From bcfde03302ab08503822f5dab20b5709f0866b18 Mon Sep 17 00:00:00 2001 From: Gianni Date: Thu, 9 May 2024 22:49:28 -0400 Subject: [PATCH] Deploy website - based on 715582098aec318c2fd1e76c5e3978fcd6ebe10c --- 404.html | 8 +- ...tyles.92802c47.css => styles.d8c3d5e8.css} | 2 +- ...85c17.222c374e.js => 01a85c17.e98d57be.js} | 2 +- ...f419f.807e6dc4.js => 03af419f.d3efac70.js} | 2 +- assets/js/0630e3af.41380c38.js | 1 + ...a438d.f23a09a4.js => 138e0e15.6968fe73.js} | 2 +- assets/js/17896441.29c50c7c.js | 1 - assets/js/17896441.7de64484.js | 1 + assets/js/180751f5.9af2e7ce.js | 1 - assets/js/1a4e3797.3e251553.js | 1 - assets/js/1a4e3797.61ec089a.js | 1 + ...3ce74.29832637.js => 1ec3ce74.b84695a8.js} | 2 +- assets/js/1f391b9e.1e51adce.js | 1 - assets/js/1f391b9e.8a1cb8cc.js | 1 + .../js/{2237.37c755eb.js => 2237.1ce5baec.js} | 2 +- assets/js/25003e4f.ea63b8ee.js | 1 + ...608aa.e518b717.js => 318608aa.a32bb04d.js} | 2 +- assets/js/319244b6.2f8ba571.js | 1 - assets/js/3242.11ffffac.js | 1 + assets/js/3242.434fe540.js | 1 - ...fb453.59d1101a.js => 36994c47.24c1c1cf.js} | 2 +- assets/js/41756ce8.dc9ab492.js | 1 + ...37655.f635f3eb.js => 44e37655.96dc4b6a.js} | 2 +- ...64d14.236264f0.js => 49b64d14.7e9d5c35.js} | 2 +- assets/js/53a3e6dc.5c1e50b8.js | 1 + assets/js/5c30ba71.0d3ec2f2.js | 1 + ...5c892.2ccfc993.js => 5e95c892.f5aa597e.js} | 2 +- ...4c797.5560fcbf.js => 5f74c797.a86bcbac.js} | 2 +- ...5c492.1ca9f5e5.js => 6875c492.bf1091d0.js} | 2 +- assets/js/74450489.17bc6034.js | 1 - .../js/{772.fe90f809.js => 772.fa094b13.js} | 4 +- ...ICENSE.txt => 772.fa094b13.js.LICENSE.txt} | 0 assets/js/7c110bd0.62d4bb39.js | 1 + assets/js/7d044f50.dfae7aa5.js | 1 - ...9a242.f85bccbb.js => 7d09a242.4bb00568.js} | 2 +- assets/js/7ec778da.36f2f1db.js | 1 - assets/js/8498.3c040e2b.js | 1 + assets/js/8509.6103d1a5.js | 1 - ...2df80.d33c5d69.js => 8eb2df80.b753f579.js} | 2 +- assets/js/935f2afb.28735225.js | 1 - ...e5962.f39702bf.js => 9cae5962.6f1b4cd9.js} | 2 +- ...a9e1f.3c68436b.js => a6aa9e1f.331d4367.js} | 2 +- assets/js/a7023ddc.e43f1e72.js | 1 - ...34027.a981430a.js => a7456010.74d83d6f.js} | 2 +- ...703ab.45801e7e.js => a94703ab.bcb3ecfd.js} | 2 +- ...a6b34.10a40529.js => aba21aa0.ae728298.js} | 2 +- assets/js/aba90f67.4d0374aa.js | 1 + assets/js/ac6a717f.b3ed906d.js | 1 + assets/js/b059735e.bb9771ec.js | 1 - assets/js/b2b675dd.dedcdbeb.js | 1 - assets/js/b2f554cd.0eb77cfa.js | 1 - ...30b4d.71f77d2c.js => b4030b4d.55b3e3ac.js} | 2 +- ...f02bf.34f376f2.js => b8af02bf.e7886f70.js} | 2 +- ...d09b6.7b977069.js => bf9d09b6.fca940cb.js} | 2 +- assets/js/c4f5d8e4.3fad96fa.js | 1 + assets/js/c4f5d8e4.6a7bb4c1.js | 1 - ...49370.d07e0ef9.js => ccc49370.e8ad5b4a.js} | 2 +- ...35278.322a0df3.js => d6535278.bd748219.js} | 2 +- assets/js/e66c2e3c.99d9b9e5.js | 1 - assets/js/e6fe0126.8a077a21.js | 1 - assets/js/e73e1d83.3983334e.js | 1 - assets/js/e80106d6.83272527.js | 1 - assets/js/ea743fb4.32fcc24b.js | 1 + ...13c31.f56ae758.js => ee513c31.d4c4b7f6.js} | 2 +- assets/js/f0f157d6.fb5629bb.js | 1 - ...08490.61e0c496.js => f9208490.a08976fa.js} | 2 +- assets/js/fdae8881.dc05964b.js | 1 - assets/js/fe210aea.406a6fa8.js | 1 + assets/js/main.50bd3ea4.js | 2 - assets/js/main.a10a2874.js | 2 + ...CENSE.txt => main.a10a2874.js.LICENSE.txt} | 0 assets/js/runtime~main.de8f3bf6.js | 1 + assets/js/runtime~main.fd5623ed.js | 1 - blog.html | 8 +- blog/archive.html | 8 +- blog/atom.xml | 92 ++++++++-------- blog/av1-encoding-for-dummies.html | 8 +- blog/embedding-the-un-embeddable.html | 8 +- blog/rss.xml | 92 ++++++++-------- blog/site-optimization.html | 8 +- blog/svt-av1-deep-dive.html | 100 +++++++++--------- blog/tags.html | 8 +- blog/tags/benchmarks.html | 8 +- blog/tags/compression.html | 8 +- blog/tags/discord.html | 8 +- blog/tags/image.html | 8 +- blog/tags/video.html | 8 +- blog/tags/web.html | 8 +- docs/FAQ.html | 8 +- docs/audio/AAC.html | 8 +- docs/audio/Dolby.html | 8 +- docs/audio/FLAC.html | 8 +- docs/audio/MP3.html | 8 +- docs/audio/Opus.html | 8 +- docs/audio/Speex.html | 8 +- docs/audio/Vorbis.html | 8 +- docs/audio/WavPack.html | 8 +- docs/contribution-guide.html | 8 +- docs/data/7z.html | 8 +- docs/data/brotli.html | 8 +- docs/data/bzip2.html | 8 +- docs/data/gzip.html | 8 +- docs/data/tar.html | 8 +- docs/data/xz.html | 8 +- docs/data/zip.html | 8 +- docs/data/zpaq.html | 8 +- docs/data/zstd.html | 8 +- docs/encoders/AVM.html | 8 +- docs/encoders/Aurora1.html | 8 +- docs/encoders/HM.html | 8 +- docs/encoders/JM.html | 8 +- docs/encoders/Kvazaar.html | 8 +- docs/encoders/SVT-AV1.html | 8 +- docs/encoders/SVT-HEVC.html | 8 +- docs/encoders/SVT-VP9.html | 8 +- docs/encoders/VTM.html | 8 +- docs/encoders/VVenC.html | 8 +- docs/encoders/aomenc.html | 8 +- docs/encoders/rav1e.html | 8 +- docs/encoders/uvg266.html | 8 +- docs/encoders/vpxenc.html | 8 +- docs/encoders/x264.html | 8 +- docs/encoders/x265.html | 8 +- docs/encoders/x266.html | 8 +- docs/encoders_hw/amf.html | 8 +- docs/encoders_hw/mediacodec.html | 8 +- docs/encoders_hw/nvenc.html | 8 +- docs/encoders_hw/qsv.html | 8 +- docs/encoders_hw/videotoolbox.html | 8 +- docs/filtering/deband.html | 8 +- docs/filtering/dehalo.html | 8 +- docs/filtering/deinterlace.html | 8 +- docs/filtering/denoise.html | 8 +- docs/filtering/detelecine.html | 8 +- docs/filtering/intro.html | 8 +- docs/filtering/vapoursynth.html | 8 +- docs/images/AVIF.html | 8 +- docs/images/GIF.html | 8 +- docs/images/HEIC.html | 8 +- docs/images/JPEG.html | 8 +- docs/images/JPEG2000.html | 8 +- docs/images/JXL.html | 8 +- docs/images/PNG.html | 8 +- docs/images/QOI.html | 8 +- docs/images/WebP.html | 8 +- docs/introduction/high-dynamic-range.html | 8 +- docs/introduction/prologue.html | 8 +- docs/introduction/psychovisual.html | 8 +- docs/introduction/terminology.html | 8 +- docs/introduction/video-artifacts.html | 8 +- docs/metrics/PSNR.html | 8 +- docs/metrics/SSIM.html | 8 +- docs/metrics/SSIMULACRA2.html | 8 +- docs/metrics/VMAF.html | 8 +- docs/metrics/XPSNR.html | 8 +- docs/metrics/butteraugli.html | 8 +- docs/privacy-policy.html | 8 +- docs/resources.html | 8 +- docs/subtitles/SRT.html | 8 +- docs/subtitles/webvtt.html | 8 +- docs/terms-of-use.html | 8 +- docs/utilities/Aviator.html | 8 +- docs/utilities/FFMetrics.html | 8 +- docs/utilities/MKVToolNix.html | 8 +- docs/utilities/YUView.html | 8 +- docs/utilities/autocompressor.html | 8 +- docs/utilities/av1an-command-gen.html | 8 +- docs/utilities/av1an.html | 8 +- docs/utilities/dovi_tool.html | 8 +- docs/utilities/eac3to.html | 8 +- docs/utilities/ffmpeg.html | 8 +- docs/utilities/hdr10plus_tool.html | 8 +- docs/utilities/mp4box.html | 8 +- docs/utilities/nmkoder.html | 8 +- docs/utilities/rAV1ator.html | 8 +- docs/utilities/rav1ator-cli.html | 8 +- docs/video-players.html | 8 +- docs/video/AV1.html | 8 +- docs/video/AVC.html | 8 +- docs/video/AVS3.html | 8 +- docs/video/ECM.html | 8 +- docs/video/FFV1.html | 8 +- docs/video/HEVC.html | 8 +- docs/video/Theora.html | 8 +- docs/video/VC-1.html | 8 +- docs/video/VP8.html | 8 +- docs/video/VP9.html | 8 +- docs/video/VVC.html | 8 +- docs/video/prores.html | 8 +- docs/video/utvideo.html | 8 +- index.html | 8 +- markdown-page.html | 8 +- search-index.json | 2 +- search.html | 8 +- 194 files changed, 663 insertions(+), 669 deletions(-) rename assets/css/{styles.92802c47.css => styles.d8c3d5e8.css} (68%) rename assets/js/{01a85c17.222c374e.js => 01a85c17.e98d57be.js} (95%) rename assets/js/{03af419f.807e6dc4.js => 03af419f.d3efac70.js} (98%) create mode 100644 assets/js/0630e3af.41380c38.js rename assets/js/{202a438d.f23a09a4.js => 138e0e15.6968fe73.js} (65%) delete mode 100644 assets/js/17896441.29c50c7c.js create mode 100644 assets/js/17896441.7de64484.js delete mode 100644 assets/js/180751f5.9af2e7ce.js delete mode 100644 assets/js/1a4e3797.3e251553.js create mode 100644 assets/js/1a4e3797.61ec089a.js rename assets/js/{1ec3ce74.29832637.js => 1ec3ce74.b84695a8.js} (98%) delete mode 100644 assets/js/1f391b9e.1e51adce.js create mode 100644 assets/js/1f391b9e.8a1cb8cc.js rename assets/js/{2237.37c755eb.js => 2237.1ce5baec.js} (95%) create mode 100644 assets/js/25003e4f.ea63b8ee.js rename assets/js/{318608aa.e518b717.js => 318608aa.a32bb04d.js} (99%) delete mode 100644 assets/js/319244b6.2f8ba571.js create mode 100644 assets/js/3242.11ffffac.js delete mode 100644 assets/js/3242.434fe540.js rename assets/js/{9b6fb453.59d1101a.js => 36994c47.24c1c1cf.js} (65%) create mode 100644 assets/js/41756ce8.dc9ab492.js rename assets/js/{44e37655.f635f3eb.js => 44e37655.96dc4b6a.js} (97%) rename assets/js/{49b64d14.236264f0.js => 49b64d14.7e9d5c35.js} (98%) create mode 100644 assets/js/53a3e6dc.5c1e50b8.js create mode 100644 assets/js/5c30ba71.0d3ec2f2.js rename assets/js/{5e95c892.2ccfc993.js => 5e95c892.f5aa597e.js} (81%) rename assets/js/{5f74c797.5560fcbf.js => 5f74c797.a86bcbac.js} (98%) rename assets/js/{6875c492.1ca9f5e5.js => 6875c492.bf1091d0.js} (96%) delete mode 100644 assets/js/74450489.17bc6034.js rename assets/js/{772.fe90f809.js => 772.fa094b13.js} (70%) rename assets/js/{772.fe90f809.js.LICENSE.txt => 772.fa094b13.js.LICENSE.txt} (100%) create mode 100644 assets/js/7c110bd0.62d4bb39.js delete mode 100644 assets/js/7d044f50.dfae7aa5.js rename assets/js/{7d09a242.f85bccbb.js => 7d09a242.4bb00568.js} (99%) delete mode 100644 assets/js/7ec778da.36f2f1db.js create mode 100644 assets/js/8498.3c040e2b.js delete mode 100644 assets/js/8509.6103d1a5.js rename assets/js/{8eb2df80.d33c5d69.js => 8eb2df80.b753f579.js} (99%) delete mode 100644 assets/js/935f2afb.28735225.js rename assets/js/{9cae5962.f39702bf.js => 9cae5962.6f1b4cd9.js} (99%) rename assets/js/{a6aa9e1f.3c68436b.js => a6aa9e1f.331d4367.js} (98%) delete mode 100644 assets/js/a7023ddc.e43f1e72.js rename assets/js/{39634027.a981430a.js => a7456010.74d83d6f.js} (65%) rename assets/js/{a94703ab.45801e7e.js => a94703ab.bcb3ecfd.js} (98%) rename assets/js/{239a6b34.10a40529.js => aba21aa0.ae728298.js} (65%) create mode 100644 assets/js/aba90f67.4d0374aa.js create mode 100644 assets/js/ac6a717f.b3ed906d.js delete mode 100644 assets/js/b059735e.bb9771ec.js delete mode 100644 assets/js/b2b675dd.dedcdbeb.js delete mode 100644 assets/js/b2f554cd.0eb77cfa.js rename assets/js/{b4030b4d.71f77d2c.js => b4030b4d.55b3e3ac.js} (98%) rename assets/js/{b8af02bf.34f376f2.js => b8af02bf.e7886f70.js} (97%) rename assets/js/{bf9d09b6.7b977069.js => bf9d09b6.fca940cb.js} (99%) create mode 100644 assets/js/c4f5d8e4.3fad96fa.js delete mode 100644 assets/js/c4f5d8e4.6a7bb4c1.js rename assets/js/{ccc49370.d07e0ef9.js => ccc49370.e8ad5b4a.js} (97%) rename assets/js/{d6535278.322a0df3.js => d6535278.bd748219.js} (99%) delete mode 100644 assets/js/e66c2e3c.99d9b9e5.js delete mode 100644 assets/js/e6fe0126.8a077a21.js delete mode 100644 assets/js/e73e1d83.3983334e.js delete mode 100644 assets/js/e80106d6.83272527.js create mode 100644 assets/js/ea743fb4.32fcc24b.js rename assets/js/{ee513c31.f56ae758.js => ee513c31.d4c4b7f6.js} (96%) delete mode 100644 assets/js/f0f157d6.fb5629bb.js rename assets/js/{f9208490.61e0c496.js => f9208490.a08976fa.js} (97%) delete mode 100644 assets/js/fdae8881.dc05964b.js create mode 100644 assets/js/fe210aea.406a6fa8.js delete mode 100644 assets/js/main.50bd3ea4.js create mode 100644 assets/js/main.a10a2874.js rename assets/js/{main.50bd3ea4.js.LICENSE.txt => main.a10a2874.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.de8f3bf6.js delete mode 100644 assets/js/runtime~main.fd5623ed.js diff --git a/404.html b/404.html index ade25c011..5ef5c4d6f 100644 --- a/404.html +++ b/404.html @@ -2,7 +2,7 @@ - + Page Not Found | Codec Wiki @@ -13,9 +13,9 @@ - - - + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/css/styles.92802c47.css b/assets/css/styles.d8c3d5e8.css similarity index 68% rename from assets/css/styles.92802c47.css rename to assets/css/styles.d8c3d5e8.css index 38c31cfc9..3cf2d8bda 100644 --- a/assets/css/styles.92802c47.css +++ b/assets/css/styles.d8c3d5e8.css @@ -1 +1 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 127.14 96.36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.15 105.15 0 0 0 81.47 0a72.06 72.06 0 0 0-3.36 6.83 97.68 97.68 0 0 0-29.11 0A72.37 72.37 0 0 0 45.64 0a105.89 105.89 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.73 105.73 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.42 68.42 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.68 68.68 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.25 105.25 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15ZM42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69Zm42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69Z'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@supports selector(:has(*)){.navbarSearchContainer_Bca1:not(:has(>*)){display:none}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/01a85c17.222c374e.js b/assets/js/01a85c17.e98d57be.js similarity index 95% rename from assets/js/01a85c17.222c374e.js rename to assets/js/01a85c17.e98d57be.js index f34a55b85..25321c3d2 100644 --- a/assets/js/01a85c17.222c374e.js +++ b/assets/js/01a85c17.e98d57be.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8209],{6535:(e,s,t)=>{t.d(s,{A:()=>v});var a=t(6540),i=t(8215),r=t(5476),l=t(4581),n=t(8774),c=t(1312),o=t(6347),d=t(9169);function m(e){const{pathname:s}=(0,o.zy)();return(0,a.useMemo)((()=>e.filter((e=>function(e,s){return!(e.unlisted&&!(0,d.ys)(e.permalink,s))}(e,s)))),[e,s])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var b=t(4848);function g(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("aside",{className:"col col--3",children:(0,b.jsxs)("nav",{className:(0,i.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,b.jsx)("div",{className:(0,i.A)(u.sidebarItemTitle,"margin-bottom--md"),children:s.title}),(0,b.jsx)("ul",{className:(0,i.A)(u.sidebarItemList,"clean-list"),children:t.map((e=>(0,b.jsx)("li",{className:u.sidebarItem,children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var h=t(5600);function j(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("ul",{className:"menu__list",children:t.map((e=>(0,b.jsx)("li",{className:"menu__list-item",children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,b.jsx)(h.GX,{component:j,props:e})}function x(e){let{sidebar:s}=e;const t=(0,l.l)();return s?.items.length?"mobile"===t?(0,b.jsx)(p,{sidebar:s}):(0,b.jsx)(g,{sidebar:s}):null}function v(e){const{sidebar:s,toc:t,children:a,...l}=e,n=s&&s.items.length>0;return(0,b.jsx)(r.A,{...l,children:(0,b.jsx)("div",{className:"container margin-vert--lg",children:(0,b.jsxs)("div",{className:"row",children:[(0,b.jsx)(x,{sidebar:s}),(0,b.jsx)("main",{className:(0,i.A)("col",{"col--7":n,"col--9 col--offset-1":!n}),children:a}),t&&(0,b.jsx)("div",{className:"col col--2",children:t})]})})})}},9158:(e,s,t)=>{t.r(s),t.d(s,{default:()=>j});t(6540);var a=t(8215),i=t(1312);const r=()=>(0,i.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var l=t(1213),n=t(7559),c=t(6535),o=t(6133),d=t(1107);const m={tag:"tag_Nnez"};var u=t(4848);function b(e){let{letterEntry:s}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(d.A,{as:"h2",id:s.letter,children:s.letter}),(0,u.jsx)("ul",{className:"padding--none",children:s.tags.map((e=>(0,u.jsx)("li",{className:m.tag,children:(0,u.jsx)(o.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function g(e){let{tags:s}=e;const t=function(e){const s={};return Object.values(e).forEach((e=>{const t=function(e){return e[0].toUpperCase()}(e.label);s[t]??=[],s[t].push(e)})),Object.entries(s).sort(((e,s)=>{let[t]=e,[a]=s;return t.localeCompare(a)})).map((e=>{let[s,t]=e;return{letter:s,tags:t.sort(((e,s)=>e.label.localeCompare(s.label)))}}))}(s);return(0,u.jsx)("section",{className:"margin-vert--lg",children:t.map((e=>(0,u.jsx)(b,{letterEntry:e},e.letter)))})}var h=t(1463);function j(e){let{tags:s,sidebar:t}=e;const i=r();return(0,u.jsxs)(l.e3,{className:(0,a.A)(n.G.wrapper.blogPages,n.G.page.blogTagsListPage),children:[(0,u.jsx)(l.be,{title:i}),(0,u.jsx)(h.A,{tag:"blog_tags_list"}),(0,u.jsxs)(c.A,{sidebar:t,children:[(0,u.jsx)(d.A,{as:"h1",children:i}),(0,u.jsx)(g,{tags:s})]})]})}},6133:(e,s,t)=>{t.d(s,{A:()=>n});t(6540);var a=t(8215),i=t(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=t(4848);function n(e){let{permalink:s,label:t,count:n}=e;return(0,l.jsxs)(i.A,{href:s,className:(0,a.A)(r.tag,n?r.tagWithCount:r.tagRegular),children:[t,n&&(0,l.jsx)("span",{children:n})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8209],{6535:(e,s,t)=>{t.d(s,{A:()=>v});var a=t(6540),i=t(4164),r=t(5476),l=t(4581),n=t(8774),c=t(1312),o=t(6347),d=t(9169);function m(e){const{pathname:s}=(0,o.zy)();return(0,a.useMemo)((()=>e.filter((e=>function(e,s){return!(e.unlisted&&!(0,d.ys)(e.permalink,s))}(e,s)))),[e,s])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var b=t(4848);function g(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("aside",{className:"col col--3",children:(0,b.jsxs)("nav",{className:(0,i.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,b.jsx)("div",{className:(0,i.A)(u.sidebarItemTitle,"margin-bottom--md"),children:s.title}),(0,b.jsx)("ul",{className:(0,i.A)(u.sidebarItemList,"clean-list"),children:t.map((e=>(0,b.jsx)("li",{className:u.sidebarItem,children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var h=t(5600);function j(e){let{sidebar:s}=e;const t=m(s.items);return(0,b.jsx)("ul",{className:"menu__list",children:t.map((e=>(0,b.jsx)("li",{className:"menu__list-item",children:(0,b.jsx)(n.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,b.jsx)(h.GX,{component:j,props:e})}function x(e){let{sidebar:s}=e;const t=(0,l.l)();return s?.items.length?"mobile"===t?(0,b.jsx)(p,{sidebar:s}):(0,b.jsx)(g,{sidebar:s}):null}function v(e){const{sidebar:s,toc:t,children:a,...l}=e,n=s&&s.items.length>0;return(0,b.jsx)(r.A,{...l,children:(0,b.jsx)("div",{className:"container margin-vert--lg",children:(0,b.jsxs)("div",{className:"row",children:[(0,b.jsx)(x,{sidebar:s}),(0,b.jsx)("main",{className:(0,i.A)("col",{"col--7":n,"col--9 col--offset-1":!n}),children:a}),t&&(0,b.jsx)("div",{className:"col col--2",children:t})]})})})}},9158:(e,s,t)=>{t.r(s),t.d(s,{default:()=>j});t(6540);var a=t(4164),i=t(1312);const r=()=>(0,i.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var l=t(1213),n=t(7559),c=t(6535),o=t(6133),d=t(1107);const m={tag:"tag_Nnez"};var u=t(4848);function b(e){let{letterEntry:s}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(d.A,{as:"h2",id:s.letter,children:s.letter}),(0,u.jsx)("ul",{className:"padding--none",children:s.tags.map((e=>(0,u.jsx)("li",{className:m.tag,children:(0,u.jsx)(o.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function g(e){let{tags:s}=e;const t=function(e){const s={};return Object.values(e).forEach((e=>{const t=function(e){return e[0].toUpperCase()}(e.label);s[t]??=[],s[t].push(e)})),Object.entries(s).sort(((e,s)=>{let[t]=e,[a]=s;return t.localeCompare(a)})).map((e=>{let[s,t]=e;return{letter:s,tags:t.sort(((e,s)=>e.label.localeCompare(s.label)))}}))}(s);return(0,u.jsx)("section",{className:"margin-vert--lg",children:t.map((e=>(0,u.jsx)(b,{letterEntry:e},e.letter)))})}var h=t(1463);function j(e){let{tags:s,sidebar:t}=e;const i=r();return(0,u.jsxs)(l.e3,{className:(0,a.A)(n.G.wrapper.blogPages,n.G.page.blogTagsListPage),children:[(0,u.jsx)(l.be,{title:i}),(0,u.jsx)(h.A,{tag:"blog_tags_list"}),(0,u.jsxs)(c.A,{sidebar:t,children:[(0,u.jsx)(d.A,{as:"h1",children:i}),(0,u.jsx)(g,{tags:s})]})]})}},6133:(e,s,t)=>{t.d(s,{A:()=>n});t(6540);var a=t(4164),i=t(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=t(4848);function n(e){let{permalink:s,label:t,count:n}=e;return(0,l.jsxs)(i.A,{href:s,className:(0,a.A)(r.tag,n?r.tagWithCount:r.tagRegular),children:[t,n&&(0,l.jsx)("span",{children:n})]})}}}]); \ No newline at end of file diff --git a/assets/js/03af419f.807e6dc4.js b/assets/js/03af419f.d3efac70.js similarity index 98% rename from assets/js/03af419f.807e6dc4.js rename to assets/js/03af419f.d3efac70.js index 921a696a7..2b8b1b5ac 100644 --- a/assets/js/03af419f.807e6dc4.js +++ b/assets/js/03af419f.d3efac70.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9305],{5702:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=t(4848),i=t(8453),r=t(1470),s=t(9365);const l={title:"VVenC",sidebar_position:12},o="VVenC",c={id:"encoders/VVenC",title:"VVenC",description:'{t.d(n,{A:()=>s});t(6540);var a=t(8215);const i={tabItem:"tabItem_Ymn6"};var r=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,a.A)(i.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),i=t(8215),r=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(9466);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:i}}=e;return{value:n,label:t,attributes:a,default:i}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const i=(0,s.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(r),(0,a.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(i.location.search);n.set(r,e),i.replace({...i.location,search:n.toString()})}),[r,i])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,r=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:r}))),[c,d]=m({queryString:t,groupId:i}),[b,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,r]=(0,u.Dv)(t);return[i,(0,a.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:i}),v=(()=>{const e=c??b;return p({value:e,tabValues:r})?e:null})();(0,l.A)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),f(e)}),[d,f,r]),tabValues:r}}var f=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),i=l[t].value;i!==a&&(c(n),s(i))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...r,className:(0,i.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=b(e);return(0,g.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...e,...n}),(0,g.jsx)(V,{...e,...n})]})}function w(e){const n=(0,f.A)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9305],{5702:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=t(4848),i=t(8453),r=t(1470),s=t(9365);const l={title:"VVenC",sidebar_position:12},o="VVenC",c={id:"encoders/VVenC",title:"VVenC",description:'{t.d(n,{A:()=>s});t(6540);var a=t(4164);const i={tabItem:"tabItem_Ymn6"};var r=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,a.A)(i.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),i=t(4164),r=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(9466);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:i}}=e;return{value:n,label:t,attributes:a,default:i}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const i=(0,s.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(r),(0,a.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(i.location.search);n.set(r,e),i.replace({...i.location,search:n.toString()})}),[r,i])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,r=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:r}))),[c,d]=m({queryString:t,groupId:i}),[b,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,r]=(0,u.Dv)(t);return[i,(0,a.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:i}),v=(()=>{const e=c??b;return p({value:e,tabValues:r})?e:null})();(0,l.A)((()=>{v&&o(v)}),[v]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),f(e)}),[d,f,r]),tabValues:r}}var f=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),i=l[t].value;i!==a&&(c(n),s(i))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...r,className:(0,i.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=b(e);return(0,g.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...n,...e}),(0,g.jsx)(V,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0630e3af.41380c38.js b/assets/js/0630e3af.41380c38.js new file mode 100644 index 000000000..49bcc2bc4 --- /dev/null +++ b/assets/js/0630e3af.41380c38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2041],{9752:a=>{a.exports=JSON.parse('{"tag":{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/202a438d.f23a09a4.js b/assets/js/138e0e15.6968fe73.js similarity index 65% rename from assets/js/202a438d.f23a09a4.js rename to assets/js/138e0e15.6968fe73.js index 0a84182d5..d10040650 100644 --- a/assets/js/202a438d.f23a09a4.js +++ b/assets/js/138e0e15.6968fe73.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2989],{1142:e=>{e.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4921],{1597:e=>{e.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/17896441.29c50c7c.js b/assets/js/17896441.29c50c7c.js deleted file mode 100644 index 708c84ec7..000000000 --- a/assets/js/17896441.29c50c7c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8401],{2447:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ae});var s=n(6540),a=n(1213),i=n(9532),l=n(4848);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(8215),m=n(4581),h=n(1312),v=n(9022);function x(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=c();return(0,l.jsx)(x,{previous:e.previous,next:e.next})}var p=n(4586),g=n(8774),f=n(4070),j=n(7559),A=n(5597),N=n(2252);const C={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function L(e){const t=C[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function _(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(g.A,{to:n,onClick:s,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,p.A)(),{pluginId:a}=(0,f.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,f.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(t,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(L,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function k(e){let{className:t}=e;const n=(0,N.r)();return n.banner?(0,l.jsx)(T,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,N.r)();return n.badge?(0,l.jsx)("span",{className:(0,u.A)(t,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}var y=n(2053),w=n(4336);function U(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(t||n||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(y.A,{tags:a})})}),o&&(0,l.jsx)(w.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var M=n(1422),B=n(5195);const E={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function I(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",E.tocCollapsibleButton,!t&&E.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const O={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function V(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,M.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(O.tocCollapsible,!i&&O.tocCollapsibleExpanded,n),children:[(0,l.jsx)(I,{collapsed:i,onClick:o}),(0,l.jsx)(M.N,{lazy:!0,className:O.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(B.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const S={tocMobile:"tocMobile_ITEo"};function G(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(V,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,S.tocMobile)})}var P=n(7763);function D(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(P.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var R=n(1107),F=n(8509);function z(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(R.A,{as:"h1",children:n})}),(0,l.jsx)(F.A,{children:t})]})}var q=n(4142),W=n(9169),Z=n(6025);function $(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const J={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function Q(){const e=(0,Z.A)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(g.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)($,{className:J.breadcrumbHomeIcon})})})}const X={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Y(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(g.A,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function K(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,q.OF)(),t=(0,W.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,X.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(Q,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(K,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(Y,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var te=n(996);const ne={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(G,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(D,{})}}(),{metadata:{unlisted:s}}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&ne.docItemCol),children:[s&&(0,l.jsx)(te.A,{}),(0,l.jsx)(k,{}),(0,l.jsxs)("div",{className:ne.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),n.mobile,(0,l.jsx)(z,{children:t}),(0,l.jsx)(U,{})]}),(0,l.jsx)(b,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function ae(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(n,{})})]})})}},4336:(e,t,n)=>{n.d(t,{A:()=>b});n(6540);var s=n(8215),a=n(1312),i=n(7559),l=n(8774);const o={iconEdit:"iconEdit_Z9Sw"};var r=n(4848);function c(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(o.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,r.jsxs)(l.A,{to:t,className:i.G.common.editThisPage,children:[(0,r.jsx)(c,{}),(0,r.jsx)(a.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,r.jsx)(a.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,r.jsx)("b",{children:(0,r.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,r.jsx)(a.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,r.jsx)("b",{children:t})},children:" by {user}"})}function v(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,r.jsxs)("span",{className:i.G.common.lastUpdated,children:[(0,r.jsx)(a.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,r.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,r.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const x={lastUpdated:"lastUpdated_JAkA"};function b(e){let{className:t,editUrl:n,lastUpdatedAt:a,lastUpdatedBy:i}=e;return(0,r.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,r.jsx)("div",{className:"col",children:n&&(0,r.jsx)(d,{editUrl:n})}),(0,r.jsx)("div",{className:(0,s.A)("col",x.lastUpdated),children:(a||i)&&(0,r.jsx)(v,{lastUpdatedAt:a,lastUpdatedBy:i})})]})}},9022:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(8215),a=n(8774),i=n(4848);function l(e){const{permalink:t,title:n,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(8215),a=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.A,{...n,linkClassName:o,linkActiveClassName:r})})}},5195:(e,t,n)=>{n.d(t,{A:()=>x});var s=n(6540),a=n(6342);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(8774),m=n(4848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function x(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const x=(0,a.p)(),b=c??x.tableOfContents.minHeadingLevel,p=u??x.tableOfContents.maxHeadingLevel,g=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:b,maxHeadingLevel:p});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:b,maxHeadingLevel:p}}),[o,r,b,p])),(0,m.jsx)(v,{toc:g,className:n,linkClassName:o,...h})}},6133:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(8215),a=n(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=n(4848);function o(e){let{permalink:t,label:n,count:o}=e;return(0,l.jsxs)(a.A,{href:t,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[n,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(8215),a=n(1312),i=n(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=n(4848);function r(e){let{tags:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{label:t,permalink:n})},n)}))})]})}},996:(e,t,n)=>{n.d(t,{A:()=>h});n(6540);var s=n(8215),a=n(1312),i=n(5260),l=n(4848);function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),u=n(7293);function m(e){let{className:t}=e;return(0,l.jsx)(u.A,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(m,{...e})]})}},6266:(e,t,n)=>{n.d(t,{i:()=>a});var s=n(4586);function a(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.7de64484.js b/assets/js/17896441.7de64484.js new file mode 100644 index 000000000..2359f7fcc --- /dev/null +++ b/assets/js/17896441.7de64484.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8401],{2447:(e,n,t)=>{t.r(n),t.d(n,{default:()=>ae});var s=t(6540),a=t(1213),i=t(9532),l=t(4848);const o=s.createContext(null);function r(e){let{children:n,content:t}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(t);return(0,l.jsx)(o.Provider,{value:a,children:n})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,l.jsx)(a.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(4164),m=t(4581),h=t(1312),v=t(9022);function b(e){const{previous:n,next:t}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,l.jsx)(v.A,{...n,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,l.jsx)(v.A,{...t,subLabel:(0,l.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var g=t(4586),p=t(8774),f=t(4070),j=t(7559),A=t(5597),C=t(2252);const L={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function N(e){const n=L[e.versionMetadata.banner];return(0,l.jsx)(n,{...e})}function _(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(p.A,{to:t,onClick:s,children:(0,l.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function k(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,f.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,A.g1)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,f.HW)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.A)(n,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(N,{siteTitle:s,versionMetadata:t})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function T(e){let{className:n}=e;const t=(0,C.r)();return t.banner?(0,l.jsx)(k,{className:n,versionMetadata:t}):null}function H(e){let{className:n}=e;const t=(0,C.r)();return t.badge?(0,l.jsx)("span",{className:(0,u.A)(n,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}var M=t(2053),w=t(4336);function I(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:a}=e,i=a.length>0,o=!!(n||t||s);return i||o?(0,l.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,l.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.A,{tags:a})})}),o&&(0,l.jsx)(w.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var y=t(1422),E=t(5195);const B={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function O(e){let{collapsed:n,...t}=e;return(0,l.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",B.tocCollapsibleButton,!n&&B.tocCollapsibleButtonExpanded,t.className),children:(0,l.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const V={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function G(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,y.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.A)(V.tocCollapsible,!i&&V.tocCollapsibleExpanded,t),children:[(0,l.jsx)(O,{collapsed:i,onClick:o}),(0,l.jsx)(y.N,{lazy:!0,className:V.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(E.A,{toc:n,minHeadingLevel:s,maxHeadingLevel:a})})]})}const R={tocMobile:"tocMobile_ITEo"};function S(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(G,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,R.tocMobile)})}var P=t(7763);function F(){const{toc:e,frontMatter:n}=c();return(0,l.jsx)(P.A,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=t(1107),D=t(8509);function z(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(U.A,{as:"h1",children:t})}),(0,l.jsx)(D.A,{children:n})]})}var W=t(4142),q=t(9169),$=t(6025);function Q(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const X={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function Y(){const e=(0,$.A)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(Q,{className:X.breadcrumbHomeIcon})})})}const Z={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function J(e){let{children:n,href:t,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:n}):t?(0,l.jsx)(p.A,{className:a,href:t,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:n})}):(0,l.jsx)("span",{className:a,children:n})}function K(e){let{children:n,active:t,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,W.OF)(),n=(0,q.Dt)();return e?(0,l.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,Z.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,l.jsx)(Y,{}),e.map(((n,t)=>{const s=t===e.length-1,a="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,l.jsx)(K,{active:s,index:t,addMicrodata:!!a,children:(0,l.jsx)(J,{href:a,isLast:s,children:n.label})},t)}))]})}):null}var ne=t(996);const te={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&n.length>0;return{hidden:s,mobile:a?(0,l.jsx)(S,{}):void 0,desktop:!a||"desktop"!==t&&"ssr"!==t?void 0:(0,l.jsx)(F,{})}}(),{metadata:{unlisted:s}}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&te.docItemCol),children:[s&&(0,l.jsx)(ne.A,{}),(0,l.jsx)(T,{}),(0,l.jsxs)("div",{className:te.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ee,{}),(0,l.jsx)(H,{}),t.mobile,(0,l.jsx)(z,{children:n}),(0,l.jsx)(I,{})]}),(0,l.jsx)(x,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ae(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.e3,{className:n,children:[(0,l.jsx)(d,{}),(0,l.jsx)(se,{children:(0,l.jsx)(t,{})})]})})}},9022:(e,n,t)=>{t.d(n,{A:()=>l});t(6540);var s=t(4164),a=t(8774),i=t(4848);function l(e){const{permalink:n,title:t,subLabel:l,isNext:o}=e;return(0,i.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:n,children:[l&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,i.jsx)("div",{className:"pagination-nav__label",children:t})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var s=t(4164),a=t(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:r})})}},5195:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540),a=t(6342);function i(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):s.push(a)})),s}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function r(e,n){let{anchorTopOffset:t}=n;const s=e.find((e=>o(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,s.useRef)(void 0),t=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let a=n;a<=t;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:s,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,g=u??b.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:x,maxHeadingLevel:g});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:g}}),[o,r,x,g])),(0,m.jsx)(v,{toc:p,className:t,linkClassName:o,...h})}},6133:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var s=t(4164),a=t(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=t(4848);function o(e){let{permalink:n,label:t,count:o}=e;return(0,l.jsxs)(a.A,{href:n,className:(0,s.A)(i.tag,o?i.tagWithCount:i.tagRegular),children:[t,o&&(0,l.jsx)("span",{children:o})]})}},2053:(e,n,t)=>{t.d(n,{A:()=>r});t(6540);var s=t(4164),a=t(1312),i=t(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var o=t(4848);function r(e){let{tags:n}=e;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:n.map((e=>{let{label:n,permalink:t}=e;return(0,o.jsx)("li",{className:l.tag,children:(0,o.jsx)(i.A,{label:n,permalink:t})},t)}))})]})}},996:(e,n,t)=>{t.d(n,{A:()=>h});t(6540);var s=t(4164),a=t(1312),i=t(5260),l=t(4848);function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),u=t(7293);function m(e){let{className:n}=e;return(0,l.jsx)(u.A,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/180751f5.9af2e7ce.js b/assets/js/180751f5.9af2e7ce.js deleted file mode 100644 index a62ade4ef..000000000 --- a/assets/js/180751f5.9af2e7ce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3662],{5967:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/image","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.3e251553.js b/assets/js/1a4e3797.3e251553.js deleted file mode 100644 index 6022e0add..000000000 --- a/assets/js/1a4e3797.3e251553.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2138],{5846:(e,t,r)=>{r.d(t,{W:()=>u});var s=r(6540),a=r(4586);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},1283:(e,t,r)=>{r.r(t),r.d(t,{default:()=>P});var s=r(6540),a=r(4586),n=r(5476),c=r(5260),l=r(8774),o=r(1312),u=r(5846),h=r(53),i=r(6347),m=r(2303),d=r(1088);const p=function(){const e=(0,m.A)(),t=(0,i.W6)(),r=(0,i.zy)(),{siteConfig:{baseUrl:s}}=(0,a.A)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l&&Array.isArray(d.Hg)&&d.Hg.some((e=>"string"==typeof e?e===l:e.path===l))?l:"",searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var g=r(5891),x=r(2384),f=r(6841),y=r(3810),C=r(7674),S=r(2849),j=r(4471);const w={searchContextInput:"searchContextInput_mXoe",searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr",searchQueryColumn:"searchQueryColumn_q7nx",searchContextColumn:"searchContextColumn_oWAF"};var A=r(3385),I=r(4848);function v(){const{siteConfig:{baseUrl:e},i18n:{currentLocale:t}}=(0,a.A)(),{selectMessage:r}=(0,u.W)(),{searchValue:n,searchContext:l,searchVersion:i,updateSearchPath:m,updateSearchContext:f}=p(),[y,C]=(0,s.useState)(n),[j,v]=(0,s.useState)(),[P,_]=(0,s.useState)(),b=`${e}${i}`,F=(0,s.useMemo)((()=>y?(0,o.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:y}):(0,o.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[y]);(0,s.useEffect)((()=>{m(y),j&&(y?j(y,(e=>{_(e)})):_(void 0))}),[y,j]);const T=(0,s.useCallback)((e=>{C(e.target.value)}),[]);return(0,s.useEffect)((()=>{n&&n!==y&&C(n)}),[n]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=!Array.isArray(d.Hg)||l||d.dz?await(0,g.Z)(b,l):{wrappedIndexes:[],zhDictionary:[]};v((()=>(0,x.m)(e,t,100)))}()}),[l,b]),(0,I.jsxs)(s.Fragment,{children:[(0,I.jsxs)(c.A,{children:[(0,I.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,I.jsx)("title",{children:F})]}),(0,I.jsxs)("div",{className:"container margin-vert--lg",children:[(0,I.jsx)("h1",{children:F}),(0,I.jsxs)("div",{className:"row",children:[(0,I.jsx)("div",{className:(0,h.A)("col",{[w.searchQueryColumn]:Array.isArray(d.Hg),"col--9":Array.isArray(d.Hg),"col--12":!Array.isArray(d.Hg)}),children:(0,I.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,"aria-label":"Search",onChange:T,value:y,autoComplete:"off",autoFocus:!0})}),Array.isArray(d.Hg)?(0,I.jsx)("div",{className:(0,h.A)("col","col--3","padding-left--none",w.searchContextColumn),children:(0,I.jsxs)("select",{name:"search-context",className:w.searchContextInput,id:"context-selector",value:l,onChange:e=>f(e.target.value),children:[d.dz&&(0,I.jsx)("option",{value:"",children:(0,o.T)({id:"theme.SearchPage.searchContext.everywhere",message:"everywhere"})}),d.Hg.map((e=>{const{label:r,path:s}=(0,A.p)(e,t);return(0,I.jsx)("option",{value:s,children:r},s)}))]})}):null]}),!j&&y&&(0,I.jsx)("div",{children:(0,I.jsx)(S.A,{})}),P&&(P.length>0?(0,I.jsx)("p",{children:r(P.length,(0,o.T)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:P.length}))}):(0,I.jsx)("p",{children:(0,o.T)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,I.jsx)("section",{children:P&&P.map((e=>(0,I.jsx)(R,{searchResult:e},e.document.i)))})]})]})}function R(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=0===r,o=2===r,u=(c?t.b:s.b).slice(),h=o?t.s:t.t;c||u.push(s.t);let i="";if(d.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);i=`?${e.toString()}`}return(0,I.jsxs)("article",{className:w.searchResultItem,children:[(0,I.jsx)("h2",{children:(0,I.jsx)(l.A,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,f.Z)(h,a):(0,y.C)(h,(0,C.g)(n,"t"),a,100)}})}),u.length>0&&(0,I.jsx)("p",{className:w.searchResultItemPath,children:(0,j.$)(u)}),o&&(0,I.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,y.C)(t.t,(0,C.g)(n,"t"),a,100)}})]})}const P=function(){return(0,I.jsx)(n.A,{children:(0,I.jsx)(v,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.61ec089a.js b/assets/js/1a4e3797.61ec089a.js new file mode 100644 index 000000000..4d5b8a294 --- /dev/null +++ b/assets/js/1a4e3797.61ec089a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2138],{5846:(e,t,r)=>{r.d(t,{W:()=>u});var s=r(6540),a=r(4586);const n=["zero","one","two","few","many","other"];function c(e){return n.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function u(){const e=o();return{selectMessage:(t,r)=>function(e,t,r){const s=e.split("|");if(1===s.length)return s[0];s.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const a=r.select(t),n=r.pluralForms.indexOf(a);return s[Math.min(n,s.length-1)]}(r,t,e)}}},1283:(e,t,r)=>{r.r(t),r.d(t,{default:()=>P});var s=r(6540),a=r(4586),n=r(5476),c=r(5260),l=r(8774),o=r(1312),u=r(5846),h=r(5391),i=r(6347),m=r(2303),d=r(1088);const p=function(){const e=(0,m.A)(),t=(0,i.W6)(),r=(0,i.zy)(),{siteConfig:{baseUrl:s}}=(0,a.A)(),n=e?new URLSearchParams(r.search):null,c=n?.get("q")||"",l=n?.get("ctx")||"",o=n?.get("version")||"",u=e=>{const t=new URLSearchParams(r.search);return e?t.set("q",e):t.delete("q"),t};return{searchValue:c,searchContext:l&&Array.isArray(d.Hg)&&d.Hg.some((e=>"string"==typeof e?e===l:e.path===l))?l:"",searchVersion:o,updateSearchPath:e=>{const r=u(e);t.replace({search:r.toString()})},updateSearchContext:e=>{const s=new URLSearchParams(r.search);s.set("ctx",e),t.replace({search:s.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${s}search?${t.toString()}`}}};var g=r(5891),x=r(2384),f=r(6841),y=r(3810),C=r(7674),S=r(2849),j=r(4471);const w={searchContextInput:"searchContextInput_mXoe",searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr",searchQueryColumn:"searchQueryColumn_q7nx",searchContextColumn:"searchContextColumn_oWAF"};var A=r(3385),I=r(4848);function v(){const{siteConfig:{baseUrl:e},i18n:{currentLocale:t}}=(0,a.A)(),{selectMessage:r}=(0,u.W)(),{searchValue:n,searchContext:l,searchVersion:i,updateSearchPath:m,updateSearchContext:f}=p(),[y,C]=(0,s.useState)(n),[j,v]=(0,s.useState)(),[P,_]=(0,s.useState)(),b=`${e}${i}`,F=(0,s.useMemo)((()=>y?(0,o.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:y}):(0,o.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[y]);(0,s.useEffect)((()=>{m(y),j&&(y?j(y,(e=>{_(e)})):_(void 0))}),[y,j]);const T=(0,s.useCallback)((e=>{C(e.target.value)}),[]);return(0,s.useEffect)((()=>{n&&n!==y&&C(n)}),[n]),(0,s.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=!Array.isArray(d.Hg)||l||d.dz?await(0,g.Z)(b,l):{wrappedIndexes:[],zhDictionary:[]};v((()=>(0,x.m)(e,t,100)))}()}),[l,b]),(0,I.jsxs)(s.Fragment,{children:[(0,I.jsxs)(c.A,{children:[(0,I.jsx)("meta",{property:"robots",content:"noindex, follow"}),(0,I.jsx)("title",{children:F})]}),(0,I.jsxs)("div",{className:"container margin-vert--lg",children:[(0,I.jsx)("h1",{children:F}),(0,I.jsxs)("div",{className:"row",children:[(0,I.jsx)("div",{className:(0,h.A)("col",{[w.searchQueryColumn]:Array.isArray(d.Hg),"col--9":Array.isArray(d.Hg),"col--12":!Array.isArray(d.Hg)}),children:(0,I.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,"aria-label":"Search",onChange:T,value:y,autoComplete:"off",autoFocus:!0})}),Array.isArray(d.Hg)?(0,I.jsx)("div",{className:(0,h.A)("col","col--3","padding-left--none",w.searchContextColumn),children:(0,I.jsxs)("select",{name:"search-context",className:w.searchContextInput,id:"context-selector",value:l,onChange:e=>f(e.target.value),children:[d.dz&&(0,I.jsx)("option",{value:"",children:(0,o.T)({id:"theme.SearchPage.searchContext.everywhere",message:"everywhere"})}),d.Hg.map((e=>{const{label:r,path:s}=(0,A.p)(e,t);return(0,I.jsx)("option",{value:s,children:r},s)}))]})}):null]}),!j&&y&&(0,I.jsx)("div",{children:(0,I.jsx)(S.A,{})}),P&&(P.length>0?(0,I.jsx)("p",{children:r(P.length,(0,o.T)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:P.length}))}):(0,I.jsx)("p",{children:(0,o.T)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"})})),(0,I.jsx)("section",{children:P&&P.map((e=>(0,I.jsx)(R,{searchResult:e},e.document.i)))})]})]})}function R(e){let{searchResult:{document:t,type:r,page:s,tokens:a,metadata:n}}=e;const c=0===r,o=2===r,u=(c?t.b:s.b).slice(),h=o?t.s:t.t;c||u.push(s.t);let i="";if(d.CU&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append("_highlight",t);i=`?${e.toString()}`}return(0,I.jsxs)("article",{className:w.searchResultItem,children:[(0,I.jsx)("h2",{children:(0,I.jsx)(l.A,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,f.Z)(h,a):(0,y.C)(h,(0,C.g)(n,"t"),a,100)}})}),u.length>0&&(0,I.jsx)("p",{className:w.searchResultItemPath,children:(0,j.$)(u)}),o&&(0,I.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,y.C)(t.t,(0,C.g)(n,"t"),a,100)}})]})}const P=function(){return(0,I.jsx)(n.A,{children:(0,I.jsx)(v,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1ec3ce74.29832637.js b/assets/js/1ec3ce74.b84695a8.js similarity index 98% rename from assets/js/1ec3ce74.29832637.js rename to assets/js/1ec3ce74.b84695a8.js index 895f9caad..2ee841ae7 100644 --- a/assets/js/1ec3ce74.29832637.js +++ b/assets/js/1ec3ce74.b84695a8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{4187:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=r(4848),i=r(8453),s=r(1470),a=r(9365);const l={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},o="rav1e",c={id:"encoders/rav1e",title:"rav1e",description:"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"rav1e",children:"rav1e"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,n.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(s.A,{children:[(0,n.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,n.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,n.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,n.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,n.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,n.jsxs)(t.p,{children:["rav1e currently has an ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,n.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,n.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,n.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,n.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,n.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,n.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["To convert ",(0,n.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,n.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,n.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,n.jsx)(t.code,{children:"--quantizer 60"}),"."]})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,n.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,n.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(8215);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(8215),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(9466);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function f(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:i}=e;const s=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,v.jsx)(f,{...e,...t}),(0,v.jsx)(j,{...e,...t})]})}function w(e){const t=(0,g.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{4187:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=r(4848),i=r(8453),s=r(1470),a=r(9365);const l={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},o="rav1e",c={id:"encoders/rav1e",title:"rav1e",description:"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"rav1e",children:"rav1e"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,n.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(s.A,{children:[(0,n.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,n.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,n.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,n.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,n.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,n.jsxs)(t.p,{children:["rav1e currently has an ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,n.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,n.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,n.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,n.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,n.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,n.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["To convert ",(0,n.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,n.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,n.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,n.jsx)(t.code,{children:"--quantizer 60"}),"."]})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,n.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,n.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(4164);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(4164),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(9466);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function f(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:i}=e;const s=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,v.jsx)(f,{...t,...e}),(0,v.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.1e51adce.js b/assets/js/1f391b9e.1e51adce.js deleted file mode 100644 index 0016cbf5f..000000000 --- a/assets/js/1f391b9e.1e51adce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6061],{7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>u});t(6540);var i=t(8215),a=t(1213),s=t(7559),l=t(5476),r=t(8509),c=t(7763),o=t(996);const d={mdxPageWrapper:"mdxPageWrapper_j9I6"};var m=t(4848);function u(e){const{content:n}=e,{metadata:{title:t,description:u,frontMatter:f,unlisted:v},assets:h}=n,{keywords:g,wrapperClassName:x,hide_table_of_contents:p}=f,L=h.image??f.image;return(0,m.jsx)(a.e3,{className:(0,i.A)(x??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,m.jsxs)(l.A,{children:[(0,m.jsx)(a.be,{title:t,description:u,keywords:g,image:L}),(0,m.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,m.jsxs)("div",{className:(0,i.A)("row",d.mdxPageWrapper),children:[(0,m.jsxs)("div",{className:(0,i.A)("col",!p&&"col--8"),children:[v&&(0,m.jsx)(o.A,{}),(0,m.jsx)("article",{children:(0,m.jsx)(r.A,{children:(0,m.jsx)(n,{})})})]}),!p&&n.toc.length>0&&(0,m.jsx)("div",{className:"col col--2",children:(0,m.jsx)(c.A,{toc:n.toc,minHeadingLevel:f.toc_min_heading_level,maxHeadingLevel:f.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(8215),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(a.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>h});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>r(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=o();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,u.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const v=i.memo(f);function h(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const h=(0,a.p)(),g=o??h.tableOfContents.minHeadingLevel,x=m??h.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:g,maxHeadingLevel:x});return d((0,i.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:g,maxHeadingLevel:x}}),[r,c,g,x])),(0,u.jsx)(v,{toc:p,className:t,linkClassName:r,...f})}},996:(e,n,t)=>{t.d(n,{A:()=>f});t(6540);var i=t(8215),a=t(1312),s=t(5260),l=t(4848);function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,l.jsx)(s.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),m=t(7293);function u(e){let{className:n}=e;return(0,l.jsx)(m.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,i.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(c,{})})}function f(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.8a1cb8cc.js b/assets/js/1f391b9e.8a1cb8cc.js new file mode 100644 index 000000000..2fc1c55d2 --- /dev/null +++ b/assets/js/1f391b9e.8a1cb8cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6061],{7973:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var a=t(4164),i=t(1213),s=t(7559),l=t(5476),r=t(8509),c=t(7763),o=t(996),d=t(4336);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:{title:t,editUrl:f,description:v,frontMatter:h,unlisted:g,lastUpdatedBy:x,lastUpdatedAt:p},assets:L}=n,{keywords:j,wrapperClassName:A,hide_table_of_contents:N}=h,C=L.image??h.image,H=!!(f||p||x);return(0,u.jsx)(i.e3,{className:(0,a.A)(A??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(i.be,{title:t,description:v,keywords:j,image:C}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,a.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,a.A)("col",!N&&"col--8"),children:[g&&(0,u.jsx)(o.A,{}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),H&&(0,u.jsx)(d.A,{className:(0,a.A)("margin-top--sm",s.G.pages.pageFooterEditMetaRow),editUrl:f,lastUpdatedAt:p,lastUpdatedBy:x})]}),!N&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:h.toc_min_heading_level,maxHeadingLevel:h.toc_max_heading_level})})]})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),i=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,a.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(i.A,{...t,linkClassName:r,linkActiveClassName:c})})}},5195:(e,n,t)=>{t.d(n,{A:()=>h});var a=t(6540),i=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):a.push(i)})),a}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>r(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,a.useRef)(void 0),t=o();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:i,minHeadingLevel:s,maxHeadingLevel:l}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),r=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let i=n;i<=t;i+=1)a.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:s,maxHeadingLevel:l}),o=c(r,{anchorTopOffset:t.current}),d=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,t])}var m=t(8774),u=t(4848);function f(e){let{toc:n,className:t,linkClassName:a,isChild:i}=e;return n.length?(0,u.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(f,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const v=a.memo(f);function h(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:o,maxHeadingLevel:m,...f}=e;const h=(0,i.p)(),g=o??h.tableOfContents.minHeadingLevel,x=m??h.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,a.useMemo)((()=>l({toc:s(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:g,maxHeadingLevel:x});return d((0,a.useMemo)((()=>{if(r&&c)return{linkClassName:r,linkActiveClassName:c,minHeadingLevel:g,maxHeadingLevel:x}}),[r,c,g,x])),(0,u.jsx)(v,{toc:p,className:t,linkClassName:r,...f})}},996:(e,n,t)=>{t.d(n,{A:()=>f});t(6540);var a=t(4164),i=t(1312),s=t(5260),l=t(4848);function r(){return(0,l.jsx)(i.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(i.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,l.jsx)(s.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),m=t(7293);function u(e){let{className:n}=e;return(0,l.jsx)(m.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,a.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(c,{})})}function f(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/2237.37c755eb.js b/assets/js/2237.1ce5baec.js similarity index 95% rename from assets/js/2237.37c755eb.js rename to assets/js/2237.1ce5baec.js index f9942b3c0..8e7c4f348 100644 --- a/assets/js/2237.37c755eb.js +++ b/assets/js/2237.1ce5baec.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(8215),o=i(1312),s=i(1107),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>c});i(6540);var n=i(1312),o=i(1213),s=i(5476),r=i(3363),a=i(4848);function c(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),o=i(1312),s=i(1107),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>c});i(6540);var n=i(1312),o=i(1213),s=i(5476),r=i(3363),a=i(4848);function c(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/25003e4f.ea63b8ee.js b/assets/js/25003e4f.ea63b8ee.js new file mode 100644 index 000000000..bbb93b818 --- /dev/null +++ b/assets/js/25003e4f.ea63b8ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2838],{4351:e=>{e.exports=JSON.parse("{\"archive\":{\"blogPosts\":[{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.32,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n\\n\\n- And here is the speed difference:\\n\\n\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n\\n\\n- Speed graphs:\\n\\n\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n\\n\\n\\n\\n\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `` and `` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n\\n\\n\\n \\n \\n some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":15.865,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1 \\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n \\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n \\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``. \\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}}")}}]); \ No newline at end of file diff --git a/assets/js/318608aa.e518b717.js b/assets/js/318608aa.a32bb04d.js similarity index 99% rename from assets/js/318608aa.e518b717.js rename to assets/js/318608aa.a32bb04d.js index 8b016808f..b654ab8fd 100644 --- a/assets/js/318608aa.e518b717.js +++ b/assets/js/318608aa.a32bb04d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6003],{1306:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);i(1470),i(9365);const r={title:"vpxenc",sidebar_position:8},l="vpxenc",c={id:"encoders/vpxenc",title:"vpxenc",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/vpxenc.mdx",sourceDirName:"encoders",slug:"/encoders/vpxenc",permalink:"/docs/encoders/vpxenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"vpxenc",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"},next:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installing (Binary)",id:"installing-binary",level:2},{value:"Compiling (Windows/MacOS/Linux)",id:"compiling-windowsmacoslinux",level:2},{value:"Cloning",id:"cloning",level:3},{value:"./configure file",id:"configure-file",level:3},{value:"Other ./configure options",id:"other-configure-options",level:3},{value:"Running GNU make",id:"running-gnu-make",level:3},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"vpxenc",children:"vpxenc"}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is part of the libvpx library for working with the ",(0,t.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," (h265) & ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"})," (h264) in coding efficiency, and has been superseded by ",(0,t.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),". VP8 competes with AVC."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, vpxenc isn't as competitive as it could be, but even when used properly, most tests show that h265 offers slightly better quality per bit with efficient encoders like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is available in FFmpeg via ",(0,t.jsx)(n.code,{children:"libvpx"})," for ",(0,t.jsx)(n.strong,{children:"VP8"})," and ",(0,t.jsx)(n.code,{children:"libvpx-vp9"})," for ",(0,t.jsx)(n.strong,{children:"VP9"}),", to check if you have it, run ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx"})," or ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx-vp9"}),".\nNon-FFmpeg standard VP8/VP9 parameters are ",(0,t.jsx)(n.strong,{children:"not"})," supported."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,t.jsx)(n.p,{children:"vpxenc supports the following color spaces:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Format"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,t.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUVA420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit (Alpha Channel)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"installing-binary",children:"Installing (Binary)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows builds are available on Lastrosade's ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/",children:"website"})," and can be downloaded ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/vpx.7z",children:"here"}),"."]}),"\n",(0,t.jsx)(n.p,{children:'For Linux and MacOS, it may be be available when searching "vpxenc" or "libvpx" in their respective package managers.'}),"\n",(0,t.jsx)(n.h2,{id:"compiling-windowsmacoslinux",children:"Compiling (Windows/MacOS/Linux)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,t.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"nasm/yasm, and the GNU build tools (make, configure) are required for this operation."}),"\n",(0,t.jsx)(n.h3,{id:"cloning",children:"Cloning"}),"\n",(0,t.jsx)(n.p,{children:"First, cloning"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\nmkdir build && cd build\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configure-file",children:"./configure file"}),"\n",(0,t.jsx)(n.p,{children:"Now here comes the annoying part, the configure file have really bad defaults. So you will need to adjust them, here are some recommended options you should use:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'./configure --cpu=native --extra-cxxflags="-O3 -flto -march=native" --extra-cflags="-O3 -flto -march=native" --as=auto --enable-vp9-highbitdepth --enable-libyuv --enable-webm-io --enable-vp9 --enable-runtime-cpu-detect --enable-internal-stats --enable-postproc --enable-vp9-postproc --enable-static --disable-shared --enable-vp9-temporal-denoising --disable-unit-tests --disable-docs --enable-multithread\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now let's break down what each of them do."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu=native"}),"\nNative CPU optimizations."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'--extra-cxxflags="-O3 -flto -march=native" --extra-cflags="-O3 -flto -march=native"'}),"\nMore native CPU optimizations for faster encoding."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--as=auto"}),"\nSet the assembler to auto, so it can choose between ",(0,t.jsx)(n.code,{children:"yasm"})," and ",(0,t.jsx)(n.code,{children:"nasm"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-highbitdepth"}),"\nEnables high bit depth (>=10 bits) when encoding VP9."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-libyuv"}),"\nEnables YUV4MPEG input support (IMPORTANT), otherwise it will only accept RAW."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-webm-io"}),"\nEnables input and output support for WebM container."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9"}),"\nEnables VP9 encoding support."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-runtime-cpu-detect"}),"\nEnables runtime CPU detection."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-internal-stats"}),"\nEnables internal statistics for the encoder for debug purposes."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-postproc"}),"\nEnables postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-postproc"}),"\nEnables VP9-specific postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-static"}),"\nEnables static builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-shared"}),"\nDisables shared builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-temporal-denoising"}),"\nDisables spatial denoising for VP9 and enables temporal instead."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-unit-tests"}),"\nDisables unit tests, unless you want to test the encoder as a developer. This should be disabled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-docs"}),"\nDisables documentation, as enabling this also requires doxygen."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-multithread"}),"\nEnables the usage of multiple CPU threads for encoding and decoding."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-configure-options",children:"Other ./configure options"}),"\n",(0,t.jsx)(n.p,{children:"There are other options you may want use to either speed up compiliation or drop unwanted features."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-vp8 --disable-vp9-decoder --disable-vp8-decoder"}),"\nDisables VP8 encoding and ",(0,t.jsx)(n.code,{children:"vpxdec"})," (decoder) to be compiled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-small"}),"\nPrioritizes smaller encoder binary size over encoding speed."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--target="}),"\nEnables target compilation for a specific operating system or CPU architecture. There's a lot of them. Here's an exhaustive list of all of them based on the configure file:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"arm64-android-gcc\narm64-darwin-gcc\narm64-darwin20-gcc\narm64-darwin21-gcc\narm64-darwin22-gcc\narm64-darwin23-gcc\narm64-linux-gcc\narm64-win64-gcc\narm64-win64-vs15\narm64-win64-vs16\narm64-win64-vs16-clangcl\narm64-win64-vs17\narm64-win64-vs17-clangcl\narmv7-android-gcc\narmv7-darwin-gcc\narmv7-linux-rvct\narmv7-linux-gcc\narmv7-none-rvct\narmv7-win32-gcc\narmv7-win32-vs14\narmv7-win32-vs15\narmv7-win32-vs16\narmv7-win32-vs17\narmv7s-darwin-gcc\narmv8-linux-gcc\nloongarch32-linux-gcc\nloongarch64-linux-gcc\nmips32-linux-gcc\nmips64-linux-gcc\nppc64le-linux-gcc\nsparc-solaris-gcc\nx86-android-gcc\nx86-darwin8-gcc\nx86-darwin8-icc\nx86-darwin9-gcc\nx86-darwin9-icc\nx86-darwin10-gcc\nx86-darwin11-gcc\nx86-darwin12-gcc\nx86-darwin13-gcc\nx86-darwin14-gcc\nx86-darwin15-gcc\nx86-darwin16-gcc\nx86-darwin17-gcc\nx86-iphonesimulator-gcc\nx86-linux-gcc\nx86-linux-icc\nx86-os2-gcc\nx86-solaris-gcc\nx86-win32-gcc\nx86-win32-vs14\nx86-win32-vs15\nx86-win32-vs16\nx86-win32-vs17\nx86_64-android-gcc\nx86_64-darwin9-gcc\nx86_64-darwin10-gcc\nx86_64-darwin11-gcc\nx86_64-darwin12-gcc\nx86_64-darwin13-gcc\nx86_64-darwin14-gcc\nx86_64-darwin15-gcc\nx86_64-darwin16-gcc\nx86_64-darwin17-gcc\nx86_64-darwin18-gcc\nx86_64-darwin19-gcc\nx86_64-darwin20-gcc\nx86_64-darwin21-gcc\nx86_64-darwin22-gcc\nx86_64-darwin23-gcc\nx86_64-iphonesimulator-gcc\nx86_64-linux-gcc\nx86_64-linux-icc\nx86_64-solaris-gcc\nx86_64-win64-gcc\nx86_64-win64-vs14\nx86_64-win64-vs15\nx86_64-win64-vs16\nx86_64-win64-vs17\ngeneric-gnu\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.strong,{children:"Windows"})," compilation with MinGW you may need to use ",(0,t.jsx)(n.code,{children:"--target=x86_64-win64-gcc"})," and ",(0,t.jsx)(n.code,{children:"--target=arm64-darwin22-gcc"})," for ",(0,t.jsx)(n.strong,{children:"MacOS"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"running-gnu-make",children:"Running GNU make"}),"\n",(0,t.jsxs)(n.p,{children:["After successfully running the configure command above, run ",(0,t.jsx)(n.code,{children:"make -j $(nproc)"})," to start compiling with your CPU count. The resulting binary will be called ",(0,t.jsx)(n.code,{children:"vpxenc"})," and you can copy it wherever you like."]}),"\n",(0,t.jsx)(n.h2,{id:"vp8",children:"VP8"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Incomplete"})}),"\n",(0,t.jsx)(n.h2,{id:"vp9",children:"VP9"}),"\n",(0,t.jsxs)(n.p,{children:["For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."]}),"\n",(0,t.jsx)(n.p,{children:"It is important to note that the vpxenc parameters provided below are considered optimal because they are efficient, but VP9 Profile 2 isn't compatible with many hardware-accelerated VP9 decoding implementations."}),"\n",(0,t.jsx)(n.h3,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--codec=vp9"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Self-explanatory."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--passes=2"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,t.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"})," and x265. Only use 1-pass mode for real-time applications, which won't be covered here yet. It is the default in the standalone vpxenc libvpx-vp9 encoder."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--webm"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,t.jsx)(n.code,{children:"--ivf"})," for an ivf video stream."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--good"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,t.jsx)(n.code,{children:"-\u2013best"})," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--threads=8"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--profile=2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--lag-in-frames=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--end-usage=q"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cq-level=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"For 1080p30 8-bit content, it is recommended to go with a Q of 25; you can go lower if you value higher quality over pure efficiency. For 1080p60 8-bit content, I would recommend going with a higher Q value with a delta of around 15. So, a Q of 30 to 40 is usually recommended. Depending on the content, you may have to tune this value, so this advice is only useful in choosing a starting point."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--kf-max-dist=[input FPS * 10]"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,t.jsx)(n.code,{children:"--kf-max-dist=240"})," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cpu-used=3"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,t.jsx)(n.code,{children:"--cpu-used=3"})," & below enables RDO, which increases quality at the expense of speed."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu-used=5"})," and above are ",(0,t.jsx)(n.em,{children:"slower"})," in the 1st pass, so it isn't recommended to use them anyway."]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--auto-alt-ref=6"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Activates alternate reference frames. Alternate reference frames are "invisible" frames which are used as references when creating the final display frames.'}),"\n",(0,t.jsx)(n.p,{children:"More alternate reference frames is typically more efficient. Setting this greater than 1 activates overlay frames and isn't compatible with the 8-bit color profiles."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-maxframes=7"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This is the maximum number of alternate reference frames the encoder is allowed to use. For most content, 7 is usually a good bet, and it is the default. With animated content, going with a value of 12 or to the max is a good bet, as animated content benefits from more additional alt-ref frames than other content. Be aware that increasing this value will impact encode speed."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-strength=4"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This setting dictates how much denoising will occur in the alt-ref frames. Lowering it to 2 or 3 is usually a good bet for noisier/grainy content to try and retain more detail, but 4 is a sane starting place. The default setting is 5, which is fine for most content, but it can be beneficial going a bit lower. For animation, keeping the default of 5 is likely a better option."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--aq-mode=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,t.jsx)(n.a,{href:"/docs/introduction/psychovisual",children:"psychovisual fidelity"}),". ",(0,t.jsx)(n.code,{children:"-\u2013aq-mode=0"})," works well on clean content (animation, video games, screen content). ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is recommended when you want to give more detail to more complex parts of a video."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--frame-boost=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,t.jsx)(n.code,{children:"--frame-boost=0"})," is usually a good bet, & this isn't a particularly salient change."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tune-content=default"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,t.jsx)(n.code,{children:"default"}),", ",(0,t.jsx)(n.code,{children:"screen"}),", and ",(0,t.jsx)(n.code,{children:"film"}),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," with ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,t.jsx)(n.code,{children:"--aq-mode=0"})," if ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," is activated, or if you want better perceptual quality, ",(0,t.jsx)(n.code,{children:"--aq-mode=1"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--row-mt=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables row multi-threading in libvpx-vp9. ",(0,t.jsx)(n.em,{children:"Always"})," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--bit-depth=10"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,t.jsx)(n.code,{children:"-\u2013profile=2"})," as mentioned above."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-columns=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,t.jsx)(n.code,{children:"-\u2013tile-columns=1"}),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-rows=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,t.jsx)(n.code,{children:"-\u2013tile-rows=0"})," & ",(0,t.jsx)(n.code,{children:"\u2013-tile-columns=0"})," will result in the highest overall coding efficiency possible with these options."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-tpl=1"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsx)(n.p,{children:"All of these options are only available for the standalone vpxenc program. Here is a sample FFmpeg command line interpretation of the commands above, with some options missing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 1 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 -f null -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 output.mkv\n"})}),"\n",(0,t.jsx)(n.p,{children:"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>l});i(6540);var t=i(8215);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function l(e){let{children:n,hidden:i,className:l}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,l),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>y});var t=i(6540),s=i(8215),r=i(3104),l=i(6347),c=i(205),o=i(7485),a=i(1682),d=i(9466);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:s}}=e;return{value:n,label:i,attributes:t,default:s}}))}(i);return function(e){const n=(0,a.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function x(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const s=(0,l.W6)(),r=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(r),(0,t.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function m(e){const{defaultValue:n,queryString:i=!1,groupId:s}=e,r=u(e),[l,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!x({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r}))),[a,h]=p({queryString:i,groupId:s}),[m,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,d.Dv)(i);return[s,(0,t.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),j=(()=>{const e=a??m;return x({value:e,tabValues:r})?e:null})();(0,c.A)((()=>{j&&o(j)}),[j]);return{selectedValue:l,selectValue:(0,t.useCallback)((e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,r]),tabValues:r}}var f=i(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function b(e){let{className:n,block:i,selectedValue:t,selectValue:l,tabValues:c}=e;const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,r.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),s=c[i].value;s!==t&&(a(n),l(s))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},n),children:c.map((e=>{let{value:n,label:i,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:s}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,t.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=m(e);return(0,g.jsxs)("div",{className:(0,s.A)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...e,...n}),(0,g.jsx)(v,{...e,...n})]})}function y(e){const n=(0,f.A)();return(0,g.jsx)(w,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6003],{1306:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);i(1470),i(9365);const r={title:"vpxenc",sidebar_position:8},l="vpxenc",c={id:"encoders/vpxenc",title:"vpxenc",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/vpxenc.mdx",sourceDirName:"encoders",slug:"/encoders/vpxenc",permalink:"/docs/encoders/vpxenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/vpxenc.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"vpxenc",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"},next:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installing (Binary)",id:"installing-binary",level:2},{value:"Compiling (Windows/MacOS/Linux)",id:"compiling-windowsmacoslinux",level:2},{value:"Cloning",id:"cloning",level:3},{value:"./configure file",id:"configure-file",level:3},{value:"Other ./configure options",id:"other-configure-options",level:3},{value:"Running GNU make",id:"running-gnu-make",level:3},{value:"VP8",id:"vp8",level:2},{value:"VP9",id:"vp9",level:2},{value:"Encoding",id:"encoding",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"vpxenc",children:"vpxenc"}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is part of the libvpx library for working with the ",(0,t.jsx)(n.a,{href:"/docs/video/VP9",children:"VP9"})," & ",(0,t.jsx)(n.a,{href:"/docs/video/VP8",children:"VP8"})," video codecs. It is capable of encoding & decoding both formats, where vpxenc is the multipurpose encoder. VP9 competes with ",(0,t.jsx)(n.a,{href:"/docs/video/HEVC",children:"HEVC"})," (h265) & ",(0,t.jsx)(n.a,{href:"/docs/video/AVC",children:"AVC"})," (h264) in coding efficiency, and has been superseded by ",(0,t.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"}),". VP8 competes with AVC."]}),"\n",(0,t.jsxs)(n.p,{children:["By default, vpxenc isn't as competitive as it could be, but even when used properly, most tests show that h265 offers slightly better quality per bit with efficient encoders like ",(0,t.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc is available in FFmpeg via ",(0,t.jsx)(n.code,{children:"libvpx"})," for ",(0,t.jsx)(n.strong,{children:"VP8"})," and ",(0,t.jsx)(n.code,{children:"libvpx-vp9"})," for ",(0,t.jsx)(n.strong,{children:"VP9"}),", to check if you have it, run ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx"})," or ",(0,t.jsx)(n.code,{children:"ffmpeg -h encoder=libvpx-vp9"}),".\nNon-FFmpeg standard VP8/VP9 parameters are ",(0,t.jsx)(n.strong,{children:"not"})," supported."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,t.jsx)(n.p,{children:"vpxenc supports the following color spaces:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Format"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,t.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUVA420P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"8-bit (Alpha Channel)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"8-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP10LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"10-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV420P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV422P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV440P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:0"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"YUV444P12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,t.jsx)(n.td,{children:"12-bit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GBRP12LE"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,t.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"installing-binary",children:"Installing (Binary)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows builds are available on Lastrosade's ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/",children:"website"})," and can be downloaded ",(0,t.jsx)(n.a,{href:"https://jeremylee.sh/bins/vpx.7z",children:"here"}),"."]}),"\n",(0,t.jsx)(n.p,{children:'For Linux and MacOS, it may be be available when searching "vpxenc" or "libvpx" in their respective package managers.'}),"\n",(0,t.jsx)(n.h2,{id:"compiling-windowsmacoslinux",children:"Compiling (Windows/MacOS/Linux)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows users are recommended to compile via MinGW-W64 which comes with ",(0,t.jsx)(n.a,{href:"https://msys2.org/",children:"MSYS2"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"nasm/yasm, and the GNU build tools (make, configure) are required for this operation."}),"\n",(0,t.jsx)(n.h3,{id:"cloning",children:"Cloning"}),"\n",(0,t.jsx)(n.p,{children:"First, cloning"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://chromium.googlesource.com/webm/libvpx\ncd libvpx\nmkdir build && cd build\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configure-file",children:"./configure file"}),"\n",(0,t.jsx)(n.p,{children:"Now here comes the annoying part, the configure file have really bad defaults. So you will need to adjust them, here are some recommended options you should use:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'./configure --cpu=native --extra-cxxflags="-O3 -flto -march=native" --extra-cflags="-O3 -flto -march=native" --as=auto --enable-vp9-highbitdepth --enable-libyuv --enable-webm-io --enable-vp9 --enable-runtime-cpu-detect --enable-internal-stats --enable-postproc --enable-vp9-postproc --enable-static --disable-shared --enable-vp9-temporal-denoising --disable-unit-tests --disable-docs --enable-multithread\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now let's break down what each of them do."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu=native"}),"\nNative CPU optimizations."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:'--extra-cxxflags="-O3 -flto -march=native" --extra-cflags="-O3 -flto -march=native"'}),"\nMore native CPU optimizations for faster encoding."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--as=auto"}),"\nSet the assembler to auto, so it can choose between ",(0,t.jsx)(n.code,{children:"yasm"})," and ",(0,t.jsx)(n.code,{children:"nasm"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-highbitdepth"}),"\nEnables high bit depth (>=10 bits) when encoding VP9."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-libyuv"}),"\nEnables YUV4MPEG input support (IMPORTANT), otherwise it will only accept RAW."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-webm-io"}),"\nEnables input and output support for WebM container."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9"}),"\nEnables VP9 encoding support."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-runtime-cpu-detect"}),"\nEnables runtime CPU detection."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-internal-stats"}),"\nEnables internal statistics for the encoder for debug purposes."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-postproc"}),"\nEnables postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-postproc"}),"\nEnables VP9-specific postprocessing stuff for better video quality."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-static"}),"\nEnables static builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-shared"}),"\nDisables shared builds."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-vp9-temporal-denoising"}),"\nDisables spatial denoising for VP9 and enables temporal instead."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-unit-tests"}),"\nDisables unit tests, unless you want to test the encoder as a developer. This should be disabled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-docs"}),"\nDisables documentation, as enabling this also requires doxygen."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-multithread"}),"\nEnables the usage of multiple CPU threads for encoding and decoding."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-configure-options",children:"Other ./configure options"}),"\n",(0,t.jsx)(n.p,{children:"There are other options you may want use to either speed up compiliation or drop unwanted features."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--disable-vp8 --disable-vp9-decoder --disable-vp8-decoder"}),"\nDisables VP8 encoding and ",(0,t.jsx)(n.code,{children:"vpxdec"})," (decoder) to be compiled."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--enable-small"}),"\nPrioritizes smaller encoder binary size over encoding speed."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--target="}),"\nEnables target compilation for a specific operating system or CPU architecture. There's a lot of them. Here's an exhaustive list of all of them based on the configure file:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"arm64-android-gcc\narm64-darwin-gcc\narm64-darwin20-gcc\narm64-darwin21-gcc\narm64-darwin22-gcc\narm64-darwin23-gcc\narm64-linux-gcc\narm64-win64-gcc\narm64-win64-vs15\narm64-win64-vs16\narm64-win64-vs16-clangcl\narm64-win64-vs17\narm64-win64-vs17-clangcl\narmv7-android-gcc\narmv7-darwin-gcc\narmv7-linux-rvct\narmv7-linux-gcc\narmv7-none-rvct\narmv7-win32-gcc\narmv7-win32-vs14\narmv7-win32-vs15\narmv7-win32-vs16\narmv7-win32-vs17\narmv7s-darwin-gcc\narmv8-linux-gcc\nloongarch32-linux-gcc\nloongarch64-linux-gcc\nmips32-linux-gcc\nmips64-linux-gcc\nppc64le-linux-gcc\nsparc-solaris-gcc\nx86-android-gcc\nx86-darwin8-gcc\nx86-darwin8-icc\nx86-darwin9-gcc\nx86-darwin9-icc\nx86-darwin10-gcc\nx86-darwin11-gcc\nx86-darwin12-gcc\nx86-darwin13-gcc\nx86-darwin14-gcc\nx86-darwin15-gcc\nx86-darwin16-gcc\nx86-darwin17-gcc\nx86-iphonesimulator-gcc\nx86-linux-gcc\nx86-linux-icc\nx86-os2-gcc\nx86-solaris-gcc\nx86-win32-gcc\nx86-win32-vs14\nx86-win32-vs15\nx86-win32-vs16\nx86-win32-vs17\nx86_64-android-gcc\nx86_64-darwin9-gcc\nx86_64-darwin10-gcc\nx86_64-darwin11-gcc\nx86_64-darwin12-gcc\nx86_64-darwin13-gcc\nx86_64-darwin14-gcc\nx86_64-darwin15-gcc\nx86_64-darwin16-gcc\nx86_64-darwin17-gcc\nx86_64-darwin18-gcc\nx86_64-darwin19-gcc\nx86_64-darwin20-gcc\nx86_64-darwin21-gcc\nx86_64-darwin22-gcc\nx86_64-darwin23-gcc\nx86_64-iphonesimulator-gcc\nx86_64-linux-gcc\nx86_64-linux-icc\nx86_64-solaris-gcc\nx86_64-win64-gcc\nx86_64-win64-vs14\nx86_64-win64-vs15\nx86_64-win64-vs16\nx86_64-win64-vs17\ngeneric-gnu\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.strong,{children:"Windows"})," compilation with MinGW you may need to use ",(0,t.jsx)(n.code,{children:"--target=x86_64-win64-gcc"})," and ",(0,t.jsx)(n.code,{children:"--target=arm64-darwin22-gcc"})," for ",(0,t.jsx)(n.strong,{children:"MacOS"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"running-gnu-make",children:"Running GNU make"}),"\n",(0,t.jsxs)(n.p,{children:["After successfully running the configure command above, run ",(0,t.jsx)(n.code,{children:"make -j $(nproc)"})," to start compiling with your CPU count. The resulting binary will be called ",(0,t.jsx)(n.code,{children:"vpxenc"})," and you can copy it wherever you like."]}),"\n",(0,t.jsx)(n.h2,{id:"vp8",children:"VP8"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Incomplete"})}),"\n",(0,t.jsx)(n.h2,{id:"vp9",children:"VP9"}),"\n",(0,t.jsxs)(n.p,{children:["For encoding VP9, vpxenc's default parameters are not considered optimal. There are a lot of options that are either disabled without reason or are simply misconfigured, hurting coding efficiency at little cost otherwise. As of mid-2021, some parameters (the TPL-model, lag-in-frames and auto-alt-ref frames) were changed (since libvpx 1.9.0 and libvpx 1.10.0) which means that there's not much use of setting these three parameters unless you're in ",(0,t.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This section covers the most important options libvpx-vp9 has to offer, recommended settings, & what they do."]}),"\n",(0,t.jsx)(n.p,{children:"It is important to note that the vpxenc parameters provided below are considered optimal because they are efficient, but VP9 Profile 2 isn't compatible with many hardware-accelerated VP9 decoding implementations."}),"\n",(0,t.jsx)(n.h3,{id:"encoding",children:"Encoding"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--codec=vp9"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Self-explanatory."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--passes=2"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["vpxenc's 2-pass mode is quite fast compared to 2-pass in ",(0,t.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"})," and x265. Only use 1-pass mode for real-time applications, which won't be covered here yet. It is the default in the standalone vpxenc libvpx-vp9 encoder."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--webm"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables WebM output for the encoder, and passes the encoder flags set. It is not necessary to enable it, but since it passes the encoder flags, I would use it. Can be changed to ",(0,t.jsx)(n.code,{children:"--ivf"})," for an ivf video stream."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--good"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is a sort of quality deadline, the minimum speed the encoder is allowed to go to. It isn't recommended to use ",(0,t.jsx)(n.code,{children:"-\u2013best"})," as it is slow for the quality uplift you get. Do not use RT for anything but real-time encoding."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--threads=8"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Dictates the number of threads the encoder should spawn. It doesn\u2019t mean it\u2019ll scale all that well over those 8 threads. On a 16 thread CPU with a single encoder instance, I would use 8 threads. With multiple encoder instance encoding(with qencoder/av1an/neav1e), I would set it to 2 threads."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--profile=2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"VP9 profile 2 is obligatory if you want 10-bit & 12-bit support for HDR, and improved quality from 8-bit."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--lag-in-frames=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lag-in-frames is the libvpx equivalent of lookahead in x264. The higher the number, the slower the encoder will be, but at the upside of making it more efficient. Going above \u2013lag-in-frames=12 also activates another setting called alternate reference frames. 25 is the maximum you can get in libvpx-vp9. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--end-usage=q"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Q mode is the closest equivalent to CRF that libvpx-vp9 offers, so use it if maximum quality is desired."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cq-level=25"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"For 1080p30 8-bit content, it is recommended to go with a Q of 25; you can go lower if you value higher quality over pure efficiency. For 1080p60 8-bit content, I would recommend going with a higher Q value with a delta of around 15. So, a Q of 30 to 40 is usually recommended. Depending on the content, you may have to tune this value, so this advice is only useful in choosing a starting point."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--kf-max-dist=[input FPS * 10]"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This tells the encoder to have a maximum number of frames between keyframes. It will usually place a lower number of keyframes in content like movies, TV shows, or animated shows, so you can set it to a very high number or not set it at all if you want maximum efficiency for this kind of content. Otherwise, I would go with the 10-second rule: ",(0,t.jsx)(n.code,{children:"--kf-max-dist=240"})," for 24FPS content, 300 for 30FPS content, 600 for 60FPS content, and so on."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--cpu-used=3"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This is where the biggest balance of quality to speed is with libvpx-vp9. This is similar to presets in x264 and x265, except the lower the number, the slower the encoder takes. Using ",(0,t.jsx)(n.code,{children:"--cpu-used=3"})," & below enables RDO, which increases quality at the expense of speed."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"--cpu-used=5"})," and above are ",(0,t.jsx)(n.em,{children:"slower"})," in the 1st pass, so it isn't recommended to use them anyway."]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--auto-alt-ref=6"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:'Activates alternate reference frames. Alternate reference frames are "invisible" frames which are used as references when creating the final display frames.'}),"\n",(0,t.jsx)(n.p,{children:"More alternate reference frames is typically more efficient. Setting this greater than 1 activates overlay frames and isn't compatible with the 8-bit color profiles."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-maxframes=7"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This is the maximum number of alternate reference frames the encoder is allowed to use. For most content, 7 is usually a good bet, and it is the default. With animated content, going with a value of 12 or to the max is a good bet, as animated content benefits from more additional alt-ref frames than other content. Be aware that increasing this value will impact encode speed."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--arnr-strength=4"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This setting dictates how much denoising will occur in the alt-ref frames. Lowering it to 2 or 3 is usually a good bet for noisier/grainy content to try and retain more detail, but 4 is a sane starting place. The default setting is 5, which is fine for most content, but it can be beneficial going a bit lower. For animation, keeping the default of 5 is likely a better option."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--aq-mode=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Adaptive quantization is the way for an encoder to spend more bits in certain areas to improve ",(0,t.jsx)(n.a,{href:"/docs/introduction/psychovisual",children:"psychovisual fidelity"}),". ",(0,t.jsx)(n.code,{children:"-\u2013aq-mode=0"})," works well on clean content (animation, video games, screen content). ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is recommended when you want to give more detail to more complex parts of a video."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--frame-boost=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This flag lets the encoder periodically boost the bitrate of a scene/frame if it needs it. Leaving it at the default ",(0,t.jsx)(n.code,{children:"--frame-boost=0"})," is usually a good bet, & this isn't a particularly salient change."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tune-content=default"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This determines how the encoder is tuned. In libvpx-vp9, there are three options: ",(0,t.jsx)(n.code,{children:"default"}),", ",(0,t.jsx)(n.code,{children:"screen"}),", and ",(0,t.jsx)(n.code,{children:"film"}),". Default is for most scenarios, screen is for screen content(video games, live-streaming content like web pages & your screen), and film is for heavily dithered/grainy video. Leaving it at the default for about everything but screen content as described above is probably the best option. ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," with ",(0,t.jsx)(n.code,{children:"--aq-mode=2"})," is not recommended, as it creates some odd artifacts. It is advised to use ",(0,t.jsx)(n.code,{children:"--aq-mode=0"})," if ",(0,t.jsx)(n.code,{children:"--tune-content=screen"})," is activated, or if you want better perceptual quality, ",(0,t.jsx)(n.code,{children:"--aq-mode=1"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--row-mt=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Enables row multi-threading in libvpx-vp9. ",(0,t.jsx)(n.em,{children:"Always"})," enable it no matter what, as it does not hurt efficiency, but boosts speed considerably. This feature is disabled by default."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--bit-depth=10"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Always use 10-bit for maximum efficiency & minimal banding, even with an 8-bit source. Make sure to enable ",(0,t.jsx)(n.code,{children:"-\u2013profile=2"})," as mentioned above."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-columns=1"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile columns for easier parallelization when encoding & decoding. Setting ",(0,t.jsx)(n.code,{children:"-\u2013tile-columns=1"}),", you will get 2\xb9 tile columns. Setting it higher is a trade-off between parallelization & coding efficiency, as more tiles means less information your encoder can work with, and this will result in decreased efficiency. Do note there is an upper threshold in regards to the number of tile columns you can get due to the fixed minimum tile width of 256 pixels. So, this means 4 tile columns (2\xb2) for 720p and 1080p, 8 tile columns (2\u2074) for 1440p/4k, and so on. If you set a tile column number that is too high, it will drop down to the lowest supported number of tile columns at the input resolution."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--tile-rows=0"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["This setting divides the video into tile rows. This option is different from columns because although it also makes decoding performance higher, it does not scale as well as tile columns & doesn\u2019t increase encoder threading nearly as much. Always use more tile-columns than rows, or leave the number of tile rows at default (0). Leaving the encoder defaults at ",(0,t.jsx)(n.code,{children:"-\u2013tile-rows=0"})," & ",(0,t.jsx)(n.code,{children:"\u2013-tile-columns=0"})," will result in the highest overall coding efficiency possible with these options."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-tpl=1"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This option enables a temporal layer model, which helps with coding efficiency. It is the default in the standalone vpxenc libvpx-vp9 encoder."}),"\n",(0,t.jsx)(n.p,{children:"All of these options are only available for the standalone vpxenc program. Here is a sample FFmpeg command line interpretation of the commands above, with some options missing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 1 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 -f null -\nffmpeg -i input.mkv -c:v libvpx-vp9 -pix_fmt yuv420p10le -pass 2 -quality good -threads 4 -profile:v 2 -lag-in-frames 25 -crf 25 -b:v 0 -g 240 -cpu-used 4 -auto-alt-ref 1 -arnr-maxframes 7 -arnr-strength 4 -aq-mode 0 -tile-rows 0 -tile-columns 1 -enable-tpl 1 -row-mt 1 output.mkv\n"})}),"\n",(0,t.jsx)(n.p,{children:"Alternatively, you can pass a raw .y4m stream to standalone vpxenc & encode that way."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"VP9 section written based on work by BlueSwordM, who has granted written permission for this wiki page to exist in its current fashion"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>l});i(6540);var t=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function l(e){let{children:n,hidden:i,className:l}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,l),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>y});var t=i(6540),s=i(4164),r=i(3104),l=i(6347),c=i(205),o=i(7485),a=i(1682),d=i(9466);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:s}}=e;return{value:n,label:i,attributes:t,default:s}}))}(i);return function(e){const n=(0,a.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function x(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const s=(0,l.W6)(),r=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(r),(0,t.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function m(e){const{defaultValue:n,queryString:i=!1,groupId:s}=e,r=u(e),[l,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!x({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r}))),[a,h]=p({queryString:i,groupId:s}),[m,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,d.Dv)(i);return[s,(0,t.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),j=(()=>{const e=a??m;return x({value:e,tabValues:r})?e:null})();(0,c.A)((()=>{j&&o(j)}),[j]);return{selectedValue:l,selectValue:(0,t.useCallback)((e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),f(e)}),[h,f,r]),tabValues:r}}var f=i(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function b(e){let{className:n,block:i,selectedValue:t,selectValue:l,tabValues:c}=e;const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,r.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),s=c[i].value;s!==t&&(a(n),l(s))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},n),children:c.map((e=>{let{value:n,label:i,attributes:r}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:s}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,t.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=m(e);return(0,g.jsxs)("div",{className:(0,s.A)("tabs-container",j.tabList),children:[(0,g.jsx)(b,{...n,...e}),(0,g.jsx)(v,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,g.jsx)(w,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/319244b6.2f8ba571.js b/assets/js/319244b6.2f8ba571.js deleted file mode 100644 index d140bcc37..000000000 --- a/assets/js/319244b6.2f8ba571.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5274],{1229:s=>{s.exports=JSON.parse('{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":3,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3242.11ffffac.js b/assets/js/3242.11ffffac.js new file mode 100644 index 000000000..e062eb22f --- /dev/null +++ b/assets/js/3242.11ffffac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3242],{6535:(e,t,a)=>{a.d(t,{A:()=>f});var s=a(6540),n=a(4164),l=a(5476),r=a(4581),i=a(8774),o=a(1312),c=a(6347),m=a(9169);function d(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var x=a(5600);function j(e){let{sidebar:t}=e;const a=d(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,h.jsx)(x.GX,{component:j,props:e})}function b(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(p,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function f(e){const{sidebar:t,toc:a,children:s,...r}=e,i=t&&t.items.length>0;return(0,h.jsx)(l.A,{...r,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(b,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4651:(e,t,a)=>{a.d(t,{A:()=>R});a(6540);var s=a(4164),n=a(7131),l=a(4848);function r(e){let{children:t,className:a}=e;return(0,l.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,n.e)(),{permalink:c,title:m}=a,d=r?"h1":"h2";return(0,l.jsx)(d,{className:(0,s.A)(o.title,t),children:r?m:(0,l.jsx)(i.A,{to:c,children:m})})}var m=a(1312),d=a(5846),u=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,l.jsx)(l.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,l.jsx)("time",{dateTime:t,children:a})}function j(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:r,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,l.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(x,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==i&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(j,{}),(0,l.jsx)(g,{readingTime:i})]})]});var c}function b(e){return e.href?(0,l.jsx)(i.A,{...e}):(0,l.jsx)(l.Fragment,{children:e.children})}function f(e){let{author:t,className:a}=e;const{name:n,title:r,url:i,imageURL:o,email:c}=t,m=i||c&&`mailto:${c}`||void 0;return(0,l.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,l.jsx)(b,{href:m,className:"avatar__photo-link",children:(0,l.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,l.jsxs)("div",{className:"avatar__intro",children:[(0,l.jsx)("div",{className:"avatar__name",children:(0,l.jsx)(b,{href:m,children:(0,l.jsx)("span",{children:n})})}),r&&(0,l.jsx)("small",{className:"avatar__subtitle",children:r})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,l.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,l.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(f,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(c,{}),(0,l.jsx)(p,{}),(0,l.jsx)(A,{})]})}var _=a(440),k=a(8509);function P(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,n.e)();return(0,l.jsx)("div",{id:r?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,l.jsx)(k.A,{children:t})})}var w=a(7559),T=a(4336),I=a(2053);function L(){return(0,l.jsx)("b",{children:(0,l.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function y(e){const{blogPostTitle:t,...a}=e;return(0,l.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,l.jsx)(L,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:r,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,d=!t&&o,u=a.length>0;if(!(u||d||i))return null;if(t){const e=!!(i||m||c);return(0,l.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("row","margin-top--sm",w.G.blog.blogFooterEditMetaRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(I.A,{tags:a})})}),e&&(0,l.jsx)(T.A,{className:(0,s.A)("margin-top--sm",w.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,l.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("col",{"col--9":d}),children:(0,l.jsx)(I.A,{tags:a})}),d&&(0,l.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,l.jsx)(y,{blogPostTitle:r,to:e.permalink})})]})}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(r,{className:(0,s.A)(i,a),children:[(0,l.jsx)(N,{}),(0,l.jsx)(P,{children:t}),(0,l.jsx)(C,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var s=a(4164),n=a(8774),l=a(4848);function r(e){const{permalink:t,title:a,subLabel:r,isNext:i}=e;return(0,l.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,l.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4164),n=a(8774);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function i(e){let{permalink:t,label:a,count:i}=e;return(0,r.jsxs)(n.A,{href:t,className:(0,s.A)(l.tag,i?l.tagWithCount:l.tagRegular),children:[a,i&&(0,r.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4164),n=a(1312),l=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:a}=e;return(0,i.jsx)("li",{className:r.tag,children:(0,i.jsx)(l.A,{label:t,permalink:a})},a)}))})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(9532),l=a(4848);const r=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,l.jsx)(r.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(r);if(null===e)throw new n.dV("BlogPostProvider");return e}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(4586);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:r(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),l=a.pluralForms.indexOf(n);return s[Math.min(l,s.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/3242.434fe540.js b/assets/js/3242.434fe540.js deleted file mode 100644 index 9e045afea..000000000 --- a/assets/js/3242.434fe540.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3242],{6535:(e,t,a)=>{a.d(t,{A:()=>f});var s=a(6540),n=a(8215),l=a(5476),r=a(4581),i=a(8774),o=a(1312),c=a(6347),d=a(9169);function m(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var p=a(5600);function x(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,h.jsx)(p.GX,{component:x,props:e})}function b(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(j,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function f(e){const{sidebar:t,toc:a,children:s,...r}=e,i=t&&t.items.length>0;return(0,h.jsx)(l.A,{...r,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(b,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4651:(e,t,a)=>{a.d(t,{A:()=>C});a(6540);var s=a(8215),n=a(7131),l=a(4848);function r(e){let{children:t,className:a}=e;return(0,l.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,n.e)(),{permalink:c,title:d}=a,m=r?"h1":"h2";return(0,l.jsx)(m,{className:(0,s.A)(o.title,t),children:r?d:(0,l.jsx)(i.A,{to:c,children:d})})}var d=a(1312),m=a(5846),u=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,l.jsx)(l.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,l.jsx)("time",{dateTime:t,children:a})}function x(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:r,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,l.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(p,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==i&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(x,{}),(0,l.jsx)(g,{readingTime:i})]})]});var c}function b(e){return e.href?(0,l.jsx)(i.A,{...e}):(0,l.jsx)(l.Fragment,{children:e.children})}function f(e){let{author:t,className:a}=e;const{name:n,title:r,url:i,imageURL:o,email:c}=t,d=i||c&&`mailto:${c}`||void 0;return(0,l.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,l.jsx)(b,{href:d,className:"avatar__photo-link",children:(0,l.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,l.jsxs)("div",{className:"avatar__intro",children:[(0,l.jsx)("div",{className:"avatar__name",children:(0,l.jsx)(b,{href:d,children:(0,l.jsx)("span",{children:n})})}),r&&(0,l.jsx)("small",{className:"avatar__subtitle",children:r})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,l.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,l.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(f,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(c,{}),(0,l.jsx)(j,{}),(0,l.jsx)(A,{})]})}var _=a(440),k=a(8509);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,n.e)();return(0,l.jsx)("div",{id:r?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,l.jsx)(k.A,{children:t})})}var U=a(7559),y=a(4336),T=a(2053);function P(){return(0,l.jsx)("b",{children:(0,l.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function I(e){const{blogPostTitle:t,...a}=e;return(0,l.jsx)(i.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,l.jsx)(P,{})})}function L(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:r,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=a.length>0;if(!(u||m||i))return null;if(t){const e=!!(i||d||c);return(0,l.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("row","margin-top--sm",U.G.blog.blogFooterEditMetaRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(T.A,{tags:a})})}),e&&(0,l.jsx)(y.A,{className:(0,s.A)("margin-top--sm",U.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,l.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,l.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,l.jsx)(T.A,{tags:a})}),m&&(0,l.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,l.jsx)(I,{blogPostTitle:r,to:e.permalink})})]})}function C(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(r,{className:(0,s.A)(i,a),children:[(0,l.jsx)(N,{}),(0,l.jsx)(w,{children:t}),(0,l.jsx)(L,{})]})}},4336:(e,t,a)=>{a.d(t,{A:()=>x});a(6540);var s=a(8215),n=a(1312),l=a(7559),r=a(8774);const i={iconEdit:"iconEdit_Z9Sw"};var o=a(4848);function c(e){let{className:t,...a}=e;return(0,o.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(i.iconEdit,t),"aria-hidden":"true",...a,children:(0,o.jsx)("g",{children:(0,o.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,o.jsxs)(r.A,{to:t,className:l.G.common.editThisPage,children:[(0,o.jsx)(c,{}),(0,o.jsx)(n.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var m=a(6266);function u(e){let{lastUpdatedAt:t}=e;const a=new Date(t),s=(0,m.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(a);return(0,o.jsx)(n.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,o.jsx)("b",{children:(0,o.jsx)("time",{dateTime:a.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,o.jsx)(n.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,o.jsx)("b",{children:t})},children:" by {user}"})}function g(e){let{lastUpdatedAt:t,lastUpdatedBy:a}=e;return(0,o.jsxs)("span",{className:l.G.common.lastUpdated,children:[(0,o.jsx)(n.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,o.jsx)(u,{lastUpdatedAt:t}):"",byUser:a?(0,o.jsx)(h,{lastUpdatedBy:a}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const p={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:a,lastUpdatedAt:n,lastUpdatedBy:l}=e;return(0,o.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,o.jsx)("div",{className:"col",children:a&&(0,o.jsx)(d,{editUrl:a})}),(0,o.jsx)("div",{className:(0,s.A)("col",p.lastUpdated),children:(n||l)&&(0,o.jsx)(g,{lastUpdatedAt:n,lastUpdatedBy:l})})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>r});a(6540);var s=a(8215),n=a(8774),l=a(4848);function r(e){const{permalink:t,title:a,subLabel:r,isNext:i}=e;return(0,l.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,l.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(8215),n=a(8774);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function i(e){let{permalink:t,label:a,count:i}=e;return(0,r.jsxs)(n.A,{href:t,className:(0,s.A)(l.tag,i?l.tagWithCount:l.tagRegular),children:[a,i&&(0,r.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(8215),n=a(1312),l=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:a}=e;return(0,i.jsx)("li",{className:r.tag,children:(0,i.jsx)(l.A,{label:t,permalink:a})},a)}))})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(9532),l=a(4848);const r=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,l.jsx)(r.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(r);if(null===e)throw new n.dV("BlogPostProvider");return e}},6266:(e,t,a)=>{a.d(t,{i:()=>n});var s=a(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),a=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:a,...e})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(4586);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:r(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),l=a.pluralForms.indexOf(n);return s[Math.min(l,s.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/9b6fb453.59d1101a.js b/assets/js/36994c47.24c1c1cf.js similarity index 65% rename from assets/js/9b6fb453.59d1101a.js rename to assets/js/36994c47.24c1c1cf.js index d61a8d07d..ebef45ae4 100644 --- a/assets/js/9b6fb453.59d1101a.js +++ b/assets/js/36994c47.24c1c1cf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6732],{2945:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9858],{5516:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/41756ce8.dc9ab492.js b/assets/js/41756ce8.dc9ab492.js new file mode 100644 index 000000000..85c42bea3 --- /dev/null +++ b/assets/js/41756ce8.dc9ab492.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9616],{5205:e=>{e.exports=JSON.parse('{"tags":[{"label":"video","permalink":"/blog/tags/video","count":3},{"label":"compression","permalink":"/blog/tags/compression","count":3},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":1},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/44e37655.f635f3eb.js b/assets/js/44e37655.96dc4b6a.js similarity index 97% rename from assets/js/44e37655.f635f3eb.js rename to assets/js/44e37655.96dc4b6a.js index 6201613fa..3d08b2c27 100644 --- a/assets/js/44e37655.f635f3eb.js +++ b/assets/js/44e37655.96dc4b6a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{962:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var r=n(4848),i=n(8453),s=n(1470),a=n(9365);const l={title:"SSIMULACRA2",sidebar_position:1},o="SSIMULACRA2",c={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"}),"\n",(0,r.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,r.jsxs)(t.p,{children:["While a ",(0,r.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,r.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,r.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(a.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,r.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,r.jsxs)(a.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,r.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,r.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,r.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,r.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,r.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,r.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,r.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,r.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,r.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,r.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,r.jsxs)(t.p,{children:["Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.",(0,r.jsx)(t.br,{}),"\n","However, the speedup is worth it."]}),"\n",(0,r.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,r.jsx)(t.code,{children:"--frame-threads"})," or ",(0,r.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,r.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,r.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,r.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,r.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,r.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,r.jsx)(t.p,{children:"The score that ssimulacra2 outputs is simple:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Very high quality: ",(0,r.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,r.jsxs)(t.li,{children:["High quality: ",(0,r.jsx)(t.code,{children:"70"})," to ",(0,r.jsx)(t.code,{children:"90"})]}),"\n",(0,r.jsxs)(t.li,{children:["Medium quality: ",(0,r.jsx)(t.code,{children:"50"})," to ",(0,r.jsx)(t.code,{children:"70"})]}),"\n",(0,r.jsxs)(t.li,{children:["Low quality: Below ",(0,r.jsx)(t.code,{children:"50"})]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(8215);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),i=n(8215),s=n(3104),a=n(6347),l=n(205),o=n(7485),c=n(1682),u=n(9466);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),b=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=n(4848);function v(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=o.indexOf(t),i=l[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:i}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,x.jsx)(v,{...e,...t}),(0,x.jsx)(j,{...e,...t})]})}function w(e){const t=(0,g.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{962:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var r=n(4848),i=n(8453),s=n(1470),a=n(9365);const l={title:"SSIMULACRA2",sidebar_position:1},o="SSIMULACRA2",c={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"}),"\n",(0,r.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,r.jsxs)(t.p,{children:["While a ",(0,r.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,r.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,r.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(a.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,r.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,r.jsxs)(a.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,r.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,r.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,r.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,r.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,r.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,r.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,r.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,r.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,r.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,r.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,r.jsxs)(t.p,{children:["Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.",(0,r.jsx)(t.br,{}),"\n","However, the speedup is worth it."]}),"\n",(0,r.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,r.jsx)(t.code,{children:"--frame-threads"})," or ",(0,r.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,r.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,r.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,r.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,r.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,r.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,r.jsx)(t.p,{children:"The score that ssimulacra2 outputs is simple:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Very high quality: ",(0,r.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,r.jsxs)(t.li,{children:["High quality: ",(0,r.jsx)(t.code,{children:"70"})," to ",(0,r.jsx)(t.code,{children:"90"})]}),"\n",(0,r.jsxs)(t.li,{children:["Medium quality: ",(0,r.jsx)(t.code,{children:"50"})," to ",(0,r.jsx)(t.code,{children:"70"})]}),"\n",(0,r.jsxs)(t.li,{children:["Low quality: Below ",(0,r.jsx)(t.code,{children:"50"})]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(4164);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),i=n(4164),s=n(3104),a=n(6347),l=n(205),o=n(7485),c=n(1682),u=n(9466);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),b=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=n(4848);function v(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=o.indexOf(t),i=l[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:i}=e;const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==i})))})}function y(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,x.jsx)(v,{...t,...e}),(0,x.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49b64d14.236264f0.js b/assets/js/49b64d14.7e9d5c35.js similarity index 98% rename from assets/js/49b64d14.236264f0.js rename to assets/js/49b64d14.7e9d5c35.js index 0e9a1a3a3..96e8f4bdc 100644 --- a/assets/js/49b64d14.236264f0.js +++ b/assets/js/49b64d14.7e9d5c35.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5993],{7490:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var n=i(4848),s=i(8453),r=i(1470),o=i(9365);const a={title:"SVT-AV1",sidebar_position:5},l="SVT-AV1",c={id:"encoders/SVT-AV1",title:"SVT-AV1",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/SVT-AV1.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1",permalink:"/docs/encoders/SVT-AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"rav1e",permalink:"/docs/encoders/rav1e"}},d={},h=[{value:"Community Forks",id:"community-forks",level:2},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"svt-av1",children:"SVT-AV1"}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(t.p,{children:['SVT-AV1 (Scalable Video Technology for AV1) is an AV1-compliant software encoder/decoder library. Jointly developed by Intel and Netflix, SVT-AV1 is written almost entirely in C with some parts written in C++ and Assembly. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:['This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,n.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", so the use of tools like ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," is less helpful albeit still helpful for scene detection."]}),"\n",(0,n.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,n.jsxs)(t.p,{children:["Currently, there is only one noteworthy community fork of SVT-AV1 called ",(0,n.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY is a community fork of SVT-AV1 that strives to improve the perceptual fidelity and quality of life provided by the encoder. The goal of this project is to create the best encoding implementation for perceptual quality with AV1, and it aims to surpass previous community forks of ",(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc#choosing-forks",children:"aomenc"})," in speed and visual quality."]}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY has a number of feature additions to the mainline SVT-AV1 encoder as well as modified defaults that aim to make it easier to produce a more perceptually optimal bistream. For a full list of the encoder's feature additions and modifications to defaults, see the ",(0,n.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/README.md#feature-additions",children:"project's README"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY is used by default in ",(0,n.jsx)(t.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"libsvtav1"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvtav1"}),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,n.jsx)(t.code,{children:"-svtav1-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone mainline SVT-AV1"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ngit reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada # Reset to release 2.0.0\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use clang when building SVT-AV1."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,n.jsx)(t.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,n.jsxs)(t.p,{children:["If you'd like to build from the latest release (2.0.0 at the time of writing - last updated 16 Apr 2024) please run ",(0,n.jsx)(t.code,{children:"git reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,n.jsxs)(t.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,n.jsxs)(t.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,n.jsx)(t.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,n.jsx)(t.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,n.jsx)(o.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsx)(t.h3,{id:"strengths",children:"Strengths"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1's greatest strength is its parallelization capability, where it outclasses other AV1 encoders by a significant margin. SVT-AV1's parallelization techniques do not involve tiling & don't harm video quality, & can comfortably utilize up to 16 cores given 1080p source video. This is while maintaining competitive coding efficiency to mainline aomenc. Perceptually, mainline SVT-AV1 is outperformed by well-tuned community forks of aomenc, but according to many the gap has begun to close with the introduction of SVT-AV1-PSY."}),"\n",(0,n.jsx)(t.h3,{id:"weaknesses",children:"Weaknesses"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is strongest on x86 CPUs, & while ARM NEON assembly is ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ba13fac241f1b54954935f2cb200efc07f3de13a",children:"available"})," and has been slowly improving since its introduction in version 1.8.0, SVT-AV1 still underperforms on ARM. For this reason, it is not a good cross-architecture CPU benchmark. SVT-AV1's support for various AV1 features is also limited; it only supports up to 4:2:0 chroma subsampling with no support for 12-bit color, and it does not support scene change detection (there are no plans to implement this, either). The smallest possible video that SVT-AV1 can produce is 64x64."]}),"\n",(0,n.jsx)(t.h3,{id:"encoder-optimization",children:"Encoder Optimization"}),"\n",(0,n.jsxs)(t.p,{children:["Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,n.jsx)(t.code,{children:"SvtAv1EncApp"})," binary parameters when encoding. The following applies to mainline SVT-AV1, but does not apply to SVT-AV1-PSY."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"--film-grain"})," & ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Most live-action sources feature hard-to-compress digital noise that is easily smoothed out by AV1 compression. To add this grain back, or even denoise through the encoder and then add grain, it is possible to use the ",(0,n.jsx)(t.code,{children:"--film-grain"})," parameter to specify an amount of film grain to add to the encode (& ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,n.jsx)(t.code,{children:"--film-grain"})," is recommended in most cases. According to ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#practical-advice-on-grain-synthesis",children:"SVT-AV1 documentation"}),", a level of 8 should be used for live-action content with a normal amount of grain while a level of 4 works well for hand-drawn animation or other smoother-looking sources that still stand to benefit from some grain synthesis."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--input-depth 10"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit. This option only produces a 10-bit AV1 bitstream if the source provided to the encoder is 10-bit."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--tune 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["There are three tunes in mainline SVT-AV1: Tune 1 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"}),", Tune 2 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," RDO, & Tune 0 is a ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"psychovisual"})," tune labeled VQ. It has been common practice to lean away from the PSNR tune, as it is not designed for visual quality but rather to perform better on the PSNR metric which is widely considered to be inconsistent with our human perception of fidelity. Using the VQ tune is a safe bet for now, but many believe the newer SSIM tune provides better visual fidelity. Using SVT-AV1-PSY, the custom Subjective SSIM tune (Tune 3) provides the best of both Tune 2 & Tune 0 with additional improvements as well."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--enable-qm 1"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Enables quantization matrices, disabled by default. Improves coding efficiency mainly by improving encoding speed while producing similar quality video."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--qm-min 0"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Sets the minimum flatness of quantization matrices to 0, down from the default 8. This is recommended unless you are dealing with extremely heavy grain. The maximum quantization matrix flatness is 15 by default, and should be left alone"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--keyint [FPS*10]"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Similar to ",(0,n.jsx)(t.code,{children:"--kf-max-dist"})," in ",(0,n.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", this tells the encoder when to place keyframes. Because SVT-AV1 doesn't have scene detection, this isn't the maximum distance between keyframes, but rather a fixed interval for placing keyframes. If using Av1an, set to -1 to disable keyframe insertion as Av1an handles that instead."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--irefresh-type 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,n.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,n.jsx)(t.code,{children:"--irefresh-type 2"})," until this is rectified."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--preset X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 can be used in 14 different presets, labeled -1 through 13. Preset -1 is the slowest, but provides the best coding efficiency; it is also dubbed a research preset that is not recommended for regular use. Preset 13 is the fastest, and is also not recommended for regular use as it makes serious trade-offs to achieve unrealistically fast speeds at the cost of the encoder's coding efficiency. Using presets 2 through 8 is the best course of action for non-realtime applications if you desire reasonable speed, while 9 through 12 are useful for real-time encoding at 1080p or lower, even on low-end consumer computer hardware."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--crf X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control capabilities."})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>o});i(6540);var n=i(8215);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function o(e){let{children:t,hidden:i,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>j});var n=i(6540),s=i(8215),r=i(3104),o=i(6347),a=i(205),l=i(7485),c=i(1682),d=i(9466);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:s}}=e;return{value:t,label:i,attributes:n,default:s}}))}(i);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const s=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:s}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[c,h]=m({queryString:i,groupId:s}),[f,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(i);return[s,(0,n.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),g=(()=>{const e=c??f;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{g&&l(g)}),[g]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),b(e)}),[h,b,r]),tabValues:r}}var b=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=i(4848);function x(e){let{className:t,block:i,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),s=a[i].value;s!==n&&(c(t),o(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:r}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function V(e){let{lazy:t,children:i,selectedValue:s}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...e,...t}),(0,v.jsx)(V,{...e,...t})]})}function j(e){const t=(0,b.A)();return(0,v.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var n=i(6540);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5993],{7490:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var n=i(4848),s=i(8453),r=i(1470),o=i(9365);const a={title:"SVT-AV1",sidebar_position:5},l="SVT-AV1",c={id:"encoders/SVT-AV1",title:"SVT-AV1",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/encoders/SVT-AV1.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1",permalink:"/docs/encoders/SVT-AV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"rav1e",permalink:"/docs/encoders/rav1e"}},d={},h=[{value:"Community Forks",id:"community-forks",level:2},{value:"SVT-AV1-PSY",id:"svt-av1-psy",level:3},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Encoding",id:"encoding",level:2},{value:"Strengths",id:"strengths",level:3},{value:"Weaknesses",id:"weaknesses",level:3},{value:"Encoder Optimization",id:"encoder-optimization",level:3}];function u(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"svt-av1",children:"SVT-AV1"}),"\n",(0,n.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(t.p,{children:['SVT-AV1 (Scalable Video Technology for AV1) is an AV1-compliant software encoder/decoder library. Jointly developed by Intel and Netflix, SVT-AV1 is written almost entirely in C with some parts written in C++ and Assembly. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:['This entry discusses the SVT-AV1 encoder, also known as the "Production" AV1 encoder (while ',(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc",children:"aomenc"}),' is the "reference" AV1 encoder), & refers to SVT-AV1 as such. SVT-AV1 is known for its parallelization, high coding efficiency, & active development. SVT-AV1 scales across multiple CPU cores much more effectively than aomenc or ',(0,n.jsx)(t.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", so the use of tools like ",(0,n.jsx)(t.a,{href:"/docs/utilities/av1an",children:"Av1an"})," is less helpful albeit still helpful for scene detection."]}),"\n",(0,n.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,n.jsxs)(t.p,{children:["Currently, there is only one noteworthy community fork of SVT-AV1 called ",(0,n.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"SVT-AV1-PSY"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"svt-av1-psy",children:"SVT-AV1-PSY"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY is a community fork of SVT-AV1 that strives to improve the perceptual fidelity and quality of life provided by the encoder. The goal of this project is to create the best encoding implementation for perceptual quality with AV1, and it aims to surpass previous community forks of ",(0,n.jsx)(t.a,{href:"/docs/encoders/aomenc#choosing-forks",children:"aomenc"})," in speed and visual quality."]}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY has a number of feature additions to the mainline SVT-AV1 encoder as well as modified defaults that aim to make it easier to produce a more perceptually optimal bistream. For a full list of the encoder's feature additions and modifications to defaults, see the ",(0,n.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy/blob/master/README.md#feature-additions",children:"project's README"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1-PSY is used by default in ",(0,n.jsx)(t.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"libsvtav1"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvtav1"}),". You can input non-FFmpeg standard SVT-AV1 parameters via ",(0,n.jsx)(t.code,{children:"-svtav1-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone mainline SVT-AV1"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ngit reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada # Reset to release 2.0.0\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use clang when building SVT-AV1."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,n.jsx)(t.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,n.jsxs)(t.p,{children:["If you'd like to build from the latest release (2.0.0 at the time of writing - last updated 16 Apr 2024) please run ",(0,n.jsx)(t.code,{children:"git reset --hard 2aeeb4f1a1d495b84bf5c21dbb60ae10e991fada"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,n.jsxs)(t.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,n.jsxs)(t.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,n.jsx)(t.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,n.jsx)(t.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,n.jsx)(o.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"encoding",children:"Encoding"}),"\n",(0,n.jsx)(t.h3,{id:"strengths",children:"Strengths"}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1's greatest strength is its parallelization capability, where it outclasses other AV1 encoders by a significant margin. SVT-AV1's parallelization techniques do not involve tiling & don't harm video quality, & can comfortably utilize up to 16 cores given 1080p source video. This is while maintaining competitive coding efficiency to mainline aomenc. Perceptually, mainline SVT-AV1 is outperformed by well-tuned community forks of aomenc, but according to many the gap has begun to close with the introduction of SVT-AV1-PSY."}),"\n",(0,n.jsx)(t.h3,{id:"weaknesses",children:"Weaknesses"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-AV1 is strongest on x86 CPUs, & while ARM NEON assembly is ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ba13fac241f1b54954935f2cb200efc07f3de13a",children:"available"})," and has been slowly improving since its introduction in version 1.8.0, SVT-AV1 still underperforms on ARM. For this reason, it is not a good cross-architecture CPU benchmark. SVT-AV1's support for various AV1 features is also limited; it only supports up to 4:2:0 chroma subsampling with no support for 12-bit color, and it does not support scene change detection (there are no plans to implement this, either). The smallest possible video that SVT-AV1 can produce is 64x64."]}),"\n",(0,n.jsx)(t.h3,{id:"encoder-optimization",children:"Encoder Optimization"}),"\n",(0,n.jsxs)(t.p,{children:["Aside from build optimizations for speed, there is further tweaking to be done to the ",(0,n.jsx)(t.code,{children:"SvtAv1EncApp"})," binary parameters when encoding. The following applies to mainline SVT-AV1, but does not apply to SVT-AV1-PSY."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"--film-grain"})," & ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Most live-action sources feature hard-to-compress digital noise that is easily smoothed out by AV1 compression. To add this grain back, or even denoise through the encoder and then add grain, it is possible to use the ",(0,n.jsx)(t.code,{children:"--film-grain"})," parameter to specify an amount of film grain to add to the encode (& ",(0,n.jsx)(t.code,{children:"--film-grain-denoise"})," to specify how to denoise the input video before encoding for potentially better appeal). Denoising a video always removes fine details, so sticking with just ",(0,n.jsx)(t.code,{children:"--film-grain"})," is recommended in most cases. According to ",(0,n.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#practical-advice-on-grain-synthesis",children:"SVT-AV1 documentation"}),", a level of 8 should be used for live-action content with a normal amount of grain while a level of 4 works well for hand-drawn animation or other smoother-looking sources that still stand to benefit from some grain synthesis."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--input-depth 10"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"10-bit output from AV1 encoding is always desirable for coding efficiency, even if your source is 8-bit. This option only produces a 10-bit AV1 bitstream if the source provided to the encoder is 10-bit."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--tune 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["There are three tunes in mainline SVT-AV1: Tune 1 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"}),", Tune 2 is for ",(0,n.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"})," RDO, & Tune 0 is a ",(0,n.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"psychovisual"})," tune labeled VQ. It has been common practice to lean away from the PSNR tune, as it is not designed for visual quality but rather to perform better on the PSNR metric which is widely considered to be inconsistent with our human perception of fidelity. Using the VQ tune is a safe bet for now, but many believe the newer SSIM tune provides better visual fidelity. Using SVT-AV1-PSY, the custom Subjective SSIM tune (Tune 3) provides the best of both Tune 2 & Tune 0 with additional improvements as well."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--enable-qm 1"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Enables quantization matrices, disabled by default. Improves coding efficiency mainly by improving encoding speed while producing similar quality video."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--qm-min 0"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Sets the minimum flatness of quantization matrices to 0, down from the default 8. This is recommended unless you are dealing with extremely heavy grain. The maximum quantization matrix flatness is 15 by default, and should be left alone"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--keyint [FPS*10]"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Similar to ",(0,n.jsx)(t.code,{children:"--kf-max-dist"})," in ",(0,n.jsx)(t.a,{href:"/docs/encoders/vpxenc",children:"vpxenc"}),", this tells the encoder when to place keyframes. Because SVT-AV1 doesn't have scene detection, this isn't the maximum distance between keyframes, but rather a fixed interval for placing keyframes. If using Av1an, set to -1 to disable keyframe insertion as Av1an handles that instead."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--irefresh-type 2"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Intra refresh is specified through this option, & lets the user decide between Closed GOP & Open GOP. GOP stands for Group of Pictures. Open GOP allows GOPs to ",(0,n.jsx)(t.a,{href:"https://ottverse.com/closed-gop-open-gop-idr/",children:"reference one another"}),", but support for this feature is currently incomplete. Therefore, it is recommended to use Closed GOP for the time being via ",(0,n.jsx)(t.code,{children:"--irefresh-type 2"})," until this is rectified."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--preset X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"SVT-AV1 can be used in 14 different presets, labeled -1 through 13. Preset -1 is the slowest, but provides the best coding efficiency; it is also dubbed a research preset that is not recommended for regular use. Preset 13 is the fastest, and is also not recommended for regular use as it makes serious trade-offs to achieve unrealistically fast speeds at the cost of the encoder's coding efficiency. Using presets 2 through 8 is the best course of action for non-realtime applications if you desire reasonable speed, while 9 through 12 are useful for real-time encoding at 1080p or lower, even on low-end consumer computer hardware."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.code,{children:"--crf X"})}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"CRF is the best way to target quality for optimal visual fidelity. VBR & CBR lose efficiency due to their inherently limited rate control capabilities."})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>o});i(6540);var n=i(4164);const s={tabItem:"tabItem_Ymn6"};var r=i(4848);function o(e){let{children:t,hidden:i,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>j});var n=i(6540),s=i(4164),r=i(3104),o=i(6347),a=i(205),l=i(7485),c=i(1682),d=i(9466);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:s}}=e;return{value:t,label:i,attributes:n,default:s}}))}(i);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const s=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:s}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[c,h]=m({queryString:i,groupId:s}),[f,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(i);return[s,(0,n.useCallback)((e=>{i&&r.set(e)}),[i,r])]}({groupId:s}),g=(()=>{const e=c??f;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{g&&l(g)}),[g]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),b(e)}),[h,b,r]),tabValues:r}}var b=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=i(4848);function x(e){let{className:t,block:i,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),s=a[i].value;s!==n&&(c(t),o(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:r}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function V(e){let{lazy:t,children:i,selectedValue:s}=e;const r=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...t,...e}),(0,v.jsx)(V,{...t,...e})]})}function j(e){const t=(0,b.A)();return(0,v.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var n=i(6540);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/53a3e6dc.5c1e50b8.js b/assets/js/53a3e6dc.5c1e50b8.js new file mode 100644 index 000000000..7d4f5baec --- /dev/null +++ b/assets/js/53a3e6dc.5c1e50b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6261],{922:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5c30ba71.0d3ec2f2.js b/assets/js/5c30ba71.0d3ec2f2.js new file mode 100644 index 000000000..1d9d9a5c6 --- /dev/null +++ b/assets/js/5c30ba71.0d3ec2f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3549],{9406:e=>{e.exports=JSON.parse('{"tag":{"label":"compression","permalink":"/blog/tags/compression","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.2ccfc993.js b/assets/js/5e95c892.f5aa597e.js similarity index 81% rename from assets/js/5e95c892.2ccfc993.js rename to assets/js/5e95c892.f5aa597e.js index 11aa9429b..079dc8148 100644 --- a/assets/js/5e95c892.2ccfc993.js +++ b/assets/js/5e95c892.f5aa597e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9647],{7121:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});s(6540);var r=s(8215),u=s(1213),a=s(7559),i=s(2831),d=s(5476),n=s(4848);function t(e){return(0,n.jsx)(u.e3,{className:(0,r.A)(a.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,i.v)(e.route.routes)})})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9647],{7121:(e,c,s)=>{s.r(c),s.d(c,{default:()=>t});s(6540);var r=s(4164),u=s(1213),a=s(7559),i=s(2831),d=s(5476),n=s(4848);function t(e){return(0,n.jsx)(u.e3,{className:(0,r.A)(a.G.wrapper.docsPages),children:(0,n.jsx)(d.A,{children:(0,i.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5f74c797.5560fcbf.js b/assets/js/5f74c797.a86bcbac.js similarity index 98% rename from assets/js/5f74c797.5560fcbf.js rename to assets/js/5f74c797.a86bcbac.js index f75464d9f..e4ffee212 100644 --- a/assets/js/5f74c797.5560fcbf.js +++ b/assets/js/5f74c797.a86bcbac.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5745],{2316:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var r=i(4848),a=i(8453),t=i(1470),s=i(9365);const o={title:"Av1an",sidebar_position:2,templating:!0},l="Av1an",c={id:"utilities/av1an",title:"Av1an",description:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.",source:"@site/docs/utilities/av1an.mdx",sourceDirName:"utilities",slug:"/utilities/av1an",permalink:"/docs/utilities/av1an",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Av1an",sidebar_position:2,templating:!0},sidebar:"tutorialSidebar",previous:{title:"Aviator",permalink:"/docs/utilities/Aviator"},next:{title:"ffmpeg",permalink:"/docs/utilities/ffmpeg"}},d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Windows",id:"windows",level:3},{value:"Script",id:"script",level:4},{value:"Pre-built Binary",id:"pre-built-binary",level:4},{value:"Compile from Source",id:"compile-from-source",level:4},{value:"macOS",id:"macos",level:3},{value:"Using MacPorts",id:"using-macports",level:4},{value:"Compile from Source",id:"compile-from-source-1",level:4},{value:"Linux",id:"linux",level:3},{value:"Package Managers",id:"package-managers",level:4},{value:"Compile from Source",id:"compile-from-source-2",level:4},{value:"Docker",id:"docker",level:3},{value:"Installing Dependencies",id:"installing-dependencies",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:""Error: The file 'XXXXX.ivf' could not be opened for reading: open file error." with mkvmerge on Linux",id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",level:3},{value:"Gray screen flashing for a single frame in output",id:"gray-screen-flashing-for-a-single-frame-in-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"av1an",children:"Av1an"}),"\n",(0,r.jsxs)("picture",{children:[(0,r.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,r.jsx)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers"})]}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(n.p,{children:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding."}),"\n",(0,r.jsx)(n.p,{children:'The only downside to this, is that RAM usage increases significantly with each "worker" you add, so if you have a low amount of RAM (< 8GB), this might not be that useful to you.'}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Av1an does not ship with any dependencies except for it's Docker image, so you will have to provide them on your own."})}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.p,{children:["You will need Python, ",(0,r.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and ",(0,r.jsx)(n.a,{href:"/docs/filtering/vapoursynth",children:"Vapoursynth"})," to be installed regardless of your current operating system."]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,r.jsx)(n.h4,{id:"script",children:"Script"}),"\n",(0,r.jsxs)(n.p,{children:["Windows users can use this ",(0,r.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"script"})," which installs everything needed in a single portable folder. Do note that you will need to update the dependencies manually once installed."]}),"\n",(0,r.jsx)(n.h4,{id:"pre-built-binary",children:"Pre-built Binary"}),"\n",(0,r.jsxs)(n.p,{children:['Av1an is available as a pre-built binary under the "',(0,r.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases/tag/latest",children:"latest"}),'" tag on GitHub releases, you can simply download that and place it wherever you want.']}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["To compile from source, it is easier to use mingw-w64 which comes with ",(0,r.jsx)(n.a,{href:"https://msys2.org",children:"MSYS2"}),". Once installed, open MinGW64 and run the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -Syuu; pacman -S cmake git nasm python3 mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-rust mingw-w64-x86_64-lld mingw-w64-x86_64-clang mingw-w64-x86_64-make\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Then, before you do anything further. Download Vapoursynth ",(0,r.jsx)(n.strong,{children:"portable"})," (",(0,r.jsx)(n.code,{children:"VapourSynth64-Portable-RXX.7z"}),") from its GitHub ",(0,r.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"release page"}),". Make sure the version you chose is compatible with the current MinGW64 Python version. For example, R65 supports 3.8 and 3.11, the version from Pacman (currently) is 3.11, so you should choose that."]}),"\n",(0,r.jsxs)(n.p,{children:["After downloading, open the 7z file and head to ",(0,r.jsx)(n.code,{children:"\\sdk\\lib64"}),", copy all the libraries from there to MinGW64's ",(0,r.jsx)(n.code,{children:"lib"})," directory, this usually resides in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\mingw64\\lib"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Now finally, resume your session and run the following:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The binary will be available in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\home\\USER\\Av1an\\target\\release"}),". The ",(0,r.jsx)(n.code,{children:"USER"})," part is your Windows username."]}),"\n",(0,r.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,r.jsx)(n.h4,{id:"using-macports",children:"Using MacPorts"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the MacPorts repository, to install just simply run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"port install av1an\n"})}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-1",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["You need to have Git, Nasm, and Rust to be installed first. You can achieve this by using ",(0,r.jsx)(n.a,{href:"https://brew.sh/",children:"Homebrew"})," or similar."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,r.jsx)(n.h4,{id:"package-managers",children:"Package Managers"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the package manager of some distributions such as Arch Linux. If not, you can skip to the next part every Linux user is familiar with."}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-2",children:"Compile from Source"}),"\n",(0,r.jsx)(n.p,{children:"Just like macOS, you need to have Git, Nasm, and Rust to be installed. Can be achieved by either using your package manager or Rustup for Rust."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"})," or ",(0,r.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(n.p,{children:"The following examples assume the file you want to encode is in your current working directory."}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(s.A,{value:"windows",label:"Windows",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsx)(s.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsxs)(s.A,{value:"build",label:"Manual Build",children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker build -t "av1an" .\n'})}),(0,r.jsx)(n.p,{children:"Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."})]})]}),"\n",(0,r.jsxs)(n.admonition,{type:"info",children:[(0,r.jsx)(n.p,{children:"To specify a different directory to use you would replace $(pwd) with the directory"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"--user"})," flag is required on Linux to avoid permission issues with the docker container not being able to write to the location, if you get permission issues ensure your user has access to the folder that you are using to encode."]})]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"The Docker image ships with the default dependencies."})}),"\n",(0,r.jsx)(n.h2,{id:"installing-dependencies",children:"Installing Dependencies"}),"\n",(0,r.jsx)(n.p,{children:"You will need a chunk method installed as the built-in ones are very slow."}),"\n",(0,r.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsx)(n.h3,{id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",children:"\"Error: The file 'XXXXX.ivf' could not be opened for reading: open file error.\" with mkvmerge on Linux"}),"\n",(0,r.jsxs)(n.p,{children:["Since mkvmerge opens all the encoded chunks at once, this obviously hits the default open file descriptor limit of 1024 on longer videos.\nYou can temporarily increase it with ",(0,r.jsx)(n.code,{children:"ulimit -n 20000"})," to allow opening 20,000 files at once in that session."]}),"\n",(0,r.jsx)(n.h3,{id:"gray-screen-flashing-for-a-single-frame-in-output",children:"Gray screen flashing for a single frame in output"}),"\n",(0,r.jsx)(n.p,{children:"This is a unique problem with Av1an. Since Av1an does random seeking for chunks, traditional keyframe-based decoding methods\nsuch as L-SMASH and FFMS2 may fail and result in a gray frame. There are currently only two known methods to solve this:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a lossless intermediary with x264 ",(0,r.jsx)(n.code,{children:"-qp 0"}),", this always fixes all related seeking issues but will result in a huge file due to it's lossless nature."]}),"\n",(0,r.jsxs)(n.li,{children:["Using a linear-decoding chunk method such as ",(0,r.jsx)(n.code,{children:"bestsource"}),", the downside to this is it's mega slow. Tests shown encode speeds drop by a whopping 10-15x slower."]}),"\n",(0,r.jsxs)(n.li,{children:["Using ",(0,r.jsx)(n.code,{children:"dgdecnv"})," chunk method. ",(0,r.jsx)(n.code,{children:"dgdecnv"})," and ",(0,r.jsx)(n.code,{children:"DGIndexNV"}),' is a proprietary CUVID-accelerated Vapoursynth "Source" decoder created by ',(0,r.jsx)(n.a,{href:"https://www.rationalqm.us/",children:"Donald Alan Graft"})," where ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," is the standalone program for seeking and ",(0,r.jsx)(n.code,{children:"dgdecnv"})," is the Vapoursynth plugin itself.\nIt is especially made with random seeking in mind which makes it perfect for Av1an. Only downside is you need an NVIDIA GPU and ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," only supports x86_64 platforms."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var r=i(8215);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>j});var r=i(6540),a=i(8215),t=i(3104),s=i(6347),o=i(205),l=i(7485),c=i(1682),d=i(9466);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:i}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:i,attributes:r,default:a}}=e;return{value:n,label:i,attributes:r,default:a}}))}(i);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function p(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:i}=e;const a=(0,s.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,l.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function g(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=h(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=i.find((e=>e.default))??i[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t}))),[c,u]=m({queryString:i,groupId:a}),[g,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,r.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,t]),tabValues:t}}var f=i(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function b(e){let{className:n,block:i,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=l.indexOf(n),a=o[i].value;a!==r&&(c(n),s(a))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;n=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;n=l[i]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:o.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...t,className:(0,a.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":r===n}),children:i??n},n)}))})}function y(e){let{lazy:n,children:i,selectedValue:a}=e;const t=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function w(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(b,{...e,...n}),(0,x.jsx)(y,{...e,...n})]})}function j(e){const n=(0,f.A)();return(0,x.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var r=i(6540);const a={},t=r.createContext(a);function s(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5745],{2316:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var r=i(4848),a=i(8453),t=i(1470),s=i(9365);const o={title:"Av1an",sidebar_position:2,templating:!0},l="Av1an",c={id:"utilities/av1an",title:"Av1an",description:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.",source:"@site/docs/utilities/av1an.mdx",sourceDirName:"utilities",slug:"/utilities/av1an",permalink:"/docs/utilities/av1an",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/av1an.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Av1an",sidebar_position:2,templating:!0},sidebar:"tutorialSidebar",previous:{title:"Aviator",permalink:"/docs/utilities/Aviator"},next:{title:"ffmpeg",permalink:"/docs/utilities/ffmpeg"}},d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Windows",id:"windows",level:3},{value:"Script",id:"script",level:4},{value:"Pre-built Binary",id:"pre-built-binary",level:4},{value:"Compile from Source",id:"compile-from-source",level:4},{value:"macOS",id:"macos",level:3},{value:"Using MacPorts",id:"using-macports",level:4},{value:"Compile from Source",id:"compile-from-source-1",level:4},{value:"Linux",id:"linux",level:3},{value:"Package Managers",id:"package-managers",level:4},{value:"Compile from Source",id:"compile-from-source-2",level:4},{value:"Docker",id:"docker",level:3},{value:"Installing Dependencies",id:"installing-dependencies",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:""Error: The file 'XXXXX.ivf' could not be opened for reading: open file error." with mkvmerge on Linux",id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",level:3},{value:"Gray screen flashing for a single frame in output",id:"gray-screen-flashing-for-a-single-frame-in-output",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"av1an",children:"Av1an"}),"\n",(0,r.jsxs)("picture",{children:[(0,r.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/codec-wiki/main/static/img/av1an_96_workers.avif",type:"image/avif"}),(0,r.jsx)("img",{src:"https://autumn.revolt.chat/attachments/K3OhOCAy9bkUCkImek_q3-t6q3zctbn9SbWW-_RI19/av1an_96_workers.webp",alt:"Av1an with 96 workers"})]}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsx)(n.p,{children:"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding."}),"\n",(0,r.jsx)(n.p,{children:'The only downside to this, is that RAM usage increases significantly with each "worker" you add, so if you have a low amount of RAM (< 8GB), this might not be that useful to you.'}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Av1an does not ship with any dependencies except for it's Docker image, so you will have to provide them on your own."})}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.p,{children:["You will need Python, ",(0,r.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," and ",(0,r.jsx)(n.a,{href:"/docs/filtering/vapoursynth",children:"Vapoursynth"})," to be installed regardless of your current operating system."]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,r.jsx)(n.h4,{id:"script",children:"Script"}),"\n",(0,r.jsxs)(n.p,{children:["Windows users can use this ",(0,r.jsx)(n.a,{href:"https://github.com/Hishiro64/av1an-win-script",children:"script"})," which installs everything needed in a single portable folder. Do note that you will need to update the dependencies manually once installed."]}),"\n",(0,r.jsx)(n.h4,{id:"pre-built-binary",children:"Pre-built Binary"}),"\n",(0,r.jsxs)(n.p,{children:['Av1an is available as a pre-built binary under the "',(0,r.jsx)(n.a,{href:"https://github.com/master-of-zen/Av1an/releases/tag/latest",children:"latest"}),'" tag on GitHub releases, you can simply download that and place it wherever you want.']}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["To compile from source, it is easier to use mingw-w64 which comes with ",(0,r.jsx)(n.a,{href:"https://msys2.org",children:"MSYS2"}),". Once installed, open MinGW64 and run the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"pacman -Syuu; pacman -S cmake git nasm python3 mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-rust mingw-w64-x86_64-lld mingw-w64-x86_64-clang mingw-w64-x86_64-make\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Then, before you do anything further. Download Vapoursynth ",(0,r.jsx)(n.strong,{children:"portable"})," (",(0,r.jsx)(n.code,{children:"VapourSynth64-Portable-RXX.7z"}),") from its GitHub ",(0,r.jsx)(n.a,{href:"https://github.com/vapoursynth/vapoursynth/releases",children:"release page"}),". Make sure the version you chose is compatible with the current MinGW64 Python version. For example, R65 supports 3.8 and 3.11, the version from Pacman (currently) is 3.11, so you should choose that."]}),"\n",(0,r.jsxs)(n.p,{children:["After downloading, open the 7z file and head to ",(0,r.jsx)(n.code,{children:"\\sdk\\lib64"}),", copy all the libraries from there to MinGW64's ",(0,r.jsx)(n.code,{children:"lib"})," directory, this usually resides in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\mingw64\\lib"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Now finally, resume your session and run the following:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The binary will be available in ",(0,r.jsx)(n.code,{children:"C:\\msys64\\home\\USER\\Av1an\\target\\release"}),". The ",(0,r.jsx)(n.code,{children:"USER"})," part is your Windows username."]}),"\n",(0,r.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,r.jsx)(n.h4,{id:"using-macports",children:"Using MacPorts"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the MacPorts repository, to install just simply run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"port install av1an\n"})}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-1",children:"Compile from Source"}),"\n",(0,r.jsxs)(n.p,{children:["You need to have Git, Nasm, and Rust to be installed first. You can achieve this by using ",(0,r.jsx)(n.a,{href:"https://brew.sh/",children:"Homebrew"})," or similar."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,r.jsx)(n.h4,{id:"package-managers",children:"Package Managers"}),"\n",(0,r.jsx)(n.p,{children:"Av1an is available in the package manager of some distributions such as Arch Linux. If not, you can skip to the next part every Linux user is familiar with."}),"\n",(0,r.jsx)(n.h4,{id:"compile-from-source-2",children:"Compile from Source"}),"\n",(0,r.jsx)(n.p,{children:"Just like macOS, you need to have Git, Nasm, and Rust to be installed. Can be achieved by either using your package manager or Rustup for Rust."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/master-of-zen/Av1an.git\ncd Av1an\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Binary is located in ",(0,r.jsx)(n.code,{children:"Av1an/target/release"}),", you can optionally place it somewhere like ",(0,r.jsx)(n.code,{children:"/usr/local/bin"})," or ",(0,r.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(n.p,{children:"The following examples assume the file you want to encode is in your current working directory."}),"\n",(0,r.jsxs)(t.A,{children:[(0,r.jsx)(s.A,{value:"windows",label:"Windows",default:!0,children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "$(pwd):/videos" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsx)(s.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "${PWD}:/videos" -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})})}),(0,r.jsxs)(s.A,{value:"build",label:"Manual Build",children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker build -t "av1an" .\n'})}),(0,r.jsx)(n.p,{children:"Run in the root directory of the repository. The dependencies will automatically be installed into the image, no manual installations necessary."})]})]}),"\n",(0,r.jsxs)(n.admonition,{type:"info",children:[(0,r.jsx)(n.p,{children:"To specify a different directory to use you would replace $(pwd) with the directory"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker run --privileged -v "/c/Users/masterofzen/Videos":/videos --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i S01E01.mkv {options}\n'})}),(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"--user"})," flag is required on Linux to avoid permission issues with the docker container not being able to write to the location, if you get permission issues ensure your user has access to the folder that you are using to encode."]})]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"The Docker image ships with the default dependencies."})}),"\n",(0,r.jsx)(n.h2,{id:"installing-dependencies",children:"Installing Dependencies"}),"\n",(0,r.jsx)(n.p,{children:"You will need a chunk method installed as the built-in ones are very slow."}),"\n",(0,r.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsx)(n.h3,{id:"error-the-file-xxxxxivf-could-not-be-opened-for-reading-open-file-error-with-mkvmerge-on-linux",children:"\"Error: The file 'XXXXX.ivf' could not be opened for reading: open file error.\" with mkvmerge on Linux"}),"\n",(0,r.jsxs)(n.p,{children:["Since mkvmerge opens all the encoded chunks at once, this obviously hits the default open file descriptor limit of 1024 on longer videos.\nYou can temporarily increase it with ",(0,r.jsx)(n.code,{children:"ulimit -n 20000"})," to allow opening 20,000 files at once in that session."]}),"\n",(0,r.jsx)(n.h3,{id:"gray-screen-flashing-for-a-single-frame-in-output",children:"Gray screen flashing for a single frame in output"}),"\n",(0,r.jsx)(n.p,{children:"This is a unique problem with Av1an. Since Av1an does random seeking for chunks, traditional keyframe-based decoding methods\nsuch as L-SMASH and FFMS2 may fail and result in a gray frame. There are currently only two known methods to solve this:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a lossless intermediary with x264 ",(0,r.jsx)(n.code,{children:"-qp 0"}),", this always fixes all related seeking issues but will result in a huge file due to it's lossless nature."]}),"\n",(0,r.jsxs)(n.li,{children:["Using a linear-decoding chunk method such as ",(0,r.jsx)(n.code,{children:"bestsource"}),", the downside to this is it's mega slow. Tests shown encode speeds drop by a whopping 10-15x slower."]}),"\n",(0,r.jsxs)(n.li,{children:["Using ",(0,r.jsx)(n.code,{children:"dgdecnv"})," chunk method. ",(0,r.jsx)(n.code,{children:"dgdecnv"})," and ",(0,r.jsx)(n.code,{children:"DGIndexNV"}),' is a proprietary CUVID-accelerated Vapoursynth "Source" decoder created by ',(0,r.jsx)(n.a,{href:"https://www.rationalqm.us/",children:"Donald Alan Graft"})," where ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," is the standalone program for seeking and ",(0,r.jsx)(n.code,{children:"dgdecnv"})," is the Vapoursynth plugin itself.\nIt is especially made with random seeking in mind which makes it perfect for Av1an. Only downside is you need an NVIDIA GPU and ",(0,r.jsx)(n.code,{children:"DGIndexNV"})," only supports x86_64 platforms."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var r=i(4164);const a={tabItem:"tabItem_Ymn6"};var t=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>j});var r=i(6540),a=i(4164),t=i(3104),s=i(6347),o=i(205),l=i(7485),c=i(1682),d=i(9466);function u(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:i}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:i,attributes:r,default:a}}=e;return{value:n,label:i,attributes:r,default:a}}))}(i);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function p(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:i}=e;const a=(0,s.W6)(),t=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,l.aZ)(t),(0,r.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(a.location.search);n.set(t,e),a.replace({...a.location,search:n.toString()})}),[t,a])]}function g(e){const{defaultValue:n,queryString:i=!1,groupId:a}=e,t=h(e),[s,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=i.find((e=>e.default))??i[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t}))),[c,u]=m({queryString:i,groupId:a}),[g,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[a,t]=(0,d.Dv)(i);return[a,(0,r.useCallback)((e=>{i&&t.set(e)}),[i,t])]}({groupId:a}),v=(()=>{const e=c??g;return p({value:e,tabValues:t})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),f(e)}),[u,f,t]),tabValues:t}}var f=i(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function b(e){let{className:n,block:i,selectedValue:r,selectValue:s,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,t.a_)(),d=e=>{const n=e.currentTarget,i=l.indexOf(n),a=o[i].value;a!==r&&(c(n),s(a))},u=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;n=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;n=l[i]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":i},n),children:o.map((e=>{let{value:n,label:i,attributes:t}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:u,onClick:d,...t,className:(0,a.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":r===n}),children:i??n},n)}))})}function y(e){let{lazy:n,children:i,selectedValue:a}=e;const t=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function w(e){const n=g(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",v.tabList),children:[(0,x.jsx)(b,{...n,...e}),(0,x.jsx)(y,{...n,...e})]})}function j(e){const n=(0,f.A)();return(0,x.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var r=i(6540);const a={},t=r.createContext(a);function s(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.1ca9f5e5.js b/assets/js/6875c492.bf1091d0.js similarity index 96% rename from assets/js/6875c492.1ca9f5e5.js rename to assets/js/6875c492.bf1091d0.js index 695d2bf2e..b8a669235 100644 --- a/assets/js/6875c492.1ca9f5e5.js +++ b/assets/js/6875c492.bf1091d0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4813],{7713:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(1312),a=n(9022),i=n(4848);function l(e){const{metadata:t}=e,{previousPage:n,nextPage:l}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),l&&(0,i.jsx)(a.A,{permalink:l,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(7131),a=n(4651),i=n(4848);function l(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(8215),a=n(1312),i=n(5846),l=n(1213),r=n(7559),o=n(8774),c=n(6535),d=n(7713),g=n(1463),u=n(3892),h=n(996),p=n(1107),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l.be,{title:n}),(0,m.jsx)(g.A,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const l=x(t);return(0,m.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.A,{as:"h1",children:l}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(l.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},996:(e,t,n)=>{n.d(t,{A:()=>h});n(6540);var s=n(8215),a=n(1312),i=n(5260),l=n(4848);function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),g=n(7293);function u(e){let{className:t}=e;return(0,l.jsx)(g.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,l.jsx)(o,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4813],{7713:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(1312),a=n(9022),i=n(4848);function l(e){const{metadata:t}=e,{previousPage:n,nextPage:l}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),l&&(0,i.jsx)(a.A,{permalink:l,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var s=n(7131),a=n(4651),i=n(4848);function l(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),a=n(1312),i=n(5846),l=n(1213),r=n(7559),o=n(8774),c=n(6535),d=n(7713),g=n(1463),u=n(3892),h=n(996),p=n(1107),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l.be,{title:n}),(0,m.jsx)(g.A,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const l=x(t);return(0,m.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.A,{as:"h1",children:l}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(l.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},996:(e,t,n)=>{n.d(t,{A:()=>h});n(6540);var s=n(4164),a=n(1312),i=n(5260),l=n(4848);function r(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,l.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),g=n(7293);function u(e){let{className:t}=e;return(0,l.jsx)(g.A,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,l.jsx)(o,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/74450489.17bc6034.js b/assets/js/74450489.17bc6034.js deleted file mode 100644 index 35a9816ae..000000000 --- a/assets/js/74450489.17bc6034.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7686],{4939:e=>{e.exports=JSON.parse('{"label":"web","permalink":"/blog/tags/web","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/772.fe90f809.js b/assets/js/772.fa094b13.js similarity index 70% rename from assets/js/772.fe90f809.js rename to assets/js/772.fa094b13.js index adedaea3d..b292d7f2c 100644 --- a/assets/js/772.fe90f809.js +++ b/assets/js/772.fa094b13.js @@ -1,2 +1,2 @@ -/*! For license information please see 772.fe90f809.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[772],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>w,cM:()=>y});var r=n(2456),o=n(6250),i=2,a=.16,c=.05,s=.05,l=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function h(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function v(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function g(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+c*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function m(e,t,n){var r;return(r=n?e.v+s*t:e.v-l*t)>1&&(r=1),Number(r.toFixed(2))}function y(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),c=h((0,o.RO)({h:v(a,i,!0),s:g(a,i,!0),v:m(a,i,!0)}));n.push(c)}n.push(h(r));for(var s=1;s<=d;s+=1){var l=p(r),y=h((0,o.RO)({h:v(l,s),s:g(l,s),v:m(l,s)}));n.push(y)}return"dark"===t.theme?f.map((function(e){var r,i,a,c=e.index,s=e.opacity;return h((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[c]),a=100*s/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var b={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},S={};Object.keys(b).forEach((function(e){A[e]=y(b[e]),A[e].primary=A[e][5],S[e]=y(b[e],{theme:"dark",backgroundColor:"#141414"}),S[e].primary=S[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var w=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>ct,an:()=>T,Ki:()=>j,zA:()=>H,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(6636),i=n(4241),a=n(9379);const c=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var s=n(5089),l=n(6540),u=n.t(l,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function h(e){return e.join(p)}const v=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(h(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(h(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var g="data-token-hash",m="data-css-hash",y="__cssinjs_instance__";function b(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(m,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[y]=t[y]||e,t[y]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(m,"]"))).forEach((function(t){var n,o=t.getAttribute(m);r[o]?t[y]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new v(e)}var A=l.createContext({hashPriority:"low",cache:b(),defaultCache:!0});const S=A;var w=n(2284),x=n(998);var k=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),O=new k;function T(e){var t=Array.isArray(e)?e:[e];return O.has(t)||O.set(t,new M(t)),O.get(t)}var L=new WeakMap,I={};var R=new WeakMap;function z(e){var t=R.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof M?t+=r.id:r&&"object"===(0,w.A)(r)?t+=z(r):t+=r})),R.set(e,t)),t}function P(e,t){return c("".concat(t,"_").concat(z(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var N=(0,x.A)();function H(e){return"number"==typeof e?"".concat(e,"px"):e}function $(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var c=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,g,t),(0,r.A)(o,m,n),o)),s=Object.keys(c).map((function(e){var t=c[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var j=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},_=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,c=(0,o.A)(e,2),s=c[0],l=c[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[s])i[s]=l;else if(!("string"!=typeof l&&"number"!=typeof l||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[s])){var u,d=j(s,null==n?void 0:n.prefix);r[d]="number"!=typeof l||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[s]?String(l):"".concat(l,"px"),i[s]="var(".concat(d,")")}})),[i,_(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),F=(0,a.A)({},u).useInsertionEffect;const W=F?function(e,t,n){return F((function(){return e(),t()}),n)}:function(e,t,n){l.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return l.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const U=function(){return!1};function Y(e,t,n,r,a){var c=l.useContext(S).cache,s=h([e].concat((0,i.A)(t))),u=X([s]),d=(U(),function(e){c.opUpdate(s,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var c=[void 0===a?0:a,i[1]||n()];return e?e(c):c}))});l.useMemo((function(){d()}),[s]);var f=c.opGet(s)[1];return W((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){c.opUpdate(s,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],l=void 0===a?0:a,d=i[1];return 0===l-1?(u((function(){!e&&c.opGet(s)||null==r||r(d,!1)})),null):[l-1,d]}))}}),[s]),f}var G={},q="css",K=new Map;var V=0;function Z(e,t){K.set(e,(K.get(e)||0)-1);var n=Array.from(K.keys()),r=n.filter((function(e){return(K.get(e)||0)<=0}));n.length-r.length>V&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(g,'="').concat(e,'"]')).forEach((function(e){var n;e[y]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),K.delete(e)}))}var Q=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,l.useContext)(S),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,h=n.override,v=void 0===h?G:h,b=n.formatToken,A=n.getComputedToken,w=n.cssVar,x=function(e,t){for(var n=L,r=0;r0?he(Ce,--xe):0,Se--,10===ke&&(Se=1,Ae--),ke}function Oe(){return ke=xe2||Re(ke)>3?"":" "}function $e(e,t){for(;--t&&Oe()&&!(ke<48||ke>102||ke>57&&ke<65||ke>70&&ke<97););return Ie(e,Le()+(t<6&&32==Te()&&32==Oe()))}function je(e){for(;Oe();)switch(ke){case e:return xe;case 34:case 39:34!==e&&39!==e&&je(ke);break;case 40:41===e&&je(e);break;case 92:Oe()}return xe}function _e(e,t){for(;Oe()&&e+ke!==57&&(e+ke!==84||47!==Te()););return"/*"+Ie(t,xe-1)+"*"+ue(47===e?e:Oe())}function De(e){for(;!Re(Te());)Oe();return Ie(e,xe)}function Be(e){return Pe(Fe("",null,null,null,[""],e=ze(e),0,[0],e))}function Fe(e,t,n,r,o,i,a,c,s){for(var l=0,u=0,d=a,f=0,p=0,h=0,v=1,g=1,m=1,y=0,b="",A=o,S=i,w=r,x=b;g;)switch(h=y,y=Oe()){case 40:if(108!=h&&58==he(x,d-1)){-1!=pe(x+=fe(Ne(y),"&","&\f"),"&\f",le(l?c[l-1]:0))&&(m=-1);break}case 34:case 39:case 91:x+=Ne(y);break;case 9:case 10:case 13:case 32:x+=He(h);break;case 92:x+=$e(Le()-1,7);continue;case 47:switch(Te()){case 42:case 47:me(Xe(_e(Oe(),Le()),t,n,s),s);break;default:x+="/"}break;case 123*v:c[l++]=ge(x)*m;case 125*v:case 59:case 0:switch(y){case 0:case 125:g=0;case 59+u:-1==m&&(x=fe(x,/\f/g,"")),p>0&&ge(x)-d&&me(p>32?Ue(x+";",r,n,d-1,s):Ue(fe(x," ","")+";",r,n,d-2,s),s);break;case 59:x+=";";default:if(me(w=We(x,t,n,l,u,o,c,b,A=[],S=[],d,i),i),123===y)if(0===u)Fe(x,t,w,w,A,i,d,c,S);else switch(99===f&&110===he(x,3)?100:f){case 100:case 108:case 109:case 115:Fe(e,w,w,r&&me(We(e,w,w,0,0,o,c,b,o,A=[],d,S),S),o,S,d,c,r?A:S);break;default:Fe(x,w,w,w,[""],S,0,c,S)}}l=u=p=0,v=m=1,b=x="",d=a;break;case 58:d=1+ge(x),p=h;default:if(v<1)if(123==y)--v;else if(125==y&&0==v++&&125==Me())continue;switch(x+=ue(y),y*v){case 38:m=u>0?1:(x+="\f",-1);break;case 44:c[l++]=(ge(x)-1)*m,m=1;break;case 64:45===Te()&&(x+=Ne(Oe())),f=Te(),u=d=ge(b=x+=De(Le())),y++;break;case 45:45===h&&2==ge(x)&&(v=0)}}return i}function We(e,t,n,r,o,i,a,c,s,l,u,d){for(var f=o-1,p=0===o?i:[""],h=function(e){return e.length}(p),v=0,g=0,m=0;v0?p[y]+" "+b:fe(b,/&\f/g,p[y])))&&(s[m++]=A);return Ee(e,t,n,0===o?oe:c,s,l,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(ke),ve(e,2,-2),0,r)}function Ue(e,t,n,r,o){return Ee(e,t,n,ie,ve(e,0,r),ve(e,r+1,-1),r,o)}var Ye,Ge="data-ant-cssinjs-cache-path",qe="_FILE_STYLE__";var Ke=!0;function Ve(e){return function(){if(!Ye&&(Ye={},(0,x.A)())){var e=document.createElement("div");e.className=Ge,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ye[r]=i}));var n,r=document.querySelector("style[".concat(Ge,"]"));r&&(Ke=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ye[e]}var Ze="_multi_value_";function Qe(e){return ye(Be(e),be).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},c=r.root,s=r.injectHash,l=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,h=void 0===p?[]:p,v=(n.linters,""),g={};function m(t){var r=t.getName(u);if(!g[r]){var i=e(t.style,n,{root:!1,parentSelectors:l}),a=(0,o.A)(i,1)[0];g[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var y=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return y.forEach((function(t){var r="string"!=typeof t||c?t:{};if("string"==typeof r)v+="".concat(r,"\n");else if(r._keyframe)m(r);else{var d=h.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,w.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,w.A)(e)&&e&&("_skip_check_"in e||Ze in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(m(t),r=t.getName(u)),v+="".concat(n,":").concat(r,";")}var h=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,w.A)(r)&&null!=r&&r[Ze]&&Array.isArray(h)?h.forEach((function(e){E(t,e)})):E(t,h)}else{var y=!1,b=t.trim(),A=!1;(c||s)&&u?b.startsWith("@")?y=!0:b=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!c||u||"&"!==b&&""!==b||(b="",A=!0);var S=e(r,n,{root:A,injectHash:y,parentSelectors:[].concat((0,i.A)(l),[b])}),x=(0,o.A)(S,2),k=x[0],C=x[1];g=(0,a.A)((0,a.A)({},g),C),v+="".concat(b).concat(k)}}))}})),c?d&&(v="@layer ".concat(d.name," {").concat(v,"}"),d.dependencies&&(g["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):v="{".concat(v,"}"),[v,g]};function et(e,t){return c("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,c=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,h=e.order,v=void 0===h?0:h,b=l.useContext(S),A=b.autoClear,w=(b.mock,b.defaultCache),k=b.hashPriority,C=b.container,E=b.ssrInline,M=b.transformers,O=b.linters,T=b.cache,L=b.layer,I=n._tokenKey,R=[I];L&&R.push("layer"),R.push.apply(R,(0,i.A)(c));var z=N;var P=Y(nt,R,(function(){var e=R.join("|");if(Ve(e)){var n=function(e){var t=Ye[e],n=null;if(t&&(0,x.A)())if(Ke)n=qe;else{var r=document.querySelector("style[".concat(m,'="').concat(Ye[e],'"]'));r?n=r.innerHTML:delete Ye[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,I,a,{},p,v]}var s=t(),l=Je(s,{hashId:u,hashPriority:k,layer:L?d:void 0,path:c.join("-"),transformers:M,linters:O}),f=(0,o.A)(l,2),h=f[0],g=f[1],y=Qe(h),b=et(R,y);return[y,I,b,g,p,v]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&N&&(0,s.m6)(n,{mark:m})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(z&&n!==qe){var c={mark:m,prepend:!L&&"queue",attachTo:C,priority:v},l="function"==typeof f?f():f;l&&(c.csp={nonce:l});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,s.BD)(Qe(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},c),{},{prepend:!0}))}));var p=(0,s.BD)(n,r,c);p[y]=T.instanceId,p.setAttribute(g,I),d.forEach((function(e){(0,s.BD)(Qe(i[e]),"_effect-".concat(e),c)}))}})),H=(0,o.A)(P,3),$=H[0],j=H[1],_=H[2];return function(e){var t,n;E&&!z&&w?t=l.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,g,j),(0,r.A)(n,m,_),n),{dangerouslySetInnerHTML:{__html:$}})):t=l.createElement(tt,null);return l.createElement(l.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,c=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,l.useContext)(S),h=p.cache.instanceId,v=p.container,b=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,b]);return Y(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:c,scope:f}),s=(0,o.A)(i,2),l=s[0],u=s[1];return[l,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];N&&(0,s.m6)(t,{mark:m})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,s.BD)(r,i,{mark:m,prepend:"queue",attachTo:v,priority:-999});a[y]=h,a.setAttribute(g,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],c=r[2],s=r[3],l=r[4],u=r[5],d=(n||{}).plain;if(l)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=$(i,a,c,p,d),s&&Object.keys(s).forEach((function(e){if(!t[e]){t[e]=!0;var n=$(Qe(s[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,c,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],c=r[4],s=(n||{}).plain;if(!a)return null;var l=i._tokenKey;return[-999,l,$(a,c,l,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],c=r[3],s=(n||{}).plain;if(!i)return null;return[-999,a,$(i,c,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]}));const ct=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function st(e){return e.notSplit=!0,e}st(["borderTop","borderBottom"]),st(["borderTop"]),st(["borderBottom"]),st(["borderLeft","borderRight"]),st(["borderLeft"]),st(["borderRight"])},4164:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var r=n(8168),o=n(6636),i=n(4467),a=n(45),c=n(6540),s=n(6942),l=n.n(s),u=n(2200);const d=(0,c.createContext)({});var f=n(9379),p=n(2284),h=n(5089);function v(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function g(e){return function(e){return v(e)instanceof ShadowRoot}(e)?v(e):null}var m=n(8210);function y(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function A(e,t,n){return n?c.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):c.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function S(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var x=["icon","className","onClick","style","primaryColor","secondaryColor"],k={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,s,l,u=e.icon,p=e.className,v=e.onClick,b=e.style,w=e.primaryColor,C=e.secondaryColor,E=(0,a.A)(e,x),M=c.useRef(),O=k;if(w&&(O={primaryColor:w,secondaryColor:C||S(w)}),t=M,n=(0,c.useContext)(d),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n alignItems: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,c.useEffect)((function(){var e=g(t.current);(0,h.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:e})}),[]),s=y(u),l="icon should be icon definiton, but got ".concat(u),(0,m.Ay)(s,"[@ant-design/icons] ".concat(l)),!y(u))return null;var T=u;return T&&"function"==typeof T.icon&&(T=(0,f.A)((0,f.A)({},T),{},{icon:T.icon(O.primaryColor,O.secondaryColor)})),A(T.icon,"svg-".concat(T.name),(0,f.A)((0,f.A)({className:p,onClick:v,style:b,"data-icon":T.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},k)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;k.primaryColor=t,k.secondaryColor=n||S(t),k.calculated=!!n};const E=C;function M(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return E.setTwoToneColors({primaryColor:r,secondaryColor:i})}var O=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];M(u.z1.primary);var T=c.forwardRef((function(e,t){var n=e.className,s=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,h=e.onClick,v=e.twoToneColor,g=(0,a.A)(e,O),m=c.useContext(d),y=m.prefixCls,b=void 0===y?"anticon":y,A=m.rootClassName,S=l()(A,b,(0,i.A)((0,i.A)({},"".concat(b,"-").concat(s.name),!!s.name),"".concat(b,"-spin"),!!u||"loading"===s.name),n),x=p;void 0===x&&h&&(x=-1);var k=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,C=w(v),M=(0,o.A)(C,2),T=M[0],L=M[1];return c.createElement("span",(0,r.A)({role:"img","aria-label":s.name},g,{ref:t,tabIndex:x,onClick:h,className:S}),c.createElement(E,{icon:s,primaryColor:T,secondaryColor:L,style:k}))}));T.displayName="AntdIcon",T.getTwoToneColor=function(){var e=E.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},T.setTwoToneColor=M;const L=T},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(4164),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(4164),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>l,Ob:()=>u,YL:()=>c,_:()=>o,g8:()=>h,n6:()=>p,oS:()=>v,wE:()=>s});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=0,s=(o+i)/2;if(o===i)c=0,a=0;else{var l=o-i;switch(c=s>.5?l/(2-o-i):l/(o+i),o){case e:a=(t-n)/l+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function c(e,t,n){var o,i,c;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,c=n,o=n;else{var s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;o=a(l,s,e+1/3),i=a(l,s,e),c=a(l,s,e-1/3)}return{r:255*o,g:255*i,b:255*c}}function s(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=o,s=o-i,l=0===o?0:s/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/s+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,c=null,s=null,l=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),l=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),c=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,c),l=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),s=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,s),l=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:l,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var c="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),s="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),l="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),u={CSS_UNIT:new RegExp(c),rgb:new RegExp("rgb"+s),rgba:new RegExp("rgba"+l),hsl:new RegExp("hsl"+s),hsla:new RegExp("hsla"+l),hsv:new RegExp("hsv"+s),hsva:new RegExp("hsva"+l),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>c});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),c=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],c=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+c)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function c(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>c})},6943:(e,t,n)=>{"use strict";n.d(t,{A:()=>_e});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),c=n(2901),s=n(6822),l=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),h=n(45);const v={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function g(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,c=o.noLeading,s=void 0!==c&&c,l=o.debounceMode,u=void 0===l?void 0:l,d=!1,f=0;function p(){r&&clearTimeout(r)}function h(){for(var n=arguments.length,o=new Array(n),i=0;ie?s?(f=Date.now(),a||(r=setTimeout(u?v:h,e))):h():!0!==a&&(r=setTimeout(u?v:h,void 0===u?e-l:e)))}return h.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},h}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var m=n(6942),y=n.n(m);const b={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var S=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},w=function(e){for(var t=[],n=x(e),r=k(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},O=function(e){return e&&e.offsetHeight||0},T=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},L=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},I=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},R=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},P=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},N=function(e){var t,n;(P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",c=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:c})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},H=function(e){P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=N(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},$=function(e){if(e.unslick)return 0;P(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,c=e.slideCount,s=e.slidesToShow,l=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,h=e.fade,v=e.vertical;if(h||1===e.slideCount)return 0;var g=0;if(i?(g=-j(e),c%l!=0&&r+l>c&&(g=-(r>c?s-(r-c):c%l)),a&&(g+=parseInt(s/2))):(c%l!=0&&r+l>c&&(g=s-c%l),a&&(g=parseInt(s/2))),t=v?r*p*-1+g*p:r*u*-1+g*u,!0===f){var m,y=o&&o.node;if(m=r+j(e),t=(n=y&&y.childNodes[m])?-1*n.offsetLeft:0,!0===a){m=i?r+j(e):r,n=y&&y.children[m],t=0;for(var b=0;be.currentSlide?e.targetSlide>e.currentSlide+F(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},W=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},U=Object.keys(b);var Y=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},G=function(e,t){return e.key+"-"+t},q=function(e){var t,n=[],o=[],a=[],c=r.Children.count(e.children),s=x(e),l=k(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var h=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),v=f.props.className||"",g=Y((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+G(f,d),"data-index":d,className:y()(g,v),tabIndex:"-1","aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&c>1&&!1===e.fade&&!e.unslick){var m=c-d;m<=j(e)&&((t=-m)>=s&&(f=u),g=Y((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+G(f,t),"data-index":t,tabIndex:"-1",className:y()(g,v),"aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=c+d)=S&&d<=m:d===S}),x={message:"dots",index:v,slidesToScroll:s,currentSlide:d},k=this.clickHandler.bind(this,x);h=h.concat(r.createElement("li",{key:v,className:w},r.cloneElement(this.props.customPaging(v),{onClick:k})))}return r.cloneElement(this.props.appendDots(h),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Z(e,t,n){return t=(0,u.A)(t),(0,s.A)(e,(0,l.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Q=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});L(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){te&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ie?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){te&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;oe.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ce=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),be="undefined"!=typeof WeakMap?new WeakMap:new ee,Ae=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=ae.getInstance(),r=new ye(t,n,this);be.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){Ae.prototype[e]=function(){var t;return(t=be.get(this))[e].apply(t,arguments)}}));const Se=void 0!==ne.ResizeObserver?ne.ResizeObserver:Ae;var we=["animating"];var xe=function(e){function t(e){var n,c,d,p;(0,a.A)(this,t),c=this,d=t,p=[e],d=(0,u.A)(d),n=(0,s.A)(c,(0,l.A)()?Reflect.construct(d,p||[],(0,u.A)(c).constructor):d.apply(c,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=O(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=w((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new Se((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=w((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=g(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),c=e.trackRef&&e.trackRef.node,s=Math.ceil(M(c));if(e.vertical)t=a;else{var l=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(l*=a/100),t=Math.ceil((a-l)/e.slidesToShow)}var u=o&&O(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],h=w((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),v={slideCount:n,slideWidth:t,listWidth:a,trackWidth:s,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(h)};return null===e.autoplaying&&e.autoplay&&(v.autoplaying="playing"),v}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var c=$(e);e=(0,i.A)((0,i.A)({},e),{},{left:c});var s=N(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=s),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=j((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),c=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var s=0;s=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-j(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,c=r.onLazyLoad,s=r.speed,l=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,c=e.slideCount,s=e.lazyLoad,l=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,h=e.lazyLoadedList;if(t&&n)return{};var v,g,m,y=a,b={},S={},x=o?a:A(a,0,c-1);if(r){if(!o&&(a<0||a>=c))return{};a<0?y=a+c:a>=c&&(y=a-c),s&&h.indexOf(y)<0&&(h=h.concat(y)),b={animating:!0,currentSlide:y,lazyLoadedList:h,targetSlide:y},S={animating:!1,targetSlide:y}}else v=y,y<0?(v=y+c,o?c%d!=0&&(v=c-c%d):v=0):!L(e)&&y>l?y=v=l:u&&y>=c?(y=o?c:c-1,v=o?0:c-1):y>=c&&(v=y-c,o?c%d!=0&&(v=0):v=c-f),!o&&y+f>=c&&(v=c-f),g=$((0,i.A)((0,i.A)({},e),{},{slideIndex:y})),m=$((0,i.A)((0,i.A)({},e),{},{slideIndex:v})),o||(g===m&&(y=v),g=m),s&&(h=h.concat(w((0,i.A)((0,i.A)({},e),{},{currentSlide:y})))),p?(b={animating:!0,currentSlide:v,trackStyle:H((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:h,targetSlide:x},S={animating:!1,currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),swipeLeft:null,targetSlide:x}):b={currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),lazyLoadedList:h,targetSlide:x};return{state:b,nextState:S}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var v=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));c&&v.length>0&&c(v),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),l&&l(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,h.A)(p,we);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),l&&l(f.currentSlide),delete n.animationEndCallback}))}),s))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,c=e.slidesToScroll,s=e.slidesToShow,l=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=l%c!=0?0:(l-u)%c,"previous"===t.message)a=u-(o=0===n?c:s-n),f&&!p&&(a=-1==(r=u-o)?l-1:r),p||(a=d-c);else if("next"===t.message)a=u+(o=0===n?c:n),f&&!p&&(a=(u+c)%l+n),p||(a=d+c);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var h=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===h?a-=l:a10)return{scrolling:!0};c&&(y.swipeLength=E);var M=(s?-1:1)*(y.curX>y.startX?1:-1);c&&(M=y.curY>y.startY?1:-1);var O=Math.ceil(v/g),I=T(t.touchObject,c),R=y.swipeLength;return m||(0===l&&("right"===I||"down"===I)||l+1>=O&&("left"===I||"up"===I)||!L(t)&&("left"===I||"up"===I))&&(R=y.swipeLength*u,!1===d&&f&&(f(I),k.edgeDragged=!0)),!p&&b&&(b(I),k.swiped=!0),x=o?C+R*(A/w)*M:s?C-R*M:C+R*M,c&&(x=C+R*M),k=(0,i.A)((0,i.A)({},k),{},{touchObject:y,swipeLeft:x,trackStyle:N((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(y.curX-y.startX)<.8*Math.abs(y.curY-y.startY)||y.swipeLength>10&&(k.swiping=!0,S(e)),k}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,c=t.touchThreshold,s=t.verticalSwiping,l=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,h=t.currentSlide,v=t.infinite;if(!n)return r&&S(e),{};var g=s?l/c:a/c,m=T(o,s),y={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return y;if(!o.swipeLength)return y;if(o.swipeLength>g){var b,A;S(e),f&&f(m);var w=v?h:p;switch(m){case"left":case"up":A=w+z(t),b=u?R(t,A):A,y.currentDirection=0;break;case"right":case"down":A=w-z(t),b=u?R(t,A):A,y.currentDirection=1;break;default:b=w}y.triggerSlideHandler=b}else{var x=$(t);y.trackStyle=H((0,i.A)((0,i.A)({},t),{},{left:x}))}return y}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!L((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,c=y()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),s=(0,i.A)((0,i.A)({},n.props),n.state),l=I(s,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(l=(0,i.A)((0,i.A)({},l),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=I(s,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(V,d)}var p=I(s,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Q,p),a=r.createElement(J,p));var h=null;n.props.vertical&&(h={height:n.state.listHeight});var v=null;!1===n.props.vertical?!0===n.props.centerMode&&(v={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(v={padding:n.props.centerPadding+" 0px"});var g=(0,i.A)((0,i.A)({},h),v),m=n.props.touchMove,b={className:"slick-list",style:g,onClick:n.clickHandler,onMouseDown:m?n.swipeStart:null,onMouseMove:n.state.dragging&&m?n.swipeMove:null,onMouseUp:m?n.swipeEnd:null,onMouseLeave:n.state.dragging&&m?n.swipeEnd:null,onTouchStart:m?n.swipeStart:null,onTouchMove:n.state.dragging&&m?n.swipeMove:null,onTouchEnd:m?n.touchEnd:null,onTouchCancel:n.state.dragging&&m?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:c,dir:"ltr",style:n.props.style};return n.props.unslick&&(b={className:"slick-list"},A={className:c,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},b),r.createElement(K,(0,o.A)({ref:n.trackRefHandler},l),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},v),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var m=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),m),n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?Ce()({minWidth:0,maxWidth:n}):Ce()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=Ce()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},b),this.props),t[0].settings):(0,i.A)((0,i.A)({},b),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var c=[],s=null,l=0;l=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*l+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*l+d},f))}e.variableWidth?c.push(r.createElement("div",{key:l,style:{width:s}},u)):c.push(r.createElement("div",{key:l},u))}if("unslick"===e){var h="regular slider "+(this.props.className||"");return r.createElement("div",{className:h},a)}return c.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(xe,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return U.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),c)}}])}(r.Component);const Me=Ee;var Oe=n(2279),Te=n(1466),Le=n(5905),Ie=n(665),Re=n(336);const ze=e=>{const{componentCls:t,antCls:n,carouselArrowSize:r,carouselDotOffset:o,marginXXS:i}=e,a=e.calc(r).mul(-1.25).equal(),c=i;return{[t]:Object.assign(Object.assign({},(0,Le.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"},".slick-arrow.slick-hidden":{display:"none"},".slick-prev, .slick-next":{position:"absolute",top:"50%",display:"block",width:r,height:r,marginTop:e.calc(r).mul(-1).div(2).equal(),padding:0,color:"transparent",fontSize:0,lineHeight:0,background:"transparent",border:0,outline:"none",cursor:"pointer","&:hover, &:focus":{color:"transparent",background:"transparent",outline:"none","&::before":{opacity:1}},"&.slick-disabled::before":{opacity:.25}},".slick-prev":{insetInlineStart:a,"&::before":{content:'"\u2190"'}},".slick-next":{insetInlineEnd:a,"&::before":{content:'"\u2192"'}},".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:o},"&-top":{top:o,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:e.dotWidth,height:e.dotHeight,marginInline:c,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${e.motionDurationSlow}`,button:{position:"relative",display:"block",width:"100%",height:e.dotHeight,padding:0,color:"transparent",fontSize:0,background:e.colorBgContainer,border:0,borderRadius:e.dotHeight,outline:"none",cursor:"pointer",opacity:.3,transition:`all ${e.motionDurationSlow}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(c).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:e.colorBgContainer,opacity:1},"&: hover, &:focus":{opacity:1}}}}})}},Pe=e=>{const{componentCls:t,carouselDotOffset:n,marginXXS:r}=e,o={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},o),{margin:`${(0,Te.zA)(r)} 0`,verticalAlign:"baseline",button:o,"&.slick-active":Object.assign(Object.assign({},o),{button:o})})}}}},Ne=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},He=(0,Ie.OF)("Carousel",(e=>{const{controlHeightLG:t,controlHeightSM:n}=e,r=(0,Re.h1)(e,{carouselArrowSize:e.calc(t).div(2).equal(),carouselDotOffset:e.calc(n).div(2).equal()});return[ze(r),Pe(r),Ne(r)]}),(()=>({dotWidth:16,dotHeight:3,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var $e=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{dots:n=!0,arrows:o=!1,draggable:i=!1,waitForAnimate:a=!1,dotPosition:c="bottom",vertical:s="left"===c||"right"===c,rootClassName:l,className:u,style:d,id:f}=e,p=$e(e,["dots","arrows","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:h,direction:v,carousel:g}=r.useContext(Oe.QO),m=r.useRef(),b=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];m.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:b,autoPlay:m.current.innerSlider.autoPlay,innerSlider:m.current.innerSlider,prev:m.current.slickPrev,next:m.current.slickNext})),[m.current]);const A=r.useRef(r.Children.count(e.children));r.useEffect((()=>{A.current!==r.Children.count(e.children)&&(b(e.initialSlide||0,!1),A.current=r.Children.count(e.children))}),[e.children]);const S=Object.assign({vertical:s,className:y()(u,null==g?void 0:g.className),style:Object.assign(Object.assign({},null==g?void 0:g.style),d)},p);"fade"===S.effect&&(S.fade=!0);const w=h("carousel",S.prefixCls),x="slick-dots",k=!!n,C=y()(x,`${x}-${c}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[E,M,O]=He(w),T=y()(w,{[`${w}-rtl`]:"rtl"===v,[`${w}-vertical`]:S.vertical},M,O,l);return E(r.createElement("div",{className:T,id:f},r.createElement(Me,Object.assign({ref:m},S,{dots:k,dotsClass:C,arrows:o,draggable:i,verticalSwiping:s,waitForAnimate:a}))))}));const _e=je},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>r});const r=n(6540).createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:"anticon"}),{Consumer:o}=r},4184:(e,t,n)=>{"use strict";n.d(t,{A:()=>nr});var r=n(6540),o=n.t(r,2),i=n(8168);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var c=n(4164),s=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:a}))};const l=r.forwardRef(s);var u=n(6942),d=n.n(u),f=n(9379),p=n(4467),h=n(6636),v=n(2284),g=n(45);function m(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var y=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],A=r.createContext(null),S=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,h.A)(i,2),c=a[0],s=a[1],l=(0,r.useRef)(!1),u="error"===c;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&s("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!l.current?s("loading"):u&&s("normal")}),[t]);var d=function(){s("normal")};return[function(e){l.current=!1,"loading"===c&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(l.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},c]}var x=n(961),k=n(998),C=n(8210),E=n(8719);const M=r.createContext(null);var O=n(4241),T=n(981),L=[];var I=n(5089);function R(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var c=getComputedStyle(e,"::-webkit-scrollbar"),s=parseInt(c.width,10),l=parseInt(c.height,10);try{var u=s?"width: ".concat(c.width,";"):"",d=l?"height: ".concat(c.height,";"):"";(0,I.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(h){console.error(h),r=s,o=l}}document.body.appendChild(n);var f=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,p=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,I.m6)(t),{width:f,height:p}}var z="rc-util-locker-".concat(Date.now()),P=0;function N(e){var t=!!e,n=r.useState((function(){return P+=1,"".concat(z,"_").concat(P)})),o=(0,h.A)(n,1)[0];(0,T.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?R(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,I.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),o)}else(0,I.m6)(o);var r;return function(){(0,I.m6)(o)}}),[t,o])}var H=!1;var $=function(e){return!1!==e&&((0,k.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)},j=r.forwardRef((function(e,t){var n=e.open,o=e.autoLock,i=e.getContainer,a=(e.debug,e.autoDestroy),c=void 0===a||a,s=e.children,l=r.useState(n),u=(0,h.A)(l,2),d=u[0],f=u[1],p=d||n;r.useEffect((function(){(c||n)&&f(n)}),[n,c]);var v=r.useState((function(){return $(i)})),g=(0,h.A)(v,2),m=g[0],y=g[1];r.useEffect((function(){var e=$(i);y(null!=e?e:null)}));var b=function(e,t){var n=r.useState((function(){return(0,k.A)()?document.createElement("div"):null})),o=(0,h.A)(n,1)[0],i=r.useRef(!1),a=r.useContext(M),c=r.useState(L),s=(0,h.A)(c,2),l=s[0],u=s[1],d=a||(i.current?void 0:function(e){u((function(t){return[e].concat((0,O.A)(t))}))});function f(){o.parentElement||document.body.appendChild(o),i.current=!0}function p(){var e;null===(e=o.parentElement)||void 0===e||e.removeChild(o),i.current=!1}return(0,T.A)((function(){return e?a?a(f):f():p(),p}),[e]),(0,T.A)((function(){l.length&&(l.forEach((function(e){return e()})),u(L))}),[l]),[o,d]}(p&&!m),A=(0,h.A)(b,2),S=A[0],w=A[1],C=null!=m?m:S;N(o&&n&&(0,k.A)()&&(C===S||C===document.body));var I=null;s&&(0,E.f3)(s)&&t&&(I=s.ref);var R=(0,E.xK)(I,t);if(!p||!(0,k.A)()||void 0===m)return null;var z,P=!1===C||("boolean"==typeof z&&(H=z),H),j=s;return t&&(j=r.cloneElement(s,{ref:R})),r.createElement(M.Provider,{value:w},P?j:(0,x.createPortal)(j,C))}));const _=j;var D=r.createContext({}),B=n(4808);var F=0;var W=(0,f.A)({},o).useId;const X=W?function(e){var t=W();return e||t}:function(e){var t=r.useState("ssr-id"),n=(0,h.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){var e=F;F+=1,i("rc_unique_".concat(e))}),[]),e||o};var U={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=U.F1&&t<=U.F12)return!1;switch(t){case U.ALT:case U.CAPS_LOCK:case U.CONTEXT_MENU:case U.CTRL:case U.DOWN:case U.END:case U.ESC:case U.HOME:case U.INSERT:case U.LEFT:case U.MAC_FF_META:case U.META:case U.NUMLOCK:case U.NUM_CENTER:case U.PAGE_DOWN:case U.PAGE_UP:case U.PAUSE:case U.PRINT_SCREEN:case U.RIGHT:case U.SHIFT:case U.UP:case U.WIN_KEY:case U.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=U.ZERO&&e<=U.NINE)return!0;if(e>=U.NUM_ZERO&&e<=U.NUM_MULTIPLY)return!0;if(e>=U.A&&e<=U.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case U.SPACE:case U.QUESTION_MARK:case U.NUM_PLUS:case U.NUM_MINUS:case U.NUM_PERIOD:case U.NUM_DIVISION:case U.SEMICOLON:case U.DASH:case U.EQUALS:case U.COMMA:case U.PERIOD:case U.SLASH:case U.APOSTROPHE:case U.SINGLE_QUOTE:case U.OPEN_SQUARE_BRACKET:case U.BACKSLASH:case U.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const Y=U;var G="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),q="aria-",K="data-";function V(e,t){return 0===e.indexOf(t)}function Z(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,f.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||V(n,q))||t.data&&V(n,K)||t.attr&&G.includes(n))&&(r[n]=e[n])})),r}function Q(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function J(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}function ee(e){return function(e){return e instanceof HTMLElement||e instanceof SVGElement}(e)?e:e instanceof r.Component?x.findDOMNode(e):null}var te=r.createContext({});var ne=n(3029),re=n(2901),oe=n(5501),ie=n(3954),ae=n(2176),ce=n(6822);function se(e){var t=(0,ae.A)();return function(){var n,r=(0,ie.A)(e);if(t){var o=(0,ie.A)(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return(0,ce.A)(this,n)}}const le=function(e){(0,oe.A)(n,e);var t=se(n);function n(){return(0,ne.A)(this,n),t.apply(this,arguments)}return(0,re.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);var ue=n(1233),de="none",fe="appear",pe="enter",he="leave",ve="none",ge="prepare",me="start",ye="active",be="end",Ae="prepared";function Se(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var we,xe,ke,Ce=(we=(0,k.A)(),xe="undefined"!=typeof window?window:{},ke={animationend:Se("Animation","AnimationEnd"),transitionend:Se("Transition","TransitionEnd")},we&&("AnimationEvent"in xe||delete ke.animationend.animation,"TransitionEvent"in xe||delete ke.transitionend.transition),ke),Ee={};if((0,k.A)()){var Me=document.createElement("div");Ee=Me.style}var Oe={};function Te(e){if(Oe[e])return Oe[e];var t=Ce[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:1),t};We.cancel=function(e){var t=Be.get(e);return Fe(e),_e(t)};const Xe=We;var Ue=[ge,me,ye,be],Ye=[ge,Ae],Ge=!1,qe=!0;function Ke(e){return e===ye||e===be}const Ve=function(e,t,n){var o=(0,ue.A)(ve),i=(0,h.A)(o,2),a=i[0],c=i[1],s=function(){var e=r.useRef(null);function t(){Xe.cancel(e.current)}return r.useEffect((function(){return function(){t()}}),[]),[function n(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;t();var i=Xe((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),l=(0,h.A)(s,2),u=l[0],d=l[1];var f=t?Ye:Ue;return $e((function(){if(a!==ve&&a!==be){var e=f.indexOf(a),t=f[e+1],r=n(a);r===Ge?c(t,!0):t&&u((function(e){function n(){e.isCanceled()||c(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),r.useEffect((function(){return function(){d()}}),[]),[function(){c(ge,!0)},a]};const Ze=function(e){var t=e;"object"===(0,v.A)(e)&&(t=e.transitionSupport);var n=r.forwardRef((function(e,n){var o=e.visible,i=void 0===o||o,a=e.removeOnLeave,c=void 0===a||a,s=e.forceRender,l=e.children,u=e.motionName,v=e.leavedClassName,g=e.eventProps,m=function(e,n){return!(!e.motionName||!t||!1===n)}(e,r.useContext(te).motion),y=(0,r.useRef)(),b=(0,r.useRef)();var A=function(e,t,n,o){var i=o.motionEnter,a=void 0===i||i,c=o.motionAppear,s=void 0===c||c,l=o.motionLeave,u=void 0===l||l,d=o.motionDeadline,v=o.motionLeaveImmediately,g=o.onAppearPrepare,m=o.onEnterPrepare,y=o.onLeavePrepare,b=o.onAppearStart,A=o.onEnterStart,S=o.onLeaveStart,w=o.onAppearActive,x=o.onEnterActive,k=o.onLeaveActive,C=o.onAppearEnd,E=o.onEnterEnd,M=o.onLeaveEnd,O=o.onVisibleChanged,T=(0,ue.A)(),L=(0,h.A)(T,2),I=L[0],R=L[1],z=(0,ue.A)(de),P=(0,h.A)(z,2),N=P[0],H=P[1],$=(0,ue.A)(null),j=(0,h.A)($,2),_=j[0],D=j[1],B=(0,r.useRef)(!1),F=(0,r.useRef)(null);function W(){return n()}var X=(0,r.useRef)(!1);function U(){H(de,!0),D(null,!0)}function Y(e){var t=W();if(!e||e.deadline||e.target===t){var n,r=X.current;N===fe&&r?n=null==C?void 0:C(t,e):N===pe&&r?n=null==E?void 0:E(t,e):N===he&&r&&(n=null==M?void 0:M(t,e)),N!==de&&r&&!1!==n&&U()}}var G=He(Y),q=(0,h.A)(G,1)[0],K=function(e){var t,n,r;switch(e){case fe:return t={},(0,p.A)(t,ge,g),(0,p.A)(t,me,b),(0,p.A)(t,ye,w),t;case pe:return n={},(0,p.A)(n,ge,m),(0,p.A)(n,me,A),(0,p.A)(n,ye,x),n;case he:return r={},(0,p.A)(r,ge,y),(0,p.A)(r,me,S),(0,p.A)(r,ye,k),r;default:return{}}},V=r.useMemo((function(){return K(N)}),[N]),Z=Ve(N,!e,(function(e){if(e===ge){var t=V[ge];return t?t(W()):Ge}var n;return ee in V&&D((null===(n=V[ee])||void 0===n?void 0:n.call(V,W(),null))||null),ee===ye&&(q(W()),d>0&&(clearTimeout(F.current),F.current=setTimeout((function(){Y({deadline:!0})}),d))),ee===Ae&&U(),qe})),Q=(0,h.A)(Z,2),J=Q[0],ee=Q[1],te=Ke(ee);X.current=te,$e((function(){R(t);var n,r=B.current;B.current=!0,!r&&t&&s&&(n=fe),r&&t&&a&&(n=pe),(r&&!t&&u||!r&&v&&!t&&u)&&(n=he);var o=K(n);n&&(e||o[ge])?(H(n),J()):H(de)}),[t]),(0,r.useEffect)((function(){(N===fe&&!s||N===pe&&!a||N===he&&!u)&&H(de)}),[s,a,u]),(0,r.useEffect)((function(){return function(){B.current=!1,clearTimeout(F.current)}}),[]);var ne=r.useRef(!1);(0,r.useEffect)((function(){I&&(ne.current=!0),void 0!==I&&N===de&&((ne.current||I)&&(null==O||O(I)),ne.current=!0)}),[I,N]);var re=_;return V[ge]&&ee===me&&(re=(0,f.A)({transition:"none"},re)),[N,ee,re,null!=I?I:t]}(m,i,(function(){try{return y.current instanceof HTMLElement?y.current:ee(b.current)}catch(e){return null}}),e),S=(0,h.A)(A,4),w=S[0],x=S[1],k=S[2],C=S[3],M=r.useRef(C);C&&(M.current=!0);var O,T=r.useCallback((function(e){y.current=e,(0,E.Xf)(n,e)}),[n]),L=(0,f.A)((0,f.A)({},g),{},{visible:i});if(l)if(w===de)O=C?l((0,f.A)({},L),T):!c&&M.current&&v?l((0,f.A)((0,f.A)({},L),{},{className:v}),T):s||!c&&!v?l((0,f.A)((0,f.A)({},L),{},{style:{display:"none"}}),T):null;else{var I,R;x===ge?R="prepare":Ke(x)?R="active":x===me&&(R="start");var z=Ne(u,"".concat(w,"-").concat(R));O=l((0,f.A)((0,f.A)({},L),{},{className:d()(Ne(u,w),(I={},(0,p.A)(I,z,z&&R),(0,p.A)(I,u,"string"==typeof u),I)),style:k}),T)}else O=null;r.isValidElement(O)&&(0,E.f3)(O)&&(O.ref||(O=r.cloneElement(O,{ref:T})));return r.createElement(le,{ref:b},O)}));return n.displayName="CSSMotion",n}(Re);var Qe=n(9417),Je="add",et="keep",tt="remove",nt="removed";function rt(e){var t;return t=e&&"object"===(0,v.A)(e)&&"key"in e?e:{key:e},(0,f.A)((0,f.A)({},t),{},{key:String(t.key)})}function ot(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(rt)}var it=["component","children","onVisibleChanged","onAllRemoved"],at=["status"],ct=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ze,n=function(e){(0,oe.A)(o,e);var n=se(o);function o(){var e;(0,ne.A)(this,o);for(var t=arguments.length,r=new Array(t),i=0;i0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,o=t.length,i=ot(e),a=ot(t);i.forEach((function(e){for(var t=!1,i=r;i1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==tt}))).forEach((function(t){t.key===e&&(t.status=et)}))})),n}(r,o);return{keyEntities:i.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==nt||e.status!==tt}))}}}]),o}(r.Component);(0,p.A)(n,"defaultProps",{component:"div"})}(Re);const st=Ze,lt=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var ut={width:0,height:0,overflow:"hidden",outline:"none"},dt={outline:"none"},ft=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,c=e.title,s=e.ariaId,l=e.footer,u=e.closable,p=e.closeIcon,h=e.onClose,g=e.children,m=e.bodyStyle,y=e.bodyProps,b=e.modalRender,A=e.onMouseDown,S=e.onMouseUp,w=e.holderRef,x=e.visible,k=e.forceRender,C=e.width,M=e.height,O=e.classNames,T=e.styles,L=r.useContext(D).panel,I=(0,E.xK)(w,L),R=(0,r.useRef)(),z=(0,r.useRef)(),P=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=P.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===z.current?R.current.focus():e||t!==R.current||z.current.focus()}}}));var N,H,$={};void 0!==C&&($.width=C),void 0!==M&&($.height=M),l&&(N=r.createElement("div",{className:d()("".concat(n,"-footer"),null==O?void 0:O.footer),style:(0,f.A)({},null==T?void 0:T.footer)},l)),c&&(H=r.createElement("div",{className:d()("".concat(n,"-header"),null==O?void 0:O.header),style:(0,f.A)({},null==T?void 0:T.header)},r.createElement("div",{className:"".concat(n,"-title"),id:s},c)));var j,_=(0,r.useMemo)((function(){return"object"===(0,v.A)(u)&&null!==u?u:u?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[u,p]),B=Z(_,!0);u&&(j=r.createElement("button",(0,i.A)({type:"button",onClick:h,"aria-label":"Close"},B,{className:"".concat(n,"-close")}),_.closeIcon));var F=r.createElement("div",{className:d()("".concat(n,"-content"),null==O?void 0:O.content),style:null==T?void 0:T.content},j,H,r.createElement("div",(0,i.A)({className:d()("".concat(n,"-body"),null==O?void 0:O.body),style:(0,f.A)((0,f.A)({},m),null==T?void 0:T.body)},y),g),N);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":c?s:null,"aria-modal":"true",ref:I,style:(0,f.A)((0,f.A)({},a),$),className:d()(n,o),onMouseDown:A,onMouseUp:S},r.createElement("div",{tabIndex:0,ref:R,style:ut,"aria-hidden":"true"}),r.createElement("div",{ref:P,tabIndex:-1,style:dt},r.createElement(lt,{shouldUpdate:x||k},b?b(F):F)),r.createElement("div",{tabIndex:0,ref:z,style:ut,"aria-hidden":"true"}))}));const pt=ft;var ht=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.title,a=e.style,c=e.className,s=e.visible,l=e.forceRender,u=e.destroyOnClose,p=e.motionName,v=e.ariaId,g=e.onVisibleChanged,m=e.mousePosition,y=(0,r.useRef)(),b=r.useState(),A=(0,h.A)(b,2),S=A[0],w=A[1],x={};function k(){var e,t,n,r,o,i=(e=y.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=J(o),n.top+=J(o,!0),n);w(m?"".concat(m.x-i.left,"px ").concat(m.y-i.top,"px"):"")}return S&&(x.transformOrigin=S),r.createElement(st,{visible:s,onVisibleChanged:g,onAppearPrepare:k,onEnterPrepare:k,forceRender:l,motionName:p,removeOnLeave:u,ref:y},(function(s,l){var u=s.className,p=s.style;return r.createElement(pt,(0,i.A)({},e,{ref:t,title:o,ariaId:v,prefixCls:n,holderRef:l,style:(0,f.A)((0,f.A)((0,f.A)({},p),a),x),className:d()(c,u)}))}))}));ht.displayName="Content";const vt=ht;function gt(e){var t=e.prefixCls,n=e.style,o=e.visible,a=e.maskProps,c=e.motionName,s=e.className;return r.createElement(st,{key:"mask",visible:o,motionName:c,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,o){var c=e.className,l=e.style;return r.createElement("div",(0,i.A)({ref:o,style:(0,f.A)((0,f.A)({},l),n),className:d()("".concat(t,"-mask"),c,s)},a))}))}function mt(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,o=e.zIndex,a=e.visible,c=void 0!==a&&a,s=e.keyboard,l=void 0===s||s,u=e.focusTriggerAfterClose,p=void 0===u||u,v=e.wrapStyle,g=e.wrapClassName,m=e.wrapProps,y=e.onClose,b=e.afterOpenChange,A=e.afterClose,S=e.transitionName,w=e.animation,x=e.closable,k=void 0===x||x,C=e.mask,E=void 0===C||C,M=e.maskTransitionName,O=e.maskAnimation,T=e.maskClosable,L=void 0===T||T,I=e.maskStyle,R=e.maskProps,z=e.rootClassName,P=e.classNames,N=e.styles;var H=(0,r.useRef)(),$=(0,r.useRef)(),j=(0,r.useRef)(),_=r.useState(c),D=(0,h.A)(_,2),F=D[0],W=D[1],U=X();function G(e){null==y||y(e)}var q=(0,r.useRef)(!1),K=(0,r.useRef)(),V=null;return L&&(V=function(e){q.current?q.current=!1:$.current===e.target&&G(e)}),(0,r.useEffect)((function(){c&&(W(!0),(0,B.A)($.current,document.activeElement)||(H.current=document.activeElement))}),[c]),(0,r.useEffect)((function(){return function(){clearTimeout(K.current)}}),[]),r.createElement("div",(0,i.A)({className:d()("".concat(n,"-root"),z)},Z(e,{data:!0})),r.createElement(gt,{prefixCls:n,visible:E&&c,motionName:Q(n,M,O),style:(0,f.A)((0,f.A)({zIndex:o},I),null==N?void 0:N.mask),maskProps:R,className:null==P?void 0:P.mask}),r.createElement("div",(0,i.A)({tabIndex:-1,onKeyDown:function(e){if(l&&e.keyCode===Y.ESC)return e.stopPropagation(),void G(e);c&&e.keyCode===Y.TAB&&j.current.changeActive(!e.shiftKey)},className:d()("".concat(n,"-wrap"),g,null==P?void 0:P.wrapper),ref:$,onClick:V,style:(0,f.A)((0,f.A)((0,f.A)({zIndex:o},v),null==N?void 0:N.wrapper),{},{display:F?null:"none"})},m),r.createElement(vt,(0,i.A)({},e,{onMouseDown:function(){clearTimeout(K.current),q.current=!0},onMouseUp:function(){K.current=setTimeout((function(){q.current=!1}))},ref:j,closable:k,ariaId:U,prefixCls:n,visible:c&&F,onClose:G,onVisibleChanged:function(e){if(e)(0,B.A)($.current,document.activeElement)||null===(t=j.current)||void 0===t||t.focus();else{if(W(!1),E&&H.current&&p){try{H.current.focus({preventScroll:!0})}catch(n){}H.current=null}F&&(null==A||A())}var t;null==b||b(e)},motionName:Q(n,S,w)}))))}var yt=function(e){var t=e.visible,n=e.getContainer,o=e.forceRender,a=e.destroyOnClose,c=void 0!==a&&a,s=e.afterClose,l=e.panelRef,u=r.useState(t),d=(0,h.A)(u,2),f=d[0],p=d[1],v=r.useMemo((function(){return{panel:l}}),[l]);return r.useEffect((function(){t&&p(!0)}),[t]),o||!c||f?r.createElement(D.Provider,{value:v},r.createElement(_,{open:t||o||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(mt,(0,i.A)({},e,{destroyOnClose:c,afterClose:function(){null==s||s(),p(!1)}})))):null};yt.displayName="Dialog";const bt=yt;function At(e,t,n,r){var o=x.unstable_batchedUpdates?function(e){x.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var St=n(3210),wt={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function xt(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,p.A)({},e,i);if(t<0&&or)return(0,p.A)({},e,t<0?i:-i);return{}}function kt(e,t,n,r){var o=m(),i=o.width,a=o.height,c=null;return e<=i&&t<=a?c={x:0,y:0}:(e>i||t>a)&&(c=(0,f.A)((0,f.A)({},xt("x",n,e,i)),xt("y",r,t,a))),c}function Ct(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function Et(e,t,n,o,i,a,c){var s=i.rotate,l=i.scale,u=i.x,d=i.y,p=(0,r.useState)(!1),v=(0,h.A)(p,2),g=v[0],m=v[1],y=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),b=function(e){y.current=(0,f.A)((0,f.A)({},y.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=At(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:g,onTouchStart:function(e){if(t){e.stopPropagation(),m(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?b({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):b({point1:{x:r[0].clientX-u,y:r[0].clientY-d},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=y.current,o=r.point1,i=r.point2,s=r.eventType;if(n.length>1&&"touchZoom"===s){var l={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=Ct(e,n),i=Ct(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,l,u),f=(0,h.A)(d,2),p=f[0],v=f[1],g=Ct(l,u)/Ct(o,i);c(g,"touchZoom",p,v,!0),b({point1:l,point2:u,eventType:"touchZoom"})}else"move"===s&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),b({eventType:"move"}))},onTouchEnd:function(){if(n){if(g&&m(!1),b({eventType:"none"}),o>l)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*l,r=e.current.offsetHeight*l,i=e.current.getBoundingClientRect(),c=i.left,u=i.top,d=s%180!=0,p=kt(d?r:t,d?t:r,c,u);p&&a((0,f.A)({},p),"dragRebound")}}}}const Mt=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,c=e.icons,s=e.countRender,l=e.showSwitch,u=e.showProgress,h=e.current,v=e.transform,g=e.count,m=e.scale,y=e.minScale,b=e.maxScale,S=e.closeIcon,w=e.onSwitchLeft,x=e.onSwitchRight,k=e.onClose,C=e.onZoomIn,E=e.onZoomOut,M=e.onRotateRight,O=e.onRotateLeft,T=e.onFlipX,L=e.onFlipY,I=e.toolbarRender,R=e.zIndex,z=(0,r.useContext)(A),P=c.rotateLeft,N=c.rotateRight,H=c.zoomIn,$=c.zoomOut,j=c.close,D=c.left,B=c.right,F=c.flipX,W=c.flipY,X="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===Y.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var U=[{icon:W,onClick:L,type:"flipY"},{icon:F,onClick:T,type:"flipX"},{icon:P,onClick:O,type:"rotateLeft"},{icon:N,onClick:M,type:"rotateRight"},{icon:$,onClick:E,type:"zoomOut",disabled:m<=y},{icon:H,onClick:C,type:"zoomIn",disabled:m===b}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,c=e.disabled;return r.createElement("div",{className:d()(X,(t={},(0,p.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,p.A)(t,"".concat(i,"-operations-operation-disabled"),!!c),t)),onClick:o,key:a},n)})),G=r.createElement("div",{className:"".concat(i,"-operations")},U);return r.createElement(st,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(_,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:d()("".concat(i,"-operations-wrapper"),t,a),style:(0,f.A)((0,f.A)({},n),{},{zIndex:R})},null===S?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},S||j),l&&r.createElement(r.Fragment,null,r.createElement("div",{className:d()("".concat(i,"-switch-left"),(0,p.A)({},"".concat(i,"-switch-left-disabled"),0===h)),onClick:w},D),r.createElement("div",{className:d()("".concat(i,"-switch-right"),(0,p.A)({},"".concat(i,"-switch-right-disabled"),h===g-1)),onClick:x},B)),r.createElement("div",{className:"".concat(i,"-footer")},u&&r.createElement("div",{className:"".concat(i,"-progress")},s?s(h+1,g):"".concat(h+1," / ").concat(g)),I?I(G,(0,f.A)({icons:{flipYIcon:U[0],flipXIcon:U[1],rotateLeftIcon:U[2],rotateRightIcon:U[3],zoomOutIcon:U[4],zoomInIcon:U[5]},actions:{onFlipY:L,onFlipX:T,onRotateLeft:O,onRotateRight:M,onZoomOut:E,onZoomIn:C},transform:v},z?{current:h,total:g}:{})):G)))}))};var Ot=["fallback","src","imgRef"],Tt=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],Lt=function(e){var t=e.fallback,n=e.src,o=e.imgRef,a=(0,g.A)(e,Ot),c=w({src:n,fallback:t}),s=(0,h.A)(c,2),l=s[0],u=s[1];return r.createElement("img",(0,i.A)({ref:function(e){o.current=e,l(e)}},a,u))};const It=function(e){var t=e.prefixCls,n=e.src,o=e.alt,a=e.fallback,c=e.movable,s=void 0===c||c,l=e.onClose,u=e.visible,v=e.icons,y=void 0===v?{}:v,b=e.rootClassName,S=e.closeIcon,w=e.getContainer,x=e.current,k=void 0===x?0:x,E=e.count,M=void 0===E?1:E,O=e.countRender,T=e.scaleStep,L=void 0===T?.5:T,I=e.minScale,R=void 0===I?1:I,z=e.maxScale,P=void 0===z?50:z,N=e.transitionName,H=void 0===N?"zoom":N,$=e.maskTransitionName,j=void 0===$?"fade":$,_=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,F=e.onTransform,W=e.onChange,X=(0,g.A)(e,Tt),U=(0,r.useRef)(),G=(0,r.useContext)(A),q=G&&M>1,K=G&&M>=1,V=(0,r.useState)(!0),Z=(0,h.A)(V,2),Q=Z[0],J=Z[1],ee=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),c=(0,r.useState)(wt),s=(0,h.A)(c,2),l=s[0],u=s[1],d=function(e,t){null===i.current&&(a.current=[],i.current=Xe((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,f.A)((0,f.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,f.A)((0,f.A)({},l),e))};return{transform:l,resetTransform:function(e){u(wt),o&&!(0,St.A)(wt,l)&&o({transform:wt,action:e})},updateTransform:d,dispatchZoomChange:function(r,o,i,a,c){var s=e.current,u=s.width,f=s.height,p=s.offsetWidth,h=s.offsetHeight,v=s.offsetLeft,g=s.offsetTop,y=r,b=l.scale*r;b>n?(b=n,y=n/l.scale):b0&&(r=1/r),c(r,"wheel",e.clientX,e.clientY)}}}}(U,s,u,L,te,re,oe),ae=ie.isMoving,ce=ie.onMouseDown,se=ie.onWheel,le=Et(U,s,u,R,te,re,oe),ue=le.isTouching,de=le.onTouchStart,fe=le.onTouchMove,pe=le.onTouchEnd,he=te.rotate,ve=te.scale,ge=d()((0,p.A)({},"".concat(t,"-moving"),ae));(0,r.useEffect)((function(){Q||J(!0)}),[Q]);var me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),k>0&&(J(!1),ne("prev"),null==W||W(k-1,k))},ye=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),kvoid 0!==n?n:`${e}-${t}`;var Yt=n(2279);const Gt=e=>{const[,,,,t]=(0,_t.Ay)();return t?`${e}-css-var`:""};const qt={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"};const Kt={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"},Vt={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},Zt={lang:Object.assign({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},Kt),timePickerLocale:Object.assign({},Vt)},Qt="${label} is not a valid ${type}",Jt={locale:"en",Pagination:qt,DatePicker:Zt,TimePicker:Vt,Calendar:Zt,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Tour:{Next:"Next",Previous:"Previous",Finish:"Finish"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:Qt,method:Qt,array:Qt,object:Qt,number:Qt,date:Qt,boolean:Qt,integer:Qt,float:Qt,regexp:Qt,email:Qt,url:Qt,hex:Qt},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"},QRCode:{expired:"QR code expired",refresh:"Refresh",scanned:"Scanned"},ColorPicker:{presetEmpty:"Empty"}};const en={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var tn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:en}))};const nn=r.forwardRef(tn);var rn=n(8633),on=n(363);const an={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z"}},{tag:"path",attrs:{d:"M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z"}}]},name:"rotate-left",theme:"outlined"};var cn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:an}))};const sn=r.forwardRef(cn);const ln={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z"}},{tag:"path",attrs:{d:"M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z"}}]},name:"rotate-right",theme:"outlined"};var un=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:ln}))};const dn=r.forwardRef(un);const fn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"swap",theme:"outlined"};var pn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:fn}))};const hn=r.forwardRef(pn);const vn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-in",theme:"outlined"};var gn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:vn}))};const mn=r.forwardRef(gn);const yn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-out",theme:"outlined"};var bn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:yn}))};const An=r.forwardRef(bn);var Sn=n(1466),wn=n(4978),xn=n(5905);const kn=e=>({animationDuration:e,animationFillMode:"both"}),Cn=e=>({animationDuration:e,animationFillMode:"both"}),En=function(e,t,n,r){const o=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${o}${e}-enter,\n ${o}${e}-appear\n `]:Object.assign(Object.assign({},kn(r)),{animationPlayState:"paused"}),[`${o}${e}-leave`]:Object.assign(Object.assign({},Cn(r)),{animationPlayState:"paused"}),[`\n ${o}${e}-enter${e}-enter-active,\n ${o}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${o}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}},Mn=new Sn.Mo("antFadeIn",{"0%":{opacity:0},"100%":{opacity:1}}),On=new Sn.Mo("antFadeOut",{"0%":{opacity:1},"100%":{opacity:0}}),Tn=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[En(r,Mn,On,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},Ln=new Sn.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),In=new Sn.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),Rn=new Sn.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),zn=new Sn.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),Pn=new Sn.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),Nn=new Sn.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),Hn={zoom:{inKeyframes:Ln,outKeyframes:In},"zoom-big":{inKeyframes:Rn,outKeyframes:zn},"zoom-big-fast":{inKeyframes:Rn,outKeyframes:zn},"zoom-left":{inKeyframes:new Sn.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Sn.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Sn.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Sn.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:Pn,outKeyframes:Nn},"zoom-down":{inKeyframes:new Sn.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Sn.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},$n=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=Hn[t];return[En(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var jn=n(336),_n=n(665);function Dn(e){return{position:e,inset:0}}const Bn=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:Tn(e)}]},Fn=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Sn.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,xn.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Sn.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Sn.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,xn.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},Wn=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},Xn=((0,_n.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,jn.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[Fn(t),Wn(t),Bn(t),$n(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Sn.zA)(e.paddingMD)} ${(0,Sn.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Sn.zA)(e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Sn.zA)(e.paddingXS)} ${(0,Sn.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),Un=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new wn.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},xn.L9),{padding:`0 ${(0,Sn.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},Yn=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:c,previewOperationHoverColor:s,motionDurationSlow:l,iconCls:u,colorTextLightSolid:d}=e,f=new wn.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${l}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Sn.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${l}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:s},"&-disabled":{color:c,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},Gn=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,c=new wn.q(t).setAlpha(.1),s=c.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:c.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:s.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},qn=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},Xn()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},Xn()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[Yn(e),Gn(e)]}]},Kn=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},Un(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},Xn())}}},Vn=e=>{const{previewCls:t}=e;return{[`${t}-root`]:$n(e,"zoom"),"&":Tn(e,!0)}},Zn=(0,_n.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,jn.h1)(e,{previewCls:t,modalMaskBg:new wn.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[Kn(n),qn(n),Bn((0,jn.h1)(n,{componentCls:t})),Vn(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new wn.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new wn.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new wn.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var Qn=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:c}=e,s=er(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:u,locale:f=Jt,getPopupContainer:p,image:h}=r.useContext(Yt.QO),v=u("image",n),g=u(),m=f.Image||Jt.Image,y=Gt(v),[b,A,S]=Zn(v,y),w=d()(a,A,S,y),x=d()(i,A,null==h?void 0:h.className),[k]=Xt("ImagePreview","object"==typeof o?o.zIndex:void 0),C=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=er(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${v}-mask-info`},r.createElement(l,null),null==m?void 0:m.preview),icons:Jn},a),{getContainer:null!=n?n:p,transitionName:Ut(g,"zoom",t.transitionName),maskTransitionName:Ut(g,"fade",t.maskTransitionName),zIndex:k,closeIcon:null!=i?i:null===(e=null==h?void 0:h.preview)||void 0===e?void 0:e.closeIcon})}),[o,m,null===(t=null==h?void 0:h.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==h?void 0:h.style),c);return b(r.createElement(jt,Object.assign({prefixCls:v,preview:C,rootClassName:w,className:x,style:E},s)))};tr.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=Qn(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(Yt.QO),a=i("image",t),c=`${a}-preview`,s=i(),l=Gt(a),[u,f,p]=Zn(a,l),[h]=Xt("ImagePreview","object"==typeof n?n.zIndex:void 0),v=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=d()(f,p,l,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:Ut(s,"zoom",t.transitionName),maskTransitionName:Ut(s,"fade",t.maskTransitionName),rootClassName:r,zIndex:h})}),[n]);return u(r.createElement(jt.PreviewGroup,Object.assign({preview:v,previewPrefixCls:c,icons:Jn},o)))};const nr=tr},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>u,L9:()=>o,Nk:()=>a,av:()=>c,dF:()=>i,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),c=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n)=>{const{fontFamily:r,fontSize:o}=e,i=`[class^="${t}"], [class*=" ${t}"]`,a=n?`.${n}`:i;return{[a]:{fontFamily:r,fontSize:o,boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"},[i]:{boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}}}}},l=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),u=e=>({"&:focus-visible":Object.assign({},l(e))})},3511:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>T,Xe:()=>E,Is:()=>C});var r=n(6540),o=n(1466);const i="5.16.1";var a=n(2200);const c={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},s=Object.assign(Object.assign({},c),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});var l=n(4978);const u=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const d=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const f=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],c=r[1],s=r[0],l=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:c,lineHeightLG:l,lineHeightSM:s,fontHeight:Math.round(c*o),fontHeightLG:Math.round(l*a),fontHeightSM:Math.round(s*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const p=(e,t)=>new l.q(e).setAlpha(t).toRgbString(),h=(e,t)=>new l.q(e).darken(t).toHexString(),v=e=>{const t=(0,a.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},g=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:p(r,.88),colorTextSecondary:p(r,.65),colorTextTertiary:p(r,.45),colorTextQuaternary:p(r,.25),colorFill:p(r,.15),colorFillSecondary:p(r,.06),colorFillTertiary:p(r,.04),colorFillQuaternary:p(r,.02),colorBgLayout:h(n,4),colorBgContainer:h(n,0),colorBgElevated:h(n,0),colorBgSpotlight:p(r,.85),colorBgBlur:"transparent",colorBorder:h(n,15),colorBorderSecondary:h(n,6)}};const m=(0,o.an)((function(e){const t=Object.keys(c).map((t=>{const n=(0,a.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:i,colorError:a,colorInfo:c,colorPrimary:s,colorBgBase:u,colorTextBase:d}=e,f=n(s),p=n(o),h=n(i),v=n(a),g=n(c),m=r(u,d),y=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},m),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:v[1],colorErrorBgHover:v[2],colorErrorBorder:v[3],colorErrorBorderHover:v[4],colorErrorHover:v[5],colorError:v[6],colorErrorActive:v[7],colorErrorTextHover:v[8],colorErrorText:v[9],colorErrorTextActive:v[10],colorWarningBg:h[1],colorWarningBgHover:h[2],colorWarningBorder:h[3],colorWarningBorderHover:h[4],colorWarningHover:h[4],colorWarning:h[6],colorWarningActive:h[7],colorWarningTextHover:h[8],colorWarningText:h[9],colorWarningTextActive:h[10],colorInfoBg:g[1],colorInfoBgHover:g[2],colorInfoBorder:g[3],colorInfoBorderHover:g[4],colorInfoHover:g[4],colorInfo:g[6],colorInfoActive:g[7],colorInfoTextHover:g[8],colorInfoText:g[9],colorInfoTextActive:g[10],colorLinkHover:y[4],colorLink:y[6],colorLinkActive:y[7],colorBgMask:new l.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:v,generateNeutralColorPalettes:g})),f(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),d(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},u(r))}(e))})),y={token:s,override:{override:s},hashed:!0},b=r.createContext(y);function A(e){return e>=0&&e<=255}const S=function(e,t){const{r:n,g:r,b:o,a:i}=new l.q(e).toRgb();if(i<1)return e;const{r:a,g:c,b:s}=new l.q(t).toRgb();for(let u=.01;u<=1;u+=.01){const e=Math.round((n-a*(1-u))/u),t=Math.round((r-c*(1-u))/u),i=Math.round((o-s*(1-u))/u);if(A(e)&&A(t)&&A(i))return new l.q({r:e,g:t,b:i,a:Math.round(100*u)/100}).toRgbString()}return new l.q({r:n,g:r,b:o,a:1}).toRgbString()};var w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{delete r[e]}));const o=Object.assign(Object.assign({},n),r),i=1200,a=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:S(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:S(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:S(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:4*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:S(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:i,screenXLMin:i,screenXLMax:1599,screenXXL:a,screenXXLMin:a,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new l.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new l.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new l.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var k=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const r=n.getDerivativeToken(e),{override:o}=t,i=k(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=x(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=k(n,["theme"]);let i=o;r&&(i=O(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function T(){const{token:e,hashed:t,theme:n,override:a,cssVar:c}=r.useContext(b),l=`${i}-${t||""}`,u=n||m,[d,f,p]=(0,o.hV)(u,[s,e],{salt:l,override:a,getComputedToken:O,formatToken:x,cssVar:c&&{prefix:c.prefix,key:c.key,unitless:C,ignore:E,preserve:M}});return[u,p,t?f:"",d,c]}},665:(e,t,n)=>{"use strict";n.d(t,{OF:()=>E});var r=n(6540),o=n(1466);n(6956),n(2533),n(8719);"undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;n(8210);var i=n(2279),a=n(5905),c=n(3511),s=n(3029),l=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var h=n(5501);const v=(0,l.A)((function e(){(0,s.A)(this,e)}));let g=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(v);const m="CALC_UNIT";function y(e){return"number"==typeof e?`${e}${m}`:e}let b=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=y(e):"string"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${y(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${y(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{},n=new RegExp(`${m}`,"g");return this.result=this.result.replace(n,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(v);const A=e=>{const t="css"===e?b:g;return e=>new t(e)};var S=n(336);const w=(e,t)=>{const[n,r]=(0,c.Ay)();return(0,o.IV)({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,a.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))},x=(e,t,n)=>{var r;return"function"==typeof n?n((0,S.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},k=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function C(e,t,n){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const l=Array.isArray(e)?e:[e,e],[u]=l,d=l.join("-");return function(e){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,h,v,g]=(0,c.Ay)(),{getPrefixCls:m,iconPrefixCls:y,csp:b}=(0,r.useContext)(i.QO),C=m(),E=g?"css":"js",M=A(E),{max:O,min:T}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),L={theme:f,token:v,hashId:h,nonce:()=>null==b?void 0:b.nonce,clientOnly:s.clientOnly,order:s.order||-999};(0,o.IV)(Object.assign(Object.assign({},L),{clientOnly:!1,path:["Shared",C]}),(()=>[{"&":(0,a.av)(v)}])),w(y,b);const I=(0,o.IV)(Object.assign(Object.assign({},L),{path:[d,e,y]}),(()=>{if(!1===s.injectStyle)return[];const{token:r,flush:i}=(0,S.Ay)(v),c=x(u,p,n),d=`.${e}`,f=k(u,p,c,{deprecatedTokens:s.deprecatedTokens});g&&Object.keys(c).forEach((e=>{c[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,g.prefix))})`}));const m=(0,S.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${y}`,antCls:`.${C}`,calc:M,max:O,min:T},g?c:f),b=t(m,{hashId:h,prefixCls:e,rootPrefixCls:C,iconPrefixCls:y});return i(u,f),[!1===s.resetStyle?null:(0,a.vj)(m,e,l),b]}));return[I,h]}}const E=(e,t,n,i)=>{const a=C(e,t,n,i),s=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:s=!0}=null!=n?n:{},l={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{l[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:s}=r;const[,u]=(0,c.Ay)();return(0,o.RC)({path:[e],prefix:s.prefix,key:null==s?void 0:s.key,unitless:Object.assign(Object.assign({},c.Is),l),ignore:c.Xe,token:u,scope:a},(()=>{const r=x(e,u,t),o=k(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,c.Ay)();return[o=>s&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=s(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function c(){}const s=e=>{let t,n=e,i=c;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>g,m6:()=>v});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",c="data-rc-priority",s="rc-util-key",l=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):s}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((l.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,s=void 0===i?0:i,l=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===l,p=document.createElement("style");p.setAttribute(a,l),u&&s&&p.setAttribute(c,"".concat(s)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var h=d(t),v=h.firstChild;if(r){if(u){var g=(t.styles||f(h)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(c)||0);return s>=t}));if(g.length)return h.insertBefore(p,g[g.length-1].nextSibling),p}h.insertBefore(p,v)}else h.appendChild(p);return p}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=h(e,t);n&&d(t).removeChild(n)}function g(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),c=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=l.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;l.set(e,o),e.removeChild(r)}}(o,c);var s=h(t,c);if(s){var v,g,m;if(null!==(v=c.csp)&&void 0!==v&&v.nonce&&s.nonce!==(null===(g=c.csp)||void 0===g?void 0:g.nonce))s.nonce=null===(m=c.csp)||void 0===m?void 0:m.nonce;return s.innerHTML!==e&&(s.innerHTML=e),s}var y=p(e,c);return y.setAttribute(u(c),t),y}},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";n.d(t,{A:()=>c,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const c=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(6636),o=n(6956),i=n(981),a=n(1233);function c(e){return void 0!==e}function s(e,t){var n=t||{},s=n.defaultValue,l=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return c(l)?l:c(s)?"function"==typeof s?s():s:"function"==typeof e?e():e})),p=(0,r.A)(f,2),h=p[0],v=p[1],g=void 0!==l?l:h,m=d?d(g):g,y=(0,o.A)(u),b=(0,a.A)([g]),A=(0,r.A)(b,2),S=A[0],w=A[1];return(0,i.o)((function(){var e=S[0];h!==e&&y(h,e)}),[S]),(0,i.o)((function(){c(l)||v(l)}),[l]),[m,(0,o.A)((function(e,t){v(e,t),w([g],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6636),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],c=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||c(e)}]}},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,s=i.has(t);if((0,o.Ay)(!s,"Warning: There may be circular references"),s)return!1;if(t===a)return!0;if(n&&c>1)return!1;i.add(t);var l=c+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{Xf:()=>a,f3:()=>l,xK:()=>s});var r=n(2284),o=(n(6540),n(6351)),i=n(8104);function a(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)}function c(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>l});var r={},o=[];function i(e,t){}function a(e,t){}function c(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function s(e,t){c(i,e,t)}s.preMessage=function(e){o.push(e)},s.resetWarned=function(){r={}},s.noteOnce=function(e,t){c(a,e,t)};const l=s},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),g=Symbol.for("react.offscreen");function m(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case c:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case l:case d:case v:case h:case s:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isMemo=function(e){return m(e)===h}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nr})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},6822:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"===(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},6636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},4241:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3145);var o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +/*! For license information please see 772.fa094b13.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[772],{2200:(e,t,n)=>{"use strict";n.d(t,{z1:()=>w,cM:()=>y});var r=n(2456),o=n(6250),i=2,a=.16,c=.05,s=.05,l=.15,u=5,d=4,f=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function p(e){var t=e.r,n=e.g,o=e.b,i=(0,r.wE)(t,n,o);return{h:360*i.h,s:i.s,v:i.v}}function h(e){var t=e.r,n=e.g,o=e.b;return"#".concat((0,r.Ob)(t,n,o,!1))}function v(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-i*t:Math.round(e.h)+i*t:n?Math.round(e.h)+i*t:Math.round(e.h)-i*t)<0?r+=360:r>=360&&(r-=360),r}function g(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-a*t:t===d?e.s+a:e.s+c*t)>1&&(r=1),n&&t===u&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function m(e,t,n){var r;return(r=n?e.v+s*t:e.v-l*t)>1&&(r=1),Number(r.toFixed(2))}function y(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=(0,o.RO)(e),i=u;i>0;i-=1){var a=p(r),c=h((0,o.RO)({h:v(a,i,!0),s:g(a,i,!0),v:m(a,i,!0)}));n.push(c)}n.push(h(r));for(var s=1;s<=d;s+=1){var l=p(r),y=h((0,o.RO)({h:v(l,s),s:g(l,s),v:m(l,s)}));n.push(y)}return"dark"===t.theme?f.map((function(e){var r,i,a,c=e.index,s=e.opacity;return h((r=(0,o.RO)(t.backgroundColor||"#141414"),i=(0,o.RO)(n[c]),a=100*s/100,{r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b}))})):n}var b={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},A={},S={};Object.keys(b).forEach((function(e){A[e]=y(b[e]),A[e].primary=A[e][5],S[e]=y(b[e],{theme:"dark",backgroundColor:"#141414"}),S[e].primary=S[e][5]}));A.red,A.volcano,A.gold,A.orange,A.yellow,A.lime,A.green,A.cyan;var w=A.blue;A.geekblue,A.purple,A.magenta,A.grey,A.grey},1466:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>ct,an:()=>T,Ki:()=>j,zA:()=>H,RC:()=>it,hV:()=>ee,IV:()=>rt});var r=n(4467),o=n(6636),i=n(4241),a=n(9379);const c=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};var s=n(5089),l=n(6540),u=n.t(l,2),d=(n(8104),n(3210),n(3029)),f=n(2901),p="%";function h(e){return e.join(p)}const v=function(){function e(t){(0,d.A)(this,e),(0,r.A)(this,"instanceId",void 0),(0,r.A)(this,"cache",new Map),this.instanceId=t}return(0,f.A)(e,[{key:"get",value:function(e){return this.opGet(h(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(h(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();var g="data-token-hash",m="data-css-hash",y="__cssinjs_instance__";function b(){var e=Math.random().toString(12).slice(2);if("undefined"!=typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(m,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[y]=t[y]||e,t[y]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(m,"]"))).forEach((function(t){var n,o=t.getAttribute(m);r[o]?t[y]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new v(e)}var A=l.createContext({hashPriority:"low",cache:b(),defaultCache:!0});const S=A;var w=n(2284),x=n(998);var k=function(){function e(){(0,d.A)(this,e),(0,r.A)(this,"cache",void 0),(0,r.A)(this,"keys",void 0),(0,r.A)(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return(0,f.A)(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var i=this.keys.reduce((function(e,t){var n=(0,o.A)(e,2)[1];return r.internalGet(t)[1]0,"[Ant Design CSS-in-JS] Theme should have at least one derivative function."),E+=1}return(0,f.A)(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),O=new k;function T(e){var t=Array.isArray(e)?e:[e];return O.has(t)||O.set(t,new M(t)),O.get(t)}var L=new WeakMap,I={};var R=new WeakMap;function z(e){var t=R.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof M?t+=r.id:r&&"object"===(0,w.A)(r)?t+=z(r):t+=r})),R.set(e,t)),t}function P(e,t){return c("".concat(t,"_").concat(z(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var N=(0,x.A)();function H(e){return"number"==typeof e?"".concat(e,"px"):e}function $(e,t,n){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var c=(0,a.A)((0,a.A)({},i),{},(o={},(0,r.A)(o,g,t),(0,r.A)(o,m,n),o)),s=Object.keys(c).map((function(e){var t=c[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"")}var j=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},_=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!=n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=(0,o.A)(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},D=function(e,t,n){var r={},i={};return Object.entries(e).forEach((function(e){var t,a,c=(0,o.A)(e,2),s=c[0],l=c[1];if(null!=n&&null!==(t=n.preserve)&&void 0!==t&&t[s])i[s]=l;else if(!("string"!=typeof l&&"number"!=typeof l||null!=n&&null!==(a=n.ignore)&&void 0!==a&&a[s])){var u,d=j(s,null==n?void 0:n.prefix);r[d]="number"!=typeof l||null!=n&&null!==(u=n.unitless)&&void 0!==u&&u[s]?String(l):"".concat(l,"px"),i[s]="var(".concat(d,")")}})),[i,_(r,t,{scope:null==n?void 0:n.scope})]},B=n(981),F=(0,a.A)({},u).useInsertionEffect;const W=F?function(e,t,n){return F((function(){return e(),t()}),n)}:function(e,t,n){l.useMemo(e,n),(0,B.A)((function(){return t(!0)}),n)};const X=void 0!==(0,a.A)({},u).useInsertionEffect?function(e){var t=[],n=!1;return l.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const U=function(){return!1};function Y(e,t,n,r,a){var c=l.useContext(S).cache,s=h([e].concat((0,i.A)(t))),u=X([s]),d=(U(),function(e){c.opUpdate(s,(function(t){var r=t||[void 0,void 0],i=(0,o.A)(r,2),a=i[0];var c=[void 0===a?0:a,i[1]||n()];return e?e(c):c}))});l.useMemo((function(){d()}),[s]);var f=c.opGet(s)[1];return W((function(){null==a||a(f)}),(function(e){return d((function(t){var n=(0,o.A)(t,2),r=n[0],i=n[1];return e&&0===r&&(null==a||a(f)),[r+1,i]})),function(){c.opUpdate(s,(function(t){var n=t||[],i=(0,o.A)(n,2),a=i[0],l=void 0===a?0:a,d=i[1];return 0===l-1?(u((function(){!e&&c.opGet(s)||null==r||r(d,!1)})),null):[l-1,d]}))}}),[s]),f}var G={},q="css",K=new Map;var V=0;function Z(e,t){K.set(e,(K.get(e)||0)-1);var n=Array.from(K.keys()),r=n.filter((function(e){return(K.get(e)||0)<=0}));n.length-r.length>V&&r.forEach((function(e){!function(e,t){"undefined"!=typeof document&&document.querySelectorAll("style[".concat(g,'="').concat(e,'"]')).forEach((function(e){var n;e[y]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),K.delete(e)}))}var Q=function(e,t,n,r){var o=n.getDerivativeToken(e),i=(0,a.A)((0,a.A)({},o),t);return r&&(i=r(i)),i},J="token";function ee(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,l.useContext)(S),u=r.cache.instanceId,d=r.container,f=n.salt,p=void 0===f?"":f,h=n.override,v=void 0===h?G:h,b=n.formatToken,A=n.getComputedToken,w=n.cssVar,x=function(e,t){for(var n=L,r=0;r0?he(Ce,--xe):0,Se--,10===ke&&(Se=1,Ae--),ke}function Oe(){return ke=xe2||Re(ke)>3?"":" "}function $e(e,t){for(;--t&&Oe()&&!(ke<48||ke>102||ke>57&&ke<65||ke>70&&ke<97););return Ie(e,Le()+(t<6&&32==Te()&&32==Oe()))}function je(e){for(;Oe();)switch(ke){case e:return xe;case 34:case 39:34!==e&&39!==e&&je(ke);break;case 40:41===e&&je(e);break;case 92:Oe()}return xe}function _e(e,t){for(;Oe()&&e+ke!==57&&(e+ke!==84||47!==Te()););return"/*"+Ie(t,xe-1)+"*"+ue(47===e?e:Oe())}function De(e){for(;!Re(Te());)Oe();return Ie(e,xe)}function Be(e){return Pe(Fe("",null,null,null,[""],e=ze(e),0,[0],e))}function Fe(e,t,n,r,o,i,a,c,s){for(var l=0,u=0,d=a,f=0,p=0,h=0,v=1,g=1,m=1,y=0,b="",A=o,S=i,w=r,x=b;g;)switch(h=y,y=Oe()){case 40:if(108!=h&&58==he(x,d-1)){-1!=pe(x+=fe(Ne(y),"&","&\f"),"&\f",le(l?c[l-1]:0))&&(m=-1);break}case 34:case 39:case 91:x+=Ne(y);break;case 9:case 10:case 13:case 32:x+=He(h);break;case 92:x+=$e(Le()-1,7);continue;case 47:switch(Te()){case 42:case 47:me(Xe(_e(Oe(),Le()),t,n,s),s);break;default:x+="/"}break;case 123*v:c[l++]=ge(x)*m;case 125*v:case 59:case 0:switch(y){case 0:case 125:g=0;case 59+u:-1==m&&(x=fe(x,/\f/g,"")),p>0&&ge(x)-d&&me(p>32?Ue(x+";",r,n,d-1,s):Ue(fe(x," ","")+";",r,n,d-2,s),s);break;case 59:x+=";";default:if(me(w=We(x,t,n,l,u,o,c,b,A=[],S=[],d,i),i),123===y)if(0===u)Fe(x,t,w,w,A,i,d,c,S);else switch(99===f&&110===he(x,3)?100:f){case 100:case 108:case 109:case 115:Fe(e,w,w,r&&me(We(e,w,w,0,0,o,c,b,o,A=[],d,S),S),o,S,d,c,r?A:S);break;default:Fe(x,w,w,w,[""],S,0,c,S)}}l=u=p=0,v=m=1,b=x="",d=a;break;case 58:d=1+ge(x),p=h;default:if(v<1)if(123==y)--v;else if(125==y&&0==v++&&125==Me())continue;switch(x+=ue(y),y*v){case 38:m=u>0?1:(x+="\f",-1);break;case 44:c[l++]=(ge(x)-1)*m,m=1;break;case 64:45===Te()&&(x+=Ne(Oe())),f=Te(),u=d=ge(b=x+=De(Le())),y++;break;case 45:45===h&&2==ge(x)&&(v=0)}}return i}function We(e,t,n,r,o,i,a,c,s,l,u,d){for(var f=o-1,p=0===o?i:[""],h=function(e){return e.length}(p),v=0,g=0,m=0;v0?p[y]+" "+b:fe(b,/&\f/g,p[y])))&&(s[m++]=A);return Ee(e,t,n,0===o?oe:c,s,l,u,d)}function Xe(e,t,n,r){return Ee(e,t,n,re,ue(ke),ve(e,2,-2),0,r)}function Ue(e,t,n,r,o){return Ee(e,t,n,ie,ve(e,0,r),ve(e,r+1,-1),r,o)}var Ye,Ge="data-ant-cssinjs-cache-path",qe="_FILE_STYLE__";var Ke=!0;function Ve(e){return function(){if(!Ye&&(Ye={},(0,x.A)())){var e=document.createElement("div");e.className=Ge,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=e.split(":"),n=(0,o.A)(t,2),r=n[0],i=n[1];Ye[r]=i}));var n,r=document.querySelector("style[".concat(Ge,"]"));r&&(Ke=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!Ye[e]}var Ze="_multi_value_";function Qe(e){return ye(Be(e),be).replace(/\{%%%\:[^;];}/g,";")}var Je=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},c=r.root,s=r.injectHash,l=r.parentSelectors,u=n.hashId,d=n.layer,f=(n.path,n.hashPriority),p=n.transformers,h=void 0===p?[]:p,v=(n.linters,""),g={};function m(t){var r=t.getName(u);if(!g[r]){var i=e(t.style,n,{root:!1,parentSelectors:l}),a=(0,o.A)(i,1)[0];g[r]="@keyframes ".concat(t.getName(u)).concat(a)}}var y=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return y.forEach((function(t){var r="string"!=typeof t||c?t:{};if("string"==typeof r)v+="".concat(r,"\n");else if(r._keyframe)m(r);else{var d=h.reduce((function(e,t){var n;return(null==t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(d).forEach((function(t){var r=d[t];if("object"!==(0,w.A)(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===(0,w.A)(e)&&e&&("_skip_check_"in e||Ze in e)}(r)){var p;function E(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;ne[e]||"number"!=typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!=t&&t._keyframe&&(m(t),r=t.getName(u)),v+="".concat(n,":").concat(r,";")}var h=null!==(p=null==r?void 0:r.value)&&void 0!==p?p:r;"object"===(0,w.A)(r)&&null!=r&&r[Ze]&&Array.isArray(h)?h.forEach((function(e){E(t,e)})):E(t,h)}else{var y=!1,b=t.trim(),A=!1;(c||s)&&u?b.startsWith("@")?y=!0:b=function(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat((0,i.A)(n.slice(1))).join(" ")})).join(",")}(t,u,f):!c||u||"&"!==b&&""!==b||(b="",A=!0);var S=e(r,n,{root:A,injectHash:y,parentSelectors:[].concat((0,i.A)(l),[b])}),x=(0,o.A)(S,2),k=x[0],C=x[1];g=(0,a.A)((0,a.A)({},g),C),v+="".concat(b).concat(k)}}))}})),c?d&&(v="@layer ".concat(d.name," {").concat(v,"}"),d.dependencies&&(g["@layer ".concat(d.name)]=d.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(d.name,";")})).join("\n"))):v="{".concat(v,"}"),[v,g]};function et(e,t){return c("".concat(e.join("%")).concat(t))}function tt(){return null}var nt="style";function rt(e,t){var n=e.token,c=e.path,u=e.hashId,d=e.layer,f=e.nonce,p=e.clientOnly,h=e.order,v=void 0===h?0:h,b=l.useContext(S),A=b.autoClear,w=(b.mock,b.defaultCache),k=b.hashPriority,C=b.container,E=b.ssrInline,M=b.transformers,O=b.linters,T=b.cache,L=b.layer,I=n._tokenKey,R=[I];L&&R.push("layer"),R.push.apply(R,(0,i.A)(c));var z=N;var P=Y(nt,R,(function(){var e=R.join("|");if(Ve(e)){var n=function(e){var t=Ye[e],n=null;if(t&&(0,x.A)())if(Ke)n=qe;else{var r=document.querySelector("style[".concat(m,'="').concat(Ye[e],'"]'));r?n=r.innerHTML:delete Ye[e]}return[n,t]}(e),r=(0,o.A)(n,2),i=r[0],a=r[1];if(i)return[i,I,a,{},p,v]}var s=t(),l=Je(s,{hashId:u,hashPriority:k,layer:L?d:void 0,path:c.join("-"),transformers:M,linters:O}),f=(0,o.A)(l,2),h=f[0],g=f[1],y=Qe(h),b=et(R,y);return[y,I,b,g,p,v]}),(function(e,t){var n=(0,o.A)(e,3)[2];(t||A)&&N&&(0,s.m6)(n,{mark:m})}),(function(e){var t=(0,o.A)(e,4),n=t[0],r=(t[1],t[2]),i=t[3];if(z&&n!==qe){var c={mark:m,prepend:!L&&"queue",attachTo:C,priority:v},l="function"==typeof f?f():f;l&&(c.csp={nonce:l});var u=[],d=[];Object.keys(i).forEach((function(e){e.startsWith("@layer")?u.push(e):d.push(e)})),u.forEach((function(e){(0,s.BD)(Qe(i[e]),"_layer-".concat(e),(0,a.A)((0,a.A)({},c),{},{prepend:!0}))}));var p=(0,s.BD)(n,r,c);p[y]=T.instanceId,p.setAttribute(g,I),d.forEach((function(e){(0,s.BD)(Qe(i[e]),"_effect-".concat(e),c)}))}})),H=(0,o.A)(P,3),$=H[0],j=H[1],_=H[2];return function(e){var t,n;E&&!z&&w?t=l.createElement("style",(0,te.A)({},(n={},(0,r.A)(n,g,j),(0,r.A)(n,m,_),n),{dangerouslySetInnerHTML:{__html:$}})):t=l.createElement(tt,null);return l.createElement(l.Fragment,null,t,e)}}var ot="cssVar";const it=function(e,t){var n=e.key,r=e.prefix,a=e.unitless,c=e.ignore,u=e.token,d=e.scope,f=void 0===d?"":d,p=(0,l.useContext)(S),h=p.cache.instanceId,v=p.container,b=u._tokenKey,A=[].concat((0,i.A)(e.path),[n,f,b]);return Y(ot,A,(function(){var e=t(),i=D(e,n,{prefix:r,unitless:a,ignore:c,scope:f}),s=(0,o.A)(i,2),l=s[0],u=s[1];return[l,u,et(A,u),n]}),(function(e){var t=(0,o.A)(e,3)[2];N&&(0,s.m6)(t,{mark:m})}),(function(e){var t=(0,o.A)(e,3),r=t[1],i=t[2];if(r){var a=(0,s.BD)(r,i,{mark:m,prepend:"queue",attachTo:v,priority:-999});a[y]=h,a.setAttribute(g,n)}}))};var at;at={},(0,r.A)(at,nt,(function(e,t,n){var r=(0,o.A)(e,6),i=r[0],a=r[1],c=r[2],s=r[3],l=r[4],u=r[5],d=(n||{}).plain;if(l)return null;var f=i,p={"data-rc-order":"prependQueue","data-rc-priority":"".concat(u)};return f=$(i,a,c,p,d),s&&Object.keys(s).forEach((function(e){if(!t[e]){t[e]=!0;var n=$(Qe(s[e]),a,"_effect-".concat(e),p,d);e.startsWith("@layer")?f=n+f:f+=n}})),[u,c,f]})),(0,r.A)(at,J,(function(e,t,n){var r=(0,o.A)(e,5),i=r[2],a=r[3],c=r[4],s=(n||{}).plain;if(!a)return null;var l=i._tokenKey;return[-999,l,$(a,c,l,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]})),(0,r.A)(at,ot,(function(e,t,n){var r=(0,o.A)(e,4),i=r[1],a=r[2],c=r[3],s=(n||{}).plain;if(!i)return null;return[-999,a,$(i,c,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]}));const ct=function(){function e(t,n){(0,d.A)(this,e),(0,r.A)(this,"name",void 0),(0,r.A)(this,"style",void 0),(0,r.A)(this,"_keyframe",!0),this.name=t,this.style=n}return(0,f.A)(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();function st(e){return e.notSplit=!0,e}st(["borderTop","borderBottom"]),st(["borderTop"]),st(["borderBottom"]),st(["borderLeft","borderRight"]),st(["borderLeft"]),st(["borderRight"])},1783:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var r=n(8168),o=n(6636),i=n(4467),a=n(45),c=n(6540),s=n(6942),l=n.n(s),u=n(2200);const d=(0,c.createContext)({});var f=n(9379),p=n(2284),h=n(5089);function v(e){var t;return null==e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function g(e){return function(e){return v(e)instanceof ShadowRoot}(e)?v(e):null}var m=n(8210);function y(e){return"object"===(0,p.A)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,p.A)(e.icon)||"function"==typeof e.icon)}function b(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function A(e,t,n){return n?c.createElement(e.tag,(0,f.A)((0,f.A)({key:t},b(e.attrs)),n),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):c.createElement(e.tag,(0,f.A)({key:t},b(e.attrs)),(e.children||[]).map((function(n,r){return A(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function S(e){return(0,u.cM)(e)[0]}function w(e){return e?Array.isArray(e)?e:[e]:[]}var x=["icon","className","onClick","style","primaryColor","secondaryColor"],k={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var C=function(e){var t,n,r,o,i,s,l,u=e.icon,p=e.className,v=e.onClick,b=e.style,w=e.primaryColor,C=e.secondaryColor,E=(0,a.A)(e,x),M=c.useRef(),O=k;if(w&&(O={primaryColor:w,secondaryColor:C||S(w)}),t=M,n=(0,c.useContext)(d),r=n.csp,o=n.prefixCls,i="\n.anticon {\n display: inline-flex;\n alignItems: center;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",o&&(i=i.replace(/anticon/g,o)),(0,c.useEffect)((function(){var e=g(t.current);(0,h.BD)(i,"@ant-design-icons",{prepend:!0,csp:r,attachTo:e})}),[]),s=y(u),l="icon should be icon definiton, but got ".concat(u),(0,m.Ay)(s,"[@ant-design/icons] ".concat(l)),!y(u))return null;var T=u;return T&&"function"==typeof T.icon&&(T=(0,f.A)((0,f.A)({},T),{},{icon:T.icon(O.primaryColor,O.secondaryColor)})),A(T.icon,"svg-".concat(T.name),(0,f.A)((0,f.A)({className:p,onClick:v,style:b,"data-icon":T.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},E),{},{ref:M}))};C.displayName="IconReact",C.getTwoToneColors=function(){return(0,f.A)({},k)},C.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;k.primaryColor=t,k.secondaryColor=n||S(t),k.calculated=!!n};const E=C;function M(e){var t=w(e),n=(0,o.A)(t,2),r=n[0],i=n[1];return E.setTwoToneColors({primaryColor:r,secondaryColor:i})}var O=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];M(u.z1.primary);var T=c.forwardRef((function(e,t){var n=e.className,s=e.icon,u=e.spin,f=e.rotate,p=e.tabIndex,h=e.onClick,v=e.twoToneColor,g=(0,a.A)(e,O),m=c.useContext(d),y=m.prefixCls,b=void 0===y?"anticon":y,A=m.rootClassName,S=l()(A,b,(0,i.A)((0,i.A)({},"".concat(b,"-").concat(s.name),!!s.name),"".concat(b,"-spin"),!!u||"loading"===s.name),n),x=p;void 0===x&&h&&(x=-1);var k=f?{msTransform:"rotate(".concat(f,"deg)"),transform:"rotate(".concat(f,"deg)")}:void 0,C=w(v),M=(0,o.A)(C,2),T=M[0],L=M[1];return c.createElement("span",(0,r.A)({role:"img","aria-label":s.name},g,{ref:t,tabIndex:x,onClick:h,className:S}),c.createElement(E,{icon:s,primaryColor:T,secondaryColor:L,style:k}))}));T.displayName="AntdIcon",T.getTwoToneColor=function(){var e=E.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},T.setTwoToneColor=M;const L=T},8633:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"}}]},name:"left",theme:"outlined"};var a=n(1783),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},363:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8168),o=n(6540);const i={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"}}]},name:"right",theme:"outlined"};var a=n(1783),c=function(e,t){return o.createElement(a.A,(0,r.A)({},e,{ref:t,icon:i}))};const s=o.forwardRef(c)},2456:(e,t,n)=>{"use strict";n.d(t,{H:()=>d,K6:()=>i,Me:()=>l,Ob:()=>u,YL:()=>c,_:()=>o,g8:()=>h,n6:()=>p,oS:()=>v,wE:()=>s});var r=n(9244);function o(e,t,n){return{r:255*(0,r.Cg)(e,255),g:255*(0,r.Cg)(t,255),b:255*(0,r.Cg)(n,255)}}function i(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=0,s=(o+i)/2;if(o===i)c=0,a=0;else{var l=o-i;switch(c=s>.5?l/(2-o-i):l/(o+i),o){case e:a=(t-n)/l+(t1&&(n-=1),n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function c(e,t,n){var o,i,c;if(e=(0,r.Cg)(e,360),t=(0,r.Cg)(t,100),n=(0,r.Cg)(n,100),0===t)i=n,c=n,o=n;else{var s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;o=a(l,s,e+1/3),i=a(l,s,e),c=a(l,s,e-1/3)}return{r:255*o,g:255*i,b:255*c}}function s(e,t,n){e=(0,r.Cg)(e,255),t=(0,r.Cg)(t,255),n=(0,r.Cg)(n,255);var o=Math.max(e,t,n),i=Math.min(e,t,n),a=0,c=o,s=o-i,l=0===o?0:s/o;if(o===i)a=0;else{switch(o){case e:a=(t-n)/s+(t>16,g:(65280&e)>>8,b:255&e}}},2434:(e,t,n)=>{"use strict";n.d(t,{D:()=>r});var r={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}},6250:(e,t,n)=>{"use strict";n.d(t,{RO:()=>a});var r=n(2456),o=n(2434),i=n(9244);function a(e){var t={r:0,g:0,b:0},n=1,a=null,c=null,s=null,l=!1,f=!1;return"string"==typeof e&&(e=function(e){if(e=e.trim().toLowerCase(),0===e.length)return!1;var t=!1;if(o.D[e])e=o.D[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=u.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=u.rgba.exec(e),n)return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=u.hsl.exec(e),n)return{h:n[1],s:n[2],l:n[3]};if(n=u.hsla.exec(e),n)return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=u.hsv.exec(e),n)return{h:n[1],s:n[2],v:n[3]};if(n=u.hsva.exec(e),n)return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=u.hex8.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),a:(0,r.n6)(n[4]),format:t?"name":"hex8"};if(n=u.hex6.exec(e),n)return{r:(0,r.g8)(n[1]),g:(0,r.g8)(n[2]),b:(0,r.g8)(n[3]),format:t?"name":"hex"};if(n=u.hex4.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),a:(0,r.n6)(n[4]+n[4]),format:t?"name":"hex8"};if(n=u.hex3.exec(e),n)return{r:(0,r.g8)(n[1]+n[1]),g:(0,r.g8)(n[2]+n[2]),b:(0,r.g8)(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(d(e.r)&&d(e.g)&&d(e.b)?(t=(0,r._)(e.r,e.g,e.b),l=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=(0,i.Px)(e.s),c=(0,i.Px)(e.v),t=(0,r.Me)(e.h,a,c),l=!0,f="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=(0,i.Px)(e.s),s=(0,i.Px)(e.l),t=(0,r.YL)(e.h,a,s),l=!0,f="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=(0,i.TV)(n),{ok:l,format:e.format||f,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var c="(?:".concat("[-\\+]?\\d*\\.\\d+%?",")|(?:").concat("[-\\+]?\\d+%?",")"),s="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),l="[\\s|\\(]+(".concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")[,|\\s]+(").concat(c,")\\s*\\)?"),u={CSS_UNIT:new RegExp(c),rgb:new RegExp("rgb"+s),rgba:new RegExp("rgba"+l),hsl:new RegExp("hsl"+s),hsla:new RegExp("hsla"+l),hsv:new RegExp("hsv"+s),hsva:new RegExp("hsva"+l),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function d(e){return Boolean(u.CSS_UNIT.exec(String(e)))}},4978:(e,t,n)=>{"use strict";n.d(t,{q:()=>c});var r=n(2456),o=n(2434),i=n(6250),a=n(9244),c=function(){function e(t,n){var o;if(void 0===t&&(t=""),void 0===n&&(n={}),t instanceof e)return t;"number"==typeof t&&(t=(0,r.oS)(t)),this.originalInput=t;var a=(0,i.RO)(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=null!==(o=n.format)&&void 0!==o?o:a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},e.prototype.getLuminance=function(){var e=this.toRgb(),t=e.r/255,n=e.g/255,r=e.b/255;return.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(e){return this.a=(0,a.TV)(e),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){return 0===this.toHsl().s},e.prototype.toHsv=function(){var e=(0,r.wE)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,v:e.v,a:this.a}},e.prototype.toHsvString=function(){var e=(0,r.wE)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.v);return 1===this.a?"hsv(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsva(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var e=(0,r.K6)(this.r,this.g,this.b);return{h:360*e.h,s:e.s,l:e.l,a:this.a}},e.prototype.toHslString=function(){var e=(0,r.K6)(this.r,this.g,this.b),t=Math.round(360*e.h),n=Math.round(100*e.s),o=Math.round(100*e.l);return 1===this.a?"hsl(".concat(t,", ").concat(n,"%, ").concat(o,"%)"):"hsla(".concat(t,", ").concat(n,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(e){return void 0===e&&(e=!1),(0,r.Ob)(this.r,this.g,this.b,e)},e.prototype.toHexString=function(e){return void 0===e&&(e=!1),"#"+this.toHex(e)},e.prototype.toHex8=function(e){return void 0===e&&(e=!1),(0,r.H)(this.r,this.g,this.b,this.a,e)},e.prototype.toHex8String=function(e){return void 0===e&&(e=!1),"#"+this.toHex8(e)},e.prototype.toHexShortString=function(e){return void 0===e&&(e=!1),1===this.a?this.toHexString(e):this.toHex8String(e)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return 1===this.a?"rgb(".concat(e,", ").concat(t,", ").concat(n,")"):"rgba(".concat(e,", ").concat(t,", ").concat(n,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var e=function(e){return"".concat(Math.round(100*(0,a.Cg)(e,255)),"%")};return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var e=function(e){return Math.round(100*(0,a.Cg)(e,255))};return 1===this.a?"rgb(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%)"):"rgba(".concat(e(this.r),"%, ").concat(e(this.g),"%, ").concat(e(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(0===this.a)return"transparent";if(this.a<1)return!1;for(var e="#"+(0,r.Ob)(this.r,this.g,this.b,!1),t=0,n=Object.entries(o.D);t=0;return t||!r||!e.startsWith("hex")&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this.a?this.toName():this.toRgbString()},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.brighten=function(t){void 0===t&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(-t/100*255))),n.g=Math.max(0,Math.min(255,n.g-Math.round(-t/100*255))),n.b=Math.max(0,Math.min(255,n.b-Math.round(-t/100*255))),new e(n)},e.prototype.darken=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=(0,a.J$)(n.l),new e(n)},e.prototype.tint=function(e){return void 0===e&&(e=10),this.mix("white",e)},e.prototype.shade=function(e){return void 0===e&&(e=10),this.mix("black",e)},e.prototype.desaturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.saturate=function(t){void 0===t&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=(0,a.J$)(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){void 0===n&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),i=n/100;return new e({r:(o.r-r.r)*i+r.r,g:(o.g-r.g)*i+r.g,b:(o.b-r.b)*i+r.b,a:(o.a-r.a)*i+r.a})},e.prototype.analogous=function(t,n){void 0===t&&(t=6),void 0===n&&(n=30);var r=this.toHsl(),o=360/n,i=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,i.push(new e(r));return i},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){void 0===t&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,i=n.v,a=[],c=1/t;t--;)a.push(new e({h:r,s:o,v:i})),i=(i+c)%1;return a},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],i=360/t,a=1;a{"use strict";function r(e,t){(function(e){return"string"==typeof e&&-1!==e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!==e.indexOf("%")}(e);return e=360===t?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:e=360===t?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t))}function o(e){return Math.min(1,Math.max(0,e))}function i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function a(e){return e<=1?"".concat(100*Number(e),"%"):e}function c(e){return 1===e.length?"0"+e:String(e)}n.d(t,{Cg:()=>r,J$:()=>o,Px:()=>a,TV:()=>i,wl:()=>c})},6943:(e,t,n)=>{"use strict";n.d(t,{A:()=>_e});var r=n(6540),o=n(8168),i=n(9379),a=n(3029),c=n(2901),s=n(6822),l=n(2176),u=n(3954),d=n(5501),f=n(4467),p=n(2284),h=n(45);const v={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0};function g(e,t,n){var r=(n||{}).atBegin;return function(e,t,n){var r,o=n||{},i=o.noTrailing,a=void 0!==i&&i,c=o.noLeading,s=void 0!==c&&c,l=o.debounceMode,u=void 0===l?void 0:l,d=!1,f=0;function p(){r&&clearTimeout(r)}function h(){for(var n=arguments.length,o=new Array(n),i=0;ie?s?(f=Date.now(),a||(r=setTimeout(u?v:h,e))):h():!0!==a&&(r=setTimeout(u?v:h,void 0===u?e-l:e)))}return h.cancel=function(e){var t=(e||{}).upcomingOnly,n=void 0!==t&&t;p(),d=!n},h}(e,t,{debounceMode:!1!==(void 0!==r&&r)})}var m=n(6942),y=n.n(m);const b={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return r.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return r.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0,asNavFor:null};function A(e,t,n){return Math.max(t,Math.min(e,n))}var S=function(e){["onTouchStart","onTouchMove","onWheel"].includes(e._reactName)||e.preventDefault()},w=function(e){for(var t=[],n=x(e),r=k(e),o=n;o0?1:0):0},E=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},M=function(e){return e&&e.offsetWidth||0},O=function(e){return e&&e.offsetHeight||0},T=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),(o=Math.round(180*r/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},L=function(e){var t=!0;return e.infinite||(e.centerMode&&e.currentSlide>=e.slideCount-1||e.slideCount<=e.slidesToShow||e.currentSlide>=e.slideCount-e.slidesToShow)&&(t=!1),t},I=function(e,t){var n={};return t.forEach((function(t){return n[t]=e[t]})),n},R=function(e,t){var n=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];nn[n.length-1])t=n[n.length-1];else for(var o in n){if(t-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+M(r)/2>-1*e.swipeLeft)return n=r,!1;return!0})),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},P=function(e,t){return t.reduce((function(t,n){return t&&e.hasOwnProperty(n)}),!0)?null:console.error("Keys Missing:",e)},N=function(e){var t,n;(P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]),e.vertical)?n=(e.unslick?e.slideCount:e.slideCount+2*e.slidesToShow)*e.slideHeight:t=D(e)*e.slideWidth;var r={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var o=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",c=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";r=(0,i.A)((0,i.A)({},r),{},{WebkitTransform:o,transform:a,msTransform:c})}else e.vertical?r.top=e.left:r.left=e.left;return e.fade&&(r={opacity:1}),t&&(r.width=t),n&&(r.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?r.marginTop=e.left+"px":r.marginLeft=e.left+"px"),r},H=function(e){P(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=N(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},$=function(e){if(e.unslick)return 0;P(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,c=e.slideCount,s=e.slidesToShow,l=e.slidesToScroll,u=e.slideWidth,d=e.listWidth,f=e.variableWidth,p=e.slideHeight,h=e.fade,v=e.vertical;if(h||1===e.slideCount)return 0;var g=0;if(i?(g=-j(e),c%l!=0&&r+l>c&&(g=-(r>c?s-(r-c):c%l)),a&&(g+=parseInt(s/2))):(c%l!=0&&r+l>c&&(g=s-c%l),a&&(g=parseInt(s/2))),t=v?r*p*-1+g*p:r*u*-1+g*u,!0===f){var m,y=o&&o.node;if(m=r+j(e),t=(n=y&&y.childNodes[m])?-1*n.offsetLeft:0,!0===a){m=i?r+j(e):r,n=y&&y.children[m],t=0;for(var b=0;be.currentSlide?e.targetSlide>e.currentSlide+F(e)?"left":"right":e.targetSlide0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},W=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0},X=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)},U=Object.keys(b);var Y=function(e){var t,n,r,o,i;return r=(i=e.rtl?e.slideCount-1-e.index:e.index)<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i=e.slideCount?e.targetSlide-e.slideCount:e.targetSlide)}},G=function(e,t){return e.key+"-"+t},q=function(e){var t,n=[],o=[],a=[],c=r.Children.count(e.children),s=x(e),l=k(e);return r.Children.forEach(e.children,(function(u,d){var f,p={message:"children",index:d,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};f=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(d)>=0?u:r.createElement("div",null);var h=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical&&e.slideHeight?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.zIndex=e.currentSlide===e.index?999:998,e.useCSS&&(t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase)),t}((0,i.A)((0,i.A)({},e),{},{index:d})),v=f.props.className||"",g=Y((0,i.A)((0,i.A)({},e),{},{index:d}));if(n.push(r.cloneElement(f,{key:"original"+G(f,d),"data-index":d,className:y()(g,v),tabIndex:"-1","aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({outline:"none"},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}})),e.infinite&&c>1&&!1===e.fade&&!e.unslick){var m=c-d;m<=j(e)&&((t=-m)>=s&&(f=u),g=Y((0,i.A)((0,i.A)({},e),{},{index:t})),o.push(r.cloneElement(f,{key:"precloned"+G(f,t),"data-index":t,tabIndex:"-1",className:y()(g,v),"aria-hidden":!g["slick-active"],style:(0,i.A)((0,i.A)({},f.props.style||{}),h),onClick:function(t){f.props&&f.props.onClick&&f.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(p)}}))),(t=c+d)=S&&d<=m:d===S}),x={message:"dots",index:v,slidesToScroll:s,currentSlide:d},k=this.clickHandler.bind(this,x);h=h.concat(r.createElement("li",{key:v,className:w},r.cloneElement(this.props.customPaging(v),{onClick:k})))}return r.cloneElement(this.props.appendDots(h),(0,i.A)({className:this.props.dotsClass},p))}}])}(r.PureComponent);function Z(e,t,n){return t=(0,u.A)(t),(0,s.A)(e,(0,l.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var Q=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?r.cloneElement(this.props.prevArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"0",type:"button"},n)," ","Previous")}}])}(r.PureComponent),J=function(e){function t(){return(0,a.A)(this,t),Z(this,t,arguments)}return(0,d.A)(t,e),(0,c.A)(t,[{key:"clickHandler",value:function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)}},{key:"render",value:function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});L(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:y()(e),style:{display:"block"},onClick:t},a={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?r.cloneElement(this.props.nextArrow,(0,i.A)((0,i.A)({},n),a)):r.createElement("button",(0,o.A)({key:"1",type:"button"},n)," ","Next")}}])}(r.PureComponent),ee=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some((function(e,r){return e[0]===t&&(n=r,!0)})),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){te&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ie?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){te&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;oe.some((function(e){return!!~n.indexOf(e)}))&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ce=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),be="undefined"!=typeof WeakMap?new WeakMap:new ee,Ae=function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=ae.getInstance(),r=new ye(t,n,this);be.set(this,r)};["observe","unobserve","disconnect"].forEach((function(e){Ae.prototype[e]=function(){var t;return(t=be.get(this))[e].apply(t,arguments)}}));const Se=void 0!==ne.ResizeObserver?ne.ResizeObserver:Ae;var we=["animating"];var xe=function(e){function t(e){var n,c,d,p;(0,a.A)(this,t),c=this,d=t,p=[e],d=(0,u.A)(d),n=(0,s.A)(c,(0,l.A)()?Reflect.construct(d,p||[],(0,u.A)(c).constructor):d.apply(c,p)),(0,f.A)(n,"listRefHandler",(function(e){return n.list=e})),(0,f.A)(n,"trackRefHandler",(function(e){return n.track=e})),(0,f.A)(n,"adaptHeight",(function(){if(n.props.adaptiveHeight&&n.list){var e=n.list.querySelector('[data-index="'.concat(n.state.currentSlide,'"]'));n.list.style.height=O(e)+"px"}})),(0,f.A)(n,"componentDidMount",(function(){if(n.props.onInit&&n.props.onInit(),n.props.lazyLoad){var e=w((0,i.A)((0,i.A)({},n.props),n.state));e.length>0&&(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e))}var t=(0,i.A)({listRef:n.list,trackRef:n.track},n.props);n.updateState(t,!0,(function(){n.adaptHeight(),n.props.autoplay&&n.autoPlay("playing")})),"progressive"===n.props.lazyLoad&&(n.lazyLoadTimer=setInterval(n.progressiveLazyLoad,1e3)),n.ro=new Se((function(){n.state.animating?(n.onWindowResized(!1),n.callbackTimers.push(setTimeout((function(){return n.onWindowResized()}),n.props.speed))):n.onWindowResized()})),n.ro.observe(n.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),(function(e){e.onfocus=n.props.pauseOnFocus?n.onSlideFocus:null,e.onblur=n.props.pauseOnFocus?n.onSlideBlur:null})),window.addEventListener?window.addEventListener("resize",n.onWindowResized):window.attachEvent("onresize",n.onWindowResized)})),(0,f.A)(n,"componentWillUnmount",(function(){n.animationEndCallback&&clearTimeout(n.animationEndCallback),n.lazyLoadTimer&&clearInterval(n.lazyLoadTimer),n.callbackTimers.length&&(n.callbackTimers.forEach((function(e){return clearTimeout(e)})),n.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",n.onWindowResized):window.detachEvent("onresize",n.onWindowResized),n.autoplayTimer&&clearInterval(n.autoplayTimer),n.ro.disconnect()})),(0,f.A)(n,"componentDidUpdate",(function(e){if(n.checkImagesLoad(),n.props.onReInit&&n.props.onReInit(),n.props.lazyLoad){var t=w((0,i.A)((0,i.A)({},n.props),n.state));t.length>0&&(n.setState((function(e){return{lazyLoadedList:e.lazyLoadedList.concat(t)}})),n.props.onLazyLoad&&n.props.onLazyLoad(t))}n.adaptHeight();var o=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state),a=n.didPropsChange(e);a&&n.updateState(o,a,(function(){n.state.currentSlide>=r.Children.count(n.props.children)&&n.changeSlide({message:"index",index:r.Children.count(n.props.children)-n.props.slidesToShow,currentSlide:n.state.currentSlide}),e.autoplay===n.props.autoplay&&e.autoplaySpeed===n.props.autoplaySpeed||(!e.autoplay&&n.props.autoplay?n.autoPlay("playing"):n.props.autoplay?n.autoPlay("update"):n.pause("paused"))}))})),(0,f.A)(n,"onWindowResized",(function(e){n.debouncedResize&&n.debouncedResize.cancel(),n.debouncedResize=g(50,(function(){return n.resizeWindow(e)})),n.debouncedResize()})),(0,f.A)(n,"resizeWindow",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(Boolean(n.track&&n.track.node)){var t=(0,i.A)((0,i.A)({listRef:n.list,trackRef:n.track},n.props),n.state);n.updateState(t,e,(function(){n.props.autoplay?n.autoPlay("update"):n.pause("paused")})),n.setState({animating:!1}),clearTimeout(n.animationEndCallback),delete n.animationEndCallback}})),(0,f.A)(n,"updateState",(function(e,t,o){var a=function(e){var t,n=r.Children.count(e.children),o=e.listRef,a=Math.ceil(M(o)),c=e.trackRef&&e.trackRef.node,s=Math.ceil(M(c));if(e.vertical)t=a;else{var l=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(l*=a/100),t=Math.ceil((a-l)/e.slidesToShow)}var u=o&&O(o.querySelector('[data-index="0"]')),d=u*e.slidesToShow,f=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(f=n-1-e.initialSlide);var p=e.lazyLoadedList||[],h=w((0,i.A)((0,i.A)({},e),{},{currentSlide:f,lazyLoadedList:p})),v={slideCount:n,slideWidth:t,listWidth:a,trackWidth:s,currentSlide:f,slideHeight:u,listHeight:d,lazyLoadedList:p=p.concat(h)};return null===e.autoplaying&&e.autoplay&&(v.autoplaying="playing"),v}(e);e=(0,i.A)((0,i.A)((0,i.A)({},e),a),{},{slideIndex:a.currentSlide});var c=$(e);e=(0,i.A)((0,i.A)({},e),{},{left:c});var s=N(e);(t||r.Children.count(n.props.children)!==r.Children.count(e.children))&&(a.trackStyle=s),n.setState(a,o)})),(0,f.A)(n,"ssrInit",(function(){if(n.props.variableWidth){var e=0,t=0,o=[],a=j((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length})),c=_((0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{slideCount:n.props.children.length}));n.props.children.forEach((function(t){o.push(t.props.style.width),e+=t.props.style.width}));for(var s=0;s=t&&n.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(t){i(t),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(n.props.lazyLoad?e.onload=function(){n.adaptHeight(),n.callbackTimers.push(setTimeout(n.onWindowResized,n.props.speed))}:(e.onload=o,e.onerror=function(){o(),n.props.onLazyLoadError&&n.props.onLazyLoadError()}))}))})),(0,f.A)(n,"progressiveLazyLoad",(function(){for(var e=[],t=(0,i.A)((0,i.A)({},n.props),n.state),r=n.state.currentSlide;r=-j(t);o--)if(n.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(n.setState((function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}})),n.props.onLazyLoad&&n.props.onLazyLoad(e)):n.lazyLoadTimer&&(clearInterval(n.lazyLoadTimer),delete n.lazyLoadTimer)})),(0,f.A)(n,"slideHandler",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.props,o=r.asNavFor,a=r.beforeChange,c=r.onLazyLoad,s=r.speed,l=r.afterChange,u=n.state.currentSlide,d=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,o=e.infinite,a=e.index,c=e.slideCount,s=e.lazyLoad,l=e.currentSlide,u=e.centerMode,d=e.slidesToScroll,f=e.slidesToShow,p=e.useCSS,h=e.lazyLoadedList;if(t&&n)return{};var v,g,m,y=a,b={},S={},x=o?a:A(a,0,c-1);if(r){if(!o&&(a<0||a>=c))return{};a<0?y=a+c:a>=c&&(y=a-c),s&&h.indexOf(y)<0&&(h=h.concat(y)),b={animating:!0,currentSlide:y,lazyLoadedList:h,targetSlide:y},S={animating:!1,targetSlide:y}}else v=y,y<0?(v=y+c,o?c%d!=0&&(v=c-c%d):v=0):!L(e)&&y>l?y=v=l:u&&y>=c?(y=o?c:c-1,v=o?0:c-1):y>=c&&(v=y-c,o?c%d!=0&&(v=0):v=c-f),!o&&y+f>=c&&(v=c-f),g=$((0,i.A)((0,i.A)({},e),{},{slideIndex:y})),m=$((0,i.A)((0,i.A)({},e),{},{slideIndex:v})),o||(g===m&&(y=v),g=m),s&&(h=h.concat(w((0,i.A)((0,i.A)({},e),{},{currentSlide:y})))),p?(b={animating:!0,currentSlide:v,trackStyle:H((0,i.A)((0,i.A)({},e),{},{left:g})),lazyLoadedList:h,targetSlide:x},S={animating:!1,currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),swipeLeft:null,targetSlide:x}):b={currentSlide:v,trackStyle:N((0,i.A)((0,i.A)({},e),{},{left:m})),lazyLoadedList:h,targetSlide:x};return{state:b,nextState:S}}((0,i.A)((0,i.A)((0,i.A)({index:e},n.props),n.state),{},{trackRef:n.track,useCSS:n.props.useCSS&&!t})),f=d.state,p=d.nextState;if(f){a&&a(u,f.currentSlide);var v=f.lazyLoadedList.filter((function(e){return n.state.lazyLoadedList.indexOf(e)<0}));c&&v.length>0&&c(v),!n.props.waitForAnimate&&n.animationEndCallback&&(clearTimeout(n.animationEndCallback),l&&l(u),delete n.animationEndCallback),n.setState(f,(function(){o&&n.asNavForIndex!==e&&(n.asNavForIndex=e,o.innerSlider.slideHandler(e)),p&&(n.animationEndCallback=setTimeout((function(){var e=p.animating,t=(0,h.A)(p,we);n.setState(t,(function(){n.callbackTimers.push(setTimeout((function(){return n.setState({animating:e})}),10)),l&&l(f.currentSlide),delete n.animationEndCallback}))}),s))}))}})),(0,f.A)(n,"changeSlide",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=function(e,t){var n,r,o,a,c=e.slidesToScroll,s=e.slidesToShow,l=e.slideCount,u=e.currentSlide,d=e.targetSlide,f=e.lazyLoad,p=e.infinite;if(n=l%c!=0?0:(l-u)%c,"previous"===t.message)a=u-(o=0===n?c:s-n),f&&!p&&(a=-1==(r=u-o)?l-1:r),p||(a=d-c);else if("next"===t.message)a=u+(o=0===n?c:n),f&&!p&&(a=(u+c)%l+n),p||(a=d+c);else if("dots"===t.message)a=t.index*t.slidesToScroll;else if("children"===t.message){if(a=t.index,p){var h=B((0,i.A)((0,i.A)({},e),{},{targetSlide:a}));a>t.currentSlide&&"left"===h?a-=l:a10)return{scrolling:!0};c&&(y.swipeLength=E);var M=(s?-1:1)*(y.curX>y.startX?1:-1);c&&(M=y.curY>y.startY?1:-1);var O=Math.ceil(v/g),I=T(t.touchObject,c),R=y.swipeLength;return m||(0===l&&("right"===I||"down"===I)||l+1>=O&&("left"===I||"up"===I)||!L(t)&&("left"===I||"up"===I))&&(R=y.swipeLength*u,!1===d&&f&&(f(I),k.edgeDragged=!0)),!p&&b&&(b(I),k.swiped=!0),x=o?C+R*(A/w)*M:s?C-R*M:C+R*M,c&&(x=C+R*M),k=(0,i.A)((0,i.A)({},k),{},{touchObject:y,swipeLeft:x,trackStyle:N((0,i.A)((0,i.A)({},t),{},{left:x}))}),Math.abs(y.curX-y.startX)<.8*Math.abs(y.curY-y.startY)||y.swipeLength>10&&(k.swiping=!0,S(e)),k}}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));t&&(t.swiping&&(n.clickable=!1),n.setState(t))})),(0,f.A)(n,"swipeEnd",(function(e){var t=function(e,t){var n=t.dragging,r=t.swipe,o=t.touchObject,a=t.listWidth,c=t.touchThreshold,s=t.verticalSwiping,l=t.listHeight,u=t.swipeToSlide,d=t.scrolling,f=t.onSwipe,p=t.targetSlide,h=t.currentSlide,v=t.infinite;if(!n)return r&&S(e),{};var g=s?l/c:a/c,m=T(o,s),y={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(d)return y;if(!o.swipeLength)return y;if(o.swipeLength>g){var b,A;S(e),f&&f(m);var w=v?h:p;switch(m){case"left":case"up":A=w+z(t),b=u?R(t,A):A,y.currentDirection=0;break;case"right":case"down":A=w-z(t),b=u?R(t,A):A,y.currentDirection=1;break;default:b=w}y.triggerSlideHandler=b}else{var x=$(t);y.trackStyle=H((0,i.A)((0,i.A)({},t),{},{left:x}))}return y}(e,(0,i.A)((0,i.A)((0,i.A)({},n.props),n.state),{},{trackRef:n.track,listRef:n.list,slideIndex:n.state.currentSlide}));if(t){var r=t.triggerSlideHandler;delete t.triggerSlideHandler,n.setState(t),void 0!==r&&(n.slideHandler(r),n.props.verticalSwiping&&n.enableBodyScroll())}})),(0,f.A)(n,"touchEnd",(function(e){n.swipeEnd(e),n.clickable=!0})),(0,f.A)(n,"slickPrev",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"previous"})}),0))})),(0,f.A)(n,"slickNext",(function(){n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"next"})}),0))})),(0,f.A)(n,"slickGoTo",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";n.callbackTimers.push(setTimeout((function(){return n.changeSlide({message:"index",index:e,currentSlide:n.state.currentSlide},t)}),0))})),(0,f.A)(n,"play",(function(){var e;if(n.props.rtl)e=n.state.currentSlide-n.props.slidesToScroll;else{if(!L((0,i.A)((0,i.A)({},n.props),n.state)))return!1;e=n.state.currentSlide+n.props.slidesToScroll}n.slideHandler(e)})),(0,f.A)(n,"autoPlay",(function(e){n.autoplayTimer&&clearInterval(n.autoplayTimer);var t=n.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;n.autoplayTimer=setInterval(n.play,n.props.autoplaySpeed+50),n.setState({autoplaying:"playing"})})),(0,f.A)(n,"pause",(function(e){n.autoplayTimer&&(clearInterval(n.autoplayTimer),n.autoplayTimer=null);var t=n.state.autoplaying;"paused"===e?n.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||n.setState({autoplaying:"focused"}):"playing"===t&&n.setState({autoplaying:"hovered"})})),(0,f.A)(n,"onDotsOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onDotsLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onTrackOver",(function(){return n.props.autoplay&&n.pause("hovered")})),(0,f.A)(n,"onTrackLeave",(function(){return n.props.autoplay&&"hovered"===n.state.autoplaying&&n.autoPlay("leave")})),(0,f.A)(n,"onSlideFocus",(function(){return n.props.autoplay&&n.pause("focused")})),(0,f.A)(n,"onSlideBlur",(function(){return n.props.autoplay&&"focused"===n.state.autoplaying&&n.autoPlay("blur")})),(0,f.A)(n,"render",(function(){var e,t,a,c=y()("slick-slider",n.props.className,{"slick-vertical":n.props.vertical,"slick-initialized":!0}),s=(0,i.A)((0,i.A)({},n.props),n.state),l=I(s,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),u=n.props.pauseOnHover;if(l=(0,i.A)((0,i.A)({},l),{},{onMouseEnter:u?n.onTrackOver:null,onMouseLeave:u?n.onTrackLeave:null,onMouseOver:u?n.onTrackOver:null,focusOnSelect:n.props.focusOnSelect&&n.clickable?n.selectHandler:null}),!0===n.props.dots&&n.state.slideCount>=n.props.slidesToShow){var d=I(s,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),f=n.props.pauseOnDotsHover;d=(0,i.A)((0,i.A)({},d),{},{clickHandler:n.changeSlide,onMouseEnter:f?n.onDotsLeave:null,onMouseOver:f?n.onDotsOver:null,onMouseLeave:f?n.onDotsLeave:null}),e=r.createElement(V,d)}var p=I(s,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);p.clickHandler=n.changeSlide,n.props.arrows&&(t=r.createElement(Q,p),a=r.createElement(J,p));var h=null;n.props.vertical&&(h={height:n.state.listHeight});var v=null;!1===n.props.vertical?!0===n.props.centerMode&&(v={padding:"0px "+n.props.centerPadding}):!0===n.props.centerMode&&(v={padding:n.props.centerPadding+" 0px"});var g=(0,i.A)((0,i.A)({},h),v),m=n.props.touchMove,b={className:"slick-list",style:g,onClick:n.clickHandler,onMouseDown:m?n.swipeStart:null,onMouseMove:n.state.dragging&&m?n.swipeMove:null,onMouseUp:m?n.swipeEnd:null,onMouseLeave:n.state.dragging&&m?n.swipeEnd:null,onTouchStart:m?n.swipeStart:null,onTouchMove:n.state.dragging&&m?n.swipeMove:null,onTouchEnd:m?n.touchEnd:null,onTouchCancel:n.state.dragging&&m?n.swipeEnd:null,onKeyDown:n.props.accessibility?n.keyHandler:null},A={className:c,dir:"ltr",style:n.props.style};return n.props.unslick&&(b={className:"slick-list"},A={className:c,style:n.props.style}),r.createElement("div",A,n.props.unslick?"":t,r.createElement("div",(0,o.A)({ref:n.listRefHandler},b),r.createElement(K,(0,o.A)({ref:n.trackRefHandler},l),n.props.children)),n.props.unslick?"":a,n.props.unslick?"":e)})),n.list=null,n.track=null,n.state=(0,i.A)((0,i.A)({},v),{},{currentSlide:n.props.initialSlide,targetSlide:n.props.initialSlide?n.props.initialSlide:0,slideCount:r.Children.count(n.props.children)}),n.callbackTimers=[],n.clickable=!0,n.debouncedResize=null;var m=n.ssrInit();return n.state=(0,i.A)((0,i.A)({},n.state),m),n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"didPropsChange",value:function(e){for(var t=!1,n=0,o=Object.keys(this.props);n1&&void 0!==arguments[1]&&arguments[1];return n.innerSlider.slickGoTo(e,t)})),(0,f.A)(n,"slickPause",(function(){return n.innerSlider.pause("paused")})),(0,f.A)(n,"slickPlay",(function(){return n.innerSlider.autoPlay("play")})),n.state={breakpoint:null},n._responsiveMediaHandlers=[],n}return(0,d.A)(t,e),(0,c.A)(t,[{key:"media",value:function(e,t){var n=window.matchMedia(e),r=function(e){e.matches&&t()};n.addListener(r),r(n),this._responsiveMediaHandlers.push({mql:n,query:e,listener:r})}},{key:"componentDidMount",value:function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map((function(e){return e.breakpoint}));t.sort((function(e,t){return e-t})),t.forEach((function(n,r){var o;o=0===r?Ce()({minWidth:0,maxWidth:n}):Ce()({minWidth:t[r-1]+1,maxWidth:n}),X()&&e.media(o,(function(){e.setState({breakpoint:n})}))}));var n=Ce()({minWidth:t.slice(-1)[0]});X()&&this.media(n,(function(){e.setState({breakpoint:null})}))}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach((function(e){e.mql.removeListener(e.listener)}))}},{key:"render",value:function(){var e,t,n=this;(e=this.state.breakpoint?"unslick"===(t=this.props.responsive.filter((function(e){return e.breakpoint===n.state.breakpoint})))[0].settings?"unslick":(0,i.A)((0,i.A)((0,i.A)({},b),this.props),t[0].settings):(0,i.A)((0,i.A)({},b),this.props)).centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var a=r.Children.toArray(this.props.children);a=a.filter((function(e){return"string"==typeof e?!!e.trim():!!e})),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var c=[],s=null,l=0;l=a.length));p+=1)f.push(r.cloneElement(a[p],{key:100*l+10*d+p,tabIndex:-1,style:{width:"".concat(100/e.slidesPerRow,"%"),display:"inline-block"}}));u.push(r.createElement("div",{key:10*l+d},f))}e.variableWidth?c.push(r.createElement("div",{key:l,style:{width:s}},u)):c.push(r.createElement("div",{key:l},u))}if("unslick"===e){var h="regular slider "+(this.props.className||"");return r.createElement("div",{className:h},a)}return c.length<=e.slidesToShow&&!e.infinite&&(e.unslick=!0),r.createElement(xe,(0,o.A)({style:this.props.style,ref:this.innerSliderRefHandler},function(e){return U.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}(e)),c)}}])}(r.Component);const Me=Ee;var Oe=n(2279),Te=n(1466),Le=n(5905),Ie=n(665),Re=n(336);const ze=e=>{const{componentCls:t,antCls:n,carouselArrowSize:r,carouselDotOffset:o,marginXXS:i}=e,a=e.calc(r).mul(-1.25).equal(),c=i;return{[t]:Object.assign(Object.assign({},(0,Le.dF)(e)),{".slick-slider":{position:"relative",display:"block",boxSizing:"border-box",touchAction:"pan-y",WebkitTouchCallout:"none",WebkitTapHighlightColor:"transparent",".slick-track, .slick-list":{transform:"translate3d(0, 0, 0)",touchAction:"pan-y"}},".slick-list":{position:"relative",display:"block",margin:0,padding:0,overflow:"hidden","&:focus":{outline:"none"},"&.dragging":{cursor:"pointer"},".slick-slide":{pointerEvents:"none",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"hidden"},"&.slick-active":{pointerEvents:"auto",[`input${n}-radio-input, input${n}-checkbox-input`]:{visibility:"visible"}},"> div > div":{verticalAlign:"bottom"}}},".slick-track":{position:"relative",top:0,insetInlineStart:0,display:"block","&::before, &::after":{display:"table",content:'""'},"&::after":{clear:"both"}},".slick-slide":{display:"none",float:"left",height:"100%",minHeight:1,img:{display:"block"},"&.dragging img":{pointerEvents:"none"}},".slick-initialized .slick-slide":{display:"block"},".slick-vertical .slick-slide":{display:"block",height:"auto"},".slick-arrow.slick-hidden":{display:"none"},".slick-prev, .slick-next":{position:"absolute",top:"50%",display:"block",width:r,height:r,marginTop:e.calc(r).mul(-1).div(2).equal(),padding:0,color:"transparent",fontSize:0,lineHeight:0,background:"transparent",border:0,outline:"none",cursor:"pointer","&:hover, &:focus":{color:"transparent",background:"transparent",outline:"none","&::before":{opacity:1}},"&.slick-disabled::before":{opacity:.25}},".slick-prev":{insetInlineStart:a,"&::before":{content:'"\u2190"'}},".slick-next":{insetInlineEnd:a,"&::before":{content:'"\u2192"'}},".slick-dots":{position:"absolute",insetInlineEnd:0,bottom:0,insetInlineStart:0,zIndex:15,display:"flex !important",justifyContent:"center",paddingInlineStart:0,margin:0,listStyle:"none","&-bottom":{bottom:o},"&-top":{top:o,bottom:"auto"},li:{position:"relative",display:"inline-block",flex:"0 1 auto",boxSizing:"content-box",width:e.dotWidth,height:e.dotHeight,marginInline:c,padding:0,textAlign:"center",textIndent:-999,verticalAlign:"top",transition:`all ${e.motionDurationSlow}`,button:{position:"relative",display:"block",width:"100%",height:e.dotHeight,padding:0,color:"transparent",fontSize:0,background:e.colorBgContainer,border:0,borderRadius:e.dotHeight,outline:"none",cursor:"pointer",opacity:.3,transition:`all ${e.motionDurationSlow}`,"&: hover, &:focus":{opacity:.75},"&::after":{position:"absolute",inset:e.calc(c).mul(-1).equal(),content:'""'}},"&.slick-active":{width:e.dotActiveWidth,"& button":{background:e.colorBgContainer,opacity:1},"&: hover, &:focus":{opacity:1}}}}})}},Pe=e=>{const{componentCls:t,carouselDotOffset:n,marginXXS:r}=e,o={width:e.dotHeight,height:e.dotWidth};return{[`${t}-vertical`]:{".slick-dots":{top:"50%",bottom:"auto",flexDirection:"column",width:e.dotHeight,height:"auto",margin:0,transform:"translateY(-50%)","&-left":{insetInlineEnd:"auto",insetInlineStart:n},"&-right":{insetInlineEnd:n,insetInlineStart:"auto"},li:Object.assign(Object.assign({},o),{margin:`${(0,Te.zA)(r)} 0`,verticalAlign:"baseline",button:o,"&.slick-active":Object.assign(Object.assign({},o),{button:o})})}}}},Ne=e=>{const{componentCls:t}=e;return[{[`${t}-rtl`]:{direction:"rtl",".slick-dots":{[`${t}-rtl&`]:{flexDirection:"row-reverse"}}}},{[`${t}-vertical`]:{".slick-dots":{[`${t}-rtl&`]:{flexDirection:"column"}}}}]},He=(0,Ie.OF)("Carousel",(e=>{const{controlHeightLG:t,controlHeightSM:n}=e,r=(0,Re.h1)(e,{carouselArrowSize:e.calc(t).div(2).equal(),carouselDotOffset:e.calc(n).div(2).equal()});return[ze(r),Pe(r),Ne(r)]}),(()=>({dotWidth:16,dotHeight:3,dotWidthActive:24,dotActiveWidth:24})),{deprecatedTokens:[["dotWidthActive","dotActiveWidth"]]});var $e=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const{dots:n=!0,arrows:o=!1,draggable:i=!1,waitForAnimate:a=!1,dotPosition:c="bottom",vertical:s="left"===c||"right"===c,rootClassName:l,className:u,style:d,id:f}=e,p=$e(e,["dots","arrows","draggable","waitForAnimate","dotPosition","vertical","rootClassName","className","style","id"]),{getPrefixCls:h,direction:v,carousel:g}=r.useContext(Oe.QO),m=r.useRef(),b=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];m.current.slickGoTo(e,t)};r.useImperativeHandle(t,(()=>({goTo:b,autoPlay:m.current.innerSlider.autoPlay,innerSlider:m.current.innerSlider,prev:m.current.slickPrev,next:m.current.slickNext})),[m.current]);const A=r.useRef(r.Children.count(e.children));r.useEffect((()=>{A.current!==r.Children.count(e.children)&&(b(e.initialSlide||0,!1),A.current=r.Children.count(e.children))}),[e.children]);const S=Object.assign({vertical:s,className:y()(u,null==g?void 0:g.className),style:Object.assign(Object.assign({},null==g?void 0:g.style),d)},p);"fade"===S.effect&&(S.fade=!0);const w=h("carousel",S.prefixCls),x="slick-dots",k=!!n,C=y()(x,`${x}-${c}`,"boolean"!=typeof n&&(null==n?void 0:n.className)),[E,M,O]=He(w),T=y()(w,{[`${w}-rtl`]:"rtl"===v,[`${w}-vertical`]:S.vertical},M,O,l);return E(r.createElement("div",{className:T,id:f},r.createElement(Me,Object.assign({ref:m},S,{dots:k,dotsClass:C,arrows:o,draggable:i,verticalSwiping:s,waitForAnimate:a}))))}));const _e=je},2279:(e,t,n)=>{"use strict";n.d(t,{QO:()=>r});const r=n(6540).createContext({getPrefixCls:(e,t)=>t||(e?`ant-${e}`:"ant"),iconPrefixCls:"anticon"}),{Consumer:o}=r},4184:(e,t,n)=>{"use strict";n.d(t,{A:()=>nr});var r=n(6540),o=n.t(r,2),i=n(8168);const a={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"}}]},name:"eye",theme:"outlined"};var c=n(1783),s=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:a}))};const l=r.forwardRef(s);var u=n(6942),d=n.n(u),f=n(9379),p=n(4467),h=n(6636),v=n(2284),g=n(45);function m(){return{width:document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight}}var y=n(2533),b=["crossOrigin","decoding","draggable","loading","referrerPolicy","sizes","srcSet","useMap","alt"],A=r.createContext(null),S=0;function w(e){var t=e.src,n=e.isCustomPlaceholder,o=e.fallback,i=(0,r.useState)(n?"loading":"normal"),a=(0,h.A)(i,2),c=a[0],s=a[1],l=(0,r.useRef)(!1),u="error"===c;(0,r.useEffect)((function(){var e=!0;return function(e){return new Promise((function(t){var n=document.createElement("img");n.onerror=function(){return t(!1)},n.onload=function(){return t(!0)},n.src=e}))}(t).then((function(t){!t&&e&&s("error")})),function(){e=!1}}),[t]),(0,r.useEffect)((function(){n&&!l.current?s("loading"):u&&s("normal")}),[t]);var d=function(){s("normal")};return[function(e){l.current=!1,"loading"===c&&null!=e&&e.complete&&(e.naturalWidth||e.naturalHeight)&&(l.current=!0,d())},u&&o?{src:o}:{onLoad:d,src:t},c]}var x=n(961),k=n(998),C=n(8210),E=n(8719);const M=r.createContext(null);var O=n(4241),T=n(981),L=[];var I=n(5089);function R(e){var t="rc-scrollbar-measure-".concat(Math.random().toString(36).substring(7)),n=document.createElement("div");n.id=t;var r,o,i=n.style;if(i.position="absolute",i.left="0",i.top="0",i.width="100px",i.height="100px",i.overflow="scroll",e){var a=getComputedStyle(e);i.scrollbarColor=a.scrollbarColor,i.scrollbarWidth=a.scrollbarWidth;var c=getComputedStyle(e,"::-webkit-scrollbar"),s=parseInt(c.width,10),l=parseInt(c.height,10);try{var u=s?"width: ".concat(c.width,";"):"",d=l?"height: ".concat(c.height,";"):"";(0,I.BD)("\n#".concat(t,"::-webkit-scrollbar {\n").concat(u,"\n").concat(d,"\n}"),t)}catch(h){console.error(h),r=s,o=l}}document.body.appendChild(n);var f=e&&r&&!isNaN(r)?r:n.offsetWidth-n.clientWidth,p=e&&o&&!isNaN(o)?o:n.offsetHeight-n.clientHeight;return document.body.removeChild(n),(0,I.m6)(t),{width:f,height:p}}var z="rc-util-locker-".concat(Date.now()),P=0;function N(e){var t=!!e,n=r.useState((function(){return P+=1,"".concat(z,"_").concat(P)})),o=(0,h.A)(n,1)[0];(0,T.A)((function(){if(t){var e=(r=document.body,"undefined"!=typeof document&&r&&r instanceof Element?R(r):{width:0,height:0}).width,n=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth;(0,I.BD)("\nhtml body {\n overflow-y: hidden;\n ".concat(n?"width: calc(100% - ".concat(e,"px);"):"","\n}"),o)}else(0,I.m6)(o);var r;return function(){(0,I.m6)(o)}}),[t,o])}var H=!1;var $=function(e){return!1!==e&&((0,k.A)()&&e?"string"==typeof e?document.querySelector(e):"function"==typeof e?e():e:null)},j=r.forwardRef((function(e,t){var n=e.open,o=e.autoLock,i=e.getContainer,a=(e.debug,e.autoDestroy),c=void 0===a||a,s=e.children,l=r.useState(n),u=(0,h.A)(l,2),d=u[0],f=u[1],p=d||n;r.useEffect((function(){(c||n)&&f(n)}),[n,c]);var v=r.useState((function(){return $(i)})),g=(0,h.A)(v,2),m=g[0],y=g[1];r.useEffect((function(){var e=$(i);y(null!=e?e:null)}));var b=function(e,t){var n=r.useState((function(){return(0,k.A)()?document.createElement("div"):null})),o=(0,h.A)(n,1)[0],i=r.useRef(!1),a=r.useContext(M),c=r.useState(L),s=(0,h.A)(c,2),l=s[0],u=s[1],d=a||(i.current?void 0:function(e){u((function(t){return[e].concat((0,O.A)(t))}))});function f(){o.parentElement||document.body.appendChild(o),i.current=!0}function p(){var e;null===(e=o.parentElement)||void 0===e||e.removeChild(o),i.current=!1}return(0,T.A)((function(){return e?a?a(f):f():p(),p}),[e]),(0,T.A)((function(){l.length&&(l.forEach((function(e){return e()})),u(L))}),[l]),[o,d]}(p&&!m),A=(0,h.A)(b,2),S=A[0],w=A[1],C=null!=m?m:S;N(o&&n&&(0,k.A)()&&(C===S||C===document.body));var I=null;s&&(0,E.f3)(s)&&t&&(I=s.ref);var R=(0,E.xK)(I,t);if(!p||!(0,k.A)()||void 0===m)return null;var z,P=!1===C||("boolean"==typeof z&&(H=z),H),j=s;return t&&(j=r.cloneElement(s,{ref:R})),r.createElement(M.Provider,{value:w},P?j:(0,x.createPortal)(j,C))}));const _=j;var D=r.createContext({}),B=n(4808);var F=0;var W=(0,f.A)({},o).useId;const X=W?function(e){var t=W();return e||t}:function(e){var t=r.useState("ssr-id"),n=(0,h.A)(t,2),o=n[0],i=n[1];return r.useEffect((function(){var e=F;F+=1,i("rc_unique_".concat(e))}),[]),e||o};var U={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=U.F1&&t<=U.F12)return!1;switch(t){case U.ALT:case U.CAPS_LOCK:case U.CONTEXT_MENU:case U.CTRL:case U.DOWN:case U.END:case U.ESC:case U.HOME:case U.INSERT:case U.LEFT:case U.MAC_FF_META:case U.META:case U.NUMLOCK:case U.NUM_CENTER:case U.PAGE_DOWN:case U.PAGE_UP:case U.PAUSE:case U.PRINT_SCREEN:case U.RIGHT:case U.SHIFT:case U.UP:case U.WIN_KEY:case U.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=U.ZERO&&e<=U.NINE)return!0;if(e>=U.NUM_ZERO&&e<=U.NUM_MULTIPLY)return!0;if(e>=U.A&&e<=U.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case U.SPACE:case U.QUESTION_MARK:case U.NUM_PLUS:case U.NUM_MINUS:case U.NUM_PERIOD:case U.NUM_DIVISION:case U.SEMICOLON:case U.DASH:case U.EQUALS:case U.COMMA:case U.PERIOD:case U.SLASH:case U.APOSTROPHE:case U.SINGLE_QUOTE:case U.OPEN_SQUARE_BRACKET:case U.BACKSLASH:case U.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const Y=U;var G="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/),q="aria-",K="data-";function V(e,t){return 0===e.indexOf(t)}function Z(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:(0,f.A)({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||V(n,q))||t.data&&V(n,K)||t.attr&&G.includes(n))&&(r[n]=e[n])})),r}function Q(e,t,n){var r=t;return!r&&n&&(r="".concat(e,"-").concat(n)),r}function J(e,t){var n=e["page".concat(t?"Y":"X","Offset")],r="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var o=e.document;"number"!=typeof(n=o.documentElement[r])&&(n=o.body[r])}return n}function ee(e){return function(e){return e instanceof HTMLElement||e instanceof SVGElement}(e)?e:e instanceof r.Component?x.findDOMNode(e):null}var te=r.createContext({});var ne=n(3029),re=n(2901),oe=n(5501),ie=n(3954),ae=n(2176),ce=n(6822);function se(e){var t=(0,ae.A)();return function(){var n,r=(0,ie.A)(e);if(t){var o=(0,ie.A)(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return(0,ce.A)(this,n)}}const le=function(e){(0,oe.A)(n,e);var t=se(n);function n(){return(0,ne.A)(this,n),t.apply(this,arguments)}return(0,re.A)(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);var ue=n(1233),de="none",fe="appear",pe="enter",he="leave",ve="none",ge="prepare",me="start",ye="active",be="end",Ae="prepared";function Se(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var we,xe,ke,Ce=(we=(0,k.A)(),xe="undefined"!=typeof window?window:{},ke={animationend:Se("Animation","AnimationEnd"),transitionend:Se("Transition","TransitionEnd")},we&&("AnimationEvent"in xe||delete ke.animationend.animation,"TransitionEvent"in xe||delete ke.transitionend.transition),ke),Ee={};if((0,k.A)()){var Me=document.createElement("div");Ee=Me.style}var Oe={};function Te(e){if(Oe[e])return Oe[e];var t=Ce[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:1),t};We.cancel=function(e){var t=Be.get(e);return Fe(e),_e(t)};const Xe=We;var Ue=[ge,me,ye,be],Ye=[ge,Ae],Ge=!1,qe=!0;function Ke(e){return e===ye||e===be}const Ve=function(e,t,n){var o=(0,ue.A)(ve),i=(0,h.A)(o,2),a=i[0],c=i[1],s=function(){var e=r.useRef(null);function t(){Xe.cancel(e.current)}return r.useEffect((function(){return function(){t()}}),[]),[function n(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;t();var i=Xe((function(){o<=1?r({isCanceled:function(){return i!==e.current}}):n(r,o-1)}));e.current=i},t]}(),l=(0,h.A)(s,2),u=l[0],d=l[1];var f=t?Ye:Ue;return $e((function(){if(a!==ve&&a!==be){var e=f.indexOf(a),t=f[e+1],r=n(a);r===Ge?c(t,!0):t&&u((function(e){function n(){e.isCanceled()||c(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),r.useEffect((function(){return function(){d()}}),[]),[function(){c(ge,!0)},a]};const Ze=function(e){var t=e;"object"===(0,v.A)(e)&&(t=e.transitionSupport);var n=r.forwardRef((function(e,n){var o=e.visible,i=void 0===o||o,a=e.removeOnLeave,c=void 0===a||a,s=e.forceRender,l=e.children,u=e.motionName,v=e.leavedClassName,g=e.eventProps,m=function(e,n){return!(!e.motionName||!t||!1===n)}(e,r.useContext(te).motion),y=(0,r.useRef)(),b=(0,r.useRef)();var A=function(e,t,n,o){var i=o.motionEnter,a=void 0===i||i,c=o.motionAppear,s=void 0===c||c,l=o.motionLeave,u=void 0===l||l,d=o.motionDeadline,v=o.motionLeaveImmediately,g=o.onAppearPrepare,m=o.onEnterPrepare,y=o.onLeavePrepare,b=o.onAppearStart,A=o.onEnterStart,S=o.onLeaveStart,w=o.onAppearActive,x=o.onEnterActive,k=o.onLeaveActive,C=o.onAppearEnd,E=o.onEnterEnd,M=o.onLeaveEnd,O=o.onVisibleChanged,T=(0,ue.A)(),L=(0,h.A)(T,2),I=L[0],R=L[1],z=(0,ue.A)(de),P=(0,h.A)(z,2),N=P[0],H=P[1],$=(0,ue.A)(null),j=(0,h.A)($,2),_=j[0],D=j[1],B=(0,r.useRef)(!1),F=(0,r.useRef)(null);function W(){return n()}var X=(0,r.useRef)(!1);function U(){H(de,!0),D(null,!0)}function Y(e){var t=W();if(!e||e.deadline||e.target===t){var n,r=X.current;N===fe&&r?n=null==C?void 0:C(t,e):N===pe&&r?n=null==E?void 0:E(t,e):N===he&&r&&(n=null==M?void 0:M(t,e)),N!==de&&r&&!1!==n&&U()}}var G=He(Y),q=(0,h.A)(G,1)[0],K=function(e){var t,n,r;switch(e){case fe:return t={},(0,p.A)(t,ge,g),(0,p.A)(t,me,b),(0,p.A)(t,ye,w),t;case pe:return n={},(0,p.A)(n,ge,m),(0,p.A)(n,me,A),(0,p.A)(n,ye,x),n;case he:return r={},(0,p.A)(r,ge,y),(0,p.A)(r,me,S),(0,p.A)(r,ye,k),r;default:return{}}},V=r.useMemo((function(){return K(N)}),[N]),Z=Ve(N,!e,(function(e){if(e===ge){var t=V[ge];return t?t(W()):Ge}var n;return ee in V&&D((null===(n=V[ee])||void 0===n?void 0:n.call(V,W(),null))||null),ee===ye&&(q(W()),d>0&&(clearTimeout(F.current),F.current=setTimeout((function(){Y({deadline:!0})}),d))),ee===Ae&&U(),qe})),Q=(0,h.A)(Z,2),J=Q[0],ee=Q[1],te=Ke(ee);X.current=te,$e((function(){R(t);var n,r=B.current;B.current=!0,!r&&t&&s&&(n=fe),r&&t&&a&&(n=pe),(r&&!t&&u||!r&&v&&!t&&u)&&(n=he);var o=K(n);n&&(e||o[ge])?(H(n),J()):H(de)}),[t]),(0,r.useEffect)((function(){(N===fe&&!s||N===pe&&!a||N===he&&!u)&&H(de)}),[s,a,u]),(0,r.useEffect)((function(){return function(){B.current=!1,clearTimeout(F.current)}}),[]);var ne=r.useRef(!1);(0,r.useEffect)((function(){I&&(ne.current=!0),void 0!==I&&N===de&&((ne.current||I)&&(null==O||O(I)),ne.current=!0)}),[I,N]);var re=_;return V[ge]&&ee===me&&(re=(0,f.A)({transition:"none"},re)),[N,ee,re,null!=I?I:t]}(m,i,(function(){try{return y.current instanceof HTMLElement?y.current:ee(b.current)}catch(e){return null}}),e),S=(0,h.A)(A,4),w=S[0],x=S[1],k=S[2],C=S[3],M=r.useRef(C);C&&(M.current=!0);var O,T=r.useCallback((function(e){y.current=e,(0,E.Xf)(n,e)}),[n]),L=(0,f.A)((0,f.A)({},g),{},{visible:i});if(l)if(w===de)O=C?l((0,f.A)({},L),T):!c&&M.current&&v?l((0,f.A)((0,f.A)({},L),{},{className:v}),T):s||!c&&!v?l((0,f.A)((0,f.A)({},L),{},{style:{display:"none"}}),T):null;else{var I,R;x===ge?R="prepare":Ke(x)?R="active":x===me&&(R="start");var z=Ne(u,"".concat(w,"-").concat(R));O=l((0,f.A)((0,f.A)({},L),{},{className:d()(Ne(u,w),(I={},(0,p.A)(I,z,z&&R),(0,p.A)(I,u,"string"==typeof u),I)),style:k}),T)}else O=null;r.isValidElement(O)&&(0,E.f3)(O)&&(O.ref||(O=r.cloneElement(O,{ref:T})));return r.createElement(le,{ref:b},O)}));return n.displayName="CSSMotion",n}(Re);var Qe=n(9417),Je="add",et="keep",tt="remove",nt="removed";function rt(e){var t;return t=e&&"object"===(0,v.A)(e)&&"key"in e?e:{key:e},(0,f.A)((0,f.A)({},t),{},{key:String(t.key)})}function ot(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(rt)}var it=["component","children","onVisibleChanged","onAllRemoved"],at=["status"],ct=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ze,n=function(e){(0,oe.A)(o,e);var n=se(o);function o(){var e;(0,ne.A)(this,o);for(var t=arguments.length,r=new Array(t),i=0;i0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,o=t.length,i=ot(e),a=ot(t);i.forEach((function(e){for(var t=!1,i=r;i1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==tt}))).forEach((function(t){t.key===e&&(t.status=et)}))})),n}(r,o);return{keyEntities:i.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==nt||e.status!==tt}))}}}]),o}(r.Component);(0,p.A)(n,"defaultProps",{component:"div"})}(Re);const st=Ze,lt=r.memo((function(e){return e.children}),(function(e,t){return!t.shouldUpdate}));var ut={width:0,height:0,overflow:"hidden",outline:"none"},dt={outline:"none"},ft=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.className,a=e.style,c=e.title,s=e.ariaId,l=e.footer,u=e.closable,p=e.closeIcon,h=e.onClose,g=e.children,m=e.bodyStyle,y=e.bodyProps,b=e.modalRender,A=e.onMouseDown,S=e.onMouseUp,w=e.holderRef,x=e.visible,k=e.forceRender,C=e.width,M=e.height,O=e.classNames,T=e.styles,L=r.useContext(D).panel,I=(0,E.xK)(w,L),R=(0,r.useRef)(),z=(0,r.useRef)(),P=(0,r.useRef)();r.useImperativeHandle(t,(function(){return{focus:function(){var e;null===(e=P.current)||void 0===e||e.focus()},changeActive:function(e){var t=document.activeElement;e&&t===z.current?R.current.focus():e||t!==R.current||z.current.focus()}}}));var N,H,$={};void 0!==C&&($.width=C),void 0!==M&&($.height=M),l&&(N=r.createElement("div",{className:d()("".concat(n,"-footer"),null==O?void 0:O.footer),style:(0,f.A)({},null==T?void 0:T.footer)},l)),c&&(H=r.createElement("div",{className:d()("".concat(n,"-header"),null==O?void 0:O.header),style:(0,f.A)({},null==T?void 0:T.header)},r.createElement("div",{className:"".concat(n,"-title"),id:s},c)));var j,_=(0,r.useMemo)((function(){return"object"===(0,v.A)(u)&&null!==u?u:u?{closeIcon:null!=p?p:r.createElement("span",{className:"".concat(n,"-close-x")})}:{}}),[u,p]),B=Z(_,!0);u&&(j=r.createElement("button",(0,i.A)({type:"button",onClick:h,"aria-label":"Close"},B,{className:"".concat(n,"-close")}),_.closeIcon));var F=r.createElement("div",{className:d()("".concat(n,"-content"),null==O?void 0:O.content),style:null==T?void 0:T.content},j,H,r.createElement("div",(0,i.A)({className:d()("".concat(n,"-body"),null==O?void 0:O.body),style:(0,f.A)((0,f.A)({},m),null==T?void 0:T.body)},y),g),N);return r.createElement("div",{key:"dialog-element",role:"dialog","aria-labelledby":c?s:null,"aria-modal":"true",ref:I,style:(0,f.A)((0,f.A)({},a),$),className:d()(n,o),onMouseDown:A,onMouseUp:S},r.createElement("div",{tabIndex:0,ref:R,style:ut,"aria-hidden":"true"}),r.createElement("div",{ref:P,tabIndex:-1,style:dt},r.createElement(lt,{shouldUpdate:x||k},b?b(F):F)),r.createElement("div",{tabIndex:0,ref:z,style:ut,"aria-hidden":"true"}))}));const pt=ft;var ht=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.title,a=e.style,c=e.className,s=e.visible,l=e.forceRender,u=e.destroyOnClose,p=e.motionName,v=e.ariaId,g=e.onVisibleChanged,m=e.mousePosition,y=(0,r.useRef)(),b=r.useState(),A=(0,h.A)(b,2),S=A[0],w=A[1],x={};function k(){var e,t,n,r,o,i=(e=y.current,t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow,n.left+=J(o),n.top+=J(o,!0),n);w(m?"".concat(m.x-i.left,"px ").concat(m.y-i.top,"px"):"")}return S&&(x.transformOrigin=S),r.createElement(st,{visible:s,onVisibleChanged:g,onAppearPrepare:k,onEnterPrepare:k,forceRender:l,motionName:p,removeOnLeave:u,ref:y},(function(s,l){var u=s.className,p=s.style;return r.createElement(pt,(0,i.A)({},e,{ref:t,title:o,ariaId:v,prefixCls:n,holderRef:l,style:(0,f.A)((0,f.A)((0,f.A)({},p),a),x),className:d()(c,u)}))}))}));ht.displayName="Content";const vt=ht;function gt(e){var t=e.prefixCls,n=e.style,o=e.visible,a=e.maskProps,c=e.motionName,s=e.className;return r.createElement(st,{key:"mask",visible:o,motionName:c,leavedClassName:"".concat(t,"-mask-hidden")},(function(e,o){var c=e.className,l=e.style;return r.createElement("div",(0,i.A)({ref:o,style:(0,f.A)((0,f.A)({},l),n),className:d()("".concat(t,"-mask"),c,s)},a))}))}function mt(e){var t=e.prefixCls,n=void 0===t?"rc-dialog":t,o=e.zIndex,a=e.visible,c=void 0!==a&&a,s=e.keyboard,l=void 0===s||s,u=e.focusTriggerAfterClose,p=void 0===u||u,v=e.wrapStyle,g=e.wrapClassName,m=e.wrapProps,y=e.onClose,b=e.afterOpenChange,A=e.afterClose,S=e.transitionName,w=e.animation,x=e.closable,k=void 0===x||x,C=e.mask,E=void 0===C||C,M=e.maskTransitionName,O=e.maskAnimation,T=e.maskClosable,L=void 0===T||T,I=e.maskStyle,R=e.maskProps,z=e.rootClassName,P=e.classNames,N=e.styles;var H=(0,r.useRef)(),$=(0,r.useRef)(),j=(0,r.useRef)(),_=r.useState(c),D=(0,h.A)(_,2),F=D[0],W=D[1],U=X();function G(e){null==y||y(e)}var q=(0,r.useRef)(!1),K=(0,r.useRef)(),V=null;return L&&(V=function(e){q.current?q.current=!1:$.current===e.target&&G(e)}),(0,r.useEffect)((function(){c&&(W(!0),(0,B.A)($.current,document.activeElement)||(H.current=document.activeElement))}),[c]),(0,r.useEffect)((function(){return function(){clearTimeout(K.current)}}),[]),r.createElement("div",(0,i.A)({className:d()("".concat(n,"-root"),z)},Z(e,{data:!0})),r.createElement(gt,{prefixCls:n,visible:E&&c,motionName:Q(n,M,O),style:(0,f.A)((0,f.A)({zIndex:o},I),null==N?void 0:N.mask),maskProps:R,className:null==P?void 0:P.mask}),r.createElement("div",(0,i.A)({tabIndex:-1,onKeyDown:function(e){if(l&&e.keyCode===Y.ESC)return e.stopPropagation(),void G(e);c&&e.keyCode===Y.TAB&&j.current.changeActive(!e.shiftKey)},className:d()("".concat(n,"-wrap"),g,null==P?void 0:P.wrapper),ref:$,onClick:V,style:(0,f.A)((0,f.A)((0,f.A)({zIndex:o},v),null==N?void 0:N.wrapper),{},{display:F?null:"none"})},m),r.createElement(vt,(0,i.A)({},e,{onMouseDown:function(){clearTimeout(K.current),q.current=!0},onMouseUp:function(){K.current=setTimeout((function(){q.current=!1}))},ref:j,closable:k,ariaId:U,prefixCls:n,visible:c&&F,onClose:G,onVisibleChanged:function(e){if(e)(0,B.A)($.current,document.activeElement)||null===(t=j.current)||void 0===t||t.focus();else{if(W(!1),E&&H.current&&p){try{H.current.focus({preventScroll:!0})}catch(n){}H.current=null}F&&(null==A||A())}var t;null==b||b(e)},motionName:Q(n,S,w)}))))}var yt=function(e){var t=e.visible,n=e.getContainer,o=e.forceRender,a=e.destroyOnClose,c=void 0!==a&&a,s=e.afterClose,l=e.panelRef,u=r.useState(t),d=(0,h.A)(u,2),f=d[0],p=d[1],v=r.useMemo((function(){return{panel:l}}),[l]);return r.useEffect((function(){t&&p(!0)}),[t]),o||!c||f?r.createElement(D.Provider,{value:v},r.createElement(_,{open:t||o||f,autoDestroy:!1,getContainer:n,autoLock:t||f},r.createElement(mt,(0,i.A)({},e,{destroyOnClose:c,afterClose:function(){null==s||s(),p(!1)}})))):null};yt.displayName="Dialog";const bt=yt;function At(e,t,n,r){var o=x.unstable_batchedUpdates?function(e){x.unstable_batchedUpdates(n,e)}:n;return null!=e&&e.addEventListener&&e.addEventListener(t,o,r),{remove:function(){null!=e&&e.removeEventListener&&e.removeEventListener(t,o,r)}}}var St=n(3210),wt={x:0,y:0,rotate:0,scale:1,flipX:!1,flipY:!1};function xt(e,t,n,r){var o=t+n,i=(n-r)/2;if(n>r){if(t>0)return(0,p.A)({},e,i);if(t<0&&or)return(0,p.A)({},e,t<0?i:-i);return{}}function kt(e,t,n,r){var o=m(),i=o.width,a=o.height,c=null;return e<=i&&t<=a?c={x:0,y:0}:(e>i||t>a)&&(c=(0,f.A)((0,f.A)({},xt("x",n,e,i)),xt("y",r,t,a))),c}function Ct(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.hypot(n,r)}function Et(e,t,n,o,i,a,c){var s=i.rotate,l=i.scale,u=i.x,d=i.y,p=(0,r.useState)(!1),v=(0,h.A)(p,2),g=v[0],m=v[1],y=(0,r.useRef)({point1:{x:0,y:0},point2:{x:0,y:0},eventType:"none"}),b=function(e){y.current=(0,f.A)((0,f.A)({},y.current),e)};return(0,r.useEffect)((function(){var e;return n&&t&&(e=At(window,"touchmove",(function(e){return e.preventDefault()}),{passive:!1})),function(){var t;null===(t=e)||void 0===t||t.remove()}}),[n,t]),{isTouching:g,onTouchStart:function(e){if(t){e.stopPropagation(),m(!0);var n=e.touches,r=void 0===n?[]:n;r.length>1?b({point1:{x:r[0].clientX,y:r[0].clientY},point2:{x:r[1].clientX,y:r[1].clientY},eventType:"touchZoom"}):b({point1:{x:r[0].clientX-u,y:r[0].clientY-d},eventType:"move"})}},onTouchMove:function(e){var t=e.touches,n=void 0===t?[]:t,r=y.current,o=r.point1,i=r.point2,s=r.eventType;if(n.length>1&&"touchZoom"===s){var l={x:n[0].clientX,y:n[0].clientY},u={x:n[1].clientX,y:n[1].clientY},d=function(e,t,n,r){var o=Ct(e,n),i=Ct(t,r);if(0===o&&0===i)return[e.x,e.y];var a=o/(o+i);return[e.x+a*(t.x-e.x),e.y+a*(t.y-e.y)]}(o,i,l,u),f=(0,h.A)(d,2),p=f[0],v=f[1],g=Ct(l,u)/Ct(o,i);c(g,"touchZoom",p,v,!0),b({point1:l,point2:u,eventType:"touchZoom"})}else"move"===s&&(a({x:n[0].clientX-o.x,y:n[0].clientY-o.y},"move"),b({eventType:"move"}))},onTouchEnd:function(){if(n){if(g&&m(!1),b({eventType:"none"}),o>l)return a({x:0,y:0,scale:o},"touchZoom");var t=e.current.offsetWidth*l,r=e.current.offsetHeight*l,i=e.current.getBoundingClientRect(),c=i.left,u=i.top,d=s%180!=0,p=kt(d?r:t,d?t:r,c,u);p&&a((0,f.A)({},p),"dragRebound")}}}}const Mt=function(e){var t=e.visible,n=e.maskTransitionName,o=e.getContainer,i=e.prefixCls,a=e.rootClassName,c=e.icons,s=e.countRender,l=e.showSwitch,u=e.showProgress,h=e.current,v=e.transform,g=e.count,m=e.scale,y=e.minScale,b=e.maxScale,S=e.closeIcon,w=e.onSwitchLeft,x=e.onSwitchRight,k=e.onClose,C=e.onZoomIn,E=e.onZoomOut,M=e.onRotateRight,O=e.onRotateLeft,T=e.onFlipX,L=e.onFlipY,I=e.toolbarRender,R=e.zIndex,z=(0,r.useContext)(A),P=c.rotateLeft,N=c.rotateRight,H=c.zoomIn,$=c.zoomOut,j=c.close,D=c.left,B=c.right,F=c.flipX,W=c.flipY,X="".concat(i,"-operations-operation");r.useEffect((function(){var e=function(e){e.keyCode===Y.ESC&&k()};return t&&window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t]);var U=[{icon:W,onClick:L,type:"flipY"},{icon:F,onClick:T,type:"flipX"},{icon:P,onClick:O,type:"rotateLeft"},{icon:N,onClick:M,type:"rotateRight"},{icon:$,onClick:E,type:"zoomOut",disabled:m<=y},{icon:H,onClick:C,type:"zoomIn",disabled:m===b}].map((function(e){var t,n=e.icon,o=e.onClick,a=e.type,c=e.disabled;return r.createElement("div",{className:d()(X,(t={},(0,p.A)(t,"".concat(i,"-operations-operation-").concat(a),!0),(0,p.A)(t,"".concat(i,"-operations-operation-disabled"),!!c),t)),onClick:o,key:a},n)})),G=r.createElement("div",{className:"".concat(i,"-operations")},U);return r.createElement(st,{visible:t,motionName:n},(function(e){var t=e.className,n=e.style;return r.createElement(_,{open:!0,getContainer:null!=o?o:document.body},r.createElement("div",{className:d()("".concat(i,"-operations-wrapper"),t,a),style:(0,f.A)((0,f.A)({},n),{},{zIndex:R})},null===S?null:r.createElement("button",{className:"".concat(i,"-close"),onClick:k},S||j),l&&r.createElement(r.Fragment,null,r.createElement("div",{className:d()("".concat(i,"-switch-left"),(0,p.A)({},"".concat(i,"-switch-left-disabled"),0===h)),onClick:w},D),r.createElement("div",{className:d()("".concat(i,"-switch-right"),(0,p.A)({},"".concat(i,"-switch-right-disabled"),h===g-1)),onClick:x},B)),r.createElement("div",{className:"".concat(i,"-footer")},u&&r.createElement("div",{className:"".concat(i,"-progress")},s?s(h+1,g):"".concat(h+1," / ").concat(g)),I?I(G,(0,f.A)({icons:{flipYIcon:U[0],flipXIcon:U[1],rotateLeftIcon:U[2],rotateRightIcon:U[3],zoomOutIcon:U[4],zoomInIcon:U[5]},actions:{onFlipY:L,onFlipX:T,onRotateLeft:O,onRotateRight:M,onZoomOut:E,onZoomIn:C},transform:v},z?{current:h,total:g}:{})):G)))}))};var Ot=["fallback","src","imgRef"],Tt=["prefixCls","src","alt","fallback","movable","onClose","visible","icons","rootClassName","closeIcon","getContainer","current","count","countRender","scaleStep","minScale","maxScale","transitionName","maskTransitionName","imageRender","imgCommonProps","toolbarRender","onTransform","onChange"],Lt=function(e){var t=e.fallback,n=e.src,o=e.imgRef,a=(0,g.A)(e,Ot),c=w({src:n,fallback:t}),s=(0,h.A)(c,2),l=s[0],u=s[1];return r.createElement("img",(0,i.A)({ref:function(e){o.current=e,l(e)}},a,u))};const It=function(e){var t=e.prefixCls,n=e.src,o=e.alt,a=e.fallback,c=e.movable,s=void 0===c||c,l=e.onClose,u=e.visible,v=e.icons,y=void 0===v?{}:v,b=e.rootClassName,S=e.closeIcon,w=e.getContainer,x=e.current,k=void 0===x?0:x,E=e.count,M=void 0===E?1:E,O=e.countRender,T=e.scaleStep,L=void 0===T?.5:T,I=e.minScale,R=void 0===I?1:I,z=e.maxScale,P=void 0===z?50:z,N=e.transitionName,H=void 0===N?"zoom":N,$=e.maskTransitionName,j=void 0===$?"fade":$,_=e.imageRender,D=e.imgCommonProps,B=e.toolbarRender,F=e.onTransform,W=e.onChange,X=(0,g.A)(e,Tt),U=(0,r.useRef)(),G=(0,r.useContext)(A),q=G&&M>1,K=G&&M>=1,V=(0,r.useState)(!0),Z=(0,h.A)(V,2),Q=Z[0],J=Z[1],ee=function(e,t,n,o){var i=(0,r.useRef)(null),a=(0,r.useRef)([]),c=(0,r.useState)(wt),s=(0,h.A)(c,2),l=s[0],u=s[1],d=function(e,t){null===i.current&&(a.current=[],i.current=Xe((function(){u((function(e){var n=e;return a.current.forEach((function(e){n=(0,f.A)((0,f.A)({},n),e)})),i.current=null,null==o||o({transform:n,action:t}),n}))}))),a.current.push((0,f.A)((0,f.A)({},l),e))};return{transform:l,resetTransform:function(e){u(wt),o&&!(0,St.A)(wt,l)&&o({transform:wt,action:e})},updateTransform:d,dispatchZoomChange:function(r,o,i,a,c){var s=e.current,u=s.width,f=s.height,p=s.offsetWidth,h=s.offsetHeight,v=s.offsetLeft,g=s.offsetTop,y=r,b=l.scale*r;b>n?(b=n,y=n/l.scale):b0&&(r=1/r),c(r,"wheel",e.clientX,e.clientY)}}}}(U,s,u,L,te,re,oe),ae=ie.isMoving,ce=ie.onMouseDown,se=ie.onWheel,le=Et(U,s,u,R,te,re,oe),ue=le.isTouching,de=le.onTouchStart,fe=le.onTouchMove,pe=le.onTouchEnd,he=te.rotate,ve=te.scale,ge=d()((0,p.A)({},"".concat(t,"-moving"),ae));(0,r.useEffect)((function(){Q||J(!0)}),[Q]);var me=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),k>0&&(J(!1),ne("prev"),null==W||W(k-1,k))},ye=function(e){null==e||e.preventDefault(),null==e||e.stopPropagation(),kvoid 0!==n?n:`${e}-${t}`;var Yt=n(2279);const Gt=e=>{const[,,,,t]=(0,_t.Ay)();return t?`${e}-css-var`:""};const qt={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"};const Kt={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"},Vt={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},Zt={lang:Object.assign({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},Kt),timePickerLocale:Object.assign({},Vt)},Qt="${label} is not a valid ${type}",Jt={locale:"en",Pagination:qt,DatePicker:Zt,TimePicker:Vt,Calendar:Zt,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Tour:{Next:"Next",Previous:"Previous",Finish:"Finish"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",deselectAll:"Deselect all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:Qt,method:Qt,array:Qt,object:Qt,number:Qt,date:Qt,boolean:Qt,integer:Qt,float:Qt,regexp:Qt,email:Qt,url:Qt,hex:Qt},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"},QRCode:{expired:"QR code expired",refresh:"Refresh",scanned:"Scanned"},ColorPicker:{presetEmpty:"Empty"}};const en={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var tn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:en}))};const nn=r.forwardRef(tn);var rn=n(8633),on=n(363);const an={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z"}},{tag:"path",attrs:{d:"M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z"}}]},name:"rotate-left",theme:"outlined"};var cn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:an}))};const sn=r.forwardRef(cn);const ln={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z"}},{tag:"path",attrs:{d:"M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z"}}]},name:"rotate-right",theme:"outlined"};var un=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:ln}))};const dn=r.forwardRef(un);const fn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"}}]},name:"swap",theme:"outlined"};var pn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:fn}))};const hn=r.forwardRef(pn);const vn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-in",theme:"outlined"};var gn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:vn}))};const mn=r.forwardRef(gn);const yn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z"}}]},name:"zoom-out",theme:"outlined"};var bn=function(e,t){return r.createElement(c.A,(0,i.A)({},e,{ref:t,icon:yn}))};const An=r.forwardRef(bn);var Sn=n(1466),wn=n(4978),xn=n(5905);const kn=e=>({animationDuration:e,animationFillMode:"both"}),Cn=e=>({animationDuration:e,animationFillMode:"both"}),En=function(e,t,n,r){const o=arguments.length>4&&void 0!==arguments[4]&&arguments[4]?"&":"";return{[`\n ${o}${e}-enter,\n ${o}${e}-appear\n `]:Object.assign(Object.assign({},kn(r)),{animationPlayState:"paused"}),[`${o}${e}-leave`]:Object.assign(Object.assign({},Cn(r)),{animationPlayState:"paused"}),[`\n ${o}${e}-enter${e}-enter-active,\n ${o}${e}-appear${e}-appear-active\n `]:{animationName:t,animationPlayState:"running"},[`${o}${e}-leave${e}-leave-active`]:{animationName:n,animationPlayState:"running",pointerEvents:"none"}}},Mn=new Sn.Mo("antFadeIn",{"0%":{opacity:0},"100%":{opacity:1}}),On=new Sn.Mo("antFadeOut",{"0%":{opacity:1},"100%":{opacity:0}}),Tn=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const{antCls:n}=e,r=`${n}-fade`,o=t?"&":"";return[En(r,Mn,On,e.motionDurationMid,t),{[`\n ${o}${r}-enter,\n ${o}${r}-appear\n `]:{opacity:0,animationTimingFunction:"linear"},[`${o}${r}-leave`]:{animationTimingFunction:"linear"}}]},Ln=new Sn.Mo("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),In=new Sn.Mo("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),Rn=new Sn.Mo("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),zn=new Sn.Mo("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),Pn=new Sn.Mo("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),Nn=new Sn.Mo("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),Hn={zoom:{inKeyframes:Ln,outKeyframes:In},"zoom-big":{inKeyframes:Rn,outKeyframes:zn},"zoom-big-fast":{inKeyframes:Rn,outKeyframes:zn},"zoom-left":{inKeyframes:new Sn.Mo("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),outKeyframes:new Sn.Mo("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}})},"zoom-right":{inKeyframes:new Sn.Mo("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),outKeyframes:new Sn.Mo("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}})},"zoom-up":{inKeyframes:Pn,outKeyframes:Nn},"zoom-down":{inKeyframes:new Sn.Mo("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),outKeyframes:new Sn.Mo("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}})}},$n=(e,t)=>{const{antCls:n}=e,r=`${n}-${t}`,{inKeyframes:o,outKeyframes:i}=Hn[t];return[En(r,o,i,"zoom-big-fast"===t?e.motionDurationFast:e.motionDurationMid),{[`\n ${r}-enter,\n ${r}-appear\n `]:{transform:"scale(0)",opacity:0,animationTimingFunction:e.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${r}-leave`]:{animationTimingFunction:e.motionEaseInOutCirc}}]};var jn=n(336),_n=n(665);function Dn(e){return{position:e,inset:0}}const Bn=e=>{const{componentCls:t,antCls:n}=e;return[{[`${t}-root`]:{[`${t}${n}-zoom-enter, ${t}${n}-zoom-appear`]:{transform:"none",opacity:0,animationDuration:e.motionDurationSlow,userSelect:"none"},[`${t}${n}-zoom-leave ${t}-content`]:{pointerEvents:"none"},[`${t}-mask`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,height:"100%",backgroundColor:e.colorBgMask,pointerEvents:"none",[`${t}-hidden`]:{display:"none"}}),[`${t}-wrap`]:Object.assign(Object.assign({},Dn("fixed")),{zIndex:e.zIndexPopupBase,overflow:"auto",outline:0,WebkitOverflowScrolling:"touch"})}},{[`${t}-root`]:Tn(e)}]},Fn=e=>{const{componentCls:t}=e;return[{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl"},[`${t}-centered`]:{textAlign:"center","&::before":{display:"inline-block",width:0,height:"100%",verticalAlign:"middle",content:'""'},[t]:{top:0,display:"inline-block",paddingBottom:0,textAlign:"start",verticalAlign:"middle"}},[`@media (max-width: ${e.screenSMMax}px)`]:{[t]:{maxWidth:"calc(100vw - 16px)",margin:`${(0,Sn.zA)(e.marginXS)} auto`},[`${t}-centered`]:{[t]:{flex:1}}}}},{[t]:Object.assign(Object.assign({},(0,xn.dF)(e)),{pointerEvents:"none",position:"relative",top:100,width:"auto",maxWidth:`calc(100vw - ${(0,Sn.zA)(e.calc(e.margin).mul(2).equal())})`,margin:"0 auto",paddingBottom:e.paddingLG,[`${t}-title`]:{margin:0,color:e.titleColor,fontWeight:e.fontWeightStrong,fontSize:e.titleFontSize,lineHeight:e.titleLineHeight,wordWrap:"break-word"},[`${t}-content`]:{position:"relative",backgroundColor:e.contentBg,backgroundClip:"padding-box",border:0,borderRadius:e.borderRadiusLG,boxShadow:e.boxShadow,pointerEvents:"auto",padding:e.contentPadding},[`${t}-close`]:Object.assign({position:"absolute",top:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),insetInlineEnd:e.calc(e.modalHeaderHeight).sub(e.modalCloseBtnSize).div(2).equal(),zIndex:e.calc(e.zIndexPopupBase).add(10).equal(),padding:0,color:e.modalCloseIconColor,fontWeight:e.fontWeightStrong,lineHeight:1,textDecoration:"none",background:"transparent",borderRadius:e.borderRadiusSM,width:e.modalCloseBtnSize,height:e.modalCloseBtnSize,border:0,outline:0,cursor:"pointer",transition:`color ${e.motionDurationMid}, background-color ${e.motionDurationMid}`,"&-x":{display:"flex",fontSize:e.fontSizeLG,fontStyle:"normal",lineHeight:`${(0,Sn.zA)(e.modalCloseBtnSize)}`,justifyContent:"center",textTransform:"none",textRendering:"auto"},"&:hover":{color:e.modalCloseIconHoverColor,backgroundColor:e.colorBgTextHover,textDecoration:"none"},"&:active":{backgroundColor:e.colorBgTextActive}},(0,xn.K8)(e)),[`${t}-header`]:{color:e.colorText,background:e.headerBg,borderRadius:`${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)} 0 0`,marginBottom:e.headerMarginBottom,padding:e.headerPadding,borderBottom:e.headerBorderBottom},[`${t}-body`]:{fontSize:e.fontSize,lineHeight:e.lineHeight,wordWrap:"break-word",padding:e.bodyPadding},[`${t}-footer`]:{textAlign:"end",background:e.footerBg,marginTop:e.footerMarginTop,padding:e.footerPadding,borderTop:e.footerBorderTop,borderRadius:e.footerBorderRadius,[`> ${e.antCls}-btn + ${e.antCls}-btn`]:{marginInlineStart:e.marginXS}},[`${t}-open`]:{overflow:"hidden"}})},{[`${t}-pure-panel`]:{top:"auto",padding:0,display:"flex",flexDirection:"column",[`${t}-content,\n ${t}-body,\n ${t}-confirm-body-wrapper`]:{display:"flex",flexDirection:"column",flex:"auto"},[`${t}-confirm-body`]:{marginBottom:"auto"}}}]},Wn=e=>{const{componentCls:t}=e;return{[`${t}-root`]:{[`${t}-wrap-rtl`]:{direction:"rtl",[`${t}-confirm-body`]:{direction:"rtl"}}}}},Xn=((0,_n.OF)("Modal",(e=>{const t=(e=>{const t=e.padding,n=e.fontSizeHeading5,r=e.lineHeightHeading5;return(0,jn.h1)(e,{modalHeaderHeight:e.calc(e.calc(r).mul(n).equal()).add(e.calc(t).mul(2).equal()).equal(),modalFooterBorderColorSplit:e.colorSplit,modalFooterBorderStyle:e.lineType,modalFooterBorderWidth:e.lineWidth,modalCloseIconColor:e.colorIcon,modalCloseIconHoverColor:e.colorIconHover,modalCloseBtnSize:e.controlHeight,modalConfirmIconSize:e.fontHeight,modalTitleHeight:e.calc(e.titleFontSize).mul(e.titleLineHeight).equal()})})(e);return[Fn(t),Wn(t),Bn(t),$n(t,"zoom")]}),(e=>({footerBg:"transparent",headerBg:e.colorBgElevated,titleLineHeight:e.lineHeightHeading5,titleFontSize:e.fontSizeHeading5,contentBg:e.colorBgElevated,titleColor:e.colorTextHeading,contentPadding:e.wireframe?0:`${(0,Sn.zA)(e.paddingMD)} ${(0,Sn.zA)(e.paddingContentHorizontalLG)}`,headerPadding:e.wireframe?`${(0,Sn.zA)(e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,headerBorderBottom:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",headerMarginBottom:e.wireframe?0:e.marginXS,bodyPadding:e.wireframe?e.paddingLG:0,footerPadding:e.wireframe?`${(0,Sn.zA)(e.paddingXS)} ${(0,Sn.zA)(e.padding)}`:0,footerBorderTop:e.wireframe?`${(0,Sn.zA)(e.lineWidth)} ${e.lineType} ${e.colorSplit}`:"none",footerBorderRadius:e.wireframe?`0 0 ${(0,Sn.zA)(e.borderRadiusLG)} ${(0,Sn.zA)(e.borderRadiusLG)}`:0,footerMarginTop:e.wireframe?0:e.marginSM,confirmBodyPadding:e.wireframe?`${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(2*e.padding)} ${(0,Sn.zA)(e.paddingLG)}`:0,confirmIconMarginInlineEnd:e.wireframe?e.margin:e.marginSM,confirmBtnsMarginTop:e.wireframe?e.marginLG:e.marginSM})),{unitless:{titleLineHeight:!0}}),e=>({position:e||"absolute",inset:0})),Un=e=>{const{iconCls:t,motionDurationSlow:n,paddingXXS:r,marginXXS:o,prefixCls:i,colorTextLightSolid:a}=e;return{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",color:a,background:new wn.q("#000").setAlpha(.5).toRgbString(),cursor:"pointer",opacity:0,transition:`opacity ${n}`,[`.${i}-mask-info`]:Object.assign(Object.assign({},xn.L9),{padding:`0 ${(0,Sn.zA)(r)}`,[t]:{marginInlineEnd:o,svg:{verticalAlign:"baseline"}}})}},Yn=e=>{const{previewCls:t,modalMaskBg:n,paddingSM:r,marginXL:o,margin:i,paddingLG:a,previewOperationColorDisabled:c,previewOperationHoverColor:s,motionDurationSlow:l,iconCls:u,colorTextLightSolid:d}=e,f=new wn.q(n).setAlpha(.1),p=f.clone().setAlpha(.2);return{[`${t}-footer`]:{position:"fixed",bottom:o,left:{_skip_check_:!0,value:0},width:"100%",display:"flex",flexDirection:"column",alignItems:"center",color:e.previewOperationColor},[`${t}-progress`]:{marginBottom:i},[`${t}-close`]:{position:"fixed",top:o,right:{_skip_check_:!0,value:o},display:"flex",color:d,backgroundColor:f.toRgbString(),borderRadius:"50%",padding:r,outline:0,border:0,cursor:"pointer",transition:`all ${l}`,"&:hover":{backgroundColor:p.toRgbString()},[`& > ${u}`]:{fontSize:e.previewOperationSize}},[`${t}-operations`]:{display:"flex",alignItems:"center",padding:`0 ${(0,Sn.zA)(a)}`,backgroundColor:f.toRgbString(),borderRadius:100,"&-operation":{marginInlineStart:r,padding:r,cursor:"pointer",transition:`all ${l}`,userSelect:"none",[`&:not(${t}-operations-operation-disabled):hover > ${u}`]:{color:s},"&-disabled":{color:c,cursor:"not-allowed"},"&:first-of-type":{marginInlineStart:0},[`& > ${u}`]:{fontSize:e.previewOperationSize}}}}},Gn=e=>{const{modalMaskBg:t,iconCls:n,previewOperationColorDisabled:r,previewCls:o,zIndexPopup:i,motionDurationSlow:a}=e,c=new wn.q(t).setAlpha(.1),s=c.clone().setAlpha(.2);return{[`${o}-switch-left, ${o}-switch-right`]:{position:"fixed",insetBlockStart:"50%",zIndex:e.calc(i).add(1).equal({unit:!1}),display:"flex",alignItems:"center",justifyContent:"center",width:e.imagePreviewSwitchSize,height:e.imagePreviewSwitchSize,marginTop:e.calc(e.imagePreviewSwitchSize).mul(-1).div(2).equal(),color:e.previewOperationColor,background:c.toRgbString(),borderRadius:"50%",transform:"translateY(-50%)",cursor:"pointer",transition:`all ${a}`,userSelect:"none","&:hover":{background:s.toRgbString()},"&-disabled":{"&, &:hover":{color:r,background:"transparent",cursor:"not-allowed",[`> ${n}`]:{cursor:"not-allowed"}}},[`> ${n}`]:{fontSize:e.previewOperationSize}},[`${o}-switch-left`]:{insetInlineStart:e.marginSM},[`${o}-switch-right`]:{insetInlineEnd:e.marginSM}}},qn=e=>{const{motionEaseOut:t,previewCls:n,motionDurationSlow:r,componentCls:o}=e;return[{[`${o}-preview-root`]:{[n]:{height:"100%",textAlign:"center",pointerEvents:"none"},[`${n}-body`]:Object.assign(Object.assign({},Xn()),{overflow:"hidden"}),[`${n}-img`]:{maxWidth:"100%",maxHeight:"70%",verticalAlign:"middle",transform:"scale3d(1, 1, 1)",cursor:"grab",transition:`transform ${r} ${t} 0s`,userSelect:"none","&-wrapper":Object.assign(Object.assign({},Xn()),{transition:`transform ${r} ${t} 0s`,display:"flex",justifyContent:"center",alignItems:"center","& > *":{pointerEvents:"auto"},"&::before":{display:"inline-block",width:1,height:"50%",marginInlineEnd:-1,content:'""'}})},[`${n}-moving`]:{[`${n}-preview-img`]:{cursor:"grabbing","&-wrapper":{transitionDuration:"0s"}}}}},{[`${o}-preview-root`]:{[`${n}-wrap`]:{zIndex:e.zIndexPopup}}},{[`${o}-preview-operations-wrapper`]:{position:"fixed",zIndex:e.calc(e.zIndexPopup).add(1).equal({unit:!1})},"&":[Yn(e),Gn(e)]}]},Kn=e=>{const{componentCls:t}=e;return{[t]:{position:"relative",display:"inline-block",[`${t}-img`]:{width:"100%",height:"auto",verticalAlign:"middle"},[`${t}-img-placeholder`]:{backgroundColor:e.colorBgContainerDisabled,backgroundImage:"url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=')",backgroundRepeat:"no-repeat",backgroundPosition:"center center",backgroundSize:"30%"},[`${t}-mask`]:Object.assign({},Un(e)),[`${t}-mask:hover`]:{opacity:1},[`${t}-placeholder`]:Object.assign({},Xn())}}},Vn=e=>{const{previewCls:t}=e;return{[`${t}-root`]:$n(e,"zoom"),"&":Tn(e,!0)}},Zn=(0,_n.OF)("Image",(e=>{const t=`${e.componentCls}-preview`,n=(0,jn.h1)(e,{previewCls:t,modalMaskBg:new wn.q("#000").setAlpha(.45).toRgbString(),imagePreviewSwitchSize:e.controlHeightLG});return[Kn(n),qn(n),Bn((0,jn.h1)(n,{componentCls:t})),Vn(n)]}),(e=>({zIndexPopup:e.zIndexPopupBase+80,previewOperationColor:new wn.q(e.colorTextLightSolid).setAlpha(.65).toRgbString(),previewOperationHoverColor:new wn.q(e.colorTextLightSolid).setAlpha(.85).toRgbString(),previewOperationColorDisabled:new wn.q(e.colorTextLightSolid).setAlpha(.25).toRgbString(),previewOperationSize:1.5*e.fontSizeIcon})));var Qn=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{var t;const{prefixCls:n,preview:o,className:i,rootClassName:a,style:c}=e,s=er(e,["prefixCls","preview","className","rootClassName","style"]),{getPrefixCls:u,locale:f=Jt,getPopupContainer:p,image:h}=r.useContext(Yt.QO),v=u("image",n),g=u(),m=f.Image||Jt.Image,y=Gt(v),[b,A,S]=Zn(v,y),w=d()(a,A,S,y),x=d()(i,A,null==h?void 0:h.className),[k]=Xt("ImagePreview","object"==typeof o?o.zIndex:void 0),C=r.useMemo((()=>{var e;if(!1===o)return o;const t="object"==typeof o?o:{},{getContainer:n,closeIcon:i}=t,a=er(t,["getContainer","closeIcon"]);return Object.assign(Object.assign({mask:r.createElement("div",{className:`${v}-mask-info`},r.createElement(l,null),null==m?void 0:m.preview),icons:Jn},a),{getContainer:null!=n?n:p,transitionName:Ut(g,"zoom",t.transitionName),maskTransitionName:Ut(g,"fade",t.maskTransitionName),zIndex:k,closeIcon:null!=i?i:null===(e=null==h?void 0:h.preview)||void 0===e?void 0:e.closeIcon})}),[o,m,null===(t=null==h?void 0:h.preview)||void 0===t?void 0:t.closeIcon]),E=Object.assign(Object.assign({},null==h?void 0:h.style),c);return b(r.createElement(jt,Object.assign({prefixCls:v,preview:C,rootClassName:w,className:x,style:E},s)))};tr.PreviewGroup=e=>{var{previewPrefixCls:t,preview:n}=e,o=Qn(e,["previewPrefixCls","preview"]);const{getPrefixCls:i}=r.useContext(Yt.QO),a=i("image",t),c=`${a}-preview`,s=i(),l=Gt(a),[u,f,p]=Zn(a,l),[h]=Xt("ImagePreview","object"==typeof n?n.zIndex:void 0),v=r.useMemo((()=>{var e;if(!1===n)return n;const t="object"==typeof n?n:{},r=d()(f,p,l,null!==(e=t.rootClassName)&&void 0!==e?e:"");return Object.assign(Object.assign({},t),{transitionName:Ut(s,"zoom",t.transitionName),maskTransitionName:Ut(s,"fade",t.maskTransitionName),rootClassName:r,zIndex:h})}),[n]);return u(r.createElement(jt.PreviewGroup,Object.assign({preview:v,previewPrefixCls:c,icons:Jn},o)))};const nr=tr},5905:(e,t,n)=>{"use strict";n.d(t,{K8:()=>u,L9:()=>o,Nk:()=>a,av:()=>c,dF:()=>i,vj:()=>s});var r=n(1466);const o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},i=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},a=()=>({display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),c=e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:`color ${e.motionDurationSlow}`,"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active,\n &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}),s=(e,t,n,r)=>{const o=`[class^="${t}"], [class*=" ${t}"]`,i=n?`.${n}`:o,a={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let c={};return!1!==r&&(c={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[i]:Object.assign(Object.assign(Object.assign({},c),a),{[o]:a})}},l=e=>({outline:`${(0,r.zA)(e.lineWidthFocus)} solid ${e.colorPrimaryBorder}`,outlineOffset:1,transition:"outline-offset 0s, outline 0s"}),u=e=>({"&:focus-visible":Object.assign({},l(e))})},3511:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>T,Xe:()=>E,Is:()=>C});var r=n(6540),o=n(1466);const i="5.16.4";var a=n(2200);const c={blue:"#1677ff",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#eb2f96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},s=Object.assign(Object.assign({},c),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});var l=n(4978);const u=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const d=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const f=e=>{const t=function(e){const t=new Array(10).fill(null).map(((t,n)=>{const r=n-1,o=e*Math.pow(2.71828,r/5),i=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(i/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],i=n[0],a=n[2],c=r[1],s=r[0],l=r[2];return{fontSizeSM:i,fontSize:o,fontSizeLG:a,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:c,lineHeightLG:l,lineHeightSM:s,fontHeight:Math.round(c*o),fontHeightLG:Math.round(l*a),fontHeightSM:Math.round(s*i),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const p=(e,t)=>new l.q(e).setAlpha(t).toRgbString(),h=(e,t)=>new l.q(e).darken(t).toHexString(),v=e=>{const t=(0,a.cM)(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},g=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:p(r,.88),colorTextSecondary:p(r,.65),colorTextTertiary:p(r,.45),colorTextQuaternary:p(r,.25),colorFill:p(r,.15),colorFillSecondary:p(r,.06),colorFillTertiary:p(r,.04),colorFillQuaternary:p(r,.02),colorBgLayout:h(n,4),colorBgContainer:h(n,0),colorBgElevated:h(n,0),colorBgSpotlight:p(r,.85),colorBgBlur:"transparent",colorBorder:h(n,15),colorBorderSecondary:h(n,6)}};const m=(0,o.an)((function(e){const t=Object.keys(c).map((t=>{const n=(0,a.cM)(e[t]);return new Array(10).fill(1).reduce(((e,r,o)=>(e[`${t}-${o+1}`]=n[o],e[`${t}${o+1}`]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:i,colorError:a,colorInfo:c,colorPrimary:s,colorBgBase:u,colorTextBase:d}=e,f=n(s),p=n(o),h=n(i),v=n(a),g=n(c),m=r(u,d),y=n(e.colorLink||e.colorInfo);return Object.assign(Object.assign({},m),{colorPrimaryBg:f[1],colorPrimaryBgHover:f[2],colorPrimaryBorder:f[3],colorPrimaryBorderHover:f[4],colorPrimaryHover:f[5],colorPrimary:f[6],colorPrimaryActive:f[7],colorPrimaryTextHover:f[8],colorPrimaryText:f[9],colorPrimaryTextActive:f[10],colorSuccessBg:p[1],colorSuccessBgHover:p[2],colorSuccessBorder:p[3],colorSuccessBorderHover:p[4],colorSuccessHover:p[4],colorSuccess:p[6],colorSuccessActive:p[7],colorSuccessTextHover:p[8],colorSuccessText:p[9],colorSuccessTextActive:p[10],colorErrorBg:v[1],colorErrorBgHover:v[2],colorErrorBorder:v[3],colorErrorBorderHover:v[4],colorErrorHover:v[5],colorError:v[6],colorErrorActive:v[7],colorErrorTextHover:v[8],colorErrorText:v[9],colorErrorTextActive:v[10],colorWarningBg:h[1],colorWarningBgHover:h[2],colorWarningBorder:h[3],colorWarningBorderHover:h[4],colorWarningHover:h[4],colorWarning:h[6],colorWarningActive:h[7],colorWarningTextHover:h[8],colorWarningText:h[9],colorWarningTextActive:h[10],colorInfoBg:g[1],colorInfoBgHover:g[2],colorInfoBorder:g[3],colorInfoBorderHover:g[4],colorInfoHover:g[4],colorInfo:g[6],colorInfoActive:g[7],colorInfoTextHover:g[8],colorInfoText:g[9],colorInfoTextActive:g[10],colorLinkHover:y[4],colorLink:y[6],colorLinkActive:y[7],colorBgMask:new l.q("#000").setAlpha(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:v,generateNeutralColorPalettes:g})),f(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),d(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:`${(n+t).toFixed(1)}s`,motionDurationMid:`${(n+2*t).toFixed(1)}s`,motionDurationSlow:`${(n+3*t).toFixed(1)}s`,lineWidthBold:o+1},u(r))}(e))})),y={token:s,override:{override:s},hashed:!0},b=r.createContext(y);function A(e){return e>=0&&e<=255}const S=function(e,t){const{r:n,g:r,b:o,a:i}=new l.q(e).toRgb();if(i<1)return e;const{r:a,g:c,b:s}=new l.q(t).toRgb();for(let u=.01;u<=1;u+=.01){const e=Math.round((n-a*(1-u))/u),t=Math.round((r-c*(1-u))/u),i=Math.round((o-s*(1-u))/u);if(A(e)&&A(t)&&A(i))return new l.q({r:e,g:t,b:i,a:Math.round(100*u)/100}).toRgbString()}return new l.q({r:n,g:r,b:o,a:1}).toRgbString()};var w=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{delete r[e]}));const o=Object.assign(Object.assign({},n),r),i=1200,a=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:S(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:S(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:S(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:4*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:S(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowSecondary:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTertiary:"\n 0 1px 2px 0 rgba(0, 0, 0, 0.03),\n 0 1px 6px -1px rgba(0, 0, 0, 0.02),\n 0 2px 4px 0 rgba(0, 0, 0, 0.02)\n ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:i,screenXLMin:i,screenXLMax:1599,screenXXL:a,screenXXLMin:a,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:`\n 0 1px 2px -2px ${new l.q("rgba(0, 0, 0, 0.16)").toRgbString()},\n 0 3px 6px 0 ${new l.q("rgba(0, 0, 0, 0.12)").toRgbString()},\n 0 5px 12px 4px ${new l.q("rgba(0, 0, 0, 0.09)").toRgbString()}\n `,boxShadowDrawerRight:"\n -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerLeft:"\n 6px 0 16px 0 rgba(0, 0, 0, 0.08),\n 3px 0 6px -4px rgba(0, 0, 0, 0.12),\n 9px 0 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerUp:"\n 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowDrawerDown:"\n 0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var k=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{const r=n.getDerivativeToken(e),{override:o}=t,i=k(t,["override"]);let a=Object.assign(Object.assign({},r),{override:o});return a=x(a),i&&Object.entries(i).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=k(n,["theme"]);let i=o;r&&(i=O(Object.assign(Object.assign({},a),o),{override:o},r)),a[t]=i})),a};function T(){const{token:e,hashed:t,theme:n,override:a,cssVar:c}=r.useContext(b),l=`${i}-${t||""}`,u=n||m,[d,f,p]=(0,o.hV)(u,[s,e],{salt:l,override:a,getComputedToken:O,formatToken:x,cssVar:c&&{prefix:c.prefix,key:c.key,unitless:C,ignore:E,preserve:M}});return[u,p,t?f:"",d,c]}},665:(e,t,n)=>{"use strict";n.d(t,{OF:()=>M});var r=n(6540),o=n(1466);n(6956),n(2533),n(8719);"undefined"==typeof Reflect?Object.keys:Reflect.ownKeys;n(8210);var i=n(2279),a=n(5905),c=n(3511),s=n(3029),l=n(2901),u=n(3954),d=n(2176),f=n(6822);function p(e,t,n){return t=(0,u.A)(t),(0,f.A)(e,(0,d.A)()?Reflect.construct(t,n||[],(0,u.A)(e).constructor):t.apply(e,n))}var h=n(5501);const v=(0,l.A)((function e(){(0,s.A)(this,e)})),g="CALC_UNIT",m=new RegExp(g,"g");function y(e){return"number"==typeof e?`${e}${g}`:e}let b=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result="",e instanceof t?n.result=`(${e.result})`:"number"==typeof e?n.result=y(e):"string"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result=`${this.result} + ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} + ${y(e)}`),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof t?this.result=`${this.result} - ${e.getResult()}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} - ${y(e)}`),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} * ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} * ${e}`),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result=`(${this.result})`),e instanceof t?this.result=`${this.result} / ${e.getResult(!0)}`:"number"!=typeof e&&"string"!=typeof e||(this.result=`${this.result} / ${e}`),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?`(${this.result})`:this.result}},{key:"equal",value:function(e){const{unit:t=!0}=e||{};return this.result=this.result.replace(m,t?"px":""),void 0!==this.lowPriority?`calc(${this.result})`:this.result}}])}(v),A=function(e){function t(e){var n;return(0,s.A)(this,t),(n=p(this,t)).result=0,e instanceof t?n.result=e.result:"number"==typeof e&&(n.result=e),n}return(0,h.A)(t,e),(0,l.A)(t,[{key:"add",value:function(e){return e instanceof t?this.result+=e.result:"number"==typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof t?this.result-=e.result:"number"==typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof t?this.result*=e.result:"number"==typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof t?this.result/=e.result:"number"==typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}])}(v);const S=e=>{const t="css"===e?b:A;return e=>new t(e)};var w=n(336);const x=(e,t)=>{const[n,r]=(0,c.Ay)();return(0,o.IV)({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null==t?void 0:t.nonce},(()=>[{[`.${e}`]:Object.assign(Object.assign({},(0,a.Nk)()),{[`.${e} .${e}-icon`]:{display:"block"}})}]))},k=(e,t,n)=>{var r;return"function"==typeof n?n((0,w.h1)(t,null!==(r=t[e])&&void 0!==r?r:{})):null!=n?n:{}},C=(e,t,n,r)=>{const o=Object.assign({},t[e]);if(null==r?void 0:r.deprecatedTokens){const{deprecatedTokens:e}=r;e.forEach((e=>{let[t,n]=e;var r;((null==o?void 0:o[t])||(null==o?void 0:o[n]))&&(null!==(r=o[n])&&void 0!==r||(o[n]=null==o?void 0:o[t]))}))}const i=Object.assign(Object.assign({},n),o);return Object.keys(i).forEach((e=>{i[e]===t[e]&&delete i[e]})),i};function E(e,t,n){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const l=Array.isArray(e)?e:[e,e],[u]=l,d=l.join("-");return function(e){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[f,p,h,v,g]=(0,c.Ay)(),{getPrefixCls:m,iconPrefixCls:y,csp:b}=(0,r.useContext)(i.QO),A=m(),E=g?"css":"js",M=S(E),{max:O,min:T}=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n(0,o.zA)(e))).join(",")})`}}}(E),L={theme:f,token:v,hashId:h,nonce:()=>null==b?void 0:b.nonce,clientOnly:s.clientOnly,order:s.order||-999};(0,o.IV)(Object.assign(Object.assign({},L),{clientOnly:!1,path:["Shared",A]}),(()=>[{"&":(0,a.av)(v)}])),x(y,b);const I=(0,o.IV)(Object.assign(Object.assign({},L),{path:[d,e,y]}),(()=>{if(!1===s.injectStyle)return[];const{token:r,flush:i}=(0,w.Ay)(v),c=k(u,p,n),d=`.${e}`,f=C(u,p,c,{deprecatedTokens:s.deprecatedTokens});g&&Object.keys(c).forEach((e=>{c[e]=`var(${(0,o.Ki)(e,((e,t)=>`${[t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-")}`)(u,g.prefix))})`}));const m=(0,w.h1)(r,{componentCls:d,prefixCls:e,iconCls:`.${y}`,antCls:`.${A}`,calc:M,max:O,min:T},g?c:f),b=t(m,{hashId:h,prefixCls:e,rootPrefixCls:A,iconPrefixCls:y});return i(u,f),[!1===s.resetStyle?null:(0,a.vj)(m,e,l,s.resetFont),b]}));return[I,h]}}const M=(e,t,n,i)=>{const a=E(e,t,n,i),s=((e,t,n)=>{function i(t){return`${e}${t.slice(0,1).toUpperCase()}${t.slice(1)}`}const{unitless:a={},injectStyle:s=!0}=null!=n?n:{},l={[i("zIndexPopup")]:!0};Object.keys(a).forEach((e=>{l[i(e)]=a[e]}));const u=r=>{let{rootCls:a,cssVar:s}=r;const[,u]=(0,c.Ay)();return(0,o.RC)({path:[e],prefix:s.prefix,key:null==s?void 0:s.key,unitless:Object.assign(Object.assign({},c.Is),l),ignore:c.Xe,token:u,scope:a},(()=>{const r=k(e,u,t),o=C(e,u,r,{deprecatedTokens:null==n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((e=>{o[i(e)]=o[e],delete o[e]})),o})),null};return t=>{const[,,,,n]=(0,c.Ay)();return[o=>s&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o,null==n?void 0:n.key]}})(Array.isArray(e)?e[0]:e,n,i);return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;const[,n]=a(e,t),[r,o]=s(t);return[r,n,o]}}},336:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,h1:()=>i});const r="undefined"!=typeof CSSINJS_STATISTIC;let o=!0;function i(){for(var e=arguments.length,t=new Array(e),n=0;n{Object.keys(e).forEach((t=>{Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>e[t]})}))})),o=!0,i}const a={};function c(){}const s=e=>{let t,n=e,i=c;return r&&"undefined"!=typeof Proxy&&(t=new Set,n=new Proxy(e,{get:(e,n)=>(o&&t.add(n),e[n])}),i=(e,n)=>{var r;a[e]={global:Array.from(t),component:Object.assign(Object.assign({},null===(r=a[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:i}}},1441:(e,t,n)=>{var r=n(8028),o=function(e){var t="",n=Object.keys(e);return n.forEach((function(o,i){var a=e[o];(function(e){return/[height|width]$/.test(e)})(o=r(o))&&"number"==typeof a&&(a+="px"),t+=!0===a?o:!1===a?"not "+o:"("+o+": "+a+")",i{"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{A:()=>r})},4808:(e,t,n)=>{"use strict";function r(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}n.d(t,{A:()=>r})},5089:(e,t,n)=>{"use strict";n.d(t,{BD:()=>g,m6:()=>v});var r=n(9379),o=n(998),i=n(4808),a="data-rc-order",c="data-rc-priority",s="rc-util-key",l=new Map;function u(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):s}function d(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function f(e){return Array.from((l.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,o.A)())return null;var n=t.csp,r=t.prepend,i=t.priority,s=void 0===i?0:i,l=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),u="prependQueue"===l,p=document.createElement("style");p.setAttribute(a,l),u&&s&&p.setAttribute(c,"".concat(s)),null!=n&&n.nonce&&(p.nonce=null==n?void 0:n.nonce),p.innerHTML=e;var h=d(t),v=h.firstChild;if(r){if(u){var g=(t.styles||f(h)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(a)))return!1;var t=Number(e.getAttribute(c)||0);return s>=t}));if(g.length)return h.insertBefore(p,g[g.length-1].nextSibling),p}h.insertBefore(p,v)}else h.appendChild(p);return p}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(t);return(t.styles||f(n)).find((function(n){return n.getAttribute(u(t))===e}))}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=h(e,t);n&&d(t).removeChild(n)}function g(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=d(n),a=f(o),c=(0,r.A)((0,r.A)({},n),{},{styles:a});!function(e,t){var n=l.get(e);if(!n||!(0,i.A)(document,n)){var r=p("",t),o=r.parentNode;l.set(e,o),e.removeChild(r)}}(o,c);var s=h(t,c);if(s){var v,g,m;if(null!==(v=c.csp)&&void 0!==v&&v.nonce&&s.nonce!==(null===(g=c.csp)||void 0===g?void 0:g.nonce))s.nonce=null===(m=c.csp)||void 0===m?void 0:m.nonce;return s.innerHTML!==e&&(s.innerHTML=e),s}var y=p(e,c);return y.setAttribute(u(c),t),y}},6956:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o{"use strict";n.d(t,{A:()=>c,o:()=>a});var r=n(6540),o=(0,n(998).A)()?r.useLayoutEffect:r.useEffect,i=function(e,t){var n=r.useRef(!0);o((function(){return e(n.current)}),t),o((function(){return n.current=!1,function(){n.current=!0}}),[])},a=function(e,t){i((function(t){if(!t)return e()}),t)};const c=i},8104:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},2533:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(6636),o=n(6956),i=n(981),a=n(1233);function c(e){return void 0!==e}function s(e,t){var n=t||{},s=n.defaultValue,l=n.value,u=n.onChange,d=n.postState,f=(0,a.A)((function(){return c(l)?l:c(s)?"function"==typeof s?s():s:"function"==typeof e?e():e})),p=(0,r.A)(f,2),h=p[0],v=p[1],g=void 0!==l?l:h,m=d?d(g):g,y=(0,o.A)(u),b=(0,a.A)([g]),A=(0,r.A)(b,2),S=A[0],w=A[1];return(0,i.o)((function(){var e=S[0];h!==e&&y(h,e)}),[S]),(0,i.o)((function(){c(l)||v(l)}),[l]),[m,(0,o.A)((function(e,t){v(e,t),w([g],t)}))]}},1233:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6636),o=n(6540);function i(e){var t=o.useRef(!1),n=o.useState(e),i=(0,r.A)(n,2),a=i[0],c=i[1];return o.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[a,function(e,n){n&&t.current||c(e)}]}},3210:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(8210);const i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new Set;return function e(t,a){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,s=i.has(t);if((0,o.Ay)(!s,"Warning: There may be circular references"),s)return!1;if(t===a)return!0;if(n&&c>1)return!1;i.add(t);var l=c+1;if(Array.isArray(t)){if(!Array.isArray(a)||t.length!==a.length)return!1;for(var u=0;u{"use strict";n.d(t,{Xf:()=>a,f3:()=>l,xK:()=>s});var r=n(2284),o=(n(6540),n(6351)),i=n(8104);function a(e,t){"function"==typeof e?e(t):"object"===(0,r.A)(e)&&e&&"current"in e&&(e.current=t)}function c(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{$e:()=>i,Ay:()=>l});var r={},o=[];function i(e,t){}function a(e,t){}function c(e,t,n){t||r[n]||(e(!1,n),r[n]=!0)}function s(e,t){c(i,e,t)}s.preMessage=function(e){o.push(e)},s.resetWarned=function(){r={}},s.noteOnce=function(e,t){c(a,e,t)};const l=s},7787:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),g=Symbol.for("react.offscreen");function m(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case c:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case l:case d:case v:case h:case s:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isMemo=function(e){return m(e)===h}},6351:(e,t,n)=>{"use strict";e.exports=n(7787)},8028:e=>{e.exports=function(e){return e.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})).toLowerCase()}},6942:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nr})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(8406);function o(e,t){for(var n=0;n{"use strict";n.d(t,{A:()=>o});var r=n(8406);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},3954:(e,t,n)=>{"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>r})},5501:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,r.A)(e,t)}},2176:(e,t,n)=>{"use strict";function r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(r=function(){return!!e})()}n.d(t,{A:()=>r})},9379:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(4467);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},6822:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2284),o=n(9417);function i(e,t){if(t&&("object"===(0,r.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,o.A)(e)}},6636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},4241:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3145);var o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},8406:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e,t){if("object"!=(0,r.A)(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=(0,r.A)(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?(0,r.A)(e,t):void 0}}},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/772.fe90f809.js.LICENSE.txt b/assets/js/772.fa094b13.js.LICENSE.txt similarity index 100% rename from assets/js/772.fe90f809.js.LICENSE.txt rename to assets/js/772.fa094b13.js.LICENSE.txt diff --git a/assets/js/7c110bd0.62d4bb39.js b/assets/js/7c110bd0.62d4bb39.js new file mode 100644 index 000000000..7d29d8357 --- /dev/null +++ b/assets/js/7c110bd0.62d4bb39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6877],{2614:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"PSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{e.exports=JSON.parse('{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7d09a242.f85bccbb.js b/assets/js/7d09a242.4bb00568.js similarity index 99% rename from assets/js/7d09a242.f85bccbb.js rename to assets/js/7d09a242.4bb00568.js index 56d40f510..24638770d 100644 --- a/assets/js/7d09a242.f85bccbb.js +++ b/assets/js/7d09a242.4bb00568.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6692],{1991:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var s=i(4848),t=i(8453),a=i(1470),o=i(9365);const l={title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},r="aomenc",c={id:"encoders/aomenc",title:"aomenc",description:"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.",source:"@site/docs/encoders/aomenc.mdx",sourceDirName:"encoders",slug:"/encoders/aomenc",permalink:"/docs/encoders/aomenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},sidebar:"tutorialSidebar",previous:{title:"x266",permalink:"/docs/encoders/x266"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},d={},h=[{value:"Choosing forks",id:"choosing-forks",level:2},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"aomenc",children:"aomenc"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"aomenc"}),", AOM-AV1, or just ",(0,s.jsx)(n.strong,{children:"libaom"})," is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1."]}),"\n",(0,s.jsx)(n.h2,{id:"choosing-forks",children:"Choosing forks"}),"\n",(0,s.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, heavy focus on ",(0,s.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," which reduces its psycho-visual capabilities, settings that does X instead of Y, among others. Fortunately there are a couple forks that were created to combat these issues."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,s.jsxs)(n.p,{children:["Our recommendadion is to use either ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," or ",(0,s.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"}),", as both are actively maintained with good defaults and have been extensively tested by the encoding community."]}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,s.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,s.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,s.jsx)(n.p,{children:"Since FFmpeg encoder libraries come as the most default, barebones as possible (Therefore mainline aomenc), it is not recommended to use it. Unless you build it yourself."})}),"\n",(0,s.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(n.p,{children:"aomenc supports the following color spaces:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Format"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY8"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:"The compilation parts of this installation will assume aom-av1-lavish as the default fork of choice."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsxs)(o.A,{value:"linux",label:"Linux",default:!0,children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc should be available in your distribution's package manager."})}),(0,s.jsx)(n.p,{children:"But if you want to compile the community forks, you can also do that. CMake, Perl, GNU Make, and nasm (assuming x64, if x86 use yasm) will be needed for compilation."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom-av1-lavish repo Endless_Merging branch, cd and create build folder"',children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="CMake configuration"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,s.jsx)(n.p,{children:"The CMake config above will statically build aomenc while disabling docs (which requires Doxygen), extra tunes, tests, and decoders. While also applying native CPU optimizations to help speed up the encoder."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Compile the encoder"',children:"make -j$(nproc)\n"})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be in the same folder you are on (",(0,s.jsx)(n.code,{children:"aom_build"}),")."]}),(0,s.jsx)(n.p,{children:"Or, optionally, you can install it to your system, which may need elevated permissions."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"make install\n"})}),(0,s.jsxs)(n.p,{children:["Alternatively, a precompiled AVX2-optimized binary can be installed for Linux via ",(0,s.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),"."]})]}),(0,s.jsxs)(o.A,{value:"mac",label:"macOS",children:[(0,s.jsxs)(n.p,{children:["macOS is very similar to Linux. Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Homebrew"})}),(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),(0,s.jsx)(n.p,{children:"Installing mainline libaom is as simple as running the following:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install aom\n"})}),(0,s.jsx)(n.p,{children:"FFmpeg can also be installed via brew."}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),(0,s.jsx)(n.p,{children:"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. aom-av1-lavish requires some additional steps, though."}),"\n"]}),(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"})," is merged to fix build errors."]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n'})}),(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish."]})]}),(0,s.jsxs)(o.A,{value:"wind",label:"Windows",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"The Easy Way:"})," Download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"})}),(0,s.jsxs)(n.p,{children:["Join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Compiling Route:"})}),(0,s.jsxs)(n.p,{children:["Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,s.jsx)(n.a,{href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying",children:"this post"})," on how to compile aomenc."]}),(0,s.jsxs)(n.p,{children:["This guide requires ",(0,s.jsx)(n.strong,{children:"MSYS2"}),", specifically ",(0,s.jsx)(n.strong,{children:"MinGW-W64"}),". Install it if you haven't yet."]}),(0,s.jsx)(n.p,{children:"First, install the required dependencies:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,s.jsx)(n.p,{children:"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.p,{children:"Then we can start compiling with some build optimizations for your CPU:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n'})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,s.jsx)(n.code,{children:"C:"}),"), navigate there and the to the aom-av1-lavish folder and it should be there."]}),(0,s.jsx)(n.p,{children:'Built files should be in the "Debug" folder'}),(0,s.jsx)(n.p,{children:"Don't share binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this will lead to missing instructions being used and slowing down encode speeds."})]})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always use 2 passes when encoding."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,s.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,s.jsx)(n.p,{children:"Where:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,s.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,s.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," will be needed for parallelization. The parameters shown will be biased towards Av1an and aom-av1-lavish usage, so if you plan on using standalone aomenc then adjust as needed."]}),"\n",(0,s.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,s.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,s.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,s.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Do not use ",(0,s.jsx)(n.code,{children:"tune-content=psy"})," if you encode live action above ",(0,s.jsx)(n.code,{children:"cq-level=30"}),"."]})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you use any of the VMAF tunes, you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put VMAF models in."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode=0"})," set to 0 b its better"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1"})," --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsx)(n.mdxAdmonitionTitle,{}),(0,s.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,s.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,s.jsx)(n.code,{children:"--photon-noise=X"})]})]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>o});i(6540);var s=i(8215);const t={tabItem:"tabItem_Ymn6"};var a=i(4848);function o(e){let{children:n,hidden:i,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,o),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),t=i(8215),a=i(3104),o=i(6347),l=i(205),r=i(7485),c=i(1682),d=i(9466);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:t}}=e;return{value:n,label:i,attributes:s,default:t}}))}(i);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const t=(0,o.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,r.aZ)(a),(0,s.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(t.location.search);n.set(a,e),t.replace({...t.location,search:n.toString()})}),[a,t])]}function x(e){const{defaultValue:n,queryString:i=!1,groupId:t}=e,a=u(e),[o,r]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:t}),[x,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,a]=(0,d.Dv)(i);return[t,(0,s.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:t}),g=(()=>{const e=c??x;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{g&&r(g)}),[g]);return{selectedValue:o,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);r(e),h(e),f(e)}),[h,f,a]),tabValues:a}}var f=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=i(4848);function b(e){let{className:n,block:i,selectedValue:s,selectValue:o,tabValues:l}=e;const r=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=r.indexOf(n),t=l[i].value;t!==s&&(c(n),o(t))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=r.indexOf(e.currentTarget)+1;n=r[i]??r[0];break}case"ArrowLeft":{const i=r.indexOf(e.currentTarget)-1;n=r[i]??r[r.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>r.push(e),onKeyDown:h,onClick:d,...a,className:(0,t.A)("tabs__item",g.tabItem,a?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:t}=e;const a=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===t));return e?(0,s.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",g.tabList),children:[(0,j.jsx)(b,{...e,...n}),(0,j.jsx)(v,{...e,...n})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const t={},a=s.createContext(t);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6692],{1991:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var s=i(4848),t=i(8453),a=i(1470),o=i(9365);const l={title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},r="aomenc",c={id:"encoders/aomenc",title:"aomenc",description:"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.",source:"@site/docs/encoders/aomenc.mdx",sourceDirName:"encoders",slug:"/encoders/aomenc",permalink:"/docs/encoders/aomenc",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/aomenc.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"aomenc",sidebar_position:4,keywords:["AV1","encoding","video encoding","AOM AV1"]},sidebar:"tutorialSidebar",previous:{title:"x266",permalink:"/docs/encoders/x266"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},d={},h=[{value:"Choosing forks",id:"choosing-forks",level:2},{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"AV1 Encoding",id:"av1-encoding",level:3},{value:"AVIF Encoding",id:"avif-encoding",level:3},{value:"Recommendations",id:"recommendations",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"aomenc",children:"aomenc"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://aomedia.googlesource.com/aom/",children:"aomenc"}),", AOM-AV1, or just ",(0,s.jsx)(n.strong,{children:"libaom"})," is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1."]}),"\n",(0,s.jsx)(n.h2,{id:"choosing-forks",children:"Choosing forks"}),"\n",(0,s.jsxs)(n.p,{children:["Mainline aomenc is unfortunately not perfect. It suffers from bad defaults, heavy focus on ",(0,s.jsx)(n.a,{href:"/docs/metrics/PSNR",children:"PSNR"})," which reduces its psycho-visual capabilities, settings that does X instead of Y, among others. Fortunately there are a couple forks that were created to combat these issues."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"})," ",(0,s.jsx)(n.em,{children:"No longer maintained as of 13th January 2023"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/porcino/aom-av1ador",children:"aom-av1ador"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"These forks fix up the poor decisions made by the original AOM devs and most importantly introduce new parameters and tunes to help fine-tune the encoder even more."}),"\n",(0,s.jsxs)(n.p,{children:["Our recommendadion is to use either ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish",children:"aom-av1-lavish"})," or ",(0,s.jsx)(n.a,{href:"https://gitlab.com/damian101/aom-psy101",children:"aom-psy101"}),", as both are actively maintained with good defaults and have been extensively tested by the encoding community."]}),"\n",(0,s.jsx)(n.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc is available in FFmpeg via ",(0,s.jsx)(n.code,{children:"libaom-av1"}),", check if you have it by running ",(0,s.jsx)(n.code,{children:"ffmpeg -h encoder=libaom-av1"}),". You can input non-FFmpeg standard aomenc parameters via ",(0,s.jsx)(n.code,{children:"-aom-params"}),"."]}),"\n",(0,s.jsx)(n.admonition,{title:"Mainline aomenc",type:"caution",children:(0,s.jsx)(n.p,{children:"Since FFmpeg encoder libraries come as the most default, barebones as possible (Therefore mainline aomenc), it is not recommended to use it. Unless you build it yourself."})}),"\n",(0,s.jsx)(n.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,s.jsx)(n.p,{children:"aomenc supports the following color spaces:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Format"}),(0,s.jsx)(n.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,s.jsx)(n.th,{children:"Supported Bit Depth(s)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY8"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"8-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY10LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"10-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV420P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV422P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"YUV444P12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GBRP12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"GRAY12LE"}),(0,s.jsx)(n.td,{style:{textAlign:"center"},children:"-"}),(0,s.jsx)(n.td,{children:"12-bit"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:"The compilation parts of this installation will assume aom-av1-lavish as the default fork of choice."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsxs)(o.A,{value:"linux",label:"Linux",default:!0,children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"aomenc should be available in your distribution's package manager."})}),(0,s.jsx)(n.p,{children:"But if you want to compile the community forks, you can also do that. CMake, Perl, GNU Make, and nasm (assuming x64, if x86 use yasm) will be needed for compilation."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Clone the aom-av1-lavish repo Endless_Merging branch, cd and create build folder"',children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="CMake configuration"',children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\n'})}),(0,s.jsx)(n.p,{children:"The CMake config above will statically build aomenc while disabling docs (which requires Doxygen), extra tunes, tests, and decoders. While also applying native CPU optimizations to help speed up the encoder."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Compile the encoder"',children:"make -j$(nproc)\n"})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be in the same folder you are on (",(0,s.jsx)(n.code,{children:"aom_build"}),")."]}),(0,s.jsx)(n.p,{children:"Or, optionally, you can install it to your system, which may need elevated permissions."}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"make install\n"})}),(0,s.jsxs)(n.p,{children:["Alternatively, a precompiled AVX2-optimized binary can be installed for Linux via ",(0,s.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),"."]})]}),(0,s.jsxs)(o.A,{value:"mac",label:"macOS",children:[(0,s.jsxs)(n.p,{children:["macOS is very similar to Linux. Note that some commands may have to be run with ",(0,s.jsx)(n.code,{children:"sudo"}),", which I won't explicitly include for security reasons."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Homebrew"})}),(0,s.jsx)(n.p,{children:"Installing the Homebrew package manager is a well documented process at this point:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"\n'})}),(0,s.jsx)(n.p,{children:"Installing mainline libaom is as simple as running the following:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew update && brew upgrade\nbrew install aom\n"})}),(0,s.jsx)(n.p,{children:"FFmpeg can also be installed via brew."}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Building From Source"})}),(0,s.jsx)(n.p,{children:"If you want aom-av1-lavish instead of mainline, you'll have to compile from source. Things are very similar to Linux, with a few oddities:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["macOS sometimes doesn't have a ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," by default. You can fix this by doing ",(0,s.jsx)(n.code,{children:"mkdir /usr/local/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Homebrew installs ",(0,s.jsx)(n.em,{children:"everything"})," in its own directory structure. If you're building things from source that rely on libraries from libvmaf, libjxl, etc, make sure to copy them from ",(0,s.jsx)(n.code,{children:"/opt/homebrew/lib"})," to ",(0,s.jsx)(n.code,{children:"/usr/local/lib"}),". Finding them is a matter of ",(0,s.jsx)(n.code,{children:'ls | grep "keyword"'})," & copying what looks reasonable to be associated with the tool you're using."]}),"\n",(0,s.jsx)(n.li,{children:"Building most things from source will have instructions for *nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. aom-av1-lavish requires some additional steps, though."}),"\n"]}),(0,s.jsx)(n.p,{children:"If you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch, which contains all of the latest lavish improvements:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish\n"})}),(0,s.jsxs)(n.p,{children:["Now, you need to make some manual changes to the source code until ",(0,s.jsx)(n.a,{href:"https://github.com/Clybius/aom-av1-lavish/pull/1/files",children:"this commit"})," is merged to fix build errors."]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the line ",(0,s.jsx)(n.code,{children:'#include "aq_variance.h"'})," at line 19 in ",(0,s.jsx)(n.code,{children:"av1/encoder/encodeframe_utils.c"})]}),"\n",(0,s.jsxs)(n.li,{children:["Comment out line 2546 in ",(0,s.jsx)(n.code,{children:"av1/encoder/speed_features.c"}),". This line is ",(0,s.jsx)(n.code,{children:"const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"})," & becomes ",(0,s.jsx)(n.code,{children:"// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };"}),"."]}),"\n"]}),(0,s.jsxs)(n.p,{children:["Now you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools. While still in the ",(0,s.jsx)(n.code,{children:"aom-av1-lavish"})," directory:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'mkdir -p aom_build && cd aom_build\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n# This may need to be run as root. If it doesn\'t work properly, you can always copy the binary into /usr/local/bin manually:\nmake install\n'})}),(0,s.jsxs)(n.p,{children:["Now you can run ",(0,s.jsx)(n.code,{children:'aomenc --help | grep "AOMedia" -C 3'})," to see if lavish installed. If you're getting the same output as above, you may need to copy the ",(0,s.jsx)(n.code,{children:"aomenc"})," executable to ",(0,s.jsx)(n.code,{children:"/opt/local/bin"}),", ",(0,s.jsx)(n.code,{children:"/usr/local/bin"}),", & ",(0,s.jsx)(n.code,{children:"/opt/homebrew/bin"})," if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% aomenc --help | grep AOMedia -C 3\n\nIncluded encoders:\n\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\n\n Use --codec to switch to a non-default encoder.\n"})}),(0,s.jsxs)(n.p,{children:["Notice how it says ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder Psy"})," instead of ",(0,s.jsx)(n.code,{children:"AOMedia Project AV1 Encoder"}),". You should be all set after this to start using aom-av1-lavish."]})]}),(0,s.jsxs)(o.A,{value:"wind",label:"Windows",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"The Easy Way:"})," Download the pre-built versions, which can be found below (Current as of Sept 6, 2023):"]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28",children:"https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28"})}),(0,s.jsxs)(n.p,{children:["Join the ",(0,s.jsx)(n.a,{href:"https://discord.gg/vpREHAvYvh",children:"AV1 Discord server"})," and head to #community-builds for updated versions, you can opt to compile it yourself with the instructions below."]}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"The Compiling Route:"})}),(0,s.jsxs)(n.p,{children:["Full credits to u/Turbulent-Bend-7416 on Reddit for ",(0,s.jsx)(n.a,{href:"https://www.reddit.com/r/AV1/comments/s6eh5f/how_to_compile_av1_in_windows_without_crying",children:"this post"})," on how to compile aomenc."]}),(0,s.jsxs)(n.p,{children:["This guide requires ",(0,s.jsx)(n.strong,{children:"MSYS2"}),", specifically ",(0,s.jsx)(n.strong,{children:"MinGW-W64"}),". Install it if you haven't yet."]}),(0,s.jsx)(n.p,{children:"First, install the required dependencies:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pacman -S cmake git perl yasm nasm python3 doxygen mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake base-devel\n"})}),(0,s.jsx)(n.p,{children:"Now, clone the aom-av1-lavish repo in the Endless_Merging branch and create the folders:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\n"})}),(0,s.jsx)(n.p,{children:"Then we can start compiling with some build optimizations for your CPU:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'cmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-flto -O3 -march=native" -DCMAKE_C_FLAGS="-flto -O3 -march=native -pipe -fno-plt" -DCMAKE_LD_FLAGS="-flto -O3 -march=native"\nmake -j$(nproc)\n'})}),(0,s.jsxs)(n.p,{children:["The resulting binary will be available within your home folder of the location where you installed MSYS2 (usually ",(0,s.jsx)(n.code,{children:"C:"}),"), navigate there and the to the aom-av1-lavish folder and it should be there."]}),(0,s.jsx)(n.p,{children:'Built files should be in the "Debug" folder'}),(0,s.jsx)(n.p,{children:"Don't share binaries compiled with native CPU optimizations unless the person you're sharing to has the same CPU architecture, as this will lead to missing instructions being used and slowing down encode speeds."})]})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.h3,{id:"av1-encoding",children:"AV1 Encoding"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The way aomenc was developed requires 2-pass to take full advantage of its efficiency which include better rate controls and encoding features. So always use 2 passes when encoding."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple Y4M input with CQ 22, 1 pass, and raw ivf bitstream output"',children:"aomenc --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf input.y4m\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=1 --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 1"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=1 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Pipe from FFmpeg, 2-pass, pass 2"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | aomenc - --end-usage=q --cq-level=32 --bit-depth=10 --passes=2 --pass=2 --fpf-log=aom-pass.log --ivf -o output.ivf\n"})}),"\n",(0,s.jsx)(n.h3,{id:"avif-encoding",children:"AVIF Encoding"}),"\n",(0,s.jsx)(n.p,{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders. A sample command for encoding AVIF looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),"\n",(0,s.jsx)(n.p,{children:"Where:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-c aom"})," is the encoder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't parallelize perfectly. Test using a speed benchmark to verify which value works best for you."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8-bit source image."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,s.jsx)(n.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,s.jsxs)(n.p,{children:["aomenc unfortunately lacks the ability to take advantage of multiple threads, so therefore a tool like ",(0,s.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," will be needed for parallelization. The parameters shown will be biased towards Av1an and aom-av1-lavish usage, so if you plan on using standalone aomenc then adjust as needed."]}),"\n",(0,s.jsx)(n.p,{children:"Here are some recommended parameters:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"--bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 --denoise-noise-level=8"})}),"\n",(0,s.jsx)(n.p,{children:"Now let's break it down."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--bit-depth=10"})," We're using 10bit because weird linear algebra allows the video to become smaller and reduces banding."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--cpu-used=4"})," This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--end-usage=q --cq-level=24"})," This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tile-columns=0 --tile-rows=0"})," This is the tiles options, where the encoder splits the videos into tiles to encode faster. See the image below (Yellow lines):"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("picture",{children:[(0,s.jsx)("source",{srcset:"https://raw.githubusercontent.com/av1-community-contributors/images/main/tiling_av1.avif?token=GHSAT0AAAAAACEZPDXIZARY5MGSTJW4SI22ZHY636A",type:"image/avif"}),(0,s.jsx)("img",{src:"https://autumn.revolt.chat/attachments/HwhZjoDsdzLZsJM2mjzX7lEDmJn1xcYNdrQqmOxPYW/tiling_av1.jpeg",alt:"Tiling",loading:"lazy"})]}),"\n",(0,s.jsxs)(n.admonition,{title:"Tile usage",type:"note",children:[(0,s.jsxs)(n.p,{children:["Do NOT use tiles for 1080p and below, use 1 ",(0,s.jsx)(n.code,{children:"tile-columns"})," at 1440p (2K), 2 ",(0,s.jsx)(n.code,{children:"tile-columns"})," and 1 ",(0,s.jsx)(n.code,{children:"tile-rows"})," for 2160p (4K)."]}),(0,s.jsxs)(n.p,{children:["If you would like an easy way to calculate the necessary number of tiles for your video, you can use ",(0,s.jsx)(n.a,{href:"https://autocompressor.net/tools/av1-calculator",children:"the AV1 Encoding Calculator"})," online or run ",(0,s.jsx)(n.a,{href:"https://github.com/gianni-rosato/av1-tile-calc",children:"this local tile calculator"}),"."]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--lag-in-frames=64"})," Similar to x264/x265 ",(0,s.jsx)(n.code,{children:"rc-lookahead"}),". Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--aq-mode=0"})," adaptive quantization mode, a mostly debatable area nowadays. 0 is better most of the time but some say 1 is also good."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--tune-content=psy --tune=ssim"})," As the name suggests they are tunes that affect the video output, for the better, and for the worst."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Do not use ",(0,s.jsx)(n.code,{children:"tune-content=psy"})," if you encode live action above ",(0,s.jsx)(n.code,{children:"cq-level=30"}),"."]})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["If you use any of the VMAF tunes, you need to specify ",(0,s.jsx)(n.code,{children:"--vmaf-model-path="})," to where you put VMAF models in."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-keyframe-filtering=1"})," We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg can't input it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--sb-size=dynamic"})," Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--deltaq-mode=0"})," set to 0 b its better"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--arnr-strength=1"})," Controls how strong the filtering (smoothing) will be, always been a hot topic. Most agree on the default of 4. Others think 1 is good for 3D Pixar CGI-like and 2D animation and 4 for live action content, and a higher value for lower bitrate encodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--disable-kf --enable-fwd-kf=0"})," We're disabling keyframes cause Av1an already did scene detection, so we wont have to. Plus it speeds things up."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--kf-max-dist=9999"})," Maximum keyframe interval, we're setting it at the highest possible value since Av1an's scene detection keyframe interval is already 240 by default"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-chroma-deltaq=1"})," --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost, ignore it."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--enable-dnl-denoising=0"})," Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well (NLMeans is the denoiser used)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"--denoise-noise-level=8"})," AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness). Don't attempt to use it at high values (>12) since it creates noticeable grain patterns."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsx)(n.mdxAdmonitionTitle,{}),(0,s.jsxs)(n.p,{children:["You can use photon noise tables as an alternative via ",(0,s.jsx)(n.code,{children:"--film-grain-table"}),", which is also conveniently available in Av1an as ",(0,s.jsx)(n.code,{children:"--photon-noise=X"})]})]}),"\n",(0,s.jsx)(n.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--butteraugli-resize-factor=2"})," if you use any of the butteraugli-based tunes to speed it up without much losses (lavish, butteraugli) and ",(0,s.jsx)(n.code,{children:"--butteraugli-intensity-target=250"})," to match the content light level."]}),"\n",(0,s.jsxs)(n.li,{children:["Use ",(0,s.jsx)(n.code,{children:"--arnr-maxframes"})," to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates."]}),"\n"]})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>o});i(6540);var s=i(4164);const t={tabItem:"tabItem_Ymn6"};var a=i(4848);function o(e){let{children:n,hidden:i,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,o),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>w});var s=i(6540),t=i(4164),a=i(3104),o=i(6347),l=i(205),r=i(7485),c=i(1682),d=i(9466);function h(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:s,default:t}}=e;return{value:n,label:i,attributes:s,default:t}}))}(i);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const t=(0,o.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,r.aZ)(a),(0,s.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(t.location.search);n.set(a,e),t.replace({...t.location,search:n.toString()})}),[a,t])]}function x(e){const{defaultValue:n,queryString:i=!1,groupId:t}=e,a=u(e),[o,r]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=i.find((e=>e.default))??i[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:t}),[x,f]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,a]=(0,d.Dv)(i);return[t,(0,s.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:t}),g=(()=>{const e=c??x;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{g&&r(g)}),[g]);return{selectedValue:o,selectValue:(0,s.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);r(e),h(e),f(e)}),[h,f,a]),tabValues:a}}var f=i(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=i(4848);function b(e){let{className:n,block:i,selectedValue:s,selectValue:o,tabValues:l}=e;const r=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=r.indexOf(n),t=l[i].value;t!==s&&(c(n),o(t))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=r.indexOf(e.currentTarget)+1;n=r[i]??r[0];break}case"ArrowLeft":{const i=r.indexOf(e.currentTarget)-1;n=r[i]??r[r.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>r.push(e),onKeyDown:h,onClick:d,...a,className:(0,t.A)("tabs__item",g.tabItem,a?.className,{"tabs__item--active":s===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:t}=e;const a=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===t));return e?(0,s.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function y(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",g.tabList),children:[(0,j.jsx)(b,{...n,...e}),(0,j.jsx)(v,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,j.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const t={},a=s.createContext(t);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7ec778da.36f2f1db.js b/assets/js/7ec778da.36f2f1db.js deleted file mode 100644 index 5e5007ded..000000000 --- a/assets/js/7ec778da.36f2f1db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3657],{4718:e=>{e.exports=JSON.parse('{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":3,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/8498.3c040e2b.js b/assets/js/8498.3c040e2b.js new file mode 100644 index 000000000..46a0f2a21 --- /dev/null +++ b/assets/js/8498.3c040e2b.js @@ -0,0 +1 @@ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8498],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),o=n(4848);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}var c=n(4164),r=n(1312),i=n(7559);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,o.jsx)("div",{className:(0,c.A)(i.G.common.admonition,i.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:a,className:c}=e;return(0,o.jsxs)(d,{type:t,className:c,children:[s||n?(0,o.jsx)(u,{title:s,icon:n}):null,(0,o.jsx)(m,{children:a})]})}function p(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,o.jsx)(p,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function x(e){return(0,o.jsx)(h,{...f,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const j={icon:(0,o.jsx)(b,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function g(e){return(0,o.jsx)(h,{...j,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const y={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function N(e){return(0,o.jsx)(h,{...y,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const k={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function B(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,o.jsx)(B,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:x,tip:g,info:N,warning:function(e){return(0,o.jsx)(h,{...k,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(h,{...w,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(x,{title:"secondary",...e}),important:e=>(0,o.jsx)(N,{title:"important",...e}),success:e=>(0,o.jsx)(g,{title:"success",...e}),caution:function(e){return(0,o.jsx)(h,{...C,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=a(e),n=(s=t.type,E[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),E.info));var s;return(0,o.jsx)(n,{...t})}},4336:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});n(6540);var s=n(4164),o=n(1312),a=n(7559),c=n(8774);const r={iconEdit:"iconEdit_Z9Sw"};var i=n(4848);function l(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(r.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,i.jsxs)(c.A,{to:t,className:a.G.common.editThisPage,children:[(0,i.jsx)(l,{}),(0,i.jsx)(o.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(o.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(o.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,i.jsx)(o.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:n,lastUpdatedAt:o,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(d,{editUrl:n})}),(0,i.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(o||a)&&(0,i.jsx)(p,{lastUpdatedAt:o,lastUpdatedBy:a})})]})}},8509:(e,t,n)=>{"use strict";n.d(t,{A:()=>re});var s=n(6540),o=n(8453),a=n(5260),c=n(2303),r=n(4164),i=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},j=Object.keys(x);function g(e,t){const n=e.map((e=>{const{start:n,end:s}=b[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(j,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<r.length;){const e=r[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y={codeBlockContainer:"codeBlockContainer_Ckt0"};var N=n(4848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y.codeBlockContainer,u.G.common.codeBlock)})}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function B(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:k.codeBlockLines,children:t})})}var w=n(9532);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=C);const o=(0,w._q)(t),a=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function _(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,r.A)(n,s&&T.codeLine)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...a({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:T.codeLineNumber}),(0,N.jsx)("span",{className:T.codeLineContent,children:i})]}):i,(0,N.jsx)("br",{})]})}var S=n(1312);function U(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function M(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),o=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":o?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,z.copyButton,o&&z.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(U,{className:z.copyButtonIcon}),(0,N.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,N.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function $(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return E(a,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:j,code:g}=v(t,{metastring:o,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[b&&(0,N.jsx)("div",{className:k.codeBlockTitle,children:b}),(0,N.jsxs)("div",{className:k.codeBlockContent,children:[(0,N.jsx)(L.f4,{theme:f,code:g,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(k.codeBlockLines,y&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(_,{line:e,getLineProps:o,getTokenProps:a,classNames:j[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:k.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,N.jsx)(V,{className:k.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,N.jsx)(I,{className:k.codeButton,code:g})]})]})]})}function W(e){let{children:t,...n}=e;const o=(0,c.A)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof a?$:B;return(0,N.jsx)(r,{...n,children:a},String(o))}function D(e){return(0,N.jsx)("code",{...e})}var P=n(8774);var q=n(3427),G=n(1422);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...o}=e;(0,q.A)().collectAnchor(o.id);const a=(0,c.A)(),i=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,G.u)({initialState:!o.open}),[u,m]=(0,s.useState)(o.open),h=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...o,ref:i,open:u,"data-collapsed":l,className:(0,r.A)(O.details,a&&O.isBrowser,o.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,i.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,N.jsx)(G.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,N.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,N.jsx)(J,{...t,className:(0,r.A)(K,Y.details,t.className)})}function X(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),o=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(Q,{...e,summary:n,children:o})}var ee=n(1107);function te(e){return(0,N.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const oe={img:"img_ev3q"};var ae=n(7293);const ce={Head:a.A,details:X,Details:X,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,N.jsx)(D,{...e}):(0,N.jsx)(W,{...e})},a:function(e){return(0,N.jsx)(P.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,q.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,oe.img))});var t},h1:e=>(0,N.jsx)(te,{as:"h1",...e}),h2:e=>(0,N.jsx)(te,{as:"h2",...e}),h3:e=>(0,N.jsx)(te,{as:"h3",...e}),h4:e=>(0,N.jsx)(te,{as:"h4",...e}),h5:e=>(0,N.jsx)(te,{as:"h5",...e}),h6:e=>(0,N.jsx)(te,{as:"h6",...e}),admonition:ae.A,mermaid:()=>null};function re(e){let{children:t}=e;return(0,N.jsx)(o.x,{components:ce,children:t})}},6266:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var s=n(4586);function o(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s<a?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(a+=e);for(let t=s;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(6540);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8509.6103d1a5.js b/assets/js/8509.6103d1a5.js deleted file mode 100644 index 5905b1351..000000000 --- a/assets/js/8509.6103d1a5.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8509],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),o=n(4848);function c(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),c=t.filter((e=>e!==n)),a=n?.props.children;return{mdxAdmonitionTitle:a,rest:c.length>0?(0,o.jsx)(o.Fragment,{children:c}):null}}(e.children),c=e.title??t;return{...e,...c&&{title:c},children:n}}var a=n(8215),r=n(1312),i=n(7559);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,o.jsx)("div",{className:(0,a.A)(i.G.common.admonition,i.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:c,className:a}=e;return(0,o.jsxs)(d,{type:t,className:a,children:[(0,o.jsx)(u,{title:s,icon:n}),(0,o.jsx)(m,{children:c})]})}function p(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,o.jsx)(p,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function x(e){return(0,o.jsx)(h,{...f,...e,className:(0,a.A)("alert alert--secondary",e.className),children:e.children})}function b(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const g={icon:(0,o.jsx)(b,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function j(e){return(0,o.jsx)(h,{...g,...e,className:(0,a.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,o.jsx)(h,{...N,...e,className:(0,a.A)("alert alert--info",e.className),children:e.children})}function k(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const B={icon:(0,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,o.jsx)(C,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const A={icon:(0,o.jsx)(k,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:x,tip:j,info:y,warning:function(e){return(0,o.jsx)(h,{...B,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(h,{...w,...e,className:(0,a.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(x,{title:"secondary",...e}),important:e=>(0,o.jsx)(y,{title:"important",...e}),success:e=>(0,o.jsx)(j,{title:"success",...e}),caution:function(e){return(0,o.jsx)(h,{...A,...e,className:(0,a.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=c(e),n=(s=t.type,E[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),E.info));var s;return(0,o.jsx)(n,{...t})}},8509:(e,t,n)=>{"use strict";n.d(t,{A:()=>ie});var s=n(6540),o=n(8453),c=n(5260),a=n(2303),r=n(8215),i=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?<quote>["'])(?<title>.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},g=Object.keys(x);function j(e,t){const n=e.map((e=>{const{start:n,end:s}=b[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:o,metastring:c}=t;if(c&&f.test(c)){const e=c.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const a=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return j(["js","jsBlock"],t);case"jsx":case"tsx":return j(["js","jsBlock","jsx"],t);case"html":return j(["js","jsBlock","html"],t);case"python":case"py":case"bash":return j(["bash"],t);case"markdown":case"md":return j(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return j(["tex"],t);case"lua":case"haskell":case"sql":return j(["lua"],t);case"wasm":return j(["wasm"],t);case"vb":case"vba":case"visual-basic":return j(["vb","rem"],t);case"vbnet":return j(["vbnet","rem"],t);case"batch":return j(["rem"],t);case"basic":return j(["rem","f90"],t);case"fsharp":return j(["js","ml"],t);case"ocaml":case"sml":return j(["ml"],t);case"fortran":return j(["f90"],t);case"cobol":return j(["cobol"],t);default:return j(g,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<r.length;){const e=r[h].match(a);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const N={codeBlockContainer:"codeBlockContainer_Ckt0"};var y=n(4848);function k(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,o]=e;const c=t[s];c&&"string"==typeof o&&(n[c]=o)})),n}(d());return(0,y.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,N.codeBlockContainer,u.G.common.codeBlock)})}const B={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return(0,y.jsx)(k,{as:"pre",tabIndex:0,className:(0,r.A)(B.codeBlockStandalone,"thin-scrollbar",n),children:(0,y.jsx)("code",{className:B.codeBlockLines,children:t})})}var w=n(9532);const A={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),c=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=A);const o=(0,w._q)(t),c=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,c),()=>t.disconnect()}),[e,o,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(8181);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function _(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:c}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=o({line:t,className:(0,r.A)(n,s&&T.codeLine)}),i=t.map(((e,t)=>(0,y.jsx)("span",{...c({token:e,key:t})},t)));return(0,y.jsxs)("span",{...a,children:[s?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)("span",{className:T.codeLineNumber}),(0,y.jsx)("span",{className:T.codeLineContent,children:i})]}):i,(0,y.jsx)("br",{})]})}var S=n(1312);function M(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function z(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const H={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,c]=(0,s.useState)(!1),a=(0,s.useRef)(void 0),i=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),o=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const c=document.getSelection(),a=c.rangeCount>0&&c.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),a&&(c.removeAllRanges(),c.addRange(a)),o&&o.focus()}(t),c(!0),a.current=window.setTimeout((()=>{c(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,y.jsx)("button",{type:"button","aria-label":o?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,H.copyButton,o&&H.copyButtonCopied),onClick:i,children:(0,y.jsxs)("span",{className:H.copyButtonIcons,"aria-hidden":"true",children:[(0,y.jsx)(M,{className:H.copyButtonIcon}),(0,y.jsx)(z,{className:H.copyButtonSuccessIcon})]})})}function R(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const V={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function $(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,y.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&V.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,y.jsx)(R,{className:V.wordWrapButtonIcon,"aria-hidden":"true"})})}function W(e){let{children:t,className:n="",metastring:o,title:c,showLineNumbers:a,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),c=(0,s.useRef)(null),a=(0,s.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");o(n)}),[c]);return E(c,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:a}}(),b=function(e){return e?.match(p)?.groups.title??""}(o)||c,{lineClassNames:g,code:j}=v(t,{metastring:o,language:h,magicComments:m}),N=a??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,y.jsxs)(k,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[b&&(0,y.jsx)("div",{className:B.codeBlockTitle,children:b}),(0,y.jsxs)("div",{className:B.codeBlockContent,children:[(0,y.jsx)(L.f4,{theme:f,code:j,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:c}=e;return(0,y.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,B.codeBlock,"thin-scrollbar"),style:n,children:(0,y.jsx)("code",{className:(0,r.A)(B.codeBlockLines,N&&B.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,y.jsx)(_,{line:e,getLineProps:o,getTokenProps:c,classNames:g[t],showLineNumbers:N},t)))})})}}),(0,y.jsxs)("div",{className:B.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,y.jsx)($,{className:B.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,y.jsx)(I,{className:B.codeButton,code:j})]})]})]})}function P(e){let{children:t,...n}=e;const o=(0,a.A)(),c=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof c?W:C;return(0,y.jsx)(r,{...n,children:c},String(o))}function D(e){return(0,y.jsx)("code",{...e})}var O=n(8774);var q=n(5066),G=n(3427),F=n(1422);const U={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function J(e){return!!e&&("SUMMARY"===e.tagName||J(e.parentElement))}function Y(e,t){return!!e&&(e===t||Y(e.parentElement,t))}function Z(e){let{summary:t,children:n,...o}=e;(0,G.A)().collectAnchor(o.id);const c=(0,a.A)(),r=(0,s.useRef)(null),{collapsed:i,setCollapsed:l}=(0,F.u)({initialState:!o.open}),[d,u]=(0,s.useState)(o.open),m=s.isValidElement(t)?t:(0,y.jsx)("summary",{children:t??"Details"});return(0,y.jsxs)("details",{...o,ref:r,open:d,"data-collapsed":i,className:(0,q.A)(U.details,c&&U.isBrowser,o.className),onMouseDown:e=>{J(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;J(t)&&Y(t,r.current)&&(e.preventDefault(),i?(l(!1),u(!0)):l(!0))},children:[m,(0,y.jsx)(F.N,{lazy:!1,collapsed:i,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{l(e),u(!e)},children:(0,y.jsx)("div",{className:U.collapsibleContent,children:n})})]})}const K={details:"details_b_Ee"},Q="alert alert--info";function X(e){let{...t}=e;return(0,y.jsx)(Z,{...t,className:(0,r.A)(Q,K.details,t.className)})}function ee(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),o=(0,y.jsx)(y.Fragment,{children:t.filter((e=>e!==n))});return(0,y.jsx)(X,{...e,summary:n,children:o})}var te=n(1107);function ne(e){return(0,y.jsx)(te.A,{...e})}const se={containsTaskList:"containsTaskList_mC6p"};function oe(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&se.containsTaskList)}const ce={img:"img_ev3q"};var ae=n(7293);const re={Head:c.A,details:ee,Details:ee,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,y.jsx)(D,{...e}):(0,y.jsx)(P,{...e})},a:function(e){return(0,y.jsx)(O.A,{...e})},pre:function(e){return(0,y.jsx)(y.Fragment,{children:e.children})},ul:function(e){return(0,y.jsx)("ul",{...e,className:oe(e.className)})},li:function(e){return(0,G.A)().collectAnchor(e.id),(0,y.jsx)("li",{...e})},img:function(e){return(0,y.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,ce.img))});var t},h1:e=>(0,y.jsx)(ne,{as:"h1",...e}),h2:e=>(0,y.jsx)(ne,{as:"h2",...e}),h3:e=>(0,y.jsx)(ne,{as:"h3",...e}),h4:e=>(0,y.jsx)(ne,{as:"h4",...e}),h5:e=>(0,y.jsx)(ne,{as:"h5",...e}),h6:e=>(0,y.jsx)(ne,{as:"h6",...e}),admonition:ae.A,mermaid:()=>null};function ie(e){let{children:t}=e;return(0,y.jsx)(o.x,{components:re,children:t})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,c]=t;if(s&&c){s=parseInt(s),c=parseInt(c);const e=s<c?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(c+=e);for(let t=s;t!==c;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>a,x:()=>r});var s=n(6540);const o={},c=s.createContext(o);function a(e){const t=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8eb2df80.d33c5d69.js b/assets/js/8eb2df80.b753f579.js similarity index 99% rename from assets/js/8eb2df80.d33c5d69.js rename to assets/js/8eb2df80.b753f579.js index 1e12b7bfd..ab4471144 100644 --- a/assets/js/8eb2df80.d33c5d69.js +++ b/assets/js/8eb2df80.b753f579.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7796],{4582:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=t(4848),s=t(8453);t(1470),t(9365);const r={title:"rav1ator-cli",sidebar_position:6,templating:!0},a="rAV1ator CLI",o={id:"utilities/rav1ator-cli",title:"rav1ator-cli",description:"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc (specifically aom-av1-lavish, as mentioned in the aomenc page), SVT-AV1, x265, and x264.",source:"@site/docs/utilities/rav1ator-cli.mdx",sourceDirName:"utilities",slug:"/utilities/rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"rav1ator-cli",sidebar_position:6,templating:!0},sidebar:"tutorialSidebar",previous:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"},next:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux (Arch)",id:"linux-arch",level:2},{value:"Linux (Other)",id:"linux-other",level:2},{value:"Windows",id:"windows",level:2},{value:"Basic installtion",id:"basic-installtion",level:3},{value:"Optional: Cleanup of the Ubuntu Distribution",id:"optional-cleanup-of-the-ubuntu-distribution",level:3},{value:"After the Installation and Cleanup, How Do I Start Arch?",id:"after-the-installation-and-cleanup-how-do-i-start-arch",level:3},{value:"Unlock WSL RAM Usage (Optional)",id:"unlock-wsl-ram-usage-optional",level:3},{value:"macOS",id:"macos",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"rav1ator-cli",children:"rAV1ator CLI"}),"\n",(0,i.jsxs)(n.p,{children:["rAV1ator CLI, or just ",(0,i.jsx)(n.code,{children:"rav1ator-cli"}),", is a TUI tool that provides an interactive command line interface for encoding videos with ",(0,i.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," using various different encoders including ",(0,i.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"})," (specifically aom-av1-lavish, as mentioned in the aomenc page), ",(0,i.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),", and ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'~ > rav1ator-cli -h\nrAV1ator: CLI Edition_ v0.2.0\n\nUsage:\n\trav1ator-cli [input] [output] [--offline]\n\nDependencies (Arch): \n\trust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n\nOptions: (Currently, only one option is useful at a time)\n\t-h, --help\t\t\tPrint this help section\n\t-l, --last-used\t\tPrint last used encode settings from history\n\t-f, --full-history\tPrint full history from ".rav1ator-cli-history" file\n\t-b, --binaries\t\tJust install binaries, then exit\n\t-x, --offline\t\tDon\'t check for updates.\n\t-a, --batch\t\t\tBatch encode. All video files in a directory specified after this flag are encoded.\n'})}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI can:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check if it is installed & up to date on its own without a package manager"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Download AVX2-optimized encoder binaries compiled with -O3 -flto in most cases & allow the user to install them with detailed instructions"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remember encoding history and let you view your whole history or your most recent command"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Allow you to encode an entire directory of video files with the same settings"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode from scratch, or resume a previous rAV1ator CLI encode"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Engage with rich interactivity features like spinners, prompts, & dropdowns"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Automatically error check binaries with SHA256 hashes for security & convenience"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Overall, it aims to provide an easy way to encode videos on the command line with helpful visual feedback. The interactive prompts help users pick encoding settings without needing deep encoding knowledge."}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI is natively supported on Linux, & is supported on Windows via WSL2. A tutorial for setting up WSL2 is provided below. macOS is not supported."}),"\n",(0,i.jsx)(n.h2,{id:"linux-arch",children:"Linux (Arch)"}),"\n",(0,i.jsxs)(n.p,{children:["These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site."]}),"\n",(0,i.jsxs)(n.p,{children:["If you're on another distro and you want to be able to follow these instructions specifically, see the ",(0,i.jsx)(n.a,{href:"#linux-other",children:"Linux (Other)"})," section."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsx)(n.li,{children:"Update your system before doing anything. On Arch:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"yay"})," (Arch only) by running the following commands:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Install rav1ator-cli:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"linux-other",children:"Linux (Other)"}),"\n",(0,i.jsxs)(n.p,{children:["If you're on Ubuntu, you can see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site for more information about doing this ",(0,i.jsx)(n.em,{children:"without"})," a distrobox. However, a distrobox is valuable because you can use Arch's fast-paced package management on other distros. Distroboxes are generally easier than Docker for beginners, and use Docker or Podman behind the scenes anyway. This tutorial will focus on using Distrobox with Podman."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install Distrobox and Podman on your distro of choice. Please look up how to do this for your respective distro, and how to get everything set up properly."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you already use Podman, are re-creating a Distrobox, or you already have other Distroboxes running from long enough ago where your Arch image is outdated, you might want to run ",(0,i.jsx)(n.code,{children:"podman image rm docker.io/archlinux/archlinux:latest"}),". It won't hurt to run it anyway if you're not sure. ",(0,i.jsx)(n.strong,{children:"Do this every time you make a new Distrobox if you're experiencing issues with Distrobox creation"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Now, run ",(0,i.jsx)(n.code,{children:"distrobox-create --name rvcli-box --image archlinux:latest"}),". You do not need to name yours \"rvcli-box\", but that's what we're going to call the box in this tutorial."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"distrobox enter rvcli-box"})," to go inside. You are now using Arch Linux from within your existing distro!"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["First, run ",(0,i.jsx)(n.code,{children:"sudo pacman -Syu"})," to update your system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Next, run ",(0,i.jsx)(n.code,{children:"sudo pacman -S --needed base-devel git && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Finally, ",(0,i.jsx)(n.code,{children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2"})," to install the necessary dependencies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download rav1ator-cli: ",(0,i.jsx)(n.code,{children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Copy rav1ator-cli to your /usr/local/bin: ",(0,i.jsx)(n.code,{children:"sudo cp rav1ator-cli /usr/local/bin"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you'd like to exit the distrobox, just do ",(0,i.jsx)(n.code,{children:"Ctrl"})," + ",(0,i.jsx)(n.code,{children:"D"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"windows",children:"Windows"}),"\n",(0,i.jsx)(n.admonition,{title:"Windows",type:"note",children:(0,i.jsxs)(n.p,{children:["The content in this entry was written by pat-e, or ",(0,i.jsx)(n.code,{children:"pate"})," on Discord. This tutorial focuses on Windows 11."]})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:'Enable WSL2 on Windows 11 and Install "ArchWSL2"'})," by pat-e"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-installtion",children:"Basic installtion"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the Terminal as Administrator:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/01_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"In the Command-Prompt, enter the following to install WSL and (temporary) Ubuntu:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl.exe --install\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/02_wsl_rv-cli.avifg",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:['If the "Host Process for Windows Services" asks for allowing changes, approve it (Press "Yes"):',(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/03_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Once the installation of WSL (and Ubuntu as Default) is finished, restart your Computer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"shutdown -r -f -t 1\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/04_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Once restarted and logged in, WSL will start with Ubuntu and ask for Username and password. Enter whatever you want as this distribution will be removed after the switch to ArchWSL2. Just exit after the Ubuntu is setup:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/05_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["From ",(0,i.jsx)(n.a,{href:"https://github.com/sileshn/ArchWSL2",children:"This GitHub link"}),", download the latest release of ArchWSL2 in the Releases section:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/06_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["On your SSD, create a folder where we will place the ArchWSL2 files. This folder ",(0,i.jsx)(n.strong,{children:"must be kept and never deleted"})," as this will contain the base files for this distribution. It is advised to use an SSD instead of an HDD. The storage must be local storage, not a network-share or a removable disk. In our example, we will create a folder located at C:\\Stuff\\ArchWSL2;",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/07_wsl_rv-cli.avif",alt:""})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/08_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Extract the downloaded ZIP of "ArchWSL2" into your newly created folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/09_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Once extracted, start the extracted "Arch.exe":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/10_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'On first start, the program will create a virtual disk (VHDx). Once finished, press "Enter" to continue (it will close the window)'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/11_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:['Once the virtual hard disk is created, restart the "arch.exe" again. It will finish some steps and ask for creating a new user-account. ',(0,i.jsx)(n.strong,{children:"This account is completely separate from your Windows user."})," Please remember the username and password you use."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/12_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/13_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"11",children:["\n",(0,i.jsx)(n.li,{children:"The Window will close and reopen again. As fist step, update all packages. As your account you created earlier is in the sudo-group, you have to enter your password again as confirmation."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/14_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"12",children:["\n",(0,i.jsx)(n.li,{children:'Approve the installation of all the updates (Type "y"):'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/15_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"13",children:["\n",(0,i.jsx)(n.li,{children:"Done... You can now use ArchWSL2."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"optional-cleanup-of-the-ubuntu-distribution",children:"Optional: Cleanup of the Ubuntu Distribution"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Open the terminal as Administrator, like we did earlier."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/16_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the current installed distributions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --list\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/17_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'To remove "Ubuntu" (and therefor make Arch as default), enter the following command:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --unregister ubuntu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/18_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'After the removal of Ubuntu, we can list the distributions again and verify that "Arch" is now the default:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/19_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"after-the-installation-and-cleanup-how-do-i-start-arch",children:"After the Installation and Cleanup, How Do I Start Arch?"}),"\n",(0,i.jsx)(n.p,{children:"For the start of Arch, there are 2 steps possible:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You can just start "wsl" form the command prompt, terminal or "Windows Search":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/20_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/21_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'As another option, you can create a Shortcut to the "arch.exe" in the Installation-Folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/22_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/23_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/24_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),': When you open the "arch.exe", you will be placed into the directory where also the "arch.exe" is located. To change to your home directory, just enter the command below:']}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/25_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.h3,{id:"unlock-wsl-ram-usage-optional",children:"Unlock WSL RAM Usage (Optional)"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),": WSL caps RAM usage at 50% of the total RAM available on your system."]}),"\n",(0,i.jsx)(n.p,{children:"When you start the VM, you will see that you only will only have 50% of your total memory available:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/26_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:"To allow more memory, you need to place a config-file in your profile-folder in Windows. See the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open "notepad.exe" and enter the following:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"[wsl2]\nmemory=12GB\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/27_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The amount of memory should never be more than current memory. Set it to total memory minus 4GB to leave enough left over for Windows. In my example, Windows has 16GB of RAM available, so I select the memory to be 12GB."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When saving the file, enter the following as filename:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"%userprofile%"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/28_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When pressing enter, the directory will switch to your user-profile folder:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/29_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Select the "Save as type" to "All files (*.*)" and save as the following filename:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:".wslconfig"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/30_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:["Make sure the file is saved as ",(0,i.jsx)(n.code,{children:".wslconfig"}),". Then exit notepad."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Exit any current running WSL / Arch (exit):"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/31_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open the Terminal as Administrator and "shutdown" any running WSL:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --shutdown\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/32_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart WSL again and check the memory settings from within Arch by running the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"free -h\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/33_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you've made it this far, you should be more than ready to encode. We hope you enjoy rAV1ator CLI!"}),"\n",(0,i.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,i.jsx)(n.p,{children:"No macOS support is provided at this time. It is definitely technically feasible, and I may produce a separate tool in the future with proper macOS binaries, though this would be a burden to keep up considering I don't currently see any demand for a port."}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,i.jsx)(n.code,{children:"-qp 0"}),". This happens because of VC-1 decoding errors, and is not something I can fix."]}),"\n",(0,i.jsxs)(n.li,{children:["If you have any more questions, please join the ",(0,i.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". There is a rAV1ator CLI channel over there, and I am always happy to talk!"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var i=t(8215);const s={tabItem:"tabItem_Ymn6"};var r=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var i=t(6540),s=t(8215),r=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),h=t(9466);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function d(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:s}}=e;return{value:n,label:t,attributes:i,default:s}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const s=(0,a.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,r=d(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:r}))),[c,u]=p({queryString:t,groupId:s}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,h.Dv)(t);return[s,(0,i.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:s}),v=(()=>{const e=c??x;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var g=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(4848);function f(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),h=e=>{const n=e.currentTarget,t=l.indexOf(n),s=o[t].value;s!==i&&(c(n),a(s))},u=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>l.push(e),onKeyDown:u,onClick:h,...r,className:(0,s.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,s.A)("tabs-container",v.tabList),children:[(0,j.jsx)(f,{...e,...n}),(0,j.jsx)(b,{...e,...n})]})}function y(e){const n=(0,g.A)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7796],{4582:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=t(4848),s=t(8453);t(1470),t(9365);const r={title:"rav1ator-cli",sidebar_position:6,templating:!0},a="rAV1ator CLI",o={id:"utilities/rav1ator-cli",title:"rav1ator-cli",description:"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc (specifically aom-av1-lavish, as mentioned in the aomenc page), SVT-AV1, x265, and x264.",source:"@site/docs/utilities/rav1ator-cli.mdx",sourceDirName:"utilities",slug:"/utilities/rav1ator-cli",permalink:"/docs/utilities/rav1ator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/rav1ator-cli.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"rav1ator-cli",sidebar_position:6,templating:!0},sidebar:"tutorialSidebar",previous:{title:"rAV1ator",permalink:"/docs/utilities/rAV1ator"},next:{title:"NMKODER",permalink:"/docs/utilities/nmkoder"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Linux (Arch)",id:"linux-arch",level:2},{value:"Linux (Other)",id:"linux-other",level:2},{value:"Windows",id:"windows",level:2},{value:"Basic installtion",id:"basic-installtion",level:3},{value:"Optional: Cleanup of the Ubuntu Distribution",id:"optional-cleanup-of-the-ubuntu-distribution",level:3},{value:"After the Installation and Cleanup, How Do I Start Arch?",id:"after-the-installation-and-cleanup-how-do-i-start-arch",level:3},{value:"Unlock WSL RAM Usage (Optional)",id:"unlock-wsl-ram-usage-optional",level:3},{value:"macOS",id:"macos",level:2},{value:"Troubleshooting",id:"troubleshooting",level:3}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"rav1ator-cli",children:"rAV1ator CLI"}),"\n",(0,i.jsxs)(n.p,{children:["rAV1ator CLI, or just ",(0,i.jsx)(n.code,{children:"rav1ator-cli"}),", is a TUI tool that provides an interactive command line interface for encoding videos with ",(0,i.jsx)(n.a,{href:"/docs/utilities/av1an",children:"Av1an"})," using various different encoders including ",(0,i.jsx)(n.a,{href:"/docs/encoders/rav1e",children:"rav1e"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/aomenc",children:"aomenc"})," (specifically aom-av1-lavish, as mentioned in the aomenc page), ",(0,i.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,i.jsx)(n.a,{href:"/docs/encoders/x265",children:"x265"}),", and ",(0,i.jsx)(n.a,{href:"/docs/encoders/x264",children:"x264"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'~ > rav1ator-cli -h\nrAV1ator: CLI Edition_ v0.2.0\n\nUsage:\n\trav1ator-cli [input] [output] [--offline]\n\nDependencies (Arch): \n\trust ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n\nOptions: (Currently, only one option is useful at a time)\n\t-h, --help\t\t\tPrint this help section\n\t-l, --last-used\t\tPrint last used encode settings from history\n\t-f, --full-history\tPrint full history from ".rav1ator-cli-history" file\n\t-b, --binaries\t\tJust install binaries, then exit\n\t-x, --offline\t\tDon\'t check for updates.\n\t-a, --batch\t\t\tBatch encode. All video files in a directory specified after this flag are encoded.\n'})}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI can:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check if it is installed & up to date on its own without a package manager"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Download AVX2-optimized encoder binaries compiled with -O3 -flto in most cases & allow the user to install them with detailed instructions"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remember encoding history and let you view your whole history or your most recent command"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Allow you to encode an entire directory of video files with the same settings"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode with x264, x265, aomenc, SVT-AV1, or rav1e, set a speed preset, CRF/quality value, FFmpeg parameters, and encoder parameters"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Generate Av1an encoding commands with the user's chosen settings & run them to encode a provided input video to an MKV output."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Encode from scratch, or resume a previous rAV1ator CLI encode"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Engage with rich interactivity features like spinners, prompts, & dropdowns"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Automatically error check binaries with SHA256 hashes for security & convenience"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Overall, it aims to provide an easy way to encode videos on the command line with helpful visual feedback. The interactive prompts help users pick encoding settings without needing deep encoding knowledge."}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo1.avif",alt:"rAV1ator-cli: Demo 1"}),"\n",(0,i.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/rav1ator_cli_demo2.avif",alt:"rAV1ator-cli: Demo 2"}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"rAV1ator CLI is natively supported on Linux, & is supported on Windows via WSL2. A tutorial for setting up WSL2 is provided below. macOS is not supported."}),"\n",(0,i.jsx)(n.h2,{id:"linux-arch",children:"Linux (Arch)"}),"\n",(0,i.jsxs)(n.p,{children:["These instructions are for Arch Linux specifically. Other distros should be very similar, and packages that are Arch-specific will be labelled. If you're on Ubuntu, you should see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site."]}),"\n",(0,i.jsxs)(n.p,{children:["If you're on another distro and you want to be able to follow these instructions specifically, see the ",(0,i.jsx)(n.a,{href:"#linux-other",children:"Linux (Other)"})," section."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsx)(n.li,{children:"Update your system before doing anything. On Arch:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"yay"})," (Arch only) by running the following commands:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay && makepkg -si\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Next, you'll want to install all of rav1ator-cli's dependencies. You can do that by running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Install rav1ator-cli:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli\nsudo cp rav1ator-cli /usr/local/bin\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"linux-other",children:"Linux (Other)"}),"\n",(0,i.jsxs)(n.p,{children:["If you're on Ubuntu, you can see the relevant section of the ",(0,i.jsx)(n.a,{href:"https://wiki.x266.mov/blog/av1-encoding-for-dummies",children:"AV1 for Dummies"})," blog post on this site for more information about doing this ",(0,i.jsx)(n.em,{children:"without"})," a distrobox. However, a distrobox is valuable because you can use Arch's fast-paced package management on other distros. Distroboxes are generally easier than Docker for beginners, and use Docker or Podman behind the scenes anyway. This tutorial will focus on using Distrobox with Podman."]}),"\n",(0,i.jsxs)(n.ol,{start:"0",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Install Distrobox and Podman on your distro of choice. Please look up how to do this for your respective distro, and how to get everything set up properly."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you already use Podman, are re-creating a Distrobox, or you already have other Distroboxes running from long enough ago where your Arch image is outdated, you might want to run ",(0,i.jsx)(n.code,{children:"podman image rm docker.io/archlinux/archlinux:latest"}),". It won't hurt to run it anyway if you're not sure. ",(0,i.jsx)(n.strong,{children:"Do this every time you make a new Distrobox if you're experiencing issues with Distrobox creation"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Now, run ",(0,i.jsx)(n.code,{children:"distrobox-create --name rvcli-box --image archlinux:latest"}),". You do not need to name yours \"rvcli-box\", but that's what we're going to call the box in this tutorial."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"distrobox enter rvcli-box"})," to go inside. You are now using Arch Linux from within your existing distro!"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["First, run ",(0,i.jsx)(n.code,{children:"sudo pacman -Syu"})," to update your system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Next, run ",(0,i.jsx)(n.code,{children:"sudo pacman -S --needed base-devel git && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Finally, ",(0,i.jsx)(n.code,{children:"yay -Syu openssl ffmpeg python mkvtoolnix-cli vapoursynth gum numactl l-smash vapoursynth-plugin-lsmashsource av1an ffms2"})," to install the necessary dependencies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Download rav1ator-cli: ",(0,i.jsx)(n.code,{children:"curl -sOJ https://raw.githubusercontent.com/gianni-rosato/rav1ator-cli/main/rav1ator-cli && chmod +x rav1ator-cli"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Copy rav1ator-cli to your /usr/local/bin: ",(0,i.jsx)(n.code,{children:"sudo cp rav1ator-cli /usr/local/bin"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If you'd like to exit the distrobox, just do ",(0,i.jsx)(n.code,{children:"Ctrl"})," + ",(0,i.jsx)(n.code,{children:"D"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You're done! Run ",(0,i.jsx)(n.code,{children:"rav1ator-cli -h"})," to get some help getting started. Happy encoding!"]}),"\n",(0,i.jsx)(n.h2,{id:"windows",children:"Windows"}),"\n",(0,i.jsx)(n.admonition,{title:"Windows",type:"note",children:(0,i.jsxs)(n.p,{children:["The content in this entry was written by pat-e, or ",(0,i.jsx)(n.code,{children:"pate"})," on Discord. This tutorial focuses on Windows 11."]})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:'Enable WSL2 on Windows 11 and Install "ArchWSL2"'})," by pat-e"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-installtion",children:"Basic installtion"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the Terminal as Administrator:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/01_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"In the Command-Prompt, enter the following to install WSL and (temporary) Ubuntu:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl.exe --install\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/02_wsl_rv-cli.avifg",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:['If the "Host Process for Windows Services" asks for allowing changes, approve it (Press "Yes"):',(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/03_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Once the installation of WSL (and Ubuntu as Default) is finished, restart your Computer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"shutdown -r -f -t 1\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/04_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Once restarted and logged in, WSL will start with Ubuntu and ask for Username and password. Enter whatever you want as this distribution will be removed after the switch to ArchWSL2. Just exit after the Ubuntu is setup:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/05_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["From ",(0,i.jsx)(n.a,{href:"https://github.com/sileshn/ArchWSL2",children:"This GitHub link"}),", download the latest release of ArchWSL2 in the Releases section:",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/06_wsl_rv-cli.avif",alt:""})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["On your SSD, create a folder where we will place the ArchWSL2 files. This folder ",(0,i.jsx)(n.strong,{children:"must be kept and never deleted"})," as this will contain the base files for this distribution. It is advised to use an SSD instead of an HDD. The storage must be local storage, not a network-share or a removable disk. In our example, we will create a folder located at C:\\Stuff\\ArchWSL2;",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/07_wsl_rv-cli.avif",alt:""})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/08_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Extract the downloaded ZIP of "ArchWSL2" into your newly created folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/09_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Once extracted, start the extracted "Arch.exe":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/10_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'On first start, the program will create a virtual disk (VHDx). Once finished, press "Enter" to continue (it will close the window)'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/11_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:['Once the virtual hard disk is created, restart the "arch.exe" again. It will finish some steps and ask for creating a new user-account. ',(0,i.jsx)(n.strong,{children:"This account is completely separate from your Windows user."})," Please remember the username and password you use."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/12_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/13_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"11",children:["\n",(0,i.jsx)(n.li,{children:"The Window will close and reopen again. As fist step, update all packages. As your account you created earlier is in the sudo-group, you have to enter your password again as confirmation."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo pacman -Syu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/14_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"12",children:["\n",(0,i.jsx)(n.li,{children:'Approve the installation of all the updates (Type "y"):'}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/15_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.ol,{start:"13",children:["\n",(0,i.jsx)(n.li,{children:"Done... You can now use ArchWSL2."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"optional-cleanup-of-the-ubuntu-distribution",children:"Optional: Cleanup of the Ubuntu Distribution"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Open the terminal as Administrator, like we did earlier."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/16_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the current installed distributions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --list\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/17_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'To remove "Ubuntu" (and therefor make Arch as default), enter the following command:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --unregister ubuntu\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/18_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'After the removal of Ubuntu, we can list the distributions again and verify that "Arch" is now the default:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/19_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"after-the-installation-and-cleanup-how-do-i-start-arch",children:"After the Installation and Cleanup, How Do I Start Arch?"}),"\n",(0,i.jsx)(n.p,{children:"For the start of Arch, there are 2 steps possible:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You can just start "wsl" form the command prompt, terminal or "Windows Search":'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/20_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/21_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'As another option, you can create a Shortcut to the "arch.exe" in the Installation-Folder:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/22_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/23_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/24_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),': When you open the "arch.exe", you will be placed into the directory where also the "arch.exe" is located. To change to your home directory, just enter the command below:']}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/25_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.h3,{id:"unlock-wsl-ram-usage-optional",children:"Unlock WSL RAM Usage (Optional)"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Hint"}),": WSL caps RAM usage at 50% of the total RAM available on your system."]}),"\n",(0,i.jsx)(n.p,{children:"When you start the VM, you will see that you only will only have 50% of your total memory available:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/26_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsx)(n.p,{children:"To allow more memory, you need to place a config-file in your profile-folder in Windows. See the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open "notepad.exe" and enter the following:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-txt",children:"[wsl2]\nmemory=12GB\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/27_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The amount of memory should never be more than current memory. Set it to total memory minus 4GB to leave enough left over for Windows. In my example, Windows has 16GB of RAM available, so I select the memory to be 12GB."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When saving the file, enter the following as filename:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"%userprofile%"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/28_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When pressing enter, the directory will switch to your user-profile folder:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/29_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Select the "Save as type" to "All files (*.*)" and save as the following filename:'}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:".wslconfig"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/30_wsl_rv-cli.avif",alt:""})}),"\n",(0,i.jsxs)(n.p,{children:["Make sure the file is saved as ",(0,i.jsx)(n.code,{children:".wslconfig"}),". Then exit notepad."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Exit any current running WSL / Arch (exit):"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/31_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Open the Terminal as Administrator and "shutdown" any running WSL:'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-pwsh",children:"wsl --shutdown\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/32_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart WSL again and check the memory settings from within Arch by running the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"free -h\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/av1-community-contributors/images/main/33_wsl_rv-cli.avif",alt:""})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you've made it this far, you should be more than ready to encode. We hope you enjoy rAV1ator CLI!"}),"\n",(0,i.jsx)(n.h2,{id:"macos",children:"macOS"}),"\n",(0,i.jsx)(n.p,{children:"No macOS support is provided at this time. It is definitely technically feasible, and I may produce a separate tool in the future with proper macOS binaries, though this would be a burden to keep up considering I don't currently see any demand for a port."}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If your encode features a grey screen flashing occaisonally in the output, create a lossless intermediary of your source with x264 ",(0,i.jsx)(n.code,{children:"-qp 0"}),". This happens because of VC-1 decoding errors, and is not something I can fix."]}),"\n",(0,i.jsxs)(n.li,{children:["If you have any more questions, please join the ",(0,i.jsx)(n.a,{href:"https://discord.gg/bbQD5MjDr3",children:"AV1 for Dummies Discord server"}),". There is a rAV1ator CLI channel over there, and I am always happy to talk!"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var i=t(4164);const s={tabItem:"tabItem_Ymn6"};var r=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var i=t(6540),s=t(4164),r=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),h=t(9466);function u(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function d(e){const{values:n,children:t}=e;return(0,i.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:s}}=e;return{value:n,label:t,attributes:i,default:s}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const s=(0,a.W6)(),r=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const n=new URLSearchParams(s.location.search);n.set(r,e),s.replace({...s.location,search:n.toString()})}),[r,s])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,r=d(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:r}))),[c,u]=p({queryString:t,groupId:s}),[x,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[s,r]=(0,h.Dv)(t);return[s,(0,i.useCallback)((e=>{t&&r.set(e)}),[t,r])]}({groupId:s}),v=(()=>{const e=c??x;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),g(e)}),[u,g,r]),tabValues:r}}var g=t(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=t(4848);function f(e){let{className:n,block:t,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),h=e=>{const n=e.currentTarget,t=l.indexOf(n),s=o[t].value;s!==i&&(c(n),a(s))},u=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:r}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:i===n?0:-1,"aria-selected":i===n,ref:e=>l.push(e),onKeyDown:u,onClick:h,...r,className:(0,s.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":i===n}),children:t??n},n)}))})}function b(e){let{lazy:n,children:t,selectedValue:s}=e;const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=r.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map(((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==s})))})}function w(e){const n=x(e);return(0,j.jsxs)("div",{className:(0,s.A)("tabs-container",v.tabList),children:[(0,j.jsx)(f,{...n,...e}),(0,j.jsx)(b,{...n,...e})]})}function y(e){const n=(0,g.A)();return(0,j.jsx)(w,{...e,children:u(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.28735225.js b/assets/js/935f2afb.28735225.js deleted file mode 100644 index d4015eab8..000000000 --- a/assets/js/935f2afb.28735225.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/filtering/intro","docId":"filtering/intro","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Detelecine / Inverse Telecine","href":"/docs/filtering/detelecine","docId":"filtering/detelecine","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"PSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"<img src=\\"https://autumn.revolt.chat/attachments/wU4lo6SU-hRjZSVeqd9vCOeAskthYXmiWHaXUTjyTa/VVenC_Spam.webp\\"","sidebar":"tutorialSidebar"},"encoders/x264":{"id":"encoders/x264","title":"x264","description":"x264 is a software library and command line application for encoding H.264 / AVC developed by VideoLAN, the people behind the ever-popular VLC Media Player and released under GNU GPL. It is written in C and Assembly with almost two decades worth of development and threading optimizations which makes it the fastest software video encoder available, which also happens to be extremely popular.","sidebar":"tutorialSidebar"},"encoders/x265":{"id":"encoders/x265","title":"x265","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/x266":{"id":"encoders/x266","title":"x266","description":"x266 is an upcoming software encoder for the H.266 / VVC codec. Very little is currently known about the encoder other than the fact it is still being developed by MulticoreWare","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"FAQ","description":"Why are you doing this?","sidebar":"tutorialSidebar"},"filtering/deband":{"id":"filtering/deband","title":"Deband","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"filtering/dehalo":{"id":"filtering/dehalo","title":"Dehalo","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"filtering/deinterlace":{"id":"filtering/deinterlace","title":"Deinterlace","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"filtering/denoise":{"id":"filtering/denoise","title":"Denoise","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"filtering/detelecine":{"id":"filtering/detelecine","title":"Detelecine / Inverse Telecine","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"filtering/intro":{"id":"filtering/intro","title":"Intro","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"filtering/vapoursynth":{"id":"filtering/vapoursynth","title":"Vapoursynth","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"images/AVIF":{"id":"images/AVIF","title":"AVIF","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"images/GIF":{"id":"images/GIF","title":"GIF","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"images/HEIC":{"id":"images/HEIC","title":"HEIC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"images/JPEG":{"id":"images/JPEG","title":"JPEG","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"images/JPEG2000":{"id":"images/JPEG2000","title":"JPEG 2000","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"images/JXL":{"id":"images/JXL","title":"JPEG-XL","description":"JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.","sidebar":"tutorialSidebar"},"images/PNG":{"id":"images/PNG","title":"PNG","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"images/QOI":{"id":"images/QOI","title":"QOI","description":"QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex PNG format while achieving much faster encoding & decoding speeds.","sidebar":"tutorialSidebar"},"images/WebP":{"id":"images/WebP","title":"WebP","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"introduction/high-dynamic-range":{"id":"introduction/high-dynamic-range","title":"High Dynamic Range","description":"HDR (High Dynamic Range) is a technology used in modern TVs and displays to produce more vibrant and lifelike images. In simple terms, it allows your TV to display a wider range of colors and brightness levels than standard displays. This means that you can see more details in both bright and dark areas of an image, which can make movies, TV shows, and video games look much more realistic.","sidebar":"tutorialSidebar"},"introduction/prologue":{"id":"introduction/prologue","title":"Prologue","description":"Multimedia compression as a whole has revolutionized our ability to communicate on the Web & beyond. It has enabled rich experiences across many breakthrough platforms that wouldn\'t have been feasible otherwise, and it has allowed us to communicate information, expression, and human connection in novel ways. It is the unsung hero of the modern Web. Despite this, it is often difficult to uncover information about codec technology that is accurate, informed, and battle-tested by passionate individuals who care about the proliferation of knowledge. This wiki aims to demystify the realm of multimedia compression while connecting codec enthusiasts to create a sink of knowledge for the benefit of everyone.","sidebar":"tutorialSidebar"},"introduction/psychovisual":{"id":"introduction/psychovisual","title":"Psychovisual","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"introduction/terminology":{"id":"introduction/terminology","title":"Terminology","description":"When learning about encoding technology, it is important to understand the vast terminology that is often used to describe concepts that are often not very complex to understand.","sidebar":"tutorialSidebar"},"introduction/video-artifacts":{"id":"introduction/video-artifacts","title":"Spotting Video Artifacts","description":"https://xkcd.com/2414","sidebar":"tutorialSidebar"},"metrics/butteraugli":{"id":"metrics/butteraugli","title":"Butteraugli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"metrics/PSNR":{"id":"metrics/PSNR","title":"PSNR","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"metrics/SSIM":{"id":"metrics/SSIM","title":"SSIM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"metrics/SSIMULACRA2":{"id":"metrics/SSIMULACRA2","title":"SSIMULACRA2","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"metrics/VMAF":{"id":"metrics/VMAF","title":"VMAF","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"metrics/XPSNR":{"id":"metrics/XPSNR","title":"PSNR","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"privacy-policy":{"id":"privacy-policy","title":"Privacy Policy","description":"This site is hosted on GitHub Pages, & usage of this site is subject to GitHub\'s Privacy Policy. GitHub may store information about your visit in the form of log files.","sidebar":"tutorialSidebar"},"resources":{"id":"resources","title":"Resources","description":"Encoding resources that you might find useful.","sidebar":"tutorialSidebar"},"subtitles/SRT":{"id":"subtitles/SRT","title":"SRT","description":"SubRip Text (SRT) is a text format for subtitles, described as \'the most basic of all subtitle formats\'. SRT files are plain text with the extension .srt.","sidebar":"tutorialSidebar"},"subtitles/webvtt":{"id":"subtitles/webvtt","title":"WebVTT","description":"WebVTT, or Web Video Text Tracks, is the format for subtitles on the web. It is used with the HTML \\\\ element, or embedded into a webm container.","sidebar":"tutorialSidebar"},"terms-of-use":{"id":"terms-of-use","title":"Terms of Use","description":"These terms & conditions outline the rules & regulations for the use of the Codec Wiki Website as a visitor, contributor, or any other party who falls under the jurisdiction of these terms.","sidebar":"tutorialSidebar"},"utilities/autocompressor":{"id":"utilities/autocompressor","title":"autocompressor","description":"Autocompressor is a free online media compression tool by Auto-Rez Media Technologies that compresses videos, images, audio, and GIFs to a target file size. Depending on the file type you upload, it will be handled differently such that the result serves a similar function to what you uploaded. For example, videos are transcoded to videos, audio files to audio files, images to images, and animations to animations.","sidebar":"tutorialSidebar"},"utilities/av1an":{"id":"utilities/av1an","title":"Av1an","description":"Av1an is a video encoding framework. It can increase your encoding speed and improve CPU utilization by running multiple encoder processes in parallel. Target quality, VMAF plotting, and more, available to take advantage for video encoding.","sidebar":"tutorialSidebar"},"utilities/av1an-command-gen":{"id":"utilities/av1an-command-gen","title":"av1an-command-gen","description":"Av1an Command Generator is a rudimentary tool for easily generating Av1an commands for AV1 encoding. It is written in the Zig programming language. It is very similar to rAV1ator CLI in the sense that it can produce Av1an commands based on user input.","sidebar":"tutorialSidebar"},"utilities/Aviator":{"id":"utilities/Aviator","title":"Aviator","description":"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator\'s primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.","sidebar":"tutorialSidebar"},"utilities/dovi_tool":{"id":"utilities/dovi_tool","title":"dovi_tool","description":"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.","sidebar":"tutorialSidebar"},"utilities/eac3to":{"id":"utilities/eac3to","title":"eac3to","description":"eac3to is a command line tool written by madshi to mostly work with audios (conversion) and raw, unencrypted Blu-rays (BDMV).","sidebar":"tutorialSidebar"},"utilities/FFMetrics":{"id":"utilities/FFMetrics","title":"FFMetrics","description":"FFMetrics is a proprietary Windows-only graphical user interface (GUI) for FFmpeg that allows you to calculate and visualize video quality metric results with graphs. PSNR, SSIM, and VMAF are the only options.","sidebar":"tutorialSidebar"},"utilities/ffmpeg":{"id":"utilities/ffmpeg","title":"ffmpeg","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"utilities/hdr10plus_tool":{"id":"utilities/hdr10plus_tool","title":"hdr10plus_tool","description":"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named hdr10plus_parser.","sidebar":"tutorialSidebar"},"utilities/MKVToolNix":{"id":"utilities/MKVToolNix","title":"MKVToolNix","description":"MKVToolNix is free and open source GUI frontend to a set of tools (mkvmerge, mkvinfo, mkvpropedit, mkvextract) to create, alter and inspect Matroska files under Linux, other \\\\*NIXes and Windows.","sidebar":"tutorialSidebar"},"utilities/mp4box":{"id":"utilities/mp4box","title":"MP4Box","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"utilities/nmkoder":{"id":"utilities/nmkoder","title":"NMKODER","description":"NMKODER is a free and open source, Windows-only GUI software developed by N00MKRAD. Built around FFmpeg, FFprobe, and Av1an","sidebar":"tutorialSidebar"},"utilities/rAV1ator":{"id":"utilities/rAV1ator","title":"rAV1ator","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"utilities/rav1ator-cli":{"id":"utilities/rav1ator-cli","title":"rav1ator-cli","description":"rAV1ator CLI, or just rav1ator-cli, is a TUI tool that provides an interactive command line interface for encoding videos with Av1an using various different encoders including rav1e, aomenc (specifically aom-av1-lavish, as mentioned in the aomenc page), SVT-AV1, x265, and x264.","sidebar":"tutorialSidebar"},"utilities/YUView":{"id":"utilities/YUView","title":"YUView","description":"YUView is a free and open source, cross-platform software developed by IENT (Institut f\xfcr Nachrichtentechnik) for working, playing, and analyzing YUV files.","sidebar":"tutorialSidebar"},"video-players":{"id":"video-players","title":"Video Players","description":"Many different players exist for video, but here are a few recommended ones:","sidebar":"tutorialSidebar"},"video/AV1":{"id":"video/AV1","title":"AV1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/AVC":{"id":"video/AVC","title":"AVC / H.264","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/AVS3":{"id":"video/AVS3","title":"AVS3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/ECM":{"id":"video/ECM","title":"ECM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/FFV1":{"id":"video/FFV1","title":"FFV1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/HEVC":{"id":"video/HEVC","title":"HEVC / H.265","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/prores":{"id":"video/prores","title":"ProRes","description":"ProRes is a family of lossy video compression codecs developed by Apple Inc. ProRes is designed to serve as a high-quality \\"visually lossless\\" video editing codec that offers superior image quality compared to many other editing codecs while still maintaining a relatively compact file size compared to uncompressed video.","sidebar":"tutorialSidebar"},"video/Theora":{"id":"video/Theora","title":"Theora","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/utvideo":{"id":"video/utvideo","title":"UT Video","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/VC-1":{"id":"video/VC-1","title":"VC-1","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/VP8":{"id":"video/VP8","title":"VP8","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/VP9":{"id":"video/VP9","title":"VP9","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"video/VVC":{"id":"video/VVC","title":"VVC / H.266","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9cae5962.f39702bf.js b/assets/js/9cae5962.6f1b4cd9.js similarity index 99% rename from assets/js/9cae5962.f39702bf.js rename to assets/js/9cae5962.6f1b4cd9.js index ea4347c37..44ca31c2d 100644 --- a/assets/js/9cae5962.f39702bf.js +++ b/assets/js/9cae5962.6f1b4cd9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{149:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var n=s(4848),t=s(8453),r=s(1470),o=s(9365);const a={title:"JPEG-XL",sidebar_position:7},l="JPEG-XL",c={id:"images/JXL",title:"JPEG-XL",description:"JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.",source:"@site/docs/images/JXL.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"QOI",permalink:"/docs/images/QOI"}},d={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG-XL"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,n.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG-XL Info page"}),", JXL has the following features:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG-XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG-XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,n.jsxs)(i.p,{children:["Example: JPEG-XL compresses ",(0,n.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,n.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,n.jsxs)(i.p,{children:["16-bit PNG: ",(0,n.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,n.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,n.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG-XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,n.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,n.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,n.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,n.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,n.jsx)(i.p,{children:"An incredibly unique JPEG-XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG-XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,n.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,n.jsx)(i.p,{children:"From the JPEG-XL Wikipedia page:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG-XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,n.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,n.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,n.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,n.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,n.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,n.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,n.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,n.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,n.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,n.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has a couple of noteworthy encoders currently available to work with. Because JPEG-XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG-XL discord that sums it up nicely:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,n.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,n.jsxs)(i.p,{children:["The reference ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG-XL image files. Both are discussed below."]}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"enc",label:"Encoding",default:!0,children:[(0,n.jsxs)(i.p,{children:["libjxl's encoder ",(0,n.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(i.code,{children:"-d"}),"), quality (",(0,n.jsx)(i.code,{children:"-q"}),"), and effort (",(0,n.jsx)(i.code,{children:"-e"}),")."]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Distance and quality"})}),(0,n.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Effort"})}),(0,n.jsxs)(i.p,{children:["Effort is similar to ",(0,n.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,n.jsxs)(o.A,{value:"dec",label:"Decoding",children:[(0,n.jsxs)(i.p,{children:["Decoding a ",(0,n.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(i.code,{children:"djxl"}),":"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,n.jsxs)(i.p,{children:["By default, if the ",(0,n.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,n.jsxs)(o.A,{value:"build",label:"Building",children:[(0,n.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,n.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,n.jsxs)(i.p,{children:["This will build ",(0,n.jsx)(i.code,{children:"cjxl"})," and ",(0,n.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,n.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,n.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,n.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,n.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,n.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,n.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n","\n",(0,n.jsx)(i.p,{children:"Sources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(8215);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(8215),r=s(3104),o=s(6347),a=s(205),l=s(7485),c=s(1682),d=s(9466);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,c.X)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[c,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,d.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=c??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(c(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:t}=e;const r=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=r.find((e=>e.props.value===t));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:r.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==t})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...e,...i}),(0,b.jsx)(y,{...e,...i})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{149:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var n=s(4848),t=s(8453),r=s(1470),o=s(9365);const a={title:"JPEG-XL",sidebar_position:7},l="JPEG-XL",c={id:"images/JXL",title:"JPEG-XL",description:"JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.",source:"@site/docs/images/JXL.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"QOI",permalink:"/docs/images/QOI"}},d={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG-XL"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,n.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG-XL Info page"}),", JXL has the following features:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG-XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG-XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,n.jsxs)(i.p,{children:["Example: JPEG-XL compresses ",(0,n.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,n.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,n.jsxs)(i.p,{children:["16-bit PNG: ",(0,n.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,n.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,n.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG-XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,n.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,n.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,n.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,n.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,n.jsx)(i.p,{children:"An incredibly unique JPEG-XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG-XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,n.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,n.jsx)(i.p,{children:"From the JPEG-XL Wikipedia page:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG-XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,n.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,n.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,n.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,n.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,n.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,n.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,n.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,n.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,n.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,n.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has a couple of noteworthy encoders currently available to work with. Because JPEG-XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG-XL discord that sums it up nicely:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,n.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,n.jsxs)(i.p,{children:["The reference ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG-XL image files. Both are discussed below."]}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"enc",label:"Encoding",default:!0,children:[(0,n.jsxs)(i.p,{children:["libjxl's encoder ",(0,n.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(i.code,{children:"-d"}),"), quality (",(0,n.jsx)(i.code,{children:"-q"}),"), and effort (",(0,n.jsx)(i.code,{children:"-e"}),")."]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Distance and quality"})}),(0,n.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Effort"})}),(0,n.jsxs)(i.p,{children:["Effort is similar to ",(0,n.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,n.jsxs)(o.A,{value:"dec",label:"Decoding",children:[(0,n.jsxs)(i.p,{children:["Decoding a ",(0,n.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(i.code,{children:"djxl"}),":"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,n.jsxs)(i.p,{children:["By default, if the ",(0,n.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,n.jsxs)(o.A,{value:"build",label:"Building",children:[(0,n.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,n.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,n.jsxs)(i.p,{children:["This will build ",(0,n.jsx)(i.code,{children:"cjxl"})," and ",(0,n.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,n.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,n.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,n.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,n.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,n.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,n.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n","\n",(0,n.jsx)(i.p,{children:"Sources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(4164);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(4164),r=s(3104),o=s(6347),a=s(205),l=s(7485),c=s(1682),d=s(9466);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,c.X)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[c,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,d.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=c??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(c(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:t}=e;const r=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=r.find((e=>e.props.value===t));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:r.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==t})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...i,...e}),(0,b.jsx)(y,{...i,...e})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.3c68436b.js b/assets/js/a6aa9e1f.331d4367.js similarity index 98% rename from assets/js/a6aa9e1f.3c68436b.js rename to assets/js/a6aa9e1f.331d4367.js index 26fe22823..03135bc54 100644 --- a/assets/js/a6aa9e1f.3c68436b.js +++ b/assets/js/a6aa9e1f.331d4367.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var i=a(8215),n=a(4586),r=a(1213),o=a(7559),s=a(6535),l=a(7713),d=a(1463),c=a(3892),g=a(5260),p=a(6676),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,n.A)(),{blogDescription:i,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:i}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:i}=e;return(0,u.jsxs)(s.A,{sidebar:i,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var i=a(1312),n=a(9022),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(n.A,{permalink:a,title:(0,r.jsx)(i.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(n.A,{permalink:o,title:(0,r.jsx)(i.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var i=a(7131),n=a(4651),r=a(4848);function o(e){let{items:t,component:a=n.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(i.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},6676:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var i=a(6025),n=a(4586),r=a(6803);var o=a(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,n.A)(),{withBaseUrl:a}=(0,i.h)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:i,frontMatter:n,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=i.image??n.image,m=n.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,n.A)(),{withBaseUrl:g}=(0,i.h)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var i=a(4164),n=a(4586),r=a(1213),o=a(7559),s=a(6535),l=a(7713),d=a(1463),c=a(3892),g=a(5260),p=a(6676),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,n.A)(),{blogDescription:i,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:i}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:i}=e;return(0,u.jsxs)(s.A,{sidebar:i,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var i=a(1312),n=a(9022),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(n.A,{permalink:a,title:(0,r.jsx)(i.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(n.A,{permalink:o,title:(0,r.jsx)(i.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var i=a(7131),n=a(4651),r=a(4848);function o(e){let{items:t,component:a=n.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(i.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},6676:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var i=a(6025),n=a(4586),r=a(6803);var o=a(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,n.A)(),{withBaseUrl:a}=(0,i.h)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:i,frontMatter:n,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=i.image??n.image,m=n.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,n.A)(),{withBaseUrl:g}=(0,i.h)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.e43f1e72.js b/assets/js/a7023ddc.e43f1e72.js deleted file mode 100644 index 5fd0a3342..000000000 --- a/assets/js/a7023ddc.e43f1e72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9267],{8289:e=>{e.exports=JSON.parse('[{"label":"video","permalink":"/blog/tags/video","count":3},{"label":"compression","permalink":"/blog/tags/compression","count":3},{"label":"benchmarks","permalink":"/blog/tags/benchmarks","count":1},{"label":"discord","permalink":"/blog/tags/discord","count":1},{"label":"image","permalink":"/blog/tags/image","count":1},{"label":"web","permalink":"/blog/tags/web","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/39634027.a981430a.js b/assets/js/a7456010.74d83d6f.js similarity index 65% rename from assets/js/39634027.a981430a.js rename to assets/js/a7456010.74d83d6f.js index 2fa0f64cf..1394d4541 100644 --- a/assets/js/39634027.a981430a.js +++ b/assets/js/a7456010.74d83d6f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5299],{4061:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1235],{8552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.45801e7e.js b/assets/js/a94703ab.bcb3ecfd.js similarity index 98% rename from assets/js/a94703ab.45801e7e.js rename to assets/js/a94703ab.bcb3ecfd.js index 34f6ffe37..54862dbbd 100644 --- a/assets/js/a94703ab.45801e7e.js +++ b/assets/js/a94703ab.bcb3ecfd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(8215),i=n(1213),s=n(7559),l=n(4142),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),j=n(4581),f=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:j}}}=(0,f.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&j&&k(!0)}),[h,N,c,k,j]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.Mj)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,f.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(2069);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,j.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(8215),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(4142),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),j=n(4581),f=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:j}}}=(0,f.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&j&&k(!0)}),[h,N,c,k,j]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.Mj)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,f.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(2069);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,j.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/239a6b34.10a40529.js b/assets/js/aba21aa0.ae728298.js similarity index 65% rename from assets/js/239a6b34.10a40529.js rename to assets/js/aba21aa0.ae728298.js index b5b55d81d..c8d4f793c 100644 --- a/assets/js/239a6b34.10a40529.js +++ b/assets/js/aba21aa0.ae728298.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7877],{1966:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5742],{7093:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/aba90f67.4d0374aa.js b/assets/js/aba90f67.4d0374aa.js new file mode 100644 index 000000000..e81031c73 --- /dev/null +++ b/assets/js/aba90f67.4d0374aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1387],{2074:a=>{a.exports=JSON.parse('{"tag":{"label":"discord","permalink":"/blog/tags/discord","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/discord","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/ac6a717f.b3ed906d.js b/assets/js/ac6a717f.b3ed906d.js new file mode 100644 index 000000000..eaa16dac7 --- /dev/null +++ b/assets/js/ac6a717f.b3ed906d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7295],{5069:e=>{e.exports=JSON.parse('{"tag":{"label":"video","permalink":"/blog/tags/video","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/video","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/b059735e.bb9771ec.js b/assets/js/b059735e.bb9771ec.js deleted file mode 100644 index 8a4e4ea21..000000000 --- a/assets/js/b059735e.bb9771ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5571],{6666:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/web","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.dedcdbeb.js b/assets/js/b2b675dd.dedcdbeb.js deleted file mode 100644 index 0a313e589..000000000 --- a/assets/js/b2b675dd.dedcdbeb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1991],{9775:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.0eb77cfa.js b/assets/js/b2f554cd.0eb77cfa.js deleted file mode 100644 index 86d156565..000000000 --- a/assets/js/b2f554cd.0eb77cfa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5894],{6042:e=>{e.exports=JSON.parse("{\"blogPosts\":[{\"id\":\"svt-av1-deep-dive\",\"metadata\":{\"permalink\":\"/blog/svt-av1-deep-dive\",\"source\":\"@site/blog/2023-12-30-svt-av1-deep-dive.mdx\",\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"date\":\"2023-12-30T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"},{\"label\":\"benchmarks\",\"permalink\":\"/blog/tags/benchmarks\"}],\"readingTime\":22.32,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"frontMatter\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"description\":\"With the recent release of SVT-AV1 1.8.0, how does it stack up for encoding animation?\",\"slug\":\"svt-av1-deep-dive\",\"authors\":[{\"name\":\"Trix\",\"title\":\"Encoder\",\"url\":\"https://github.com/trixoniisama/\",\"image_url\":\"https://avatars.githubusercontent.com/u/93526043\",\"imageURL\":\"https://avatars.githubusercontent.com/u/93526043\"}],\"tags\":[\"video\",\"compression\",\"benchmarks\"],\"image\":\"/img/svt-1.8.0-testing-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"nextItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"}},\"content\":\"import { CarouselGenerator } from '../src/utils/ImageCarousel.mdx';\\n\\n\\nThis blog post is based on a series of visual quality benchmarks with SSIMULACRA2 and speed benchmarks of SVT-AV1 1.8.0 on a corpus of animated clips.\\n\\nThe resources available will range from ***graphs*** to ~~**image comparisons**~~ (WIP). The ***former*** has the advantage of being easily understandable, showcasing pure efficiency comparisons between encoder parameters using metrics as the reference, while the **latter** are image samples from the encoded files during the tests that enable you to check quality for yourself and add another layer of subjective interpretation to these comparisons.\\n\\n\x3c!--truncate--\x3e\\n\\nThe testing methodology involves using relatively short video samples from a wide range of modern anime genre, which have been either losslessly encoded with `x264 --qp 0` for ease of use or losslessly cut from their source. These lossless files are then pipped into SvtAv1EncApp *directly*, meaning we are measuring the performance of a single encoder instance and not leveraging chunked encoding like any actual final AV1 encoding pipeline should. Once an encode is done, SSIMULACRA2 scores are calculated using the [Zig implementation](https://github.com/dnjulek/vapoursynth-ssimulacra2) and lots of useful data are aggregated to make the graphs for this benchmark, including encoding time, encode size (bitrate), and SSIMULACRA2 scores. Bits per pixel scores (BPP) are calculated so that the `Metric / BPP` graphs may represent the closest we have to real efficiency.\\n\\nThe clips used in this test were acquired legally. The Codec Wiki and its contributors do not endorse media piracy.\\n\\nSvtAv1EncApp was compiled directly from the [v1.8.0 source code](https://gitlab.com/AOMediaCodec/SVT-AV1/-/releases/v1.8.0) using the provided `Build/linux/build.sh` script, Clang 16.0.6, and Profile-Guided Optimization (PGO). The testing machine is comprised of an i7 8750H running at 35W with 16GB of 2666MHz DDR4 RAM in Arch Linux with kernel 6.6.6 and the performance governor enabled. All encodes have been made in the same session without rebooting.\\n\\nThis testing was conducted within the [AV1 Weeb Edition](https://discord.gg/83dRFDFDp7) Discord server, which is focused on encoding animated content in AV1.\\n\\n## Samples\\n\\nThe samples are as follows:\\n- 11s `Blame!` clip which sports 3DCG action with lots of grain, effects and high-contrast elements. Most complex source of this set.\\n- 13s `Blue Lock` clip which sports rapid camera movements and rotations + high-contrast elements.\\n- 15s `Fate/Grand Order: Babylonia` relatively slow-paced clip with lots of effects still. Easiest source of this set but easy sources still give interesting data.\\n- 22s `Jigokuraku (Hell's Paradise)` flashback clip with huge static grain in a very dark scenery and some action.\\n- 14s `Kaguya-sama` opening sequence with lots of effects and fast change of scenery.\\nThe resolution of every clip is 1080p, except for the first one which is 1920x804.\\n\\n> **All clips have been encoded in a wide quality range, from `--crf 8` to `--crf 43`.**\\n\\nWithout further ado, let's start with the first comparisons!\\n\\n## Presets comparisons (-1 -> 13)\\n\\n**In the following graphs, you may find comparisons between all SVT-AV1 presets, ranging from the slowest `--preset -1` to the fastest `--preset 13`.**\\n*Please remember that these two extreme presets are meant for development purposes and as such should not be used in normal encoding conditions. You will soon understand why.*\\n\\n`--preset X` is the only parameter used here, in conjunction with the CRF values. That means everything else is default. The defaults worth mentioning are: \\n- `--tune 1`: tune PSNR\\n- `--aq-mode 2`: variance deltaq\\n- `--enable-qm 0`: quantisation matrices disabled\\n- `--irefresh-type 2`: closed GOP\\n- `--enable-tf 1`: temporal filtering enabled\\nAnd more, like CDEF and restoration enabled, overlays and film-grain disabled...\\n\\n- First of all, here are the efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={[\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_blame.webp',\\n alt: 'Blame!.h264 Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_bluelock.webp',\\n alt: 'BlueLock.h264 Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_fate.webp',\\n alt: 'Fate.h264 Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_jigokuraku.webp',\\n alt: 'Jigokuraku.h264 Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-graphs/SVT4_kaguya.webp',\\n alt: 'Kaguya.h264 Efficiency Graph',\\n },\\n ]}\\n/>\\n\\nThis could be too much information.\\n\\n- Now the same graphs but focusing on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_blame.webp',\\n alt: 'blame High Quality Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_bluelock.webp',\\n alt: 'bluelock High Quality Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_fate.webp',\\n alt: 'fate High Quality Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_jigokuraku.webp',\\n alt: 'jigokuraku High Quality Efficiency Graph',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq/SVT4_kaguya.webp',\\n alt: 'kaguya High Quality Efficiency Graph',\\n },\\n ]\\n }\\n/>\\n\\n- Same again but without presets 9 to 13 for better clarity:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-highq-slow/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Now for the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Same but without presets 9 to 13 for better clarity:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/svt-efficiency-lowq-slow/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- **Let's now see speed comparisons between all presets:**\\n\\n![speed_overall](https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed_overall.webp)\\n\\nAs we can see, preset -1 is so abysmally slow it makes the graph unusable\\n(BTW, notice the `1e6` in the lower right corner, it is obviously not encoding at 1 to 4 ms, but at 1 000 000 to 4 000 000 ms)\\n\\n- Here is what it looks like with a logarithmic scale:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-bpp/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- **Now the speed graphs but with SSIMU2 on the y-axis instead of BPP: (logarithmic scale)**\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-log-ssimu2/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Here are speeds graphs for preset 1 to 6 with a linear scale:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/speed-linear-bpp/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\nOne interpretation we can have is that **presets 2 to 4** have actually pretty close scores (pretty much the same at HQ, 2 points at max in the low quality range) but **preset 2** is **2x slower than preset 4**. The quality gap between **preset 2** and **preset 1** is even narrower but the speed penalty is also ~2x.\\n\\nThat makes it hard to recommend **preset 1**, while **preset 3** is in a strange middle ground between **2** and **4** where it makes little sense to choose it over those two: it's better to choose **preset 2** for the higher efficiency at 1.5x slower speeds, or **preset 4** for the 1.33 to 1.5x higher speeds. At least the option exists.\\n\\nA similar observation can be made between **preset 5** and **6**. They can be so close in scores in many samples (especially at HQ) while also being close in speeds that **preset 5** becomes rather obsolete most of the time.\\n\\n### TLDR\\n\\n**Clear quality gains can be observed as we decrease presets, until the very last one, however the effectiveness of dropping presets becomes less and less impressive the higher in quality you go.**\\n\\n- For instance, in worst-case scenario, we observe that (for the CRF23 to CRF8 range), __**preset 4**__ only loses at maximum **2** SSIMU2 **points** compared to __**preset -1**__ while being 50-60x faster. Though to be fair, the speed loss from __**preset 4**__ to __**preset 0**__ is \\\"only\\\" 5-10x for a maximum SSIMU2 difference close to **1.5 point**.\\n\\n- From CRF43 to CRF28, the difference between __**preset 4**__ and __**preset -1**__ can be as much as **5** SSIMU2 **points**, so lower presets become more attractive.\\n\\n## Tunes comparisons\\n\\n**In the following graphs, you may find comparisons between SVT-AV1 tunes, from the default `--tune 1` (PSNR) to the other two tunes: `--tune 0` (VQ) and `--tune 2` (SSIM).**\\n\\nExcept for the tunes, `--preset 4` is set due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n- **Let's compare the efficiency of every tunes:**\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Now let's focus on the \\\"high quality\\\" range (CRF8 -> 23):\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-highq/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- And the \\\"low quality\\\" range (CRF28 -> 43):\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-efficiency-lowq/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- And here is the speed difference:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tunes-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Graphs comparing the tunes individually between each others will be made available soon.\\n- The image comparisons will make the conclusion quite more nuanced, stay tuned (heheh) for that.\\n\\n### TLDR\\n\\n**SSIMU2 favors __tune 1 and 2__ above __tune 0__. At high quality, __tune 1 and 2__ are matched, while at low quality __tune 2__ takes the edge. __Tune 0__ is sometimes a match for the other two on certain clips and other times fare pretty badly.**\\n**For some reason, __tune 0__ is quite a bit faster now, compared to 1 and 2 which are basically the same.**\\n\\nKeep in mind that I have observed multiple times in the past that __tune 0__ kept more fine detail and was sharper than the other tunes, at the expense of potential artifacting, like ringing and distortion. It may very well explain why the metric doesn't like its results. The image comparisons may give a different interpretation than what we concluded here, please stay *tuned* for these subjective comparisons.\\n\\n## Parameters comparisons\\n\\n**In the following graphs, you may find comparisons between many SVT-AV1 parameters.**\\n*Additional graphs focusing on the high and low qualities will be made available later down the line*\\n\\n`--preset 4` is used here due to its good balance of quality and speed, in conjunction with the CRF values. That means everything else is default. The defaults have been mentioned earlier above.\\n\\n### `--tile-rows 1 --tile-columns 1` vs default `--tile-rows 0 --tile-columns 0`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tile-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __tiles__ here are both slightly harmful and slower.\\n\\n### `--aq-mode 0` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Except for the Jigokuraku clip, __aq-mode 0__ is harmful in the eyes of SSIMU2, while being slower at low CRF levels, and sometimes a match or faster at high CRF levels.\\n\\n### `--aq-mode 1` vs default `--aq-mode 2`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/aq-mode1-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __aq-mode 1__ fares closer to __aq-mode 2__ than __aq-mode 0__ did, both in quality and speed, but is still overall inferior according to SSIMU2\\n\\n### `--enable-cdef 0` vs default `--enable-cdef 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/cdef-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> According to SSIMU2, disabling CDEF barely impact efficiency. But as its a pretty demanding tool, there's a slight speed benefit of having it disabled too. I advise you to take these results with a grain of salt until the image comparisons, because in anime particularly, CDEF *can* be beneficial for the line-art.\\n\\n### `--enable-dg 0` vs default `--enable-dg 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dg-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __Dynamic GoP control__ yields bit-perfect results in all clips except for Blue Lock and Jigokuraku. There is no speed benefit to disabling it except in clips where it is in use. Let's not jump to conclusions too easily, the image comparisons will tell if it's \\\"safe\\\" to keep the setting disabled at all times or not.\\n\\n### `--enable-dlf 0` vs default `--enable-dlf 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/dlf-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __Deblocking loop filter__ can be slightly beneficial in some scenarios. In reverse, it is never harmful, so it is recommended to keep it default.\\n\\n### `--fast-decode 1` vs default `--fast-decode 0`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/fast-decode-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __fast-decode 1__ is pretty harmful in the Fate clip and slightly harmful in the rest. There is a speed benefit of enabling it though.\\n\\n### `--irefresh-type 1` vs default `--irefresh-type 2`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/irefresh-type1-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Finally something interesting to analyse!\\n- __irefresh-type 1__ is either a match or beneficial compared to __irefresh-type 2__ at high CRF levels.\\n- __irefresh-type 1__ either wins or lose to __irefresh-type 2__ at low CRF levels depending on the clip. As such, it is NOT recommended to blindly set __irefresh-type__ to __1__ at \\\"high quality\\\" as it might be harmful depending on the content.\\n- __irefresh-type 1__ is always slower compared to __irefresh-type 2__, so I might argue it is more safe to leave __irefresh-type__ default at \\\"high quality\\\" than not.\\n- According to the content type of those clips, it appears that __irefresh-type 1__ may benefit *extremely grainy* content while default __irefresh-type 2__ is better suited for *cleanish* content. This needs to be confirmed with *moar* testing though.\\n\\n### `--lookahead 0` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n### `--lookahead 60` vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead60-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n### `--lookahead 120` (max) vs default `--lookahead -1` (auto)\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame'\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock'\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate'\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku'\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya'\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/lookahead120-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __lookahead__ seems to behave strangely when set...\\n- __lookahead 0__ shifts quality around a lot and it is difficult to draw conclusions but there's a clear speed drawback of disabling lookahead.\\n- __lookahead 60__ is perfectly bit-perfect to every clips EXCEPT for some damn reason in Jigokuraku at CRF23\\n- __lookahead 120__ is somehow also bit-perfect, but this time in every clips and every CRF levels. Both 60 and 120 don't see much speed differences.\\n> Soooo.... this behavior is so odd I don't advise to set any lookahead value. Let the encoder decide.\\n\\n### `--enable-overlays 1` vs default `--enable-overlays 0`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/overlays-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> __overlays__ do not seem to either improve efficiency or performance.\\n\\n### `--enable-qm 1` vs default `--enable-qm 0`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Enabling __quantization matrices__ alone increase efficiency at \\\"high quality\\\" with no real speed impact.\\n\\n### `--enable-qm 1 --qm-min 0` vs `--enable-qm 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_blame.webp',\\n alt: 'SVT4_qm1_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_bluelock.webp',\\n alt: 'SVT4_qm1_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_fate.webp',\\n alt: 'SVT4_qm1_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_jigokuraku.webp',\\n alt: 'SVT4_qm1_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-efficiency/SVT4_qm1_kaguya.webp',\\n alt: 'SVT4_qm1_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_blame.webp',\\n alt: 'SVT4_qm1_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_bluelock.webp',\\n alt: 'SVT4_qm1_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_fate.webp',\\n alt: 'SVT4_qm1_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_jigokuraku.webp',\\n alt: 'SVT4_qm1_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/qm-min-speed/SVT4_qm1_kaguya.webp',\\n alt: 'SVT4_qm1_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Setting __qm-min__ to __0__ on top of enabling __quantization matrices__ can be beneficial in some clips at no added compute time.\\n\\nI will re-tests many QMs ranges in the future, but I doubt it changed much from v1.7.0 where 0 was the most appropriate choice for most content.\\n\\n### `--enable-restoration 0` vs default `--enable-restoration 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/restoration-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Even though the efficiencies are very similar, nothing is bit-perfect here. So according to SSIMU2, the __loop restoration filter__ isn't necessarily useful. However, just like CDEF, it's a pretty demanding tool, so disabling it yields some performance improvements. Let's take these with a grain of salt until the image comparisons.\\n\\n### `--scm 0` vs default `--scm 2` (content adaptive)\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `--scm 1` vs default `--scm 2` (content adaptive)\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/scm1-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Interestingly enough, __screen content tools__ seem to improve efficiency according to SSIMU2, at the cost of a huge performance regression. After the image comparisons are published, I will conduct additional testing on this.\\n\\n### `--enable-tf 0` vs default `--enable-tf 1`\\n\\n- Efficiency graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-efficiency/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n- Speed graphs:\\n\\n<CarouselGenerator\\n imageData={\\n [\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_blame.webp',\\n alt: 'SVT4_blame',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_bluelock.webp',\\n alt: 'SVT4_bluelock',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_fate.webp',\\n alt: 'SVT4_fate',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_jigokuraku.webp',\\n alt: 'SVT4_jigokuraku',\\n },\\n {\\n src: 'https://raw.githubusercontent.com/av1-community-contributors/images/main/svt-trix-blogpost/tf-speed/SVT4_kaguya.webp',\\n alt: 'SVT4_kaguya',\\n },\\n ]\\n }\\n/>\\n\\n> Disabled __temporal filtering__ *can* sometimes improve efficiency slightly at \\\"high quality\\\", however it is very much clip dependent. It also improves performance slightly. The image comparisons will give another perspective to these results.\\n\\n### `--enable-tpl-la 0` vs default `--enable-tpl-la 1`\\n\\nIn all the clips, the results are bit-perfect and there is no notable performance difference.\\n\\n### `superres`:\\n\\nKinda lazy to make, share and comment so much graphs for something that can be told in two lines...\\n\\nAll superres variants are freaking useless as they:\\n- do not improve efficiency\\n- decrease encoding speeds\\n- decrease decoding speeds when either bitrate or quality normalized.\\n\\n### __Early TLDR on parameters results:__\\n\\n***For a previous test with SVT-AV1 1.7.0 I did all parameters tests with `--preset 6 --tune 2`, now I did them with `--preset 4 --tune 1`. Mostly everything tested on v1.7.0 still stands today, but now we have more valuable data. Images comparisons are still needed to give more context to some results, so the conclusion presented here remains early as they are 100% based on SSIMU2 results and will require more analysis down the line.***\\n\\n**Here is a quick run down of how each parameter affect encoding:**\\n- `--tile-rows --tile-columns` should never be used (except for decreasing decode complexity)\\n- `--aq-mode 2` is the most efficient / fastest\\n- `--enable-cdef 0` *might* improve performance at almost no efficiency loss *(needs more thorough testing)*\\n- `--enable-dg` and `--enable-dlf` barely do anything\\n- `--fast-decode 1` decreases efficiency, improves encoding times, and the decoding gains still need to be determined.\\n- `--irefresh-type` should be kept default at high CRF values and for cleanish content at low CRF values, but can be set to 1 at low CRF values for extremely grainy content\\n- `--lookahead` should be kept default\\n- `--enable-overlays 1` does not improve efficiency, slight speed regression as well\\n- `--enable-qm 1 --qm-min 0` should be set for increased efficiency especially at low CRF values at no perf cost\\n- `--enable-restoration` barely does anything but disabling yields better performance *(needs visual confirmation)*\\n- `--scm 1` screen content tools can improve efficiency with a big performance trade-off *(needs more thorough testing)*\\n- `--enable-tf 0` is a mixed bag efficiency wise but improves performance\\n- `superres & resize` please don't.\\n\\n## Conclusion\\n\\nThe extensive benchmarking reveals that obviously the slower presets provide better efficiency, with diminishing returns past preset 2. However, preset 4 provides a good balance of quality and speed for most use cases. Presets 6 and 8 are good options for the people that find 4 to be too slow for their liking.\\n\\nThe default settings tend to provide good results, but some tweaks like enabling quantization matrices can further optimize efficiency. Parameters like tile encoding and super resolution modes are not beneficial. Overall, SVT-AV1 continues to be a competitive option for encoding animation in AV1, with its speed being a notable strength.\\n\\nFurther testing with more content samples would help solidify these findings. The image comparisons will also provide additional subjective evaluation to complement the objective metrics used here, and we can discover the potential usefulness of Tune 0 that may betray what the metrics suggest. Overall, this comprehensive deep dive should give encoders a helpful starting point for choosing settings when encoding animation with the latest SVT-AV1 1.8.0. Thanks for reading!\\n\\n{}\"},{\"id\":\"embedding-the-un-embeddable\",\"metadata\":{\"permalink\":\"/blog/embedding-the-un-embeddable\",\"source\":\"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx\",\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"date\":\"2023-10-29T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"discord\",\"permalink\":\"/blog/tags/discord\"}],\"readingTime\":8.92,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"frontMatter\":{\"title\":\"Embedding the Un-Embeddable\",\"description\":\"Revealing the secrets of those websites that allow you to embed entire movies, AV1, and videos over 500MB on Discord.\",\"slug\":\"embedding-the-un-embeddable\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"}],\"tags\":[\"video\",\"discord\"],\"image\":\"/img/discord-embed-blog-image.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Encoding Animation with SVT-AV1: A Deep Dive\",\"permalink\":\"/blog/svt-av1-deep-dive\"},\"nextItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"![Feature image](/img/discord-embed-blog-image.webp)\\n**A 567.14 MB, 12 min 11 s, 2K (2,048 x 858), VP9 + Opus, 6.51 Mbps average, Blender short film \\\"Cosmos Laundromat\\\"**\\n\\n\\n## A Scenario\\n\\nWhile chatting in your favorite Discord servers & group chats, you may see a friend send a weird link. You might even consider it suspicious on first glance. It is a video featuring an image of a movie poster with a play button that is almost begging to be clicked. Naturally, you click it.\\n\\n\x3c!--truncate--\x3e\\n\\nIt loads for a second, and to your surprise it is a full-length, 90-minute (sometimes even two hour)-long unauthorized copy of a movie. If you don't know exactly what is going on, you probably sit there dumbfounded as a pixel perfect HD movie plays back. You may have expected a stereotypically muddy, blocky, laggy shitpost, but this has defied your expectations.\\n\\n![stolen.shoes](/img/stolenshoes-puss.webp)\\n\\nThe truth is, there are *multiple* site that do this. Currently, there are five at the time of writing. Below is a list the ones I am currently familiar with:\\n\\n- https://stolen.shoes\\n- https://discord.nfp.is\\n- https://embeds.video\\n- https://x266.mov/discord-embed\\n- https://autocompressor.net/av1\\n\\nThe big question is, **how do they work?** Let's get to dissecting.\\n\\n## But First, a Quick Disclosure\\n\\nThe Codec Wiki unequivocally condemns any form of piracy, including the unauthorized distribution of copyrighted content. This blog post is intended to educate & inform. You may not use the tools discussed to infringe upon the intellectual property rights of content creators without serious legal risk. We encourage our readers to respect copyright laws & use the tools we discuss here appropriately.\\n\\n## How it Works\\n\\nThe entire scheme is actually very simple, as it is all just HTML meta tags (If you are familiar with web development, this is all a walk in the park).\\n\\nThe technology's inner working can be divided into two distinct parts. First, let's see how it works on the website's end.\\n\\n### The Website's End\\nIf you view each website's source, you will find this specific line in each one but they may have a different order:\\n\\n```html\\n<meta property=\\\"og:image\\\" content=\\\"https://example.com/i/someimageforthumbnail.jpg\\\">\\n<meta property=\\\"og:type\\\" content=\\\"video.other\\\">\\n<meta property=\\\"og:video:url\\\" content=\\\"https://example.com/v/video.mp4\\\">\\n<meta property=\\\"og:video:width\\\" content=\\\"1920\\\">\\n<meta property=\\\"og:video:height\\\" content=\\\"1080\\\">\\n```\\n\\nThese are the `head` parts of HTML, which dictate metadata for the document itself such as what the website title/name is, cosmetic embed, defining the site's icon, etc. They are usually found in between the `<html>` and `<body>` tags. Here's an example of a static HTML site serving one specific video:\\n```html\\n<!DOCTYPE html>\\n<html>\\n<head>\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\n <link rel=\\\"shortcut icon\\\" type=\\\"image/x-icon\\\" href=\\\"../favicon.ico\\\"/>\\n <title>some embed site\\n \\n \\n \\n \\n \\n\\n\\n

Hi

\\n

Just your friendly neighborhood video embed site

\\n \\n\\n```\\n\\n< br />\\nThese interactive sites usually deploy a live script, like a Javascript framework. Examples are NodeJS, ExpressJS, Svelte, etc. These are used to parse video and thumbnails realtime so they can be embedded on Discord (or potentially other platforms).\\n\\n### Discord's End\\n\\nTraditionally, Discord's media embedder will impose it's own video embed size limit (50 MiB) when a user sends a direct video link as usual. But in this case Discord will embed the thumbnail first, not the video. You could say the link \\\"tricks\\\" Discord by showing a \\\"false face\\\" first.\\n\\n\\n\\n## Strengths & Limitations\\n\\nAfter a combination of countless hours of observation, rigorous testing throughout the period of a year, and conversations with the sites' creators, the current strengths & limitations of this exploit are enumerated below.\\n\\n#### Strengths\\n\\n- You can embed non-web compatible codecs such as [HEVC](https://wiki.x266.mov/docs/video/HEVC) in [MP4/MOV](https://wiki.x266.mov/docs/introduction/terminology#mp4--m4v), but the user must be using a compatible browser. [Thorium](https://thorium.rocks) or Safari version 13 or greater will work for HEVC playback.\\n- There is no maximum size. You could embed a video the size of a raw Bluray, although I do not condone this unless you have the necessary legal permissions to do so or you're uploading a Creative Commons licensed movie like Big Buck Bunny while adhering to the restrictions of the applicable Creative Commons license. This also means you can send high bitrate gaming clips to your friends without any restrictions, assuming you already have a place to upload them.\\n\\n#### Limitations\\n\\n- You can only use [hotlinks](https://simple.wikipedia.org/wiki/Hotlinking), which means direct linking to the video itself ending in the appropriate file extension such as `.mp4`. Cloud services like Google Drive or OneDrive will not work for storage.\\n- You cannot use Discord's CDN (cdn.discordapp.com) as the video source. I assume this is because of Discord's proxy blocking embeds over 50 MiB, but **only discord.nfp.is can do this**, as it **proxies cdn.discordapp.com** itself.\\n- You cannot embed videos in any resolutions higher than 3840 x 2160, Discord imposes a hard limit for this on all video after it was discovered that some videos could play normally but then be maliciously scaled to ridiculous resolutions during playback to crash Discord.\\n\\n\\n\\n## Differences between Sites\\n\\nAs mentioned before, there are five known sites at the time of writing. They all serve the same function, but one may interest you more than another due to slight differences in features & functionality.\\n\\nHere are the sites, each with one noteworthy special benefit:\\n\\n- https://stolen.shoes - Recognition, as it is the OG.\\n- https://discord.nfp.is - You can use Discord CDN as video source.\\n- https://embeds.video - Immediately input video source into the URL (`https://embeds.video/https://example.com/v/video.mp4`)\\n- https://x266.mov/discord-embed - Attractive domain, simple layout.\\n- https://autocompressor.net/av1 - Lots of info dump, pretty advanced features.\\n\\nThat concludes the technical overview! Next, let's cover the history of this exploit.\\n\\n## The Lore\\n\\n### Dwayne\\n\\nIn around April of 2022, a Reddit user going by the name of u/CreativeGamer03 [posted a video on r/discordapp](https://www.reddit.com/r/discordapp/comments/u96kky/someone_sent_this_in_the_memes_channel_and_bruh) of a link where a GIF of Dwayne \\\"The Rock\\\" Johnson plays caption with \\\"Is this a GIF or is it a video?\\\" When played, a low-quality music video of Rick Astley's \\\"Never Gonna Give You Up\\\" plays.\\n\\nThe link used is now unfortunately [removed](https://archuser.de/the-rock).\\n\\n### Discovery\\nOn 23rd June 2022, a Discord user *Clybius* on the AV1 Community server asked people for [VP9](https://wiki.x266.mov/docs/video/VP9) or [H.264](https://wiki.x266.mov/docs/video/AVC) videos that were over 100 MB in size. At the time the current 500 MB nitro tier did not exist. They then decided to use a 59 minute 1080p sample video of nature scenery from around the world with a thumbnail featuring a GIF of a waterfall to test the exploit. It worked.\\n\\nHe tried shortly afterward with [AV1](https://wiki.x266.mov/docs/video/AV1). Eureka, it also worked:\\n\\n![AV1](/img/clybius-av1.webp)\\n\\nClybius confirmed that this could be patched if discovered. He cites having had the idea from the Dwayne Johnson example above, but forgetting about it for a couple of months. So, it seems this entire concept stemmed from a silly rickroll.\\n\\n![Dwayne](/img/clybius-dwayne.webp)\\n\\n### The Experiments & Interactive Site\\n\\nAfter the discovery of AV1 embedding, experimentation brought about the discovery that *any* video codec will work as long as the user can decode/play the codec and the container/extension is an MP4, MOV, or WebM. These are all traditionally web-compatible containers. If you're interested in learning about containers, please see the [Containers](https://wiki.x266.mov/docs/introduction/terminology#container) section on the [Terminology](https://wiki.x266.mov/docs/introduction/terminology) page.\\n\\nThis applies to HEVC, ProRes, [xHE-AAC](https://wiki.x266.mov/docs/audio/AAC#xhe-aac), and other bizarre codecs that are rarely seen on the Web.\\n\\nWhile experimentating, Clybius converted one their idle domains `stolen.shoes` into an interactive embedder that provided a textbox for a video URL, a thumbnail URL, a width value, & a height value for the desired video. This would be the first website for Discord embedding.\\n\\n### Virality\\n\\nIt's not long before people outside of the AV1 Community discovered `stolen.shoes`, and its popularity increased rapidly. Its use usually involved the illicit distribution of full-length, unauthorized copies of movies; this sometimes happened very shortly after some movies were released. There were a couple notable instances of this happenening that caused quite the stir online each time.\\n\\n- The first instance featured the DreamWorks sequel of \\\"Puss in Boots (2011)\\\", \\\"Puss in Boots: The Last Wish (2022)\\\". A 1080p video sourced from a streaming site was the first wake up call that attracted attention to the existence of these embed sites. This example used `stolen.shoes`.\\n\\n![puss](/img/stolenshoes-puss.webp)\\n\\n- The second instance was when highly-anticipated animated film \\\"The Super Mario Bros. Movie (2023)\\\" produced by Illumination, Universal Studios, and Nintendo was spread around Discord. It was first spotted as a Cam (A camera recording by someone in theaters), then as it went out on streaming services a different link appeared but spread faster and with upgraded 1080p quality. Both used `stolen.shoes` as the embed site.\\n\\n![mario](/img/stolenshoes-mario.webp)\\n\\n- The third instance is very recent as of the day this was posted. A streaming-service sourced \\\"Five Nights at Freddy's (2023)\\\" was spread around since the movie released both in theaters and streaming service (Peacock) day one, and it gained steam extremely fast as most people had not seen it yet. Currently, this illegal novelty is gaining [hundreds of upvotes within the r/discordapp subreddit](https://www.reddit.com/r/discordapp/comments/17hx45y/is_discordnfp_an_ip_grabber/). The copy seems to be a compressed 720p encode. This example used `discord.nfp.is`.\\n\\n![fnaf](/img/discordnfpis-fnaf.webp)\\n\\nNote the ones listed here are the ones that I saw become extremely popular. There may be lesser known links that have been spread around privately or just did not cause enough noise for me to notice. Some less popular examples I've noticed, featuring more illicit copyrighted content distribution: \\n- Top Gun Maverick (2022)\\n- The SpongeBob trilogy (2005/2015/2020)\\n- Spider-Man: Across the Spider-Verse (2023)\\n\\n\\n## Closing\\n\\nThe ability to embed unusually large videos on Discord has enabled both positive and negative use cases. On the one hand, it allows high-quality content to be shared easily among friends. However, it has also facilitated mass copyright infringement by empowering virtually anyone with a Discord accound to freely spread pirated movies.\\n\\nWhile this is fascinating from a technical perspective, embedding techniques like these tread a fine ethical line. As with anything, it is important to be mindful of how our actions affect others, and I should remind everyone that content creators deserve to be compensated for their work. As users, we should support them by accessing their content via legitimate platforms.\\n\\nIt is hard to say how long this exploit will continue to be usable. Instead of enabling piracy, which may cause Discord to be more likely to patch this exploit if they see it as a serious threat, let's instead use these capabilities responsibly to share our own creations, gaming highlights, and other media which we can share legally. Given some thoughtfulness, perhaps we can find a fair balance between respecting copyright law and appeasing Discord's sensibilities while allowing some creative flexibility on the platform.\\n\\nThank you for reading this blog post, I hope you learned something!\"},{\"id\":\"av1-encoding-for-dummies\",\"metadata\":{\"permalink\":\"/blog/av1-encoding-for-dummies\",\"source\":\"@site/blog/2023-09-03-av1-for-dummies.mdx\",\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"date\":\"2023-09-03T00:00:00.000Z\",\"tags\":[{\"label\":\"video\",\"permalink\":\"/blog/tags/video\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":15.865,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"AV1 Encoding for Dummies\",\"description\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way.\",\"slug\":\"av1-encoding-for-dummies\",\"authors\":[{\"name\":\"Simulping\",\"title\":\"Maintainer / Encoder\",\"url\":\"https://github.com/Simulping\",\"image_url\":\"https://avatars.githubusercontent.com/u/12994794?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/12994794?v=4\"},{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"video\",\"compression\"],\"image\":\"/img/compare-guide.webp\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"Embedding the Un-Embeddable\",\"permalink\":\"/blog/embedding-the-un-embeddable\"},\"nextItem\":{\"title\":\"Reducing Image Load Online\",\"permalink\":\"/blog/site-optimization\"}},\"content\":\"This guide will show you how to encode in AV1 the *right* and *optimal* way. Yes, you using standalone ``libaom``, ``libsvtav1``, and ``librav1e`` from FFmpeg or even piping ``yuv4mpeg`` into **mainline** aomenc are all unoptimal.\\n\\n\x3c!--truncate--\x3e\\n\\n\\n![Compare](/img/compare-guide.webp)\\n\\nIn this guide, we'll be installing Av1an for chunked encoding and infinite threading, because the current state of AV1 encoders, except for [SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1), unfortunately lacks threading and will only use very low amount of cores, which hampers speeds. The only caveat to this approach is **RAM consumption**, encoding 2160p (4K) with [aomenc](https://wiki.x266.mov/docs/encoders/aomenc) with 4 workers could take upwards of **16GB** of RAM! So do keep this in mind.\\n\\n## Installing the Tools\\n\\nGiven all of the different operating systems that people use on a day to day basis and the various different encoding workflows that exist, there are a number of ways to do this.\\n\\n**Jump to**: [Windows](#microsoft-windows) | [macOS](#macos) | [Linux](#linux)\\n\\n## Microsoft Windows\\n\\n### The GUI Way\\n1. Install [NMKODER](https://github.com/n00mkrad/nmkoder) which is a GUI front-end to av1an with all dependencies installed.\\n2. You're done, you can skip to the encoding part\\n\\n:::danger Almost abandonware\\nSince Nmkoder already ships everything by default and its last release was 29th March 2022. You need to manually update all encoders and tools to get better encoding speeds. Missing out on updates will result in your encodes being sub-optimal.\\n:::\\n\\n### The WSL2 Way\\n\\n*(Recommended)*\\n\\nIf you're not already familiar with WSL2, the The Windows Subsystem for Linux (WSL) is a feature of the Windows operating system that allows you to run a Linux file system, along with Linux command-line tools and GUI apps, directly on Windows. This lets Linux distributions run on bare metal without managing any virtual machines, so encoding performance is very good.\\n\\nThe easiest way to encode with WSL2 is to use [rAV1ator CLI](https://wiki.x266.mov/docs/utilities/rav1ator-cli), an interactive TUI for [Av1an](https://wiki.x266.mov/docs/utilities/av1an). An ArchWSL2 installation tutorial is provided [here](https://wiki.x266.mov/docs/utilities/rav1ator-cli#windows).\\n\\n### The Automated Way\\n\\nThere is now a batch script for automating the install process, which can be found [here](https://github.com/Hishiro64/av1an-win-script). The instructions are in the README file.\\n\\n:::caution\\nThe script will download outdated version encoders and tools such as `aom-av1-psy` and MKVToolNix v76.0, if you are fine with these you can proceed.\\n:::\\n\\n### The Manual Way\\n\\n1. Install **Python 3.10.x, this will change so consult from the** [Vapoursynth website](http://www.vapoursynth.com/doc/installation.html) **if you're reading this from the future** from [here](https://www.python.org/downloads/windows/) and select \\\"Windows Installer 64-bit\\\". Upon installation check the tick for adding Python to PATH like so\\n![Python PATH](/img/python-path.webp))\\n\\n2. Download and install Vapoursynth from [here](https://github.com/vapoursynth/vapoursynth/releases) and select \\\"VapourSynth64-RXX.exe\\\"\\n3. Open the terminal and type ``vsrepo.py install lsmas ffms2`` to install some plugins for Av1an to work.\\n4. Download MKVToolNix from [here](https://mkvtoolnix.download/downloads.html#windows), select \\\"mkvtoolnix-64bit-XX.X.X-setup.exe\\\", and install **(Also available on winget!)**\\n5. Download Av1an from [here](https://github.com/master-of-zen/Av1an/releases) (SELECT LATEST AND CLICK THE \\\"ASSETS\\\" DROPDOWN)\\n6. Download **shared libraries** FFmpeg from [gyan.dev](https://www.gyan.dev/ffmpeg/builds)\\n7. Download a pre-built fork of Aomenc ([aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish/tree/Endless_Merging)) which has neat stuff such as sane defaults, new tunes, optimizations, etc. This can be downloaded for Windows [here](https://autumn.revolt.chat/attachments/download/-2EiZW1edcT9anApFZ1PJBEber-pJ6z02NiQBjbr28) *(Current as of Sept 6, 2023)*\\n:::info\\nIf you opt to compile aomenc yourself, you can view the instructions on how to do that [here](https://wiki.x266.mov/docs/encoders/aomenc/#installation).\\n:::\\n8. Move Av1an, FFmpeg **(Including the FFmpeg DLLs)**, and aomenc to somewhere preferable, eg ``C:\\\\Encoding``.\\n9. Add the folder **AND MKVTOOLNIX INSTALLATION FOLDER** to the [Windows PATH environment](https://www.maketecheasier.com/what-is-the-windows-path/).\\n\\n\\n## macOS\\n\\nmacOS is very similar to Linux, although there aren't any GUI tools for AV1 encoding that I can comfortably recommend.\\n\\n**Homebrew + Macports for Av1an + rav1e:**\\n*Note that some commands may have to be run with `sudo`, which I won't explicitly include for security reasons.*\\n\\nInstalling the Homebrew package manager is a well documented process at this point:\\n```bash\\n/bin/bash -c \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\\\"\\n```\\n\\nAs is installing MacPorts. Install the relevent `.pkg` for your macOS version from the MacPorts Project website:\\n[www.macports.org/install.php](https://www.macports.org/install.php)\\n\\nNow, you can run the following commands:\\n```bash\\nbrew update && brew upgrade\\nbrew install rav1e aom mkvtoolnix ffmpeg\\n# Usually you must run MacPorts commands for package installations as root\\nport upgrade outdated\\nport install av1an\\n```\\n\\nThis is the easiest way to get everything set up & working to produce AV1 video with `rav1e` or mainline `aomenc` & Av1an. You can check that things are installed by running the following commands & parsing their output:\\n```bash\\n% av1an --version\\nav1an 0.4.1-unstable (rev e10880d) (Release)\\n\\n* Compiler\\n rustc 1.70.0 (LLVM 16.0)\\n\\n* Target Triple\\n aarch64-apple-darwin\\n\\n* Date Info\\n Commit Date: 2023-06-25\\n\\n* VapourSynth Plugins\\n systems.innocent.lsmas : Not found\\n com.vapoursynth.ffms2 : Not found\\n```\\n```bash\\n% rav1e --version | grep \\\"release\\\" -C 1 \\nrav1e 0.6.6 () (release)\\nrustc 1.69.0 (84c898d65 2023-04-16) (built from a source tarball) aarch64-apple-darwin\\n```\\n```bash\\n% aomenc --help | grep \\\"AOMedia\\\" -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder 3.6.1 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice `systems.innocent.lsmas : Not found` in the Av1an output. This means you won't be able to use the lsmash chunking method through vapoursynth & may instead have to rely on hybrid chunking, through `-m hybrid`. This is slower & takes up disk space while encoding, but still works. A sample Av1an command with this basic installation may look like this:\\n\\n```bash\\nav1an -i \\\"input\\\" -y --resume --verbose --split-method av-scenechange -m hybrid -c mkvmerge -e rav1e --force -v \\\" --tiles 8 -s 4 --quantizer 80 --no-scene-detection\\\" --photon-noise 7 --chroma-noise --pix-format yuv420p10le -w 8 -o \\\"output.mkv\\\"\\n```\\n\\n**Building From Source**\\n\\nIf you want lsmash support, aom-av1-lavish instead of mainline, or anything else that isn't covered by the more basic installation, you'll have to compile from source. Things are very similar to Linux, with a few oddities:\\n\\n- macOS sometimes doesn't have a `/usr/local/bin` by default. You can fix this by doing `mkdir /usr/local/bin`.\\n- Homebrew installs *everything* in its own directory structure. If you're building things from source that rely on libraries from vapoursynth, zimg, lsmash, etc, make sure to copy them from `/opt/homebrew/lib` to `/usr/local/lib`. Finding them is a matter of `ls | grep \\\"keyword\\\"` & copying what looks reasonable to be associated with the tool you're using.\\n- Building most things from source will have instructions for \\\\*nix which work for both macOS & Linux. Even if it says Linux, there's a good chance it'll work on macOS as well, & it is always worth trying Linux build instructions on Mac. I won't be going through building every encoding tool & dependency from source, as it is generally much more intuitive than Windows, but building Av1an is worth detailing here just as an example.\\n```bash\\nbrew install git rust nasm\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\ncd .. && cd target/release\\ncp av1an /usr/local/bin\\n```\\n\\n**More Difficult: Building aom-av1-lavish from Source**\\n\\nIf you want to make the most out of your hardware & eke out every last drop of quality, it may be worth building aom-av1-lavish from source. The first step is to clone it from the Endless Merging branch:\\n```bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish\\n```\\nNow, you need to make some manual changes to the source code until Clybius merges [this commit](https://github.com/Clybius/aom-av1-lavish/pull/1/files).\\n- Add the line `#include \\\"aq_variance.h\\\"` at line 19 in `av1/encoder/encodeframe_utils.c`\\n- Comment out line 2546 in `av1/encoder/speed_features.c`. This line is `const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };` & becomes `// const int qindex_thresh_cdef_sf_s1_s3_l2[2] = { 92, 48 };`.\\n\\nNow you can continue to build according to the Linux instructions below. Obviously you'll need cmake, which you can install with homebrew along with any other tools you may need. While still in the `aom-av1-lavish` directory:\\n```bash\\nmkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\" -DCMAKE_LD_FLAGS=\\\"-flto -O3 -march=native\\\"\\nmake -j$(nproc)\\n# This may need to be run as root:\\nmake install\\n```\\n\\nNow you can run `aomenc --help | grep \\\"AOMedia\\\" -C 3` to see if lavish installed. If you're getting the same output as above, you may need to copy the `aomenc` executable to `/opt/local/bin`, `/usr/local/bin`, & `/opt/homebrew/bin` if you already installed mainline aomenc. Running the version info command again, the correct output should look something like this:\\n```bash\\n% aomenc --help | grep AOMedia -C 3\\n\\nIncluded encoders:\\n\\n av1 - AOMedia Project AV1 Encoder Psy v3.6.0 (default)\\n\\n Use --codec to switch to a non-default encoder.\\n```\\n\\nNotice how it says `AOMedia Project AV1 Encoder Psy` instead of `AOMedia Project AV1 Encoder`. You should be all set after this to start using aom-av1-lavish & following the current parameter meta as outlined below.\\n\\n## Linux\\n\\n:::info\\nYet again, try using Arch. It's way easier.\\n:::\\n\\n### The GUI Way\\n\\n- Install [Aviator](https://github.com/gianni-rosato/aviator) ([SVT-AV1](https://wiki.x266.mov/docs/encoders/SVT-AV1) + [FFmpeg](https://wiki.x266.mov/docs/utilities/FFmpeg)) or [rAV1ator](https://giannirosato.com/blog/post/aviator-1/) basically same thing but [Av1an](https://wiki.x266.mov/docs/utilities/av1an.mdx) + [rav1e](https://wiki.x266.mov/docs/encoders/rav1e). Both are only available as [Flatpaks](https://beta.flathub.org/apps/net.natesales.Aviator). Keep in mind Aviator ships with **SVT-AV1** and rAV1ator with **rav1e** instead of aomenc/AOM-AV1, which I will not be covering here.\\n\\n### The TUI Way\\n\\n*(Recommended)*\\n\\n- Install [rav1ator-cli](https://wiki.x266.mov/docs/utilities/rav1ator-cli), a TUI for using Av1an meant to be easy to use. Much more flexible than the GUI options & can work with a number of encoders. See [this page](https://wiki.x266.mov/docs/utilities/rav1ator-cli/#installation) for more info. Can be easily used on any distro.\\n\\n### The Compiling Route\\n\\n#### Ubuntu\\n\\nThe guide below is targeted towards 22.04, packages and other things may be different on other versions. First Install Rust via `rustup` first, as apt version of Rust is severely outdated, then you can continue.\\n\\nInstall dependencies:\\n```bash\\nsudo apt install wget python unzip unrar build-essential meson autoconf automake libtool git nasm yasm python3-dev python3-pip cython3 libass-dev libqt5websockets5-dev libfftw3-dev libtesseract-dev ffmpeg libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libswresample-dev libmediainfo-dev mkvtoolnix mediainfo perl nasm yasm git cmake libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev libpostproc-dev llvm libclang-dev libssl-dev\\n```\\n\\nInstall l-smash:\\n```bash\\ngit clone https://github.com/l-smash/l-smash.git\\ncd l-smash\\n./configure --enable-shared --extra-cflags=\\\"-march=native\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall zimg:\\n```bash\\ngit clone --recursive https://github.com/sekrit-twc/zimg.git\\ncd zimg\\n./autogen.sh\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall ImageMagick:\\n```bash\\ngit clone https://github.com/ImageMagick/ImageMagick\\ncd ImageMagick\\n./configure\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\nInstall Vapoursynth R63:\\n```bash\\nwget https://github.com/vapoursynth/vapoursynth/archive/refs/tags/R63.zip\\nunzip R63.zip\\ncd vapoursynth-R63\\n./autogen.sh\\n./configure CFLAGS=\\\"-march=native\\\" CXXFLAGS=\\\"-march=native\\\" --libdir=/usr/lib\\nmake -j$(nproc)\\nsudo make install\\nsudo mkdir /usr/lib/vapoursynth\\nsudo ldconfig\\n```\\nThe plugin directory will be located in `/usr/lib/vapoursynth`.\\n\\n\\nInstall L-SMASH-Works Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/AkarinVS/L-SMASH-Works -b ffmpeg-4.5\\ncd L-SMASH-Works/VapourSynth && mkdir build && cd build\\nmeson .. --optimization=3 --default-library=static -Db_lto=true -Dc_args=\\\"-march=native\\\" -Dcpp_args=\\\"-march=native\\\"\\nninja -j$(nproc)\\nsudo cp libvslsmashsource.so /usr/lib/vapoursynth/\\n```\\n\\n:::danger\\nL-SMASH-Works doesn't work on **aarch64**, it is recommended to use other plugins instead.\\n:::\\n\\nInstall FFMS2 Vapoursynth Plugin:\\n```bash\\ngit clone https://github.com/FFMS/ffms2\\ncd ffms2\\n./autogen.sh\\n./configure CFLAGS=\\\"-O3 -march=native\\\" CXXFLAGS=\\\"-O3 -march=native\\\"\\nmake -j$(nproc)\\nsudo cp src/core/.libs/libffms2.so src/core/.libs/libffms2.so.5 src/core/.libs/libffms2.so.5.0.0 /usr/lib/vapoursynth\\n```\\n\\nInstall Av1an:\\n```bash\\ngit clone https://github.com/master-of-zen/Av1an\\ncd Av1an\\nRUSTFLAGS=\\\"-C target-cpu=native\\\" cargo build --release\\nsudo cp target/release/av1an /usr/local/bin\\n```\\n\\nWhen there's no errors, proceed to compiling `aom-av1-lavish`.\\n\\n### Arch\\n\\nInstall dependencies:\\n```bash\\nsudo pacman -S vapoursynth ffmpeg av1an mkvtoolnix-gui git perl cmake ninja meson nasm vapoursynth-plugin-lsmashsource ffms2\\n```\\n\\nyou're done, proceed.\\n\\n#### Compiling aom-av1-lavish\\n``` bash\\ngit clone https://github.com/Clybius/aom-av1-lavish -b Endless_Merging\\ncd aom-av1-lavish && mkdir -p aom_build && cd aom_build\\ncmake .. -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DCONFIG_TUNE_BUTTERAUGLI=0 -DCONFIG_TUNE_VMAF=0 -DCONFIG_AV1_DECODER=0 -DENABLE_TESTS=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=\\\"-flto -O3 -march=native\\\" -DCMAKE_C_FLAGS=\\\"-flto -O3 -march=native -pipe -fno-plt\\\"\\nmake -j$(nproc)\\nsudo make install\\n```\\n\\n## Encoding\\n\\nThe moment you've all been waiting for, let's just get into it. Here's an example *recommended* parameter as of now (09/03/23) [MM/DD/YY]:\\n```bash\\nav1an -x 300 -i input.mkv -w 4 -e aom -c mkvmerge --resume -m lsmash --photon-noise=10 --set-thread-affinity=2 --verbose -a \\\" -an \\\" -f \\\" -an \\\" -v \\\" --bit-depth=10 --cpu-used=4 --end-usage=q --cq-level=24 --threads=2 --tile-columns=0 --tile-rows=0 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-keyframe-filtering=1 --disable-kf --kf-max-dist=9999 --enable-qm=1 --deltaq-mode=0 --aq-mode=0 --quant-b-adapt=1 --enable-fwd-kf=0 --arnr-strength=1 --sb-size=dynamic --enable-dnl-denoising=0 \\\" -o \\\"output.mkv\\\"\\n```\\n\\n:::info Parameter Meta\\nIt is strongly recommended to join the [AV1 Discord server](https://discord.gg/vpREHAvYvh) to get the latest updates on what to use and which to set, as it's the only easily reachable place for everything AV1 & encoding tips in general.\\n:::\\nNow let's dissect it one-by-one\\n\\n**Av1an parameters:**\\n\\n- ``-i`` Input.\\n\\n- ``-x 300`` Sets scene split length to 300 frames, you can increase it for more quality at the tradeoff of video seekability.\\n\\n- ``-w 4`` Specifies the amount of \\\"workers\\\" or amount of encoders working on the video.\\n\\n- ``--verbose`` Sets logging to verbose.\\n\\n- ``--resume`` Resumes the encode even when you haven't encoded yet. I strongly recommend leaving this if you resume a lot since you can accidentally delete your whole progress (There's no delete confirmation feature.. yet) if you \\\"resumed\\\" without the parameter in place.\\n\\n- ``-e aom`` Specifies we're using aomenc encoder which should be the default option.\\n\\n- ``-c mkvmerge`` Specifies we're using mkvmerge (MKVToolNix) to concatenate the parts when done, you can specify with ffmpeg if you want to but this is the best method.\\n\\n- ``-m lsmash`` Specifies we're using l-smash (Vapoursynth plugin) to split the videos, this is also the best method because ffms2 causes video lag (Tested a year ago, might change now) and other methods just suck (Slow and not worth it, learned the hard way). You can attempt to use ffms2 when inputting VC-1 videos as it is not possible with l-smash (Or convert it to lossless with x264 qp 0).\\n\\n- ``-f \\\" -an \\\"`` ``-f`` Stands for ffmpeg parameters, ``-an`` is to remove all audio since its better to encode and merge it separately. To crop use ``-f \\\" -an -vf crop=1920:800 \\\"`` for example to crop the video to 1920x800.\\n\\n- ``-v \\\" \\\"`` Is where you put the encoder's parameters in.\\n\\n- ``-a \\\" -an \\\"`` FFmpeg audio encoding options, we're removing it cause we can always add it later. But if you want to, you can also encode directly. Here's an example for encoding to Opus using libopus assuming stereo: `-a \\\" -c:a libopus -b:a 128k \\\"`.\\n\\n- ``--photon-noise=10`` AV1 grain synthesis, which is a technique where the encoder puts fake grain in so it looks more natural and potentially hiding video artifacts (cause grain is hard to encode and explodes bitrate usage because of their randomness), 5-8 for almost none to little grain, 10-14 for medium, 15+ heavy, 20+ extremely heavy, 30+ for extremely grainy 90s live action films.\\n\\n- ``--set-thread-affinity=2`` Pins the thread to the encoder, aligns with ``--threads=2`` in the encoder parameter so set them accordingly.\\n\\n\\n**aomenc parameters:**\\n- ``--bit-depth=10`` We're using 10bit because it makes the video smaller and reduces [banding](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#contouring).\\n\\n- ``--cpu-used=4`` This is the preset which ranges from 0-9, you can go to 3 if you want more efficiency, 2 if you have a lot of time, 4 is the sweet spot, and 6 if you want speed. Don't go above 6 (Worst efficiency) or even 0 (It would take WEEKS to finish).\\n\\n- ``--end-usage=q --cq-level=24`` This specifies that we are going to use a knockoff version of CRF level similar to x264/x265 encoders, in this case CRF 24.\\n\\n- `--threads=2` Sets the amount of threads the encoder can use, aligns with `--set-thread-affinity` in Av1an.\\n\\n- ``--tile-columns=0 --tile-rows=0`` This is the tiles options, where the encoder splits the videos into tiles to encode faster, see the image below (Yellow lines):\\n\\n \\n \\\"Tiling\\\"\\n \\n\\n:::note Tile usage\\nDo NOT use tiles for 1080p and below, use 1 ``tile-columns`` at 1440p (2K), 2 ``tile-columns`` and 1 ``tile-rows`` for 2160p (4K)\\n:::\\n\\n- ``--lag-in-frames=64`` Similar to x264/x265 `rc-lookahead`. Sets a number of frames to look ahead for frametype and ratecontrol, allowing for better compression decision making. Setting to a value greater than 64 is generally not considered useful.\\n \\n- ``--aq-mode`` adaptive quantization mode, 0 is better most of the time\\n\\n- ``--tune-content=psy --tune=ssim`` As the name suggests they are tunes that affect the video output, for the better, and for the worst\\n\\n:::info Tunes to use\\nSet ``tune-content`` to ``animation`` if you're encoding above ``cq-level=30`` A.K.A lower quality, despite it's name\\nSet ``tune-content`` to ``psy`` for everything else, **do not use if you encode above ``cq-level=30``**\\nFor ``tune``, this is a bit tricky. For now, the meta seems to be ``ssim``, but back then it was ``lavish`` which is considered THE best tune because it's based on [butteraugli](https://github.com/google/butteraugli). Now it's fallen behind because its more blurry than ``ssim``, and before that it was ``butteraugli``, and then ``ipq_vmaf_psy``, and finally just ``ipq``. \\nIf you use any of the VMAF tunes, **you need to specify ``--vmaf-model-path=`` to where you put it**.\\n:::\\n\\n- ``--enable-keyframe-filtering=1`` We're setting it to 1 because of compatibility reasons, 2 is more efficient but there are seeking issues and FFmpeg for some reason can't input it.\\n\\n- ``--sb-size=dynamic`` Allows the encoder to use 128x128 block partitioning besides 64x64 which gives an efficiency boost, ignore it.\\n\\n- ``--deltaq-mode`` set to 0 because its just better.\\n\\n- ``--arnr-strength=1`` Controls how strong the filtering will be, 1 is good for 3D Pixar CGI-like and 2D animation, use 4 if you're doing live action content. Using maximum at higher bitrates would just result in a blurry mess.\\n\\n- ``--disable-kf --enable-fwd-kf=0`` We're disabling keyframes cause **Av1an already did scene detection, so we wont have to.**. And it speeds things up.\\n\\n- ``--kf-max-dist=9999`` Maximum keyframe interval, we're setting it at the highest possible value since av1an's scene detection keyframe interval is already 240 by default\\n\\n- ``--enable-chroma-deltaq=1 --enable-qm=1 --quant-b-adapt=1`` Parameters that give you free efficiency boost.\\n\\n- ``--enable-dnl-denoising=0`` Disables the encoder's built-in denoising technique when grain synthesis is enabled, you can optionally set it to 1 when you have a pretty noisy video since it works quite well.\\n\\n\\n:::info Concatenation Error on Linux\\nRun ``ulimit -n 200000``, resume, and it should concatenate just fine. If it still errors, head to the encode directory > encode, and run ``mkvmerge @../options.json``\\n:::\\n\\n\\n## Merging Everything\\n\\nOnce you're done just encode your audio using ffmpeg (or just passthrough it), subtitles should be carried along with your video output, and merge them in MKVToolNix! Don't want Matroska files? That's fine, you can use FFmpeg or MP4Box to output into `mp4`, just keep in mind that PGS/SUP/VOBSUB subtitles are not supported and Opus audio support is still experimental.\\n\\n\\n## Tips & Tricks\\n\\n- `--denoise-noise-level=10` Alternative to `photon-noise`, slower than photon-noise and is the OG grain synthesis method, performs okay and just serves as an alternative. Don't attempt to use it at high values (>12) since it creates noticeable grain patterns.\\n\\n- `--arnr-maxframes` to set max reference frames that will be used to filter the encode, higher values would make the video blurrier at high fidelity but look better at lower bitrates.\\n\\n- `--butteraugli-resize-factor=2` if you use any of the butteraugli-based tunes (lavish, butteraugli) to speed it up without much losses and `--butteraugli-intensity-target=250` to match the content light level.\\n\\n\\n## Final Thoughts\\n\\nEncoding has always been about experimentation for the best, there is really no \\\"One size fits all\\\" for encoding content, as they differ from scene complexity, how it's captured (2D/Real life), film grain, dark scenes, etc. So experiment away for your specific type of content!\\n\\n> **Guide originally hosted on https://rentry.co/AV1, rewrite and migration by Simulping.**\"},{\"id\":\"site-optimization\",\"metadata\":{\"permalink\":\"/blog/site-optimization\",\"source\":\"@site/blog/2023-07-21-site-optimization.mdx\",\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"date\":\"2023-07-21T00:00:00.000Z\",\"tags\":[{\"label\":\"image\",\"permalink\":\"/blog/tags/image\"},{\"label\":\"web\",\"permalink\":\"/blog/tags/web\"},{\"label\":\"compression\",\"permalink\":\"/blog/tags/compression\"}],\"readingTime\":9.25,\"hasTruncateMarker\":true,\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"frontMatter\":{\"title\":\"Reducing Image Load Online\",\"description\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery.\",\"slug\":\"site-optimization\",\"authors\":[{\"name\":\"Gianni Rosato\",\"title\":\"Maintainer\",\"url\":\"https://github.com/gianni-rosato\",\"image_url\":\"https://avatars.githubusercontent.com/u/35711760?v=4\",\"imageURL\":\"https://avatars.githubusercontent.com/u/35711760?v=4\"}],\"tags\":[\"image\",\"web\",\"compression\"],\"image\":\"/img/_DSC8466-smaller.jpg\",\"hide_table_of_contents\":false},\"unlisted\":false,\"prevItem\":{\"title\":\"AV1 Encoding for Dummies\",\"permalink\":\"/blog/av1-encoding-for-dummies\"}},\"content\":\"A big part of understanding any multimedia codec technology is knowing the application for such technology. For images, a big use case is web delivery. Compared to other multimedia, images are incredibly popular on the Web & knowing how to serve them properly can be a massive boon to your website's traffic as well as less of a headache for users on slower connections or who are under bandwidth constraints. The most disappointing part is that images are often poorly done on the web; all too frequently will you run into a site serving massive photographic PNGs for no reason, or photography sites serving photographs fresh out of the editing software with no thought put into their final delivery. A little effort, patience, & knowledge will go a long way toward improving the user experience for individuals using your site, & this article will illustrate some of the basics.\\n\\n\x3c!--truncate--\x3e\\n\\n:::caution\\nThese instructions are for *photographic* images; other kinds of images, like non-photographic, artwork, pixel art, etc. should likely be handled differently.\\n:::\\n\\n:::danger\\nMany images won't load properly unless your browser supports JXL, AVIF, & proper ICCv2 color management. This is for demonstration purposes only & shouldn't represent an actual common website experience. If you're curious anyway, the following browsers can display the contents of this page perfectly:\\n- [Thorium](https://thorium.rocks/) | *Linux, [macOS](https://github.com/Alex313031/Thorium-Special/releases), [Windows](https://github.com/Alex313031/thorium/releases/), [Android](https://github.com/Alex313031/Thorium-Special/releases)*\\n- [Waterfox](https://www.waterfox.net/) | *[Linux](https://flathub.org/apps/net.waterfox.waterfox), [macOS](https://www.waterfox.net/download/), [Windows](https://www.waterfox.net/download/)*\\n- [Mercury](https://thorium.rocks/mercury) | *[Linux](https://github.com/Alex313031/Mercury/releases), [Windows](https://github.com/Alex313031/Mercury/releases)*\\n:::\\n\\n## Fire & Forget\\n\\nFirst, we'll illustrate what *not* to do, which is fortunately not incredibly difficult to avoid. Taking an image straight out of your editing software at a massive size will often bloat the size & resolution to something that isn't generally usable for a website regardless of the codec you're using & its quality per bit. It can be argued there are specific use cases that demand incredible resolution & fidelity coexist on the Web, but we won't be covering those here. Here's an example of a bloated image:\\n\\n*exported straight from Darktable at JPEG q90, with no scaling*\\n\\n![bloated_jpeg](/img/_DSC8466.jpg)\\n\\n**2.2 MB**\\n\\n## Massive Improvement\\n\\nThe easiest way to have a large improvement without doing much work is to simply resize the image before serving it. Even if you exported a lossy JPEG, resizing should remove a lot of artifacts. The way to perceive a worst-case for an image's size on a site is to inspect the image element's width & height, which should give us an estimate of how large we should make our image. Any larger than this value is unreasonable since we're overfilling the element's size for no reason & the image is being scaled down anyway.\\n\\n![box-size-mac](/img/box-size-mac.avif)\\n*Inspect Element in Firefox. The Mac used to take this screenshot has a relatively high display resolution of 2560x1664. Because Macs scale things differently, we're probably going to want to double the horizontal resolution here.*\\n\\nThe width is the most important value here, so our new image is going to be exported with a width of 1699 pixels. This new image, encoded at JPEG q90 with `cjpegli`, looks like this:\\n\\n![smaller_jpeg](/img/_DSC8466-smaller.jpg)\\n\\nObviously, there's lost fidelity compared to the original, but considering this is *so much smaller*, it is worth the trade-off for many. It is also worth noting we are using an improved jpeg encoder in the form of `cjpegli`, although that is secondary to the resize. If it doesn't look as good as you want it to, you can always scale the resolution up a bit, though currently, it looks plenty passable for its size.\\n\\n2.2 MB -> **233 kB**\\n\\n### Lazy Loading\\n\\nA bonus tip is to add the `loading=\\\"lazy\\\"` attribute to your picture tag to allow the image to load only when scrolled to by a user. This doesn't save bandwidth, but it improves the user experience by loading images further down the page only when necessary. An example may look like this:\\n\\n```html\\n\\n \\\"alt\\n \\n```\\n\\n## New Codecs\\n\\nIf you desire further improvement, it may be time to consider using a newer codec like [AVIF](https://wiki.x266.mov/docs/images/AVIF) or [JPEG-XL](https://wiki.x266.mov/docs/images/JXL). These options will compress far more effectively than JPEG, with the only trade-off being browser support. We're not going to consider [WebP](/docs/images/WebP) or [HEIC](/docs/images/HEIC), since WebP is not competitive enough with JPEG for photographic imagery (often being worse) & HEIC has been superseded by AVIF - which sees greater support anyhow - & is not royalty free, effectively preventing widespread Web adoption forever. Again, we're just considering *lossy* compression for *photographic* images; it is a different story with WebP elsewhere, as it performs well on non-photographic content & is almost always better than PNG for 8-bit lossless compression. So, we are left with JXL & AVIF for now.\\n\\n### Fallbacks\\n\\nAVIF sees widespread support, but JPEG-XL isn't quite there yet with Web support as Google continues to push AVIF (it is debatable if it ever will be outside the Apple ecosystem). Even with AVIF, adoption isn't remotely close to JPEG, so it is worth providing a fallback. This can look like the following example:\\n\\n```html\\n\\n \\n \\n \\n \\\"alt\\n \\n```\\n\\nHere is a JXL falling back to an AVIF falling back to a WebP falling back to a JPEG. Pretty intense to have this many fallbacks unless you're really after the ultimate compression ratio, but it is certainly an option. AVIF & JPEG alone will probably be enough for most.\\n\\n### Compression Efficacy\\n\\nLet's look at how our image examples compare to the original with our new codec selection. We'll be aiming for high visual fidelity, so around the same quality as our initial JPEG encoded with `cjpegli` (which scores ~`83.01` with the [SSIMULACRA2](/docs/metrics/SSIMULACRA2) visual fidelity metric).\\n\\n![smaller_jxl](/img/_DSC8466-smaller.jxl)\\n\\n**137.0 kB** *JPEG-XL image, encoded with `cjxl lossless.png out.jxl -d 1.49 -e 9`. Score: ~`83.04`* *3.06s user time*\\n\\n![smaller_avif](/img/_DSC8466-smaller.avif)\\n\\n**124.8 kB** *AVIF image, encoded with `avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim lossless.png out.avif`. Score: ~`83.03`* *7.54s user time*\\n\\nJXL also supports lossless transcoding of JPEG images. This means every pixel is identical, the image just has a smaller filesize than the original JPEG; if you can use JXL, you can transcode existing JPEGs losslessly on your site & save some bandwidth that way. The JPEG transcode below gives a higher SSIMULACRA2 score than the original for some reason, but I'll chalk that up to a decoding inconsistency between how the `ssimulacra2` program decodes JPEG & JXL. Either way, the scores are fairly close.\\n\\n![smaller_jxl_jpeg-recomp](/img/_DSC8466-smaller-recomp.jxl)\\n\\n**189.4 kB** *JPEG-XL image from JPEG, encoded with `cjxl input.jpg input-recomp.jxl -d 0.0 -e 9 --brotli_effort=11`. Score: ~`84.92` (???)* *0.67s user time*\\n\\nThe final trick we can use, while not a new codec at all, still increases quality per bit. Encoding an XYB JPEG with `cjpegli` encodes with the perceptual XYB colorspace using an ICC profile to modify the original JPEG colors, avoiding JPEG's normal YCbCr which isn't perceptually optimized for the human visual system. Using XYB, we can afford identical quality with less bitrate than normal JPEG. This has universal compatibility, but not every application understands how to handle the XYB color profile (although color-managed modern browsers should be fine).\\n\\n![smaller_jpeg_xyb](/img/_DSC8466-smaller-xyb.jpg)\\n\\n**208.3 kB** *XYB JPEG, encoded with `cjpegli lossless.png out.jpg --xyb -d 1.155`. Score: ~`83.04`* *0.10s user time*\\n\\nIn this particular instance, AVIF seems to be the overall winner. This isn't always the case due to JXL's superiority at higher fidelity & with more detailed images, but according to SSIMULACRA2, AVIF has the best quality per bit with this image. You can use your own eyes to further clarify your choice, though. It is worth mentioning that as these were encoded from a 16-bit source PNG, the JXL image is the only one that maintains the full original bit depth, & AVIF isn't fast to encode.\\n\\n## Responsive Images\\n\\nDisplaying an image that is too large for a viewport is a waste of bandwidth, & displaying an image that's too small for the viewport leaves fidelity to be desired. Luckily, we have the [Responsive Image Linter](https://ausi.github.io/respimagelint/) that can help us figure out which image sizes we should be using.\\n\\n![responsive_image_linter](/img/responsive_image_linter.avif)\\n\\nIn our fire & forget example, we see that we are serving an image that is far too large. We already know that, but now we can see that given various viewport sizes we could be serving images that have respective widths of 270px, 958px, 1350px, 1660px, & 1916px to optimize for delivery to a variety of different devices. Here's how we'd write that in HTML:\\n\\n```html\\n\\n \\n \\n \\\"alt\\n\\n```\\n\\nIt is worth noting that this example above & the example below aren't perfect implementations of a responsive image given the conditions of this site, but the general concept still applies. Some things to note:\\n\\n- `srcset` = the images available to your browser to serve, & their respective widths\\n- `sizes` = the conditions given to the browser explaining under what conditions should it serve which image\\n- `(min-width: XXXpx) YYYpx` = Given the viewport is at least XXX wide, serve an image of YYY horizontal resolution. The browser will pick an image from srcset that is CSS pixels \\\\* display scaling.\\n- `calc(100vw - 24px)` = Usually preceded by a (min-width) condition. Specifies a value the browser should calculate on its own to pick the closest option from the srcset. Let's say we have `(min-width: 997px) calc(75vw - 257px)`. This means given the viewport is at least 997px wide, calculate 0.75 \\\\* the current viewport resolution - 257 to find the closest image in the srcset to fit the number of pixel specified.\\n\\n\\n \\n \\n \\\"alt\\n\\n\\nThat's all! Massive thanks to Auto-Rez Media Technologies for the inspiration behind this article & explicit permission to use their [Reduce Your Page's Image Load](https://autocompressor.net/blog/reduce-image-load) blog post when writing this entry. I have [confirmed](https://autumn.revolt.chat/attachments/GtFGuwNfeRdcwUN0MWzhDCAiiadWOk88XXC3pQv6RI) with their leadership that this wiki entry can be safely licensed under CC BY-SA 4.0.\"}]}")}}]); \ No newline at end of file diff --git a/assets/js/b4030b4d.71f77d2c.js b/assets/js/b4030b4d.55b3e3ac.js similarity index 98% rename from assets/js/b4030b4d.71f77d2c.js rename to assets/js/b4030b4d.55b3e3ac.js index 11565730d..ee8dcf05e 100644 --- a/assets/js/b4030b4d.71f77d2c.js +++ b/assets/js/b4030b4d.55b3e3ac.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{4557:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>u,toc:()=>c});var a=i(4848),o=i(8453),n=i(1470),s=i(9365);const r={title:"Aviator",sidebar_position:1},l="Aviator",u={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},d={},c=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"aviator",children:"Aviator"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,a.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,a.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,a.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,a.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.A,{children:[(0,a.jsxs)(s.A,{value:"unixlike",label:"Linux",children:[(0,a.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,a.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,a.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,a.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,a.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,a.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,a.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,a.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,a.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,a.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,a.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,a.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,a.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,a.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,a.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,a.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,a.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,a.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,a.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,a.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,a.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,a.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,a.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,a.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,a.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,a.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,a.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,a.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,a.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,a.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,a.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,a.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,a.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,a.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,a.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,a.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>s});i(6540);var a=i(8215);const o={tabItem:"tabItem_Ymn6"};var n=i(4848);function s(e){let{children:t,hidden:i,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,a.A)(o.tabItem,s),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>A});var a=i(6540),o=i(8215),n=i(3104),s=i(6347),r=i(205),l=i(7485),u=i(1682),d=i(9466);function c(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,a.useMemo)((()=>{const e=t??function(e){return c(e).map((e=>{let{props:{value:t,label:i,attributes:a,default:o}}=e;return{value:t,label:i,attributes:a,default:o}}))}(i);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(n),(0,a.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:o}=e,n=h(e),[s,l]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=i.find((e=>e.default))??i[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:n}))),[u,c]=m({queryString:i,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,d.Dv)(i);return[o,(0,a.useCallback)((e=>{i&&n.set(e)}),[i,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),v(e)}),[c,v,n]),tabValues:n}}var v=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function y(e){let{className:t,block:i,selectedValue:a,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),o=r[i].value;o!==a&&(u(t),s(o))},c=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":i},t),children:r.map((e=>{let{value:t,label:i,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:c,onClick:d,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":a===t}),children:i??t},t)}))})}function x(e){let{lazy:t,children:i,selectedValue:o}=e;const n=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=n.find((e=>e.props.value===o));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==o})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(y,{...e,...t}),(0,g.jsx)(x,{...e,...t})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:c(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var a=i(6540);const o={},n=a.createContext(o);function s(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3408],{4557:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>u,toc:()=>c});var a=i(4848),o=i(8453),n=i(1470),s=i(9365);const r={title:"Aviator",sidebar_position:1},l="Aviator",u={id:"utilities/Aviator",title:"Aviator",description:"Aviator is a GUI application designed for encoding AV1 video & Opus audio with SVT-AV1, libopus, & ffmpeg on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder.",source:"@site/docs/utilities/Aviator.mdx",sourceDirName:"utilities",slug:"/utilities/Aviator",permalink:"/docs/utilities/Aviator",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/Aviator.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Aviator",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Dehalo",permalink:"/docs/filtering/dehalo"},next:{title:"Av1an",permalink:"/docs/utilities/av1an"}},d={},c=[{value:"Installation",id:"installation",level:2},{value:"Aviator's Defaults",id:"aviators-defaults",level:2},{value:"Perceptual Optimization",id:"perceptual-optimization",level:3},{value:"Video",id:"video",level:3},{value:"Audio",id:"audio",level:3},{value:"Output",id:"output",level:3},{value:"Credits",id:"credits",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"aviator",children:"Aviator"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is a GUI application designed for encoding ",(0,a.jsx)(t.a,{href:"/docs/video/AV1",children:"AV1"})," video & Opus audio with ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1"}),", ",(0,a.jsx)(t.a,{href:"/docs/audio/Opus",children:"libopus"}),", & ",(0,a.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"ffmpeg"})," on Linux systems in a user-friendly, intuitive manner. Aviator's primary focus is ease-of-use, while still striving to offer optimal quality per bit through a smart default encoding configuration implemented via the SVT-AV1-PSY encoder."]}),"\n",(0,a.jsx)("img",{width:"640",height:"360",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_splash2.avif",alt:"Aviator Splash"}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsxs)(n.A,{children:[(0,a.jsxs)(s.A,{value:"unixlike",label:"Linux",children:[(0,a.jsxs)(t.p,{children:["Aviator is available on Linux through Flathub as a Flatpak. You can learn how to set up Flatpak on your distro of choice ",(0,a.jsx)(t.a,{href:"https://flatpak.org/setup/",children:"here"}),". Please do not use Aviator through the AUR."]}),(0,a.jsx)("a",{href:"https://flathub.org/apps/details/net.natesales.Aviator",children:(0,a.jsx)("img",{width:"200",alt:"Download on Flathub",src:"https://flathub.org/assets/badges/flathub-badge-en.png"})}),(0,a.jsx)(t.p,{children:"If Flatpak is already set up and you'd prefer to install Aviator from the terminal, you can run the following commmand:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Flatpak was chosen for Aviator because it allows Aviator to ship its own sandboxed dependencies, ensuring every Linux user has a cohesive experience. One major benefit is the latest stable SVT-AV1-PSY implementation is always included, and Flatpak Aviator won't use your system's SVT-AV1 implementation which may be incompatible with Aviator's custom parameters."}),(0,a.jsxs)(t.p,{children:["If you would like to build Aviator from source, you may do so via the following commands. Ensure you have the right dependencies; if not, ",(0,a.jsx)(t.code,{children:"make"})," will warn you and you can install them as you see what you're missing."]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/gianni-rosato/aviator\ncd aviator\nmake\n"})})]}),(0,a.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,a.jsx)(t.admonition,{title:"Partial Support",type:"caution",children:(0,a.jsxs)(t.p,{children:['Windows support is provided on a "best-effort" basis via ',(0,a.jsx)(t.strong,{children:"WSL2"}),". Compatibility hiccups will almost certainly be encountered should you decide to run Aviator on Windows."]})}),(0,a.jsxs)(t.p,{children:['Aviator is supported on a "best-effort" basis on Windows via WSL2. In order to set up a WSL2 Arch Linux environment, see the ',(0,a.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli#windows",children:"rAV1ator CLI"})," WSL2 tutorial for Windows 11."]}),(0,a.jsxs)(t.p,{children:["Once WSL2 is set up, install Flatpak in your Linux environment by follwing the steps below. ",(0,a.jsxs)(t.strong,{children:["Always be careful when running commands with ",(0,a.jsx)(t.code,{children:"sudo"})," copied from the Internet, including the commands below."]})]}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo pacman -Syu # Update your system\nsudo pacman -S flatpak # Install flatpak\nsudo systemctl enable --now dbus # Start dbus\nflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # Add flathub repo if it hasn't already been added\n"})}),(0,a.jsxs)(t.p,{children:["Finally, you can verify that Flatpak has actually been installed by running ",(0,a.jsx)(t.code,{children:"flatpak --version"})," and checking that the version string is valid."]}),(0,a.jsx)(t.p,{children:"Now, Aviator requires a couple of special Flatpak dependencies most commonly found on GNOME Linux distros."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install org.gnome.Sdk # Select option 15\nsudo flatpak install org.gnome.Platform # Select option 14\n"})}),(0,a.jsx)(t.p,{children:"Finally, you can install Aviator."}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"sudo flatpak install flathub net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"You can run Aviator by executing the following command:"}),(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"flatpak run net.natesales.Aviator\n"})}),(0,a.jsx)(t.p,{children:"Now, you should be all set! Happy encoding!"})]})]}),"\n",(0,a.jsx)(t.h2,{id:"aviators-defaults",children:"Aviator's Defaults"}),"\n",(0,a.jsx)(t.p,{children:"Hovering over most user configurable options in Aviator will produce a helpful tooltip that you can look at to make things more clear."}),"\n",(0,a.jsx)(t.h3,{id:"perceptual-optimization",children:"Perceptual Optimization"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator doesn't use mainline SVT-AV1, but rather uses ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/svt-av1-psy",children:"a fork"})," dubbed SVT-AV1-PSY maintained for perceptual quality. It includes several unique changes, including a custom ",(0,a.jsx)(t.a,{href:"/docs/metrics/SSIM",children:"SSIM"}),"-based ",(0,a.jsx)(t.a,{href:"/docs/introduction/psychovisual",children:"RDO"})," tune that isn't included in mainline SVT-AV1. You can read more about SVT-AV1-PSY on the ",(0,a.jsx)(t.a,{href:"/docs/encoders/SVT-AV1#community-forks",children:"SVT-AV1"})," entry."]}),"\n",(0,a.jsx)(t.p,{children:"Aviator's default FFmpeg command uses the following encoding parameters, some of which are redundant with defaults:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"-c:v libsvtav1 -crf X -preset X -pix_fmt yuv420p10le -svtav1-params film-grain=X:irefresh-type=2:input-depth=10:tune=3:sharpness=1:qm-min=0:keyint=300:aq-mode=2:enable-qm=1:film-grain-denoise=X\n"})}),"\n",(0,a.jsx)(t.h3,{id:"video",children:"Video"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_video.webp",alt:"Aviator Video Settings",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["By default, output resolution will match your source's resolution. Manually changing one resolution value will automatically calculate the other based on the video's aspect ratio. Aviator's SVT-AV1 speed preset is set to 6 by default, with a CRF (Constant Rate Factor) level of 32. You can set CRF from 0 to 63 using the slider, with larger numerical values indicating smaller filesize at the expense of visual quality. You can look at the detailed specifications behind each speed preset ",(0,a.jsx)(t.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.mdx#what-presets-do",children:"here"}),". Speed 7 offers a good balance between speed & compression efficiency at any CRF level."]}),"\n",(0,a.jsx)(t.p,{children:"Setting values that don't correspond with the source video's aspect ratio means the output will either stretch or crop based on if the \"crop\" option is checked."}),"\n",(0,a.jsx)(t.p,{children:"The Grain Synth slider allows you to add artificial grain to your video to mimic its natural grain. This option applies the artificial grain at decode time as a filter, which makes it easier to encode grainy videos at high fidelity. The Denoise switch removes noise from the video before applying artificial grain."}),"\n",(0,a.jsx)(t.h3,{id:"audio",children:"Audio"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_audio.webp",alt:"Aviator Audio Settings",loading:"lazy"}),"\n",(0,a.jsx)(t.p,{children:"The default bitrate for Opus audio is 80kb/s. The audio source can be copied to the output media via that \"Copy Audio\" switch, & audio with >2 channels can be downmixed to stereo via the appropriately labelled switch. Volume adjustment & normalization are also offered in this section as well; the Volume slider allows you to increase or decrease the output's volume & is measured in decibels, & negative values decrease the volume. The Normalize toggle allows you to normalize your audio's perceived loudness."}),"\n",(0,a.jsx)(t.p,{children:'The "Copy Audio" switch disables WebM output due to potential compatibility hiccups & overrides every option on the Audio page to keep the source audio untouched. This option, when enabled, ensures the source audio isn\'t reencoded.'}),"\n",(0,a.jsx)(t.p,{children:"The Volume slider allows you to increase or decrease the output's volume. It is measured in decibels, and negative values decrease the volume. The Normalize switch allows you to normalize the audio's perceived loudness."}),"\n",(0,a.jsx)(t.h3,{id:"output",children:"Output"}),"\n",(0,a.jsx)("img",{width:"678",height:"567",src:"https://raw.githubusercontent.com/gianni-rosato/aviator/main/assets/aviator_output.webp",alt:"Aviator Output UI",loading:"lazy"}),"\n",(0,a.jsxs)(t.p,{children:["The container your video is stored in is associated with the file extension. Aviator offers two options for video output: the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#mkv--mka--mks--mk3d",children:"Matroska"})," video container & the ",(0,a.jsx)(t.a,{href:"/docs/introduction/terminology#webm",children:"WebM"})," container. The open-source Matroska container (.MKV) is used by default in Aviator & is a universal multimedia container with broad video & audio support. WebM is designed for web compatibility. Aviator won't copy subtitles to WebM outputs because WebM is only officially compatible with ",(0,a.jsx)(t.a,{href:"/docs/subtitles/webvtt",children:"WebVTT"})," subtitles. Both containers work out of the box with Aviator's AV1 video & Opus audio, but WebM output will be disabled if the Copy Audio switch is enabled because then we lose this format compliance assurance."]}),"\n",(0,a.jsx)(t.h2,{id:"credits",children:"Credits"}),"\n",(0,a.jsxs)(t.p,{children:["Aviator is actively developed by ",(0,a.jsx)(t.a,{href:"https://github.com/gianni-rosato/",children:"Gianni Rosato"}),"."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},9365:(e,t,i)=>{i.d(t,{A:()=>s});i(6540);var a=i(4164);const o={tabItem:"tabItem_Ymn6"};var n=i(4848);function s(e){let{children:t,hidden:i,className:s}=e;return(0,n.jsx)("div",{role:"tabpanel",className:(0,a.A)(o.tabItem,s),hidden:i,children:t})}},1470:(e,t,i)=>{i.d(t,{A:()=>A});var a=i(6540),o=i(4164),n=i(3104),s=i(6347),r=i(205),l=i(7485),u=i(1682),d=i(9466);function c(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,a.useMemo)((()=>{const e=t??function(e){return c(e).map((e=>{let{props:{value:t,label:i,attributes:a,default:o}}=e;return{value:t,label:i,attributes:a,default:o}}))}(i);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function p(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:i}=e;const o=(0,s.W6)(),n=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l.aZ)(n),(0,a.useCallback)((e=>{if(!n)return;const t=new URLSearchParams(o.location.search);t.set(n,e),o.replace({...o.location,search:t.toString()})}),[n,o])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:o}=e,n=h(e),[s,l]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=i.find((e=>e.default))??i[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:n}))),[u,c]=m({queryString:i,groupId:o}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[o,n]=(0,d.Dv)(i);return[o,(0,a.useCallback)((e=>{i&&n.set(e)}),[i,n])]}({groupId:o}),b=(()=>{const e=u??f;return p({value:e,tabValues:n})?e:null})();(0,r.A)((()=>{b&&l(b)}),[b]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:n}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),v(e)}),[c,v,n]),tabValues:n}}var v=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=i(4848);function y(e){let{className:t,block:i,selectedValue:a,selectValue:s,tabValues:r}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,n.a_)(),d=e=>{const t=e.currentTarget,i=l.indexOf(t),o=r[i].value;o!==a&&(u(t),s(o))},c=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":i},t),children:r.map((e=>{let{value:t,label:i,attributes:n}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:c,onClick:d,...n,className:(0,o.A)("tabs__item",b.tabItem,n?.className,{"tabs__item--active":a===t}),children:i??t},t)}))})}function x(e){let{lazy:t,children:i,selectedValue:o}=e;const n=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=n.find((e=>e.props.value===o));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==o})))})}function w(e){const t=f(e);return(0,g.jsxs)("div",{className:(0,o.A)("tabs-container",b.tabList),children:[(0,g.jsx)(y,{...t,...e}),(0,g.jsx)(x,{...t,...e})]})}function A(e){const t=(0,v.A)();return(0,g.jsx)(w,{...e,children:c(e.children)},String(t))}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>r});var a=i(6540);const o={},n=a.createContext(o);function s(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8af02bf.34f376f2.js b/assets/js/b8af02bf.e7886f70.js similarity index 97% rename from assets/js/b8af02bf.34f376f2.js rename to assets/js/b8af02bf.e7886f70.js index 6acd3f15f..9819e24f2 100644 --- a/assets/js/b8af02bf.34f376f2.js +++ b/assets/js/b8af02bf.e7886f70.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{8348:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const s={title:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var o=t(6540);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3222],{5967:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(4848),n=t(8453);const s={title:"JPEG 2000",sidebar_position:5},a="JPEG 2000",r={id:"images/JPEG2000",title:"JPEG 2000",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/images/JPEG2000.mdx",sourceDirName:"images",slug:"/images/JPEG2000",permalink:"/docs/images/JPEG2000",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JPEG2000.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"JPEG 2000",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"WebP",permalink:"/docs/images/WebP"},next:{title:"AVIF",permalink:"/docs/images/AVIF"}},c={},d=[];function l(e){const i={a:"a",admonition:"admonition",h1:"h1",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.h1,{id:"jpeg-2000",children:"JPEG 2000"}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsx)(i.p,{children:'JPEG-2000 is an older image compression format that uses wavelet technology to achieve high compression ratios while maintaining image quality. It supports both lossy and lossless compression, and is commonly used in applications such as digital photography, medical imaging, and video surveillance. JPEG-2000 files can be transparently compressed and decompressed using a variety of software tools and libraries, making it a flexible and widely-supported format for image storage & transmission. JPEG-2000 never effectively took off on the Web, but digital cinema distribution is often done with JPEG-2000. A "DCP" is a "Digital Cinema Package," which is a format used to distribute and play back digital movies in theaters. These DCPs are often compressed losslessly with JPEG-2000.'})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>r});var o=t(6540);const n={},s=o.createContext(n);function a(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf9d09b6.7b977069.js b/assets/js/bf9d09b6.fca940cb.js similarity index 99% rename from assets/js/bf9d09b6.7b977069.js rename to assets/js/bf9d09b6.fca940cb.js index 7297a8232..b20a070cc 100644 --- a/assets/js/bf9d09b6.7b977069.js +++ b/assets/js/bf9d09b6.fca940cb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8270],{9094:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>j,frontMatter:()=>l,metadata:()=>h,toc:()=>a});var n=r(4848),s=r(8453),i=r(1470),d=r(9365);const l={title:"SVT-HEVC",sidebar_position:10},c="SVT-HEVC",h={id:"encoders/SVT-HEVC",title:"SVT-HEVC",description:'SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the "Scalable Video Technology" project lineup by Intel.',source:"@site/docs/encoders/SVT-HEVC.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"SVT-HEVC",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"},next:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Normal usage",id:"normal-usage",level:3},{value:"Encoding HDR",id:"encoding-hdr",level:3},{value:"Encoding with Dolby Vision",id:"encoding-with-dolby-vision",level:3},{value:"List of all configuration parameters",id:"list-of-all-configuration-parameters",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"svt-hevc",children:"SVT-HEVC"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC",children:"SVT-HEVC"})," (Scalable Video Technology for HEVC) is an open source ",(0,n.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder developed by Intel made specifically to ",(0,n.jsx)(t.strong,{children:"only support x86"}),'. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:["The encoder is written in C with some parts in Assembly and licensed under ",(0,n.jsx)(t.strong,{children:"BSD+Patent"}),"."]}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.p,{children:["It is recommended to use ",(0,n.jsx)(t.a,{href:"/docs/encoders/x265",children:"x265"})," instead as it performs much better in quality."]})}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-HEVC is only available in FFmpeg when it is compiled with their provided ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/tree/master/ffmpeg_plugin",children:"plugin"}),". Otherwise it is via ",(0,n.jsx)(t.code,{children:"libsvt_hevc"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvt_hevc"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-HEVC supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.A,{children:[(0,n.jsxs)(d.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the SVT-HEVC repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-HEVC and cd"',children:"git clone https://github.com/OpenVisualCloud/SVT-HEVC\ncd SVT-HEVC/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.5.1 or higher and either GCC or Clang. It is recommended to use Clang when building SVT-HEVC."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build release"',children:"./build.sh static release\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory."]})]}),(0,n.jsx)(d.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.h3,{id:"normal-usage",children:"Normal usage"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20, and raw 265 bitstream output"',children:"SvtHevcEncApp -i input.y4m -q 20 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Preset 4, CRF 20, Y4M input"',children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | SvtHevcEncApp -i stdin -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.admonition,{type:"danger",children:(0,n.jsxs)(t.p,{children:["SVT-HEVC currently does not have the ability to detect EOF (End of File) within Y4M pipes (",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/issues/634#issuecomment-1434911798",children:"issue"}),"), so the encode process will go on indefinitely until your drive is full.\nThe only known solution is to manually set the number of frames to encode via ",(0,n.jsx)(t.code,{children:"-n"}),"."]})}),"\n",(0,n.jsx)(t.h3,{id:"encoding-hdr",children:"Encoding HDR"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h3,{id:"encoding-with-dolby-vision",children:"Encoding with Dolby Vision"}),"\n",(0,n.jsx)(t.p,{children:"The ability to encode with Dolby Vision via RPU file is surprisingly present within SVT-HEVC, although it is limited to Profile 8.1."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -dolby-vision-rpu RPUFile.bin -dolby-vision-profile 81 -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h2,{id:"list-of-all-configuration-parameters",children:"List of all configuration parameters"}),"\n",(0,n.jsxs)(t.p,{children:['As with every SVT line-up, they redirect you to read their "User Guide" instead of presenting what each and every parameter do in the ',(0,n.jsx)(t.code,{children:"--help"})," page.\nThe table below is an exact copy from their user guide taken from ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md",children:"GitHub"})," for backup purposes. Feel free to read them."]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Encoder Parameter as shown in the configuration file"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Command Line parameter"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Range"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Default"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Description"})})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Channel Number"})}),(0,n.jsx)(t.td,{children:"-nch"}),(0,n.jsx)(t.td,{children:"[1 - 6]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Number of encode instances"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConfigFile"})}),(0,n.jsx)(t.td,{children:"-c"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Configuration file path"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InputFile"})}),(0,n.jsx)(t.td,{children:"-i"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Input file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"StreamFile"})}),(0,n.jsx)(t.td,{children:"-b"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Output bitstream file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ErrorFile"})}),(0,n.jsx)(t.td,{children:"-errlog"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"stderr"}),(0,n.jsx)(t.td,{children:"Error log displaying configuration or encode errors"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ReconFile"})}),(0,n.jsx)(t.td,{children:"-o"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Output reconstructed yuv used for debug purposes. ",(0,n.jsx)(t.strong,{children:"Note:"})," using this feature will affect the speed of the encoder significantly. This should only be used for debugging purposes."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseQpFile"})}),(0,n.jsx)(t.td,{children:"-use-q-file"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, overwrite the picture qp assignment using qp values in QpFile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QpFile"})}),(0,n.jsx)(t.td,{children:"-qp-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to qp file"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SegmentOvFile"})}),(0,n.jsx)(t.td,{children:"-segment-ov-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to segment override file which will allow for sharpness improvement and bit rate reduction on a per segment basis. Refer to config/SVTSegmentOvFile.txt for details."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderMode"})}),(0,n.jsx)(t.td,{children:"-encMode"}),(0,n.jsx)(t.td,{children:"[0 - 11]"}),(0,n.jsx)(t.td,{children:"7"}),(0,n.jsx)(t.td,{children:"A preset defining the quality vs density tradeoff point that the encoding is to be performed at. (e.g. 0 is the highest quality mode, 11 is the highest density mode). Section 3.4 outlines the preset availability per resolution"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderBitDepth"})}),(0,n.jsx)(t.td,{children:"-bit-depth"}),(0,n.jsx)(t.td,{children:"[8, 10]"}),(0,n.jsx)(t.td,{children:"8"}),(0,n.jsx)(t.td,{children:"Specifies the bit depth of input video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderColorFormat"})}),(0,n.jsx)(t.td,{children:"-color-format"}),(0,n.jsx)(t.td,{children:"[1, 2, 3]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Specifies the chroma subsampling of input video(1: 420, 2: 422, 3: 444)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"CompressedTenBitFormat"})}),(0,n.jsx)(t.td,{children:"-compressed-ten-bit-format"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Offline packing of the 2bits: requires two bits packed input (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceWidth"})}),(0,n.jsx)(t.td,{children:"-w"}),(0,n.jsx)(t.td,{children:"[64 - 8192]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceHeight"})}),(0,n.jsx)(t.td,{children:"-h"}),(0,n.jsx)(t.td,{children:"[64 - 4320]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameToBeEncoded"})}),(0,n.jsx)(t.td,{children:"-n"}),(0,n.jsx)(t.td,{children:"[0 - 2^31 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Number of frames to be encoded, if number of frames is > number of frames in file, the encoder will loop to the beginning and continue the encode. 0 encodes the full clip."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferedInput"})}),(0,n.jsx)(t.td,{children:"-nb"}),(0,n.jsx)(t.td,{children:"[-1, 1 to 2^31 -1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"number of frames to preload to the RAM before the start of the encode. If -nb = 100 and \u2013n 1000 --\x3e the encoder will encode the first 100 frames of the video 10 times. Use -1 to not preload any frames. This parameter is best used to eliminate the impact of disk reading on encoding speed and is most noticeable when frames sizes are 4k or 8k. Because frames are repeated when value specified (-nb) is less than the total frame count (-n), you should expect bitstreams to be different."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Profile"})}),(0,n.jsx)(t.td,{children:"-profile"}),(0,n.jsx)(t.td,{children:"[1,2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"1: Main, 2: Main 10"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Tier"})}),(0,n.jsx)(t.td,{children:"-tier"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0: Main, 1: High"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Level"})}),(0,n.jsx)(t.td,{children:"-level"}),(0,n.jsx)(t.td,{children:"[1, 2, 2.1,3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 to 6.2 [0 for auto determine Level]"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRate"})}),(0,n.jsx)(t.td,{children:"-fps"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"If the number is less than 1000, the input frame rate is an integer number between 1 and 60, else the input number is in Q16 format (shifted by 16 bits) [Max allowed is 240 fps]. If FrameRateNumerator and FrameRateDenominator are both !=0 the encoder will ignore this parameter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateNumerator"})}),(0,n.jsx)(t.td,{children:"-fps-num"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate numerator e.g. 6000 When zero, the encoder will use \u2013fps if FrameRateDenominator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateDenominator"})}),(0,n.jsx)(t.td,{children:"-fps-denom"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate denominator e.g. 100 When zero, the encoder will use \u2013fps if FrameRateNumerator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Injector"})}),(0,n.jsx)(t.td,{children:"-inj"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enable injection of input frames at the specified framerate (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InjectorFrameRate"})}),(0,n.jsx)(t.td,{children:"-inj-frm-rt"}),(0,n.jsx)(t.td,{children:"[1 - 240]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"Frame Rate used for the injector. Recommended to match the encoder speed."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SpeedControlFlag"})}),(0,n.jsx)(t.td,{children:"-speed-ctrl"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables the Speed Control functionality to achieve the real-time encoding speed defined by \u2013fps. When this parameter is set to 1 it forces \u2013inj to be 1 and -inj-frm-rt to be set to \u2013fps."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InterlacedVideo"})}),(0,n.jsx)(t.td,{children:"-interlaced-video"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : encoder will signal interlaced signal in the stream
0 : assumes progressive signal"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SeparateFields"})}),(0,n.jsx)(t.td,{children:"-separate-fields"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : Interlaced input, application will separate top and bottom fields and encode it as progressive.
0 : Treat video as progressive video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HierarchicalLevels"})}),(0,n.jsx)(t.td,{children:"-hierarchical-levels"}),(0,n.jsx)(t.td,{children:"[0 \u2013 3]"}),(0,n.jsx)(t.td,{children:"3"}),(0,n.jsx)(t.td,{children:"0 : Flat
1: 2-Level Hierarchy
2: 3-Level Hierarchy
3: 4-Level Hierarchy
Minigop Size = (2^HierarchicalLevels)
(e.g. 3 == > 7B pyramid, 2 ==> 3B Pyramid)
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BaseLayerSwitchMode"})}),(0,n.jsx)(t.td,{children:"-base-layer-switch-mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : Use B-frames in the base layer pointing to the same past picture
1 : Use P-frames in the base layer
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PredStructure"})}),(0,n.jsx)(t.td,{children:"-pred-struct"}),(0,n.jsx)(t.td,{children:"[0 \u2013 2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"0: Low Delay P
1: Low Delay B
2: Random Access
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraPeriod"})}),(0,n.jsx)(t.td,{children:"-intra-period"}),(0,n.jsx)(t.td,{children:"[-2 - 255]"}),(0,n.jsx)(t.td,{children:"-2"}),(0,n.jsx)(t.td,{children:"Distance between Intra Frame inserted.
-1 denotes no intra update.
-2 denotes auto."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraRefreshType"})}),(0,n.jsx)(t.td,{children:"-irefresh-type"}),(0,n.jsx)(t.td,{children:"[-1,N]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"-1: CRA (Open GOP)
>=0: IDR (Closed GOP, N is headers insertion interval, 0 supported if CQP, >=0 supported if VBR)
Refer to Appendix A.3"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QP"})}),(0,n.jsx)(t.td,{children:"-q"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"32"}),(0,n.jsx)(t.td,{children:"Initial quantization parameter for the Intra pictures used when RateControlMode 0 (CQP)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LoopFilterDisable"})}),(0,n.jsx)(t.td,{children:"-dlf"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1 disables the Deblocking Loop Filtering"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SAO"})}),(0,n.jsx)(t.td,{children:"-sao"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"When set to 0 the encoder will not use the Sample Adaptive Filter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseDefaultMeHme"})}),(0,n.jsx)(t.td,{children:"-use-default-me-hme"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 : Overwrite Default ME HME parameters
1 : Use default ME HME parameters, dependent on width and height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HME"})}),(0,n.jsx)(t.td,{children:"-hme"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enable HME, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaWidth"})}),(0,n.jsx)(t.td,{children:"-search-w"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaHeight"})}),(0,n.jsx)(t.td,{children:"-search-h"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConstrainedIntra"})}),(0,n.jsx)(t.td,{children:"-constrd-intra"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Allow the use of Constrained Intra, when enabled, this features yields to sending two PPSs in the HEVC Elementary streams
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RateControlMode"})}),(0,n.jsx)(t.td,{children:"-rc"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : CQP , 1 : VBR"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetBitRate"})}),(0,n.jsx)(t.td,{children:"-tbr"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"7000000"}),(0,n.jsx)(t.td,{children:"Target bitrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvMaxrate"})}),(0,n.jsx)(t.td,{children:"-vbv-maxrate"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBVMaxrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufsize"})}),(0,n.jsx)(t.td,{children:"-vbv-bufsize"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBV BufferSize in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufInit"})}),(0,n.jsx)(t.td,{children:"-vbv-init"}),(0,n.jsx)(t.td,{children:"[0 - 100]"}),(0,n.jsx)(t.td,{children:"90"}),(0,n.jsx)(t.td,{children:"Sets the initial percentage size that the VBV buffer is filled to"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"hrdFlag"})}),(0,n.jsx)(t.td,{children:"-hrd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["Sets the HRD (Hypothetical Reference Decoder) Flag in the encoded stream, 0 = OFF, 1 = ON When",(0,n.jsx)("br",{}),"hrdFlag is set to 1, vbvMaxrate and vbvBufsize must be greater than 0"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxQpAllowed"})}),(0,n.jsx)(t.td,{children:"-max-qp"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"48"}),(0,n.jsx)(t.td,{children:"Maximum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be >= MinQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MinQpAllowed"})}),(0,n.jsx)(t.td,{children:"-min-qp"}),(0,n.jsx)(t.td,{children:"[0 - 50]"}),(0,n.jsx)(t.td,{children:"10"}),(0,n.jsx)(t.td,{children:"Minimum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be < MaxQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LookAheadDistance"})}),(0,n.jsx)(t.td,{children:"-lad"}),(0,n.jsx)(t.td,{children:"[0 - 250]"}),(0,n.jsx)(t.td,{children:"Depending on BRC mode"}),(0,n.jsx)(t.td,{children:"When RateControlMode is set to 1 it's best to set this parameter to be equal to the Intra period value (such is the default set by the encoder). When CQP is chosen, then a (2 * minigopsize +1) look ahead is recommended."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SceneChangeDetection"})}),(0,n.jsx)(t.td,{children:"-scd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the scene change detection algorithm
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BitRateReduction"})}),(0,n.jsx)(t.td,{children:"-brr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables visual quality algorithms to reduce the output bitrate with minimal or no subjective visual quality impact.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ImproveSharpness"})}),(0,n.jsx)(t.td,{children:"-sharp"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"This is a visual quality knob that allows the use of adaptive quantization within the picture and enables visual quality algorithms that improve the sharpness of the background. This feature is only available for 4k and 8k resolutions
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"VideoUsabilityInfo"})}),(0,n.jsx)(t.td,{children:"-vid-info"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HighDynamicRangeInput"})}),(0,n.jsx)(t.td,{children:"-hdr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, signals HDR10 input in the output HEVC elementary bitstream and forces VideoUsabilityInfo to 1.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AccessUnitDelimiter"})}),(0,n.jsx)(t.td,{children:"-ua-delm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferingPeriod"})}),(0,n.jsx)(t.td,{children:"-pbuff"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PictureTiming"})}),(0,n.jsx)(t.td,{children:"-tpic"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON.
If 1, VideoUsabilityInfo should be also set to 1."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RegisteredUserData"})}),(0,n.jsx)(t.td,{children:"-reg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnregisteredUserData"})}),(0,n.jsx)(t.td,{children:"-unreg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RecoveryPoint"})}),(0,n.jsx)(t.td,{children:"-recovery-point"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TemporalId"})}),(0,n.jsx)(t.td,{children:"-temporal-id"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 = OFF
1 = Insert temporal ID in NAL units"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AsmType"})}),(0,n.jsx)(t.td,{children:"-asm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Assembly instruction set
(0: C Only, 1: Automatically select highest assembly instruction set supported)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LogicalProcessors"})}),(0,n.jsx)(t.td,{children:"-lp"}),(0,n.jsx)(t.td,{children:"[0, total number of logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FirstLogicalProcessor"})}),(0,n.jsx)(t.td,{children:"-flp"}),(0,n.jsx)(t.td,{children:"[0, the index of last logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The index of first logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetSocket"})}),(0,n.jsx)(t.td,{children:"-ss"}),(0,n.jsx)(t.td,{children:"[-1,1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"For dual socket systems, this can specify which socket the encoder runs on. Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ThreadCount"})}),(0,n.jsx)(t.td,{children:"-thread-count"}),(0,n.jsx)(t.td,{children:"[0,N]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of threads to get created and run, 0 = AUTO"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SwitchThreadsToRtPriority"})}),(0,n.jsx)(t.td,{children:"-rt"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables threads to real time priority, 0 = OFF, 1 = ON (only works on Linux)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FPSInVPS"})}),(0,n.jsx)(t.td,{children:"-fpsinvps"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the VPS timing info, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileRowCount"})}),(0,n.jsx)(t.td,{children:"-tile_row_cnt"}),(0,n.jsx)(t.td,{children:"[1,22]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the Row"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileColumnCount"})}),(0,n.jsx)(t.td,{children:"-tile_col_cnt"}),(0,n.jsx)(t.td,{children:"[1,20]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the column"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileSliceMode"})}),(0,n.jsx)(t.td,{children:"-tile_slice_mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Per slice per tile, only valid for multi-tile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnrestrictedMotionVector"})}),(0,n.jsx)(t.td,{children:"-umv"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables unrestricted motion vectors
0 = OFF(motion vectors are constrained within frame or tile boundary)
1 = ON.
For MCTS support, set -umv 0 with valid TileRowCount and TileColumnCount"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxCLL"})}),(0,n.jsx)(t.td,{children:"-max-cll"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum content light level (MaxCLL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxFALL"})}),(0,n.jsx)(t.td,{children:"-max-fall"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum Frame Average light level (MaxFALL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseMasterDisplay"})}),(0,n.jsx)(t.td,{children:"-use-master-display"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables the MasterDisplayColorVolume
0 = OFF
1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MasterDisplay"})}),(0,n.jsx)(t.td,{children:"-master-display"}),(0,n.jsx)(t.td,{children:"For R, G, B and whitepoint [0, 2^16-1]. For max, min luminance [0, 2^32-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SMPTE ST 2086 mastering display color volume SEI info, specified as a string. The string format is \u201cG(%hu,%hu)B(%hu,%hu)R(%hu,% hu)WP(%hu,%hu)L(%u,%u)\u201d where %hu are unsigned 16bit integers and %u are unsigned 32bit integers. The SEI includes X, Y display primaries for RGB channels and white point (WP) in units of 0.00002 and max, min luminance (L) values in units of 0.0001 candela per meter square. Applicable for HDR content. Example for a P3D65 1000-nits monitor,G(13250,34500)B(7500,3 000)R(34000,16000)WP(15635,16 450)L(10000000,1)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionRpuFile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-rpu"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to the file containing Dolby Vision RPU metadata"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionProfile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-profile"}),(0,n.jsx)(t.td,{children:"8.1 or 81"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Generate bitstreams confirming to the specified Dolby Vision profile 8.1. When specified, enables HighDynamicRangeInput automatically. Applicable only for 10-bit input content. MasterDisplay should be set for using dolby vision profile 81. Pass the dynamic metadata through DolbyVisionRpuFile option"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"NaluFile"})}),(0,n.jsx)(t.td,{children:"-nalu-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Path to the file containing CEA 608/708 metadata. Text file should contain the userSEI in POC order as per below format: ",(0,n.jsx)(t.code,{children:"/"}),". Currently only PREFIX_SEI messages are supported"]})]})]})]})]})}function j(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>d});r(6540);var n=r(8215);const s={tabItem:"tabItem_Ymn6"};var i=r(4848);function d(e){let{children:t,hidden:r,className:d}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,d),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),s=r(8215),i=r(3104),d=r(6347),l=r(205),c=r(7485),h=r(1682),o=r(9466);function a(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return a(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,h.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function j(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:r}=e;const s=(0,d.W6)(),i=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,c.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(s.location.search);t.set(i,e),s.replace({...s.location,search:t.toString()})}),[i,s])]}function p(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,i=x(e),[d,c]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[h,a]=u({queryString:r,groupId:s}),[p,m]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,i]=(0,o.Dv)(r);return[s,(0,n.useCallback)((e=>{r&&i.set(e)}),[r,i])]}({groupId:s}),g=(()=>{const e=h??p;return j({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&c(g)}),[g]);return{selectedValue:d,selectValue:(0,n.useCallback)((e=>{if(!j({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);c(e),a(e),m(e)}),[a,m,i]),tabValues:i}}var m=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b(e){let{className:t,block:r,selectedValue:n,selectValue:d,tabValues:l}=e;const c=[],{blockElementScrollPositionUntilNextRender:h}=(0,i.a_)(),o=e=>{const t=e.currentTarget,r=c.indexOf(t),s=l[r].value;s!==n&&(h(t),d(s))},a=e=>{let t=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:i}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>c.push(e),onKeyDown:a,onClick:o,...i,className:(0,s.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function v(e){let{lazy:t,children:r,selectedValue:s}=e;const i=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=p(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...e,...t}),(0,f.jsx)(v,{...e,...t})]})}function w(e){const t=(0,m.A)();return(0,f.jsx)(y,{...e,children:a(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var n=r(6540);const s={},i=n.createContext(s);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8270],{9094:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>j,frontMatter:()=>l,metadata:()=>h,toc:()=>a});var n=r(4848),s=r(8453),i=r(1470),d=r(9365);const l={title:"SVT-HEVC",sidebar_position:10},c="SVT-HEVC",h={id:"encoders/SVT-HEVC",title:"SVT-HEVC",description:'SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the "Scalable Video Technology" project lineup by Intel.',source:"@site/docs/encoders/SVT-HEVC.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-HEVC",permalink:"/docs/encoders/SVT-HEVC",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-HEVC.mdx",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"SVT-HEVC",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"SVT-VP9",permalink:"/docs/encoders/SVT-VP9"},next:{title:"Kvazaar",permalink:"/docs/encoders/Kvazaar"}},o={},a=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Normal usage",id:"normal-usage",level:3},{value:"Encoding HDR",id:"encoding-hdr",level:3},{value:"Encoding with Dolby Vision",id:"encoding-with-dolby-vision",level:3},{value:"List of all configuration parameters",id:"list-of-all-configuration-parameters",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"svt-hevc",children:"SVT-HEVC"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC",children:"SVT-HEVC"})," (Scalable Video Technology for HEVC) is an open source ",(0,n.jsx)(t.a,{href:"/docs/video/HEVC",children:"H.265 / HEVC"})," software encoder developed by Intel made specifically to ",(0,n.jsx)(t.strong,{children:"only support x86"}),'. As the name suggests, it is part of the "',(0,n.jsx)(t.a,{href:"https://www.intel.com/content/www/us/en/developer/articles/technical/scalable-video-technology.html",children:"Scalable Video Technology"}),'" project lineup by Intel.']}),"\n",(0,n.jsxs)(t.p,{children:["The encoder is written in C with some parts in Assembly and licensed under ",(0,n.jsx)(t.strong,{children:"BSD+Patent"}),"."]}),"\n",(0,n.jsx)(t.admonition,{type:"info",children:(0,n.jsxs)(t.p,{children:["It is recommended to use ",(0,n.jsx)(t.a,{href:"/docs/encoders/x265",children:"x265"})," instead as it performs much better in quality."]})}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["SVT-HEVC is only available in FFmpeg when it is compiled with their provided ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/tree/master/ffmpeg_plugin",children:"plugin"}),". Otherwise it is via ",(0,n.jsx)(t.code,{children:"libsvt_hevc"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=libsvt_hevc"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"SVT-HEVC supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(i.A,{children:[(0,n.jsxs)(d.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsx)(t.p,{children:"To build SVT-AV1 from source, first clone the SVT-HEVC repository & enter the build directory."}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Clone SVT-HEVC and cd"',children:"git clone https://github.com/OpenVisualCloud/SVT-HEVC\ncd SVT-HEVC/Build/linux\n"})}),(0,n.jsxs)(t.p,{children:["In the directory, simply run ",(0,n.jsx)(t.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.5.1 or higher and either GCC or Clang. It is recommended to use Clang when building SVT-HEVC."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Statically build release"',children:"./build.sh static release\n"})}),(0,n.jsxs)(t.p,{children:["The compiled binaries will be in the ",(0,n.jsx)(t.code,{children:"Bin/Release"})," directory."]})]}),(0,n.jsx)(d.A,{value:"windows",label:"Windows",children:(0,n.jsxs)(t.p,{children:["To be filled. If you believe you can help, see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"}),"."]})})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.h3,{id:"normal-usage",children:"Normal usage"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Simple Y4M input with QP 20, and raw 265 bitstream output"',children:"SvtHevcEncApp -i input.y4m -q 20 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Preset 4, CRF 20, Y4M input"',children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="FFmpeg piping"',children:"ffmpeg -v error -i input.mkv -f yuv4mpegpipe -strict -1 - | SvtHevcEncApp -i stdin -q 20 -encMode 4 -b output.265\n"})}),"\n",(0,n.jsx)(t.admonition,{type:"danger",children:(0,n.jsxs)(t.p,{children:["SVT-HEVC currently does not have the ability to detect EOF (End of File) within Y4M pipes (",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/issues/634#issuecomment-1434911798",children:"issue"}),"), so the encode process will go on indefinitely until your drive is full.\nThe only known solution is to manually set the number of frames to encode via ",(0,n.jsx)(t.code,{children:"-n"}),"."]})}),"\n",(0,n.jsx)(t.h3,{id:"encoding-hdr",children:"Encoding HDR"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h3,{id:"encoding-with-dolby-vision",children:"Encoding with Dolby Vision"}),"\n",(0,n.jsx)(t.p,{children:"The ability to encode with Dolby Vision via RPU file is surprisingly present within SVT-HEVC, although it is limited to Profile 8.1."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"SvtHevcEncApp -i input.y4m -q 20 -encMode 4 -hdr -dolby-vision-rpu RPUFile.bin -dolby-vision-profile 81 -max-cll XXX -max-fall XXX -master-display G(0.265,0.690)B(0.150,0.060)R(0.680,0.320)WP(0.3127,0.3290)L(1000,0.0100) -b output.265\n"})}),"\n",(0,n.jsx)(t.p,{children:"Remember sure to adjust the HDR metadata accordingly."}),"\n",(0,n.jsx)(t.h2,{id:"list-of-all-configuration-parameters",children:"List of all configuration parameters"}),"\n",(0,n.jsxs)(t.p,{children:['As with every SVT line-up, they redirect you to read their "User Guide" instead of presenting what each and every parameter do in the ',(0,n.jsx)(t.code,{children:"--help"})," page.\nThe table below is an exact copy from their user guide taken from ",(0,n.jsx)(t.a,{href:"https://github.com/OpenVisualCloud/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md",children:"GitHub"})," for backup purposes. Feel free to read them."]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Encoder Parameter as shown in the configuration file"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Command Line parameter"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Range"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Default"})}),(0,n.jsx)(t.th,{children:(0,n.jsx)(t.strong,{children:"Description"})})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Channel Number"})}),(0,n.jsx)(t.td,{children:"-nch"}),(0,n.jsx)(t.td,{children:"[1 - 6]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Number of encode instances"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConfigFile"})}),(0,n.jsx)(t.td,{children:"-c"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Configuration file path"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InputFile"})}),(0,n.jsx)(t.td,{children:"-i"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Input file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"StreamFile"})}),(0,n.jsx)(t.td,{children:"-b"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Output bitstream file path and name"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ErrorFile"})}),(0,n.jsx)(t.td,{children:"-errlog"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"stderr"}),(0,n.jsx)(t.td,{children:"Error log displaying configuration or encode errors"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ReconFile"})}),(0,n.jsx)(t.td,{children:"-o"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Output reconstructed yuv used for debug purposes. ",(0,n.jsx)(t.strong,{children:"Note:"})," using this feature will affect the speed of the encoder significantly. This should only be used for debugging purposes."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseQpFile"})}),(0,n.jsx)(t.td,{children:"-use-q-file"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, overwrite the picture qp assignment using qp values in QpFile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QpFile"})}),(0,n.jsx)(t.td,{children:"-qp-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to qp file"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SegmentOvFile"})}),(0,n.jsx)(t.td,{children:"-segment-ov-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to segment override file which will allow for sharpness improvement and bit rate reduction on a per segment basis. Refer to config/SVTSegmentOvFile.txt for details."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderMode"})}),(0,n.jsx)(t.td,{children:"-encMode"}),(0,n.jsx)(t.td,{children:"[0 - 11]"}),(0,n.jsx)(t.td,{children:"7"}),(0,n.jsx)(t.td,{children:"A preset defining the quality vs density tradeoff point that the encoding is to be performed at. (e.g. 0 is the highest quality mode, 11 is the highest density mode). Section 3.4 outlines the preset availability per resolution"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderBitDepth"})}),(0,n.jsx)(t.td,{children:"-bit-depth"}),(0,n.jsx)(t.td,{children:"[8, 10]"}),(0,n.jsx)(t.td,{children:"8"}),(0,n.jsx)(t.td,{children:"Specifies the bit depth of input video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"EncoderColorFormat"})}),(0,n.jsx)(t.td,{children:"-color-format"}),(0,n.jsx)(t.td,{children:"[1, 2, 3]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Specifies the chroma subsampling of input video(1: 420, 2: 422, 3: 444)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"CompressedTenBitFormat"})}),(0,n.jsx)(t.td,{children:"-compressed-ten-bit-format"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Offline packing of the 2bits: requires two bits packed input (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceWidth"})}),(0,n.jsx)(t.td,{children:"-w"}),(0,n.jsx)(t.td,{children:"[64 - 8192]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SourceHeight"})}),(0,n.jsx)(t.td,{children:"-h"}),(0,n.jsx)(t.td,{children:"[64 - 4320]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Input source height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameToBeEncoded"})}),(0,n.jsx)(t.td,{children:"-n"}),(0,n.jsx)(t.td,{children:"[0 - 2^31 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Number of frames to be encoded, if number of frames is > number of frames in file, the encoder will loop to the beginning and continue the encode. 0 encodes the full clip."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferedInput"})}),(0,n.jsx)(t.td,{children:"-nb"}),(0,n.jsx)(t.td,{children:"[-1, 1 to 2^31 -1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"number of frames to preload to the RAM before the start of the encode. If -nb = 100 and \u2013n 1000 --\x3e the encoder will encode the first 100 frames of the video 10 times. Use -1 to not preload any frames. This parameter is best used to eliminate the impact of disk reading on encoding speed and is most noticeable when frames sizes are 4k or 8k. Because frames are repeated when value specified (-nb) is less than the total frame count (-n), you should expect bitstreams to be different."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Profile"})}),(0,n.jsx)(t.td,{children:"-profile"}),(0,n.jsx)(t.td,{children:"[1,2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"1: Main, 2: Main 10"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Tier"})}),(0,n.jsx)(t.td,{children:"-tier"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0: Main, 1: High"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Level"})}),(0,n.jsx)(t.td,{children:"-level"}),(0,n.jsx)(t.td,{children:"[1, 2, 2.1,3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 to 6.2 [0 for auto determine Level]"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRate"})}),(0,n.jsx)(t.td,{children:"-fps"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"If the number is less than 1000, the input frame rate is an integer number between 1 and 60, else the input number is in Q16 format (shifted by 16 bits) [Max allowed is 240 fps]. If FrameRateNumerator and FrameRateDenominator are both !=0 the encoder will ignore this parameter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateNumerator"})}),(0,n.jsx)(t.td,{children:"-fps-num"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate numerator e.g. 6000 When zero, the encoder will use \u2013fps if FrameRateDenominator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FrameRateDenominator"})}),(0,n.jsx)(t.td,{children:"-fps-denom"}),(0,n.jsx)(t.td,{children:"[0 - 2^64 -1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Frame rate denominator e.g. 100 When zero, the encoder will use \u2013fps if FrameRateNumerator is also zero, otherwise an error is returned"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"Injector"})}),(0,n.jsx)(t.td,{children:"-inj"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enable injection of input frames at the specified framerate (0: OFF, 1: ON)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InjectorFrameRate"})}),(0,n.jsx)(t.td,{children:"-inj-frm-rt"}),(0,n.jsx)(t.td,{children:"[1 - 240]"}),(0,n.jsx)(t.td,{children:"60"}),(0,n.jsx)(t.td,{children:"Frame Rate used for the injector. Recommended to match the encoder speed."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SpeedControlFlag"})}),(0,n.jsx)(t.td,{children:"-speed-ctrl"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables the Speed Control functionality to achieve the real-time encoding speed defined by \u2013fps. When this parameter is set to 1 it forces \u2013inj to be 1 and -inj-frm-rt to be set to \u2013fps."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"InterlacedVideo"})}),(0,n.jsx)(t.td,{children:"-interlaced-video"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : encoder will signal interlaced signal in the stream
0 : assumes progressive signal"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SeparateFields"})}),(0,n.jsx)(t.td,{children:"-separate-fields"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"1 : Interlaced input, application will separate top and bottom fields and encode it as progressive.
0 : Treat video as progressive video"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HierarchicalLevels"})}),(0,n.jsx)(t.td,{children:"-hierarchical-levels"}),(0,n.jsx)(t.td,{children:"[0 \u2013 3]"}),(0,n.jsx)(t.td,{children:"3"}),(0,n.jsx)(t.td,{children:"0 : Flat
1: 2-Level Hierarchy
2: 3-Level Hierarchy
3: 4-Level Hierarchy
Minigop Size = (2^HierarchicalLevels)
(e.g. 3 == > 7B pyramid, 2 ==> 3B Pyramid)
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BaseLayerSwitchMode"})}),(0,n.jsx)(t.td,{children:"-base-layer-switch-mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : Use B-frames in the base layer pointing to the same past picture
1 : Use P-frames in the base layer
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PredStructure"})}),(0,n.jsx)(t.td,{children:"-pred-struct"}),(0,n.jsx)(t.td,{children:"[0 \u2013 2]"}),(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"0: Low Delay P
1: Low Delay B
2: Random Access
Refer to Appendix A.1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraPeriod"})}),(0,n.jsx)(t.td,{children:"-intra-period"}),(0,n.jsx)(t.td,{children:"[-2 - 255]"}),(0,n.jsx)(t.td,{children:"-2"}),(0,n.jsx)(t.td,{children:"Distance between Intra Frame inserted.
-1 denotes no intra update.
-2 denotes auto."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"IntraRefreshType"})}),(0,n.jsx)(t.td,{children:"-irefresh-type"}),(0,n.jsx)(t.td,{children:"[-1,N]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"-1: CRA (Open GOP)
>=0: IDR (Closed GOP, N is headers insertion interval, 0 supported if CQP, >=0 supported if VBR)
Refer to Appendix A.3"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"QP"})}),(0,n.jsx)(t.td,{children:"-q"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"32"}),(0,n.jsx)(t.td,{children:"Initial quantization parameter for the Intra pictures used when RateControlMode 0 (CQP)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LoopFilterDisable"})}),(0,n.jsx)(t.td,{children:"-dlf"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1 disables the Deblocking Loop Filtering"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SAO"})}),(0,n.jsx)(t.td,{children:"-sao"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"When set to 0 the encoder will not use the Sample Adaptive Filter"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseDefaultMeHme"})}),(0,n.jsx)(t.td,{children:"-use-default-me-hme"}),(0,n.jsx)(t.td,{children:"[0, 1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 : Overwrite Default ME HME parameters
1 : Use default ME HME parameters, dependent on width and height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HME"})}),(0,n.jsx)(t.td,{children:"-hme"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enable HME, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaWidth"})}),(0,n.jsx)(t.td,{children:"-search-w"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area width"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SearchAreaHeight"})}),(0,n.jsx)(t.td,{children:"-search-h"}),(0,n.jsx)(t.td,{children:"[1 - 256]"}),(0,n.jsx)(t.td,{children:"Depends on input resolution"}),(0,n.jsx)(t.td,{children:"Motion vector search area height"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ConstrainedIntra"})}),(0,n.jsx)(t.td,{children:"-constrd-intra"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Allow the use of Constrained Intra, when enabled, this features yields to sending two PPSs in the HEVC Elementary streams
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RateControlMode"})}),(0,n.jsx)(t.td,{children:"-rc"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"0 : CQP , 1 : VBR"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetBitRate"})}),(0,n.jsx)(t.td,{children:"-tbr"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"7000000"}),(0,n.jsx)(t.td,{children:"Target bitrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvMaxrate"})}),(0,n.jsx)(t.td,{children:"-vbv-maxrate"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBVMaxrate in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufsize"})}),(0,n.jsx)(t.td,{children:"-vbv-bufsize"}),(0,n.jsx)(t.td,{children:"Any Number"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"VBV BufferSize in bits / second. Only used when RateControlMode is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"vbvBufInit"})}),(0,n.jsx)(t.td,{children:"-vbv-init"}),(0,n.jsx)(t.td,{children:"[0 - 100]"}),(0,n.jsx)(t.td,{children:"90"}),(0,n.jsx)(t.td,{children:"Sets the initial percentage size that the VBV buffer is filled to"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"hrdFlag"})}),(0,n.jsx)(t.td,{children:"-hrd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["Sets the HRD (Hypothetical Reference Decoder) Flag in the encoded stream, 0 = OFF, 1 = ON When",(0,n.jsx)("br",{}),"hrdFlag is set to 1, vbvMaxrate and vbvBufsize must be greater than 0"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxQpAllowed"})}),(0,n.jsx)(t.td,{children:"-max-qp"}),(0,n.jsx)(t.td,{children:"[0 - 51]"}),(0,n.jsx)(t.td,{children:"48"}),(0,n.jsx)(t.td,{children:"Maximum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be >= MinQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MinQpAllowed"})}),(0,n.jsx)(t.td,{children:"-min-qp"}),(0,n.jsx)(t.td,{children:"[0 - 50]"}),(0,n.jsx)(t.td,{children:"10"}),(0,n.jsx)(t.td,{children:"Minimum QP value allowed for rate control use. Only used when RateControlMode is set to 1. Has to be < MaxQpAllowed"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LookAheadDistance"})}),(0,n.jsx)(t.td,{children:"-lad"}),(0,n.jsx)(t.td,{children:"[0 - 250]"}),(0,n.jsx)(t.td,{children:"Depending on BRC mode"}),(0,n.jsx)(t.td,{children:"When RateControlMode is set to 1 it's best to set this parameter to be equal to the Intra period value (such is the default set by the encoder). When CQP is chosen, then a (2 * minigopsize +1) look ahead is recommended."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SceneChangeDetection"})}),(0,n.jsx)(t.td,{children:"-scd"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the scene change detection algorithm
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BitRateReduction"})}),(0,n.jsx)(t.td,{children:"-brr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables visual quality algorithms to reduce the output bitrate with minimal or no subjective visual quality impact.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ImproveSharpness"})}),(0,n.jsx)(t.td,{children:"-sharp"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"This is a visual quality knob that allows the use of adaptive quantization within the picture and enables visual quality algorithms that improve the sharpness of the background. This feature is only available for 4k and 8k resolutions
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"VideoUsabilityInfo"})}),(0,n.jsx)(t.td,{children:"-vid-info"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"HighDynamicRangeInput"})}),(0,n.jsx)(t.td,{children:"-hdr"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"When set to 1, signals HDR10 input in the output HEVC elementary bitstream and forces VideoUsabilityInfo to 1.
0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AccessUnitDelimiter"})}),(0,n.jsx)(t.td,{children:"-ua-delm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"BufferingPeriod"})}),(0,n.jsx)(t.td,{children:"-pbuff"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"PictureTiming"})}),(0,n.jsx)(t.td,{children:"-tpic"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON.
If 1, VideoUsabilityInfo should be also set to 1."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RegisteredUserData"})}),(0,n.jsx)(t.td,{children:"-reg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnregisteredUserData"})}),(0,n.jsx)(t.td,{children:"-unreg-user-data"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"RecoveryPoint"})}),(0,n.jsx)(t.td,{children:"-recovery-point"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SEI message, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TemporalId"})}),(0,n.jsx)(t.td,{children:"-temporal-id"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"0 = OFF
1 = Insert temporal ID in NAL units"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"AsmType"})}),(0,n.jsx)(t.td,{children:"-asm"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Assembly instruction set
(0: C Only, 1: Automatically select highest assembly instruction set supported)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"LogicalProcessors"})}),(0,n.jsx)(t.td,{children:"-lp"}),(0,n.jsx)(t.td,{children:"[0, total number of logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FirstLogicalProcessor"})}),(0,n.jsx)(t.td,{children:"-flp"}),(0,n.jsx)(t.td,{children:"[0, the index of last logical processor]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The index of first logical processor which encoder threads run on.Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TargetSocket"})}),(0,n.jsx)(t.td,{children:"-ss"}),(0,n.jsx)(t.td,{children:"[-1,1]"}),(0,n.jsx)(t.td,{children:"-1"}),(0,n.jsx)(t.td,{children:"For dual socket systems, this can specify which socket the encoder runs on. Refer to Appendix A.2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"ThreadCount"})}),(0,n.jsx)(t.td,{children:"-thread-count"}),(0,n.jsx)(t.td,{children:"[0,N]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The number of threads to get created and run, 0 = AUTO"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"SwitchThreadsToRtPriority"})}),(0,n.jsx)(t.td,{children:"-rt"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables threads to real time priority, 0 = OFF, 1 = ON (only works on Linux)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"FPSInVPS"})}),(0,n.jsx)(t.td,{children:"-fpsinvps"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables the VPS timing info, 0 = OFF, 1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileRowCount"})}),(0,n.jsx)(t.td,{children:"-tile_row_cnt"}),(0,n.jsx)(t.td,{children:"[1,22]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the Row"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileColumnCount"})}),(0,n.jsx)(t.td,{children:"-tile_col_cnt"}),(0,n.jsx)(t.td,{children:"[1,20]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Tile count in the column"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"TileSliceMode"})}),(0,n.jsx)(t.td,{children:"-tile_slice_mode"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Per slice per tile, only valid for multi-tile"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UnrestrictedMotionVector"})}),(0,n.jsx)(t.td,{children:"-umv"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"Enables or disables unrestricted motion vectors
0 = OFF(motion vectors are constrained within frame or tile boundary)
1 = ON.
For MCTS support, set -umv 0 with valid TileRowCount and TileColumnCount"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxCLL"})}),(0,n.jsx)(t.td,{children:"-max-cll"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum content light level (MaxCLL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MaxFALL"})}),(0,n.jsx)(t.td,{children:"-max-fall"}),(0,n.jsx)(t.td,{children:"[0 , 2^16-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Maximum Frame Average light level (MaxFALL) as required by the Consumer Electronics Association 861.3 specification. Applicable for HDR content. If specified, signaled only when HighDynamicRangeInput is set to 1"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"UseMasterDisplay"})}),(0,n.jsx)(t.td,{children:"-use-master-display"}),(0,n.jsx)(t.td,{children:"[0,1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Enables or disables the MasterDisplayColorVolume
0 = OFF
1 = ON"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"MasterDisplay"})}),(0,n.jsx)(t.td,{children:"-master-display"}),(0,n.jsx)(t.td,{children:"For R, G, B and whitepoint [0, 2^16-1]. For max, min luminance [0, 2^32-1]"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"SMPTE ST 2086 mastering display color volume SEI info, specified as a string. The string format is \u201cG(%hu,%hu)B(%hu,%hu)R(%hu,% hu)WP(%hu,%hu)L(%u,%u)\u201d where %hu are unsigned 16bit integers and %u are unsigned 32bit integers. The SEI includes X, Y display primaries for RGB channels and white point (WP) in units of 0.00002 and max, min luminance (L) values in units of 0.0001 candela per meter square. Applicable for HDR content. Example for a P3D65 1000-nits monitor,G(13250,34500)B(7500,3 000)R(34000,16000)WP(15635,16 450)L(10000000,1)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionRpuFile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-rpu"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsx)(t.td,{children:"Path to the file containing Dolby Vision RPU metadata"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"DolbyVisionProfile"})}),(0,n.jsx)(t.td,{children:"-dolby-vision-profile"}),(0,n.jsx)(t.td,{children:"8.1 or 81"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Generate bitstreams confirming to the specified Dolby Vision profile 8.1. When specified, enables HighDynamicRangeInput automatically. Applicable only for 10-bit input content. MasterDisplay should be set for using dolby vision profile 81. Pass the dynamic metadata through DolbyVisionRpuFile option"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.strong,{children:"NaluFile"})}),(0,n.jsx)(t.td,{children:"-nalu-file"}),(0,n.jsx)(t.td,{children:"any string"}),(0,n.jsx)(t.td,{children:"null"}),(0,n.jsxs)(t.td,{children:["Path to the file containing CEA 608/708 metadata. Text file should contain the userSEI in POC order as per below format: ",(0,n.jsx)(t.code,{children:"/"}),". Currently only PREFIX_SEI messages are supported"]})]})]})]})]})}function j(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(x,{...e})}):x(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>d});r(6540);var n=r(4164);const s={tabItem:"tabItem_Ymn6"};var i=r(4848);function d(e){let{children:t,hidden:r,className:d}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,d),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),s=r(4164),i=r(3104),d=r(6347),l=r(205),c=r(7485),h=r(1682),o=r(9466);function a(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return a(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:s}}=e;return{value:t,label:r,attributes:n,default:s}}))}(r);return function(e){const t=(0,h.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function j(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function u(e){let{queryString:t=!1,groupId:r}=e;const s=(0,d.W6)(),i=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,c.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(s.location.search);t.set(i,e),s.replace({...s.location,search:t.toString()})}),[i,s])]}function p(e){const{defaultValue:t,queryString:r=!1,groupId:s}=e,i=x(e),[d,c]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[h,a]=u({queryString:r,groupId:s}),[p,m]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,i]=(0,o.Dv)(r);return[s,(0,n.useCallback)((e=>{r&&i.set(e)}),[r,i])]}({groupId:s}),g=(()=>{const e=h??p;return j({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&c(g)}),[g]);return{selectedValue:d,selectValue:(0,n.useCallback)((e=>{if(!j({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);c(e),a(e),m(e)}),[a,m,i]),tabValues:i}}var m=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b(e){let{className:t,block:r,selectedValue:n,selectValue:d,tabValues:l}=e;const c=[],{blockElementScrollPositionUntilNextRender:h}=(0,i.a_)(),o=e=>{const t=e.currentTarget,r=c.indexOf(t),s=l[r].value;s!==n&&(h(t),d(s))},a=e=>{let t=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=c.indexOf(e.currentTarget)+1;t=c[r]??c[0];break}case"ArrowLeft":{const r=c.indexOf(e.currentTarget)-1;t=c[r]??c[c.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:i}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>c.push(e),onKeyDown:a,onClick:o,...i,className:(0,s.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function v(e){let{lazy:t,children:r,selectedValue:s}=e;const i=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=p(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...t,...e}),(0,f.jsx)(v,{...t,...e})]})}function w(e){const t=(0,m.A)();return(0,f.jsx)(y,{...e,children:a(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var n=r(6540);const s={},i=n.createContext(s);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.3fad96fa.js b/assets/js/c4f5d8e4.3fad96fa.js new file mode 100644 index 000000000..9195768ea --- /dev/null +++ b/assets/js/c4f5d8e4.3fad96fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2634],{1459:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var s=n(4164),r=n(8774),i=n(4586),o=n(5476);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var a=n(4848);function l(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,s.A)("hero hero--primary",c.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:c.buttons,children:(0,a.jsx)(r.A,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue",children:"Start learning!"})})]})})}function d(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)(o.A,{title:`${e.title}`,description:`${e.tagline}`,children:(0,a.jsx)(l,{})})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.6a7bb4c1.js b/assets/js/c4f5d8e4.6a7bb4c1.js deleted file mode 100644 index 19b7bc66d..000000000 --- a/assets/js/c4f5d8e4.6a7bb4c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2634],{1459:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var s=n(53),r=n(8774),i=n(4586),o=n(5476);const c={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};var a=n(4848);function l(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,s.A)("hero hero--primary",c.heroBanner),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:c.buttons,children:(0,a.jsx)(r.A,{className:"button button--secondary button--lg",to:"/docs/introduction/prologue",children:"Start learning!"})})]})})}function d(){const{siteConfig:e}=(0,i.A)();return(0,a.jsx)(o.A,{title:`${e.title}`,description:`${e.tagline}`,children:(0,a.jsx)(l,{})})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.d07e0ef9.js b/assets/js/ccc49370.e8ad5b4a.js similarity index 97% rename from assets/js/ccc49370.d07e0ef9.js rename to assets/js/ccc49370.e8ad5b4a.js index 1ffdb0cc8..53fc3f6fd 100644 --- a/assets/js/ccc49370.d07e0ef9.js +++ b/assets/js/ccc49370.e8ad5b4a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var i=n(8215),a=n(1213),o=n(7559),r=n(7131),s=n(6535),l=n(4651),c=n(1312),d=n(9022),u=n(4848);function m(e){const{nextItem:t,prevItem:n}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:t}=(0,r.e)(),{title:n,description:i,date:o,tags:s,authors:l,frontMatter:c}=t,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:n,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:o}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),s.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:s.map((e=>e.label)).join(",")})]})}var h=n(5260),f=n(6676);function p(){const e=(0,f.J)();return(0,u.jsx)(h.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var v=n(7763),x=n(996);function b(e){let{sidebar:t,children:n}=e;const{metadata:i,toc:a}=(0,r.e)(),{nextItem:o,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:p}=d;return(0,u.jsxs)(s.A,{sidebar:t,toc:!h&&a.length>0?(0,u.jsx)(v.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:p}):void 0,children:[g&&(0,u.jsx)(x.A,{}),(0,u.jsx)(l.A,{children:n}),(o||c)&&(0,u.jsx)(m,{nextItem:o,prevItem:c})]})}function j(e){const t=e.content;return(0,u.jsx)(r.i,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(p,{}),(0,u.jsx)(b,{sidebar:e.sidebar,children:(0,u.jsx)(t,{})})]})})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(8215),a=n(5195);const o={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=n(4848);const s="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,r.jsx)("div",{className:(0,i.A)(o.tableOfContents,"thin-scrollbar",t),children:(0,r.jsx)(a.A,{...n,linkClassName:s,linkActiveClassName:l})})}},5195:(e,t,n)=>{n.d(t,{A:()=>f});var i=n(6540),a=n(6342);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const i=n.slice(2,e.level);e.parentIndex=Math.max(...i),n[e.level]=t}));const i=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):i.push(a)})),i}function r(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:i}=e;return t.flatMap((e=>{const t=r({toc:e.children,minHeadingLevel:n,maxHeadingLevel:i});return function(e){return e.level>=n&&e.level<=i}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function l(e,t){let{anchorTopOffset:n}=t;const i=e.find((e=>s(e).top>=n));if(i){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,i.useRef)(void 0),n=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const i=[];for(let a=t;a<=n;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=l(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}var u=n(8774),m=n(4848);function g(e){let{toc:t,className:n,linkClassName:i,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:n,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.p)(),p=c??f.tableOfContents.minHeadingLevel,v=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(s&&l)return{linkClassName:s,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[s,l,p,v])),(0,m.jsx)(h,{toc:x,className:n,linkClassName:s,...g})}},996:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var i=n(8215),a=n(1312),o=n(5260),r=n(4848);function s(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,r.jsx)(o.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),u=n(7293);function m(e){let{className:t}=e;return(0,r.jsx)(u.A,{type:"caution",title:(0,r.jsx)(s,{}),className:(0,i.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(l,{})})}function g(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(m,{...e})]})}},6676:(e,t,n)=>{n.d(t,{k:()=>d,J:()=>u});var i=n(6025),a=n(4586),o=n(6803);var r=n(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(m);return{author:1===t.length?t[0]:t}}function c(e,t,n){return e?{image:g({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${n}`})}:{}}function d(e){const{siteConfig:t}=(0,a.A)(),{withBaseUrl:n}=(0,i.h)(),{metadata:{blogDescription:o,blogTitle:r,permalink:d}}=e,u=`${t.url}${d}`;return{"@context":"https://schema.org","@type":"Blog","@id":u,mainEntityOfPage:u,headline:r,description:o,blogPost:e.items.map((e=>function(e,t,n){const{assets:i,frontMatter:a,metadata:o}=e,{date:r,title:d,description:u,lastUpdatedAt:m}=o,g=i.image??a.image,h=a.keywords??[],f=`${t.url}${o.permalink}`,p=m?s(m):void 0;return{"@type":"BlogPosting","@id":f,mainEntityOfPage:f,url:f,headline:d,name:d,description:u,datePublished:r,...p?{dateModified:p}:{},...l(o.authors),...c(g,n,d),...h?{keywords:h}:{}}}(e.content,t,n)))}}function u(){const e=function(){const e=(0,o.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:n}=(0,r.e)(),{siteConfig:d}=(0,a.A)(),{withBaseUrl:u}=(0,i.h)(),{date:m,title:g,description:h,frontMatter:f,lastUpdatedAt:p}=n,v=t.image??f.image,x=f.keywords??[],b=p?s(p):void 0,j=`${d.url}${n.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:g,name:g,description:h,datePublished:m,...b?{dateModified:b}:{},...l(n.authors),...c(v,u,g),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${d.url}${e.blogBasePath}`,name:e.blogTitle}}}function m(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function g(e){let{imageUrl:t,caption:n}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:n}}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var i=n(4164),a=n(1213),o=n(7559),r=n(7131),s=n(6535),l=n(4651),c=n(1312),d=n(9022),u=n(4848);function m(e){const{nextItem:t,prevItem:n}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:t}=(0,r.e)(),{title:n,description:i,date:o,tags:s,authors:l,frontMatter:c}=t,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:n,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:o}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),s.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:s.map((e=>e.label)).join(",")})]})}var h=n(5260),f=n(6676);function p(){const e=(0,f.J)();return(0,u.jsx)(h.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var v=n(7763),x=n(996);function b(e){let{sidebar:t,children:n}=e;const{metadata:i,toc:a}=(0,r.e)(),{nextItem:o,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:p}=d;return(0,u.jsxs)(s.A,{sidebar:t,toc:!h&&a.length>0?(0,u.jsx)(v.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:p}):void 0,children:[g&&(0,u.jsx)(x.A,{}),(0,u.jsx)(l.A,{children:n}),(o||c)&&(0,u.jsx)(m,{nextItem:o,prevItem:c})]})}function j(e){const t=e.content;return(0,u.jsx)(r.i,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(p,{}),(0,u.jsx)(b,{sidebar:e.sidebar,children:(0,u.jsx)(t,{})})]})})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),a=n(5195);const o={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=n(4848);const s="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,r.jsx)("div",{className:(0,i.A)(o.tableOfContents,"thin-scrollbar",t),children:(0,r.jsx)(a.A,{...n,linkClassName:s,linkActiveClassName:l})})}},5195:(e,t,n)=>{n.d(t,{A:()=>f});var i=n(6540),a=n(6342);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const i=n.slice(2,e.level);e.parentIndex=Math.max(...i),n[e.level]=t}));const i=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):i.push(a)})),i}function r(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:i}=e;return t.flatMap((e=>{const t=r({toc:e.children,minHeadingLevel:n,maxHeadingLevel:i});return function(e){return e.level>=n&&e.level<=i}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function l(e,t){let{anchorTopOffset:n}=t;const i=e.find((e=>s(e).top>=n));if(i){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,i.useRef)(void 0),n=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const i=[];for(let a=t;a<=n;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=l(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}var u=n(8774),m=n(4848);function g(e){let{toc:t,className:n,linkClassName:i,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:n,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.p)(),p=c??f.tableOfContents.minHeadingLevel,v=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(s&&l)return{linkClassName:s,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[s,l,p,v])),(0,m.jsx)(h,{toc:x,className:n,linkClassName:s,...g})}},996:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var i=n(4164),a=n(1312),o=n(5260),r=n(4848);function s(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,r.jsx)(o.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(7559),u=n(7293);function m(e){let{className:t}=e;return(0,r.jsx)(u.A,{type:"caution",title:(0,r.jsx)(s,{}),className:(0,i.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(l,{})})}function g(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(m,{...e})]})}},6676:(e,t,n)=>{n.d(t,{k:()=>d,J:()=>u});var i=n(6025),a=n(4586),o=n(6803);var r=n(7131);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(m);return{author:1===t.length?t[0]:t}}function c(e,t,n){return e?{image:g({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${n}`})}:{}}function d(e){const{siteConfig:t}=(0,a.A)(),{withBaseUrl:n}=(0,i.h)(),{metadata:{blogDescription:o,blogTitle:r,permalink:d}}=e,u=`${t.url}${d}`;return{"@context":"https://schema.org","@type":"Blog","@id":u,mainEntityOfPage:u,headline:r,description:o,blogPost:e.items.map((e=>function(e,t,n){const{assets:i,frontMatter:a,metadata:o}=e,{date:r,title:d,description:u,lastUpdatedAt:m}=o,g=i.image??a.image,h=a.keywords??[],f=`${t.url}${o.permalink}`,p=m?s(m):void 0;return{"@type":"BlogPosting","@id":f,mainEntityOfPage:f,url:f,headline:d,name:d,description:u,datePublished:r,...p?{dateModified:p}:{},...l(o.authors),...c(g,n,d),...h?{keywords:h}:{}}}(e.content,t,n)))}}function u(){const e=function(){const e=(0,o.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:n}=(0,r.e)(),{siteConfig:d}=(0,a.A)(),{withBaseUrl:u}=(0,i.h)(),{date:m,title:g,description:h,frontMatter:f,lastUpdatedAt:p}=n,v=t.image??f.image,x=f.keywords??[],b=p?s(p):void 0,j=`${d.url}${n.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:g,name:g,description:h,datePublished:m,...b?{dateModified:b}:{},...l(n.authors),...c(v,u,g),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${d.url}${e.blogBasePath}`,name:e.blogTitle}}}function m(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function g(e){let{imageUrl:t,caption:n}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:n}}}}]); \ No newline at end of file diff --git a/assets/js/d6535278.322a0df3.js b/assets/js/d6535278.bd748219.js similarity index 99% rename from assets/js/d6535278.322a0df3.js rename to assets/js/d6535278.bd748219.js index acafd24d1..1d1fbd61e 100644 --- a/assets/js/d6535278.322a0df3.js +++ b/assets/js/d6535278.bd748219.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6977],{3096:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>h});var i=n(4848),s=n(8453),r=n(1470),a=n(9365);const o={title:"VMAF",sidebar_position:1},l="VMAF",c={id:"metrics/VMAF",title:"VMAF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/VMAF.mdx",sourceDirName:"metrics",slug:"/metrics/VMAF",permalink:"/docs/metrics/VMAF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"VMAF",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"},next:{title:"PSNR",permalink:"/docs/metrics/XPSNR"}},d={},h=[{value:"Installation & Usage",id:"installation--usage",level:2},{value:"Using VMAF with FFmpeg",id:"using-vmaf-with-ffmpeg",level:2},{value:"Note about the model path on Windows",id:"note-about-the-model-path-on-windows",level:3},{value:"Scoring",id:"scoring",level:2},{value:"Some weaknesses",id:"some-weaknesses",level:2},{value:"Comparing to SSIMULACRA2",id:"comparing-to-ssimulacra2",level:3}];function u(e){const t={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"vmaf",children:"VMAF"}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.p,{children:"Short for Video Multimethod Assessment Fusion, VMAF is a full reference video appeal metric mainly developed by netflix."}),"\n",(0,i.jsx)(t.h2,{id:"installation--usage",children:"Installation & Usage"}),"\n",(0,i.jsxs)(t.p,{children:["Vmaf comes as a part of ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf",children:"libvmaf"}),". There are two ways it is commonly used:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["As an ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," filter"]}),"\n",(0,i.jsx)(t.li,{children:"As a standalone binary"}),"\n"]}),"\n",(0,i.jsxs)(r.A,{children:[(0,i.jsxs)(a.A,{value:"bin",label:"Standalone Binary",children:[(0,i.jsxs)(t.p,{children:["If you would not like to build from source, you may grab the latest build from the VMAF ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/releases",children:"GitHub releases"})," for your operating system."]}),(0,i.jsx)(t.p,{children:"Now, you can:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"/path/to/vmaf --reference refrence.y4m --distorted distorted.y4m\n"})}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Tip:"})," If the VMAF binary exists but is not market as executable, you might need to ",(0,i.jsx)(t.code,{children:"chmod +x /path/to/vmaf"})]}),(0,i.jsxs)(t.p,{children:["Explainer on command line flags can be found ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/libvmaf/tools/README.md",children:"here"})]}),(0,i.jsx)(t.p,{children:"The disadvantage of using the bin is that you need .yuv|y4m files, you can that overcome by using named pipes\nSimple example using ffmpeg as a decoder:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"# create the pipes\nmkfifo ref.pipe\nmkfido dist.pipe\n\n# run these each in a new terminal, order docent matter\nffmpeg -v error -i ref.mkv -strict -1 -f yuv4mpegpipe - > ref.pipe\nffmpeg -v error -i dist.mkv -strict -1 -f yuv4mpegpipe - > dist.pipe\n\n# after starting the two ffmpeg processes,\n# start the vmaf in a new terminal\n/path/to/vmaf --reference ref.pipe --distorted dist.pipe\n\n# delete the pipes after usage\nrm ref.pipe dist.pipe\n"})}),(0,i.jsx)(t.p,{children:"The Advantages of this are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["No need for a ffmpeg build with ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})]}),"\n",(0,i.jsxs)(t.li,{children:["Clear & simple usage of VMAF's various options, like ",(0,i.jsx)(t.code,{children:"--aom_ctc"})]}),"\n"]}),(0,i.jsx)(t.p,{children:"Disadvantages are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Difficult/awkward to use without a wrapper script"}),"\n"]})]}),(0,i.jsxs)(a.A,{value:"ffmpegfilter",label:"FFmpeg Filter",children:[(0,i.jsxs)(t.p,{children:["If you are not sure if you have VMAF installed, you can check by running ",(0,i.jsx)(t.code,{children:"ffmpeg -help"})," and looking for whether or not the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag appears in the banner that is printed to the terminal. If you do not see this, you will need to build ffmpeg from source with the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag or grab a pre-compiled build of FFmpeg with the flag enabled."]}),(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.em,{children:["Via the ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/resource/doc/ffmpeg.md",children:"VMAF github repo"}),":"]})}),(0,i.jsx)(t.h2,{id:"using-vmaf-with-ffmpeg",children:"Using VMAF with FFmpeg"}),(0,i.jsxs)(t.p,{children:["After installing ",(0,i.jsx)(t.code,{children:"libvmaf"}),", you can use it with ",(0,i.jsx)(t.a,{href:"http://ffmpeg.org/",children:"FFmpeg"}),". Under the FFmpeg directory, configure, build and install FFmpeg with:"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"./configure --enable-libvmaf\nmake -j4\nmake install\n"})}),(0,i.jsxs)(t.p,{children:["Using FFmpeg+libvmaf is very powerful, as you can create complex filters to calculate VMAF directly on videos of different encoding formats and resolutions. For the best practices of computing VMAF at the right resolution, refer to our ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"tech blog"}),"."]}),(0,i.jsxs)(t.p,{children:["We provide a few examples how you can construct the FFmpeg command line and use VMAF as a filter. Note that you may need to download the test videos from ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/tree/master/python/test/resource",children:"vmaf_resource"}),"."]}),(0,i.jsxs)(t.p,{children:["Below is an example on how you can run FFmpeg+libvmaf on a pair of YUV files. First, download the reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc00_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc00_576x324.yuv"})})," and the distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc01_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc01_576x324.yuv"})}),". ",(0,i.jsx)(t.code,{children:"-r 24"})," sets the frame rate (note that it needs to be before ",(0,i.jsx)(t.code,{children:"-i"}),"), and ",(0,i.jsx)(t.code,{children:"PTS-STARTPTS"})," synchronizes the PTS (presentation timestamp) of the two videos (this is crucial if one of your videos does not start at PTS 0, for example, if you cut your video out of a long video stream). It is important to set the frame rate and the PTS right, since FFmpeg filters synchronize based on timestamps instead of frames."]}),(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.code,{children:"log_path"})," is set to standard output ",(0,i.jsx)(t.code,{children:"/dev/stdout"}),". It uses the ",(0,i.jsx)(t.code,{children:"model_path"})," at location ",(0,i.jsx)(t.code,{children:"/usr/local/share/model/vmaf_float_v0.6.1.json"})," (which is the default and can be omitted)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc00_576x324.yuv \\\n -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc01_576x324.yuv \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fcfa3403980] VMAF score: 76.668905\n"})}),(0,i.jsxs)(t.p,{children:["Below is a more complicated example where the inputs are packaged ",(0,i.jsx)(t.code,{children:".mp4"})," files. It takes in 1) a reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_30_480_1050.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_30_480_1050.mp4"})})," of 480p and 2) a distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_10_288_375.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_10_288_375.mp4"})})," of 288p upsampled to ",(0,i.jsx)(t.code,{children:"720x480"})," using bicubic, and compute VMAF on the two 480p videos. Bicubic is used as the recommended upsampling method (also see the ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"techblog"})," for more details)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg \\\n -r 24 -i Seeking_30_480_1050.mp4 \\\n -r 24 -i Seeking_10_288_375.mp4 \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]scale=720:480:flags=bicubic,setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fb5b672bc00] VMAF score: 51.017497\n"})}),(0,i.jsxs)(t.p,{children:["See the ",(0,i.jsx)(t.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#libvmaf",children:"FFmpeg's guide to libvmaf"}),", the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/FilteringGuide",children:"FFmpeg Filtering Guide"})," for more examples of complex filters, and the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/Scaling",children:"Scaling Guide"})," for information about scaling and using different scaling algorithms."]}),(0,i.jsx)(t.h3,{id:"note-about-the-model-path-on-windows",children:"Note about the model path on Windows"}),(0,i.jsxs)(t.p,{children:["Due to Windows not having a good default for where to pull the VMAF model from, you will always need to specify ",(0,i.jsx)(t.code,{children:"model_path"})," when calling libvmaf through ",(0,i.jsx)(t.code,{children:"ffmpeg"}),". However, you will need to be careful about the path you pass to ",(0,i.jsx)(t.code,{children:"model_path"}),"."]}),(0,i.jsxs)(t.p,{children:["If you are using a relative path for your ",(0,i.jsx)(t.code,{children:"model_path"}),", you can completely ignore this whole section, else if you are trying to use an absolute Windows path (",(0,i.jsx)(t.code,{children:"D:\\mypath\\vmaf_v0.6.1.json"}),") for your ",(0,i.jsx)(t.code,{children:"model_path"})," argument, you will need to be careful so ",(0,i.jsx)(t.code,{children:"ffmpeg"})," passes the right path to ",(0,i.jsx)(t.code,{children:"libvmaf"}),"."]}),(0,i.jsxs)(t.p,{children:["The final command line will depend on what shell you are running ",(0,i.jsx)(t.code,{children:"ffmpeg"})," through, so you will need to go through the following steps to make sure your path is okay."]}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Convert all of the backslashes ",(0,i.jsx)(t.code,{children:"\\"})," to forward slashes ",(0,i.jsx)(t.code,{children:"/"})," (",(0,i.jsx)(t.code,{children:"D:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Escape the colon ",(0,i.jsx)(t.code,{children:":"})," character by using a backslash ",(0,i.jsx)(t.code,{children:"\\"})," (",(0,i.jsx)(t.code,{children:"D\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Then escape that backslash with another backslash (",(0,i.jsx)(t.code,{children:"D\\\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["The next step will depend on the shell that will run ",(0,i.jsx)(t.code,{children:"ffmpeg"}),":"]}),"\n",(0,i.jsxs)(t.p,{children:["For PowerShell and Command Prompt, this will be enough and your final ",(0,i.jsx)(t.code,{children:"ffmpeg"})," command line will look something like"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-powershell",children:'./ffmpeg.exe -i dist.y4m -i ref.y4m \\\n -lavfi libvmaf=model_path="D\\\\:/mypath/vmaf_v0.6.1.json" \\\n -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quoting the path",type:"info",children:(0,i.jsxs)(t.p,{children:["Note: I only quoted the path part for trivial reasons and in this specific case, it can be unquoted or you can quote the whole part after lavfi starting from ",(0,i.jsx)(t.code,{children:"libvmaf"})," to ",(0,i.jsx)(t.code,{children:"json"})," and it should give the same result due to neither shell treating the ",(0,i.jsx)(t.code,{children:"\\"})," as a special character"]})}),"\n",(0,i.jsxs)(t.p,{children:["For bash or specifically msys2 bash, it has some additional considerations. The first thing to know is that bash treats the backslash character ",(0,i.jsx)(t.code,{children:"\\"})," a bit special in that it's an escape character normally when not put inside single quotes. The second thing to know is that msys2's bash attempts convert a posix-like path (",(0,i.jsx)(t.code,{children:"/mingw64/share/model/vmaf_v0.6.1.json"}),") to a Windows mixed path (",(0,i.jsx)(t.code,{children:"D:/msys2/mingw64/share/model/vmaf_v0.6.1.json"}),") when passing arguments to a program. Normally, this would be fine, however, in our case, this works against us since we cannot allow it to convert the path to a normal path with an un-escaped colon. For this, we will need to not only escape the escaped backslash, but we will also need to pass the ",(0,i.jsx)(t.code,{children:"MSYS2_ARG_CONV_EXCL"})," environment variable with the value of ",(0,i.jsx)(t.code,{children:"*"})," to make sure it doesn't apply that special conversion on any of the arguments"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'MSYS2_ARG_CONV_EXCL="*" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path="D\\\\\\:/mypath/vmaf_v0.6.1.json" -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quotes",type:"info",children:(0,i.jsx)(t.p,{children:"Note: in this case, the quotes are not as trivial as the PowerShell/cmd version, as removing the quotes entirely will require you to re-escape the backslash resulting in 4 total backslashes, but quoting the whole argument will be fine."})}),"\n",(0,i.jsxs)(t.admonition,{title:"Single Quotes",type:"note",children:[(0,i.jsx)(t.p,{children:"Second Note: if you use single quotes around the path, it will be fine as well and the final command line would look like"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"MSYS2_ARG_CONV_EXCL=\"*\" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path='D\\\\:/mypath/vmaf_v0.6.1.json' -f null -\n"})}),(0,i.jsx)(t.p,{children:"with only a double backslash instead of a triple."})]}),"\n"]}),"\n"]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,i.jsxs)(t.p,{children:["scores range from 0 to 100, and are best interpreted in a linear way,\n100 meaning perfect quality, 0 meaning not recognisable,\nmore info ",(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"in the Best Practices section here"}),(0,i.jsx)(t.br,{}),"\n","It aligns with mean opinion scores (MOS) really well at low/medium bitrates,\nas stated ",(0,i.jsx)(t.a,{href:"https://videoprocessing.ai/benchmarks/video-quality-metrics_both.html",children:"in this benchmark"})]}),"\n",(0,i.jsx)(t.h2,{id:"some-weaknesses",children:"Some weaknesses"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Newer codecs like AV1 and VVC introduce new kinds of artifacting that v0.6.2\n(current model as of Jan 2024) doesn't recognise,\nthat's why its performance might degrade, for example, high motion scenes being affected badly"}),"\n",(0,i.jsx)(t.li,{children:'It\'s bad at "transparent" levels of quality, kinds of quality that the average viewer might not notice'}),"\n",(0,i.jsx)(t.li,{children:"Synthetic grain throws off scores, this issue is not isolated to vmaf, but it should be noted regardless"}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{title:"With ffmpeg you can disable application of synthetic grain",type:"tip",children:(0,i.jsxs)(t.p,{children:["place ",(0,i.jsx)(t.code,{children:"-filmgrain 0"})," before ",(0,i.jsx)(t.code,{children:"-i"})," in the above ffmpeg commands, limited to decoding with dav1d\nTODO: replace this tip with an export_side_data solution"]})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"As of January 2024, it doesn't work on HDR content, nothing prevents you from feeding it un-tonemapped PQ but scores will be off"}),"\n",(0,i.jsx)(t.li,{children:"In contrast with SSIMULACRA2, it focuses on appeal, not necessarily on fidelity. They often align, but not always."}),"\n",(0,i.jsx)(t.li,{children:"Due to the ML nature, comparing the same video to itself will not always result in a score of 100"}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"comparing-to-ssimulacra2",children:"Comparing to SSIMULACRA2"}),"\n",(0,i.jsx)(t.p,{children:"One big advantage over SSIMULACRA2 is the inclusion of some temporal information.\nThis means that VMAF weights frames that have a lot of motion higher.\nMeanwhile, SSIMULACRA2 based solutions compare each frame to the reference frame individually, since it is an image\nmetric at heart.\nVMAF also wins in speed and general ease of use."}),"\n",(0,i.jsx)(t.h1,{id:"additional-resources",children:"Additional resources"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/tree/master/resource/doc",children:"VMAF Documentation on GitHub"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"Medium Article by Netflix"})}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(8215);const s={tabItem:"tabItem_Ymn6"};var r=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var i=n(6540),s=n(8215),r=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),d=n(9466);function h(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:n}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:n,attributes:i,default:s}}=e;return{value:t,label:n,attributes:i,default:s}}))}(n);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const s=(0,a.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function p(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,r=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=n.find((e=>e.default))??n[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:r}))),[c,h]=f({queryString:n,groupId:s}),[p,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(n);return[s,(0,i.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:s}),x=(()=>{const e=c??p;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),g(e)}),[h,g,r]),tabValues:r}}var g=n(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function v(e){let{className:t,block:n,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),s=o[n].value;s!==i&&(c(t),a(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",x.tabItem,r?.className,{"tabs__item--active":i===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=p(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...e,...t}),(0,b.jsx)(j,{...e,...t})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6977],{3096:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>h});var i=n(4848),s=n(8453),r=n(1470),a=n(9365);const o={title:"VMAF",sidebar_position:1},l="VMAF",c={id:"metrics/VMAF",title:"VMAF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/VMAF.mdx",sourceDirName:"metrics",slug:"/metrics/VMAF",permalink:"/docs/metrics/VMAF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/VMAF.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"VMAF",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2"},next:{title:"PSNR",permalink:"/docs/metrics/XPSNR"}},d={},h=[{value:"Installation & Usage",id:"installation--usage",level:2},{value:"Using VMAF with FFmpeg",id:"using-vmaf-with-ffmpeg",level:2},{value:"Note about the model path on Windows",id:"note-about-the-model-path-on-windows",level:3},{value:"Scoring",id:"scoring",level:2},{value:"Some weaknesses",id:"some-weaknesses",level:2},{value:"Comparing to SSIMULACRA2",id:"comparing-to-ssimulacra2",level:3}];function u(e){const t={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"vmaf",children:"VMAF"}),"\n",(0,i.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,i.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,i.jsx)(t.p,{children:"Short for Video Multimethod Assessment Fusion, VMAF is a full reference video appeal metric mainly developed by netflix."}),"\n",(0,i.jsx)(t.h2,{id:"installation--usage",children:"Installation & Usage"}),"\n",(0,i.jsxs)(t.p,{children:["Vmaf comes as a part of ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf",children:"libvmaf"}),". There are two ways it is commonly used:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["As an ",(0,i.jsx)(t.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," filter"]}),"\n",(0,i.jsx)(t.li,{children:"As a standalone binary"}),"\n"]}),"\n",(0,i.jsxs)(r.A,{children:[(0,i.jsxs)(a.A,{value:"bin",label:"Standalone Binary",children:[(0,i.jsxs)(t.p,{children:["If you would not like to build from source, you may grab the latest build from the VMAF ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/releases",children:"GitHub releases"})," for your operating system."]}),(0,i.jsx)(t.p,{children:"Now, you can:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"/path/to/vmaf --reference refrence.y4m --distorted distorted.y4m\n"})}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Tip:"})," If the VMAF binary exists but is not market as executable, you might need to ",(0,i.jsx)(t.code,{children:"chmod +x /path/to/vmaf"})]}),(0,i.jsxs)(t.p,{children:["Explainer on command line flags can be found ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/libvmaf/tools/README.md",children:"here"})]}),(0,i.jsx)(t.p,{children:"The disadvantage of using the bin is that you need .yuv|y4m files, you can that overcome by using named pipes\nSimple example using ffmpeg as a decoder:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"# create the pipes\nmkfifo ref.pipe\nmkfido dist.pipe\n\n# run these each in a new terminal, order docent matter\nffmpeg -v error -i ref.mkv -strict -1 -f yuv4mpegpipe - > ref.pipe\nffmpeg -v error -i dist.mkv -strict -1 -f yuv4mpegpipe - > dist.pipe\n\n# after starting the two ffmpeg processes,\n# start the vmaf in a new terminal\n/path/to/vmaf --reference ref.pipe --distorted dist.pipe\n\n# delete the pipes after usage\nrm ref.pipe dist.pipe\n"})}),(0,i.jsx)(t.p,{children:"The Advantages of this are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["No need for a ffmpeg build with ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})]}),"\n",(0,i.jsxs)(t.li,{children:["Clear & simple usage of VMAF's various options, like ",(0,i.jsx)(t.code,{children:"--aom_ctc"})]}),"\n"]}),(0,i.jsx)(t.p,{children:"Disadvantages are:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Difficult/awkward to use without a wrapper script"}),"\n"]})]}),(0,i.jsxs)(a.A,{value:"ffmpegfilter",label:"FFmpeg Filter",children:[(0,i.jsxs)(t.p,{children:["If you are not sure if you have VMAF installed, you can check by running ",(0,i.jsx)(t.code,{children:"ffmpeg -help"})," and looking for whether or not the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag appears in the banner that is printed to the terminal. If you do not see this, you will need to build ffmpeg from source with the ",(0,i.jsx)(t.code,{children:"--enable-libvmaf"})," flag or grab a pre-compiled build of FFmpeg with the flag enabled."]}),(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.em,{children:["Via the ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/blob/master/resource/doc/ffmpeg.md",children:"VMAF github repo"}),":"]})}),(0,i.jsx)(t.h2,{id:"using-vmaf-with-ffmpeg",children:"Using VMAF with FFmpeg"}),(0,i.jsxs)(t.p,{children:["After installing ",(0,i.jsx)(t.code,{children:"libvmaf"}),", you can use it with ",(0,i.jsx)(t.a,{href:"http://ffmpeg.org/",children:"FFmpeg"}),". Under the FFmpeg directory, configure, build and install FFmpeg with:"]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"./configure --enable-libvmaf\nmake -j4\nmake install\n"})}),(0,i.jsxs)(t.p,{children:["Using FFmpeg+libvmaf is very powerful, as you can create complex filters to calculate VMAF directly on videos of different encoding formats and resolutions. For the best practices of computing VMAF at the right resolution, refer to our ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"tech blog"}),"."]}),(0,i.jsxs)(t.p,{children:["We provide a few examples how you can construct the FFmpeg command line and use VMAF as a filter. Note that you may need to download the test videos from ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/tree/master/python/test/resource",children:"vmaf_resource"}),"."]}),(0,i.jsxs)(t.p,{children:["Below is an example on how you can run FFmpeg+libvmaf on a pair of YUV files. First, download the reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc00_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc00_576x324.yuv"})})," and the distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/yuv/src01_hrc01_576x324.yuv",children:(0,i.jsx)(t.code,{children:"src01_hrc01_576x324.yuv"})}),". ",(0,i.jsx)(t.code,{children:"-r 24"})," sets the frame rate (note that it needs to be before ",(0,i.jsx)(t.code,{children:"-i"}),"), and ",(0,i.jsx)(t.code,{children:"PTS-STARTPTS"})," synchronizes the PTS (presentation timestamp) of the two videos (this is crucial if one of your videos does not start at PTS 0, for example, if you cut your video out of a long video stream). It is important to set the frame rate and the PTS right, since FFmpeg filters synchronize based on timestamps instead of frames."]}),(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.code,{children:"log_path"})," is set to standard output ",(0,i.jsx)(t.code,{children:"/dev/stdout"}),". It uses the ",(0,i.jsx)(t.code,{children:"model_path"})," at location ",(0,i.jsx)(t.code,{children:"/usr/local/share/model/vmaf_float_v0.6.1.json"})," (which is the default and can be omitted)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc00_576x324.yuv \\\n -video_size 576x324 -r 24 -pixel_format yuv420p -i src01_hrc01_576x324.yuv \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fcfa3403980] VMAF score: 76.668905\n"})}),(0,i.jsxs)(t.p,{children:["Below is a more complicated example where the inputs are packaged ",(0,i.jsx)(t.code,{children:".mp4"})," files. It takes in 1) a reference video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_30_480_1050.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_30_480_1050.mp4"})})," of 480p and 2) a distorted video ",(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf_resource/blob/master/python/test/resource/mp4/Seeking_10_288_375.mp4",children:(0,i.jsx)(t.code,{children:"Seeking_10_288_375.mp4"})})," of 288p upsampled to ",(0,i.jsx)(t.code,{children:"720x480"})," using bicubic, and compute VMAF on the two 480p videos. Bicubic is used as the recommended upsampling method (also see the ",(0,i.jsx)(t.a,{href:"https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12",children:"techblog"})," for more details)."]}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:'ffmpeg \\\n -r 24 -i Seeking_30_480_1050.mp4 \\\n -r 24 -i Seeking_10_288_375.mp4 \\\n -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \\\n [1:v]scale=720:480:flags=bicubic,setpts=PTS-STARTPTS[distorted]; \\\n [distorted][reference]libvmaf=log_fmt=xml:log_path=/dev/stdout:model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json:n_threads=4" \\\n -f null -\n'})}),(0,i.jsx)(t.p,{children:"The expected output is:"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-shell",metastring:"script",children:"[libvmaf @ 0x7fb5b672bc00] VMAF score: 51.017497\n"})}),(0,i.jsxs)(t.p,{children:["See the ",(0,i.jsx)(t.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#libvmaf",children:"FFmpeg's guide to libvmaf"}),", the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/FilteringGuide",children:"FFmpeg Filtering Guide"})," for more examples of complex filters, and the ",(0,i.jsx)(t.a,{href:"https://trac.ffmpeg.org/wiki/Scaling",children:"Scaling Guide"})," for information about scaling and using different scaling algorithms."]}),(0,i.jsx)(t.h3,{id:"note-about-the-model-path-on-windows",children:"Note about the model path on Windows"}),(0,i.jsxs)(t.p,{children:["Due to Windows not having a good default for where to pull the VMAF model from, you will always need to specify ",(0,i.jsx)(t.code,{children:"model_path"})," when calling libvmaf through ",(0,i.jsx)(t.code,{children:"ffmpeg"}),". However, you will need to be careful about the path you pass to ",(0,i.jsx)(t.code,{children:"model_path"}),"."]}),(0,i.jsxs)(t.p,{children:["If you are using a relative path for your ",(0,i.jsx)(t.code,{children:"model_path"}),", you can completely ignore this whole section, else if you are trying to use an absolute Windows path (",(0,i.jsx)(t.code,{children:"D:\\mypath\\vmaf_v0.6.1.json"}),") for your ",(0,i.jsx)(t.code,{children:"model_path"})," argument, you will need to be careful so ",(0,i.jsx)(t.code,{children:"ffmpeg"})," passes the right path to ",(0,i.jsx)(t.code,{children:"libvmaf"}),"."]}),(0,i.jsxs)(t.p,{children:["The final command line will depend on what shell you are running ",(0,i.jsx)(t.code,{children:"ffmpeg"})," through, so you will need to go through the following steps to make sure your path is okay."]}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Convert all of the backslashes ",(0,i.jsx)(t.code,{children:"\\"})," to forward slashes ",(0,i.jsx)(t.code,{children:"/"})," (",(0,i.jsx)(t.code,{children:"D:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Escape the colon ",(0,i.jsx)(t.code,{children:":"})," character by using a backslash ",(0,i.jsx)(t.code,{children:"\\"})," (",(0,i.jsx)(t.code,{children:"D\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Then escape that backslash with another backslash (",(0,i.jsx)(t.code,{children:"D\\\\:/mypath/vmaf_v0.6.1.json"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["The next step will depend on the shell that will run ",(0,i.jsx)(t.code,{children:"ffmpeg"}),":"]}),"\n",(0,i.jsxs)(t.p,{children:["For PowerShell and Command Prompt, this will be enough and your final ",(0,i.jsx)(t.code,{children:"ffmpeg"})," command line will look something like"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-powershell",children:'./ffmpeg.exe -i dist.y4m -i ref.y4m \\\n -lavfi libvmaf=model_path="D\\\\:/mypath/vmaf_v0.6.1.json" \\\n -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quoting the path",type:"info",children:(0,i.jsxs)(t.p,{children:["Note: I only quoted the path part for trivial reasons and in this specific case, it can be unquoted or you can quote the whole part after lavfi starting from ",(0,i.jsx)(t.code,{children:"libvmaf"})," to ",(0,i.jsx)(t.code,{children:"json"})," and it should give the same result due to neither shell treating the ",(0,i.jsx)(t.code,{children:"\\"})," as a special character"]})}),"\n",(0,i.jsxs)(t.p,{children:["For bash or specifically msys2 bash, it has some additional considerations. The first thing to know is that bash treats the backslash character ",(0,i.jsx)(t.code,{children:"\\"})," a bit special in that it's an escape character normally when not put inside single quotes. The second thing to know is that msys2's bash attempts convert a posix-like path (",(0,i.jsx)(t.code,{children:"/mingw64/share/model/vmaf_v0.6.1.json"}),") to a Windows mixed path (",(0,i.jsx)(t.code,{children:"D:/msys2/mingw64/share/model/vmaf_v0.6.1.json"}),") when passing arguments to a program. Normally, this would be fine, however, in our case, this works against us since we cannot allow it to convert the path to a normal path with an un-escaped colon. For this, we will need to not only escape the escaped backslash, but we will also need to pass the ",(0,i.jsx)(t.code,{children:"MSYS2_ARG_CONV_EXCL"})," environment variable with the value of ",(0,i.jsx)(t.code,{children:"*"})," to make sure it doesn't apply that special conversion on any of the arguments"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'MSYS2_ARG_CONV_EXCL="*" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path="D\\\\\\:/mypath/vmaf_v0.6.1.json" -f null -\n'})}),"\n",(0,i.jsx)(t.admonition,{title:"Quotes",type:"info",children:(0,i.jsx)(t.p,{children:"Note: in this case, the quotes are not as trivial as the PowerShell/cmd version, as removing the quotes entirely will require you to re-escape the backslash resulting in 4 total backslashes, but quoting the whole argument will be fine."})}),"\n",(0,i.jsxs)(t.admonition,{title:"Single Quotes",type:"note",children:[(0,i.jsx)(t.p,{children:"Second Note: if you use single quotes around the path, it will be fine as well and the final command line would look like"}),(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"MSYS2_ARG_CONV_EXCL=\"*\" \\\n ./ffmpeg.exe -i dist.y4m -i ref.y4m -lavfi \\\n libvmaf=model_path='D\\\\:/mypath/vmaf_v0.6.1.json' -f null -\n"})}),(0,i.jsx)(t.p,{children:"with only a double backslash instead of a triple."})]}),"\n"]}),"\n"]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,i.jsxs)(t.p,{children:["scores range from 0 to 100, and are best interpreted in a linear way,\n100 meaning perfect quality, 0 meaning not recognisable,\nmore info ",(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"in the Best Practices section here"}),(0,i.jsx)(t.br,{}),"\n","It aligns with mean opinion scores (MOS) really well at low/medium bitrates,\nas stated ",(0,i.jsx)(t.a,{href:"https://videoprocessing.ai/benchmarks/video-quality-metrics_both.html",children:"in this benchmark"})]}),"\n",(0,i.jsx)(t.h2,{id:"some-weaknesses",children:"Some weaknesses"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Newer codecs like AV1 and VVC introduce new kinds of artifacting that v0.6.2\n(current model as of Jan 2024) doesn't recognise,\nthat's why its performance might degrade, for example, high motion scenes being affected badly"}),"\n",(0,i.jsx)(t.li,{children:'It\'s bad at "transparent" levels of quality, kinds of quality that the average viewer might not notice'}),"\n",(0,i.jsx)(t.li,{children:"Synthetic grain throws off scores, this issue is not isolated to vmaf, but it should be noted regardless"}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{title:"With ffmpeg you can disable application of synthetic grain",type:"tip",children:(0,i.jsxs)(t.p,{children:["place ",(0,i.jsx)(t.code,{children:"-filmgrain 0"})," before ",(0,i.jsx)(t.code,{children:"-i"})," in the above ffmpeg commands, limited to decoding with dav1d\nTODO: replace this tip with an export_side_data solution"]})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"As of January 2024, it doesn't work on HDR content, nothing prevents you from feeding it un-tonemapped PQ but scores will be off"}),"\n",(0,i.jsx)(t.li,{children:"In contrast with SSIMULACRA2, it focuses on appeal, not necessarily on fidelity. They often align, but not always."}),"\n",(0,i.jsx)(t.li,{children:"Due to the ML nature, comparing the same video to itself will not always result in a score of 100"}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"comparing-to-ssimulacra2",children:"Comparing to SSIMULACRA2"}),"\n",(0,i.jsx)(t.p,{children:"One big advantage over SSIMULACRA2 is the inclusion of some temporal information.\nThis means that VMAF weights frames that have a lot of motion higher.\nMeanwhile, SSIMULACRA2 based solutions compare each frame to the reference frame individually, since it is an image\nmetric at heart.\nVMAF also wins in speed and general ease of use."}),"\n",(0,i.jsx)(t.h1,{id:"additional-resources",children:"Additional resources"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/Netflix/vmaf/tree/master/resource/doc",children:"VMAF Documentation on GitHub"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://netflixtechblog.com/vmaf-the-journey-continues-44b51ee9ed12",children:"Medium Article by Netflix"})}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164);const s={tabItem:"tabItem_Ymn6"};var r=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,i.A)(s.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var i=n(6540),s=n(4164),r=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),d=n(9466);function h(e){return i.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:t,children:n}=e;return(0,i.useMemo)((()=>{const e=t??function(e){return h(e).map((e=>{let{props:{value:t,label:n,attributes:i,default:s}}=e;return{value:t,label:n,attributes:i,default:s}}))}(n);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const s=(0,a.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(r),(0,i.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(s.location.search);t.set(r,e),s.replace({...s.location,search:t.toString()})}),[r,s])]}function p(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,r=u(e),[a,l]=(0,i.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const i=n.find((e=>e.default))??n[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:t,tabValues:r}))),[c,h]=f({queryString:n,groupId:s}),[p,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,r]=(0,d.Dv)(n);return[s,(0,i.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:s}),x=(()=>{const e=c??p;return m({value:e,tabValues:r})?e:null})();(0,o.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,i.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),g(e)}),[h,g,r]),tabValues:r}}var g=n(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function v(e){let{className:t,block:n,selectedValue:i,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,r.a_)(),d=e=>{const t=e.currentTarget,n=l.indexOf(t),s=o[n].value;s!==i&&(c(t),a(s))},h=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,ref:e=>l.push(e),onKeyDown:h,onClick:d,...r,className:(0,s.A)("tabs__item",x.tabItem,r?.className,{"tabs__item--active":i===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===s));return e?(0,i.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,i.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=p(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...t,...e}),(0,b.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:h(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e66c2e3c.99d9b9e5.js b/assets/js/e66c2e3c.99d9b9e5.js deleted file mode 100644 index 250f560cf..000000000 --- a/assets/js/e66c2e3c.99d9b9e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7090],{177:e=>{e.exports=JSON.parse('{"label":"benchmarks","permalink":"/blog/tags/benchmarks","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/e6fe0126.8a077a21.js b/assets/js/e6fe0126.8a077a21.js deleted file mode 100644 index 0e547bbf4..000000000 --- a/assets/js/e6fe0126.8a077a21.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6368],{5848:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/blog/tags/image","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/e73e1d83.3983334e.js b/assets/js/e73e1d83.3983334e.js deleted file mode 100644 index 2aa716b65..000000000 --- a/assets/js/e73e1d83.3983334e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6555],{9344:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/benchmarks","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e80106d6.83272527.js b/assets/js/e80106d6.83272527.js deleted file mode 100644 index 5f5c029da..000000000 --- a/assets/js/e80106d6.83272527.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2909],{7756:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/compression","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ea743fb4.32fcc24b.js b/assets/js/ea743fb4.32fcc24b.js new file mode 100644 index 000000000..53cc5d993 --- /dev/null +++ b/assets/js/ea743fb4.32fcc24b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9417],{4943:a=>{a.exports=JSON.parse('{"tag":{"label":"image","permalink":"/blog/tags/image","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/image","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/ee513c31.f56ae758.js b/assets/js/ee513c31.d4c4b7f6.js similarity index 96% rename from assets/js/ee513c31.f56ae758.js rename to assets/js/ee513c31.d4c4b7f6.js index cdcfb7ea7..d3b9de419 100644 --- a/assets/js/ee513c31.f56ae758.js +++ b/assets/js/ee513c31.d4c4b7f6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1137],{2154:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var o=n(4848),r=n(8453),i=n(1470),a=n(9365);const l={title:"dovi_tool",sidebar_position:9},s="dovi_tool",u={id:"utilities/dovi_tool",title:"dovi_tool",description:"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.",source:"@site/docs/utilities/dovi_tool.mdx",sourceDirName:"utilities",slug:"/utilities/dovi_tool",permalink:"/docs/utilities/dovi_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"dovi_tool",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"},next:{title:"eac3to",permalink:"/docs/utilities/eac3to"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"dovi_tool",children:"dovi_tool"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"dovi_tool"})," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."]}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(i.A,{children:[(0,o.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,o.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,o.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"dovi_tool [OPTIONS] \n"})}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"dovi_tool --help\n"})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var o=n(8215);const r={tabItem:"tabItem_Ymn6"};var i=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>j});var o=n(6540),r=n(8215),i=n(3104),a=n(6347),l=n(205),s=n(7485),u=n(1682),c=n(9466);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,a.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=h(e),[a,s]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:r}),[b,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(n);return[r,(0,o.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),v=(()=>{const e=u??b;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{v&&s(v)}),[v]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),f(e)}),[d,f,i]),tabValues:i}}var f=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:o,selectValue:a,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=s.indexOf(t),r=l[n].value;r!==o&&(u(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>s.push(e),onKeyDown:d,onClick:c,...i,className:(0,r.A)("tabs__item",v.tabItem,i?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function w(e){let{lazy:t,children:n,selectedValue:r}=e;const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...e,...t}),(0,g.jsx)(w,{...e,...t})]})}function j(e){const t=(0,f.A)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1137],{2154:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var o=n(4848),r=n(8453),i=n(1470),a=n(9365);const l={title:"dovi_tool",sidebar_position:9},s="dovi_tool",u={id:"utilities/dovi_tool",title:"dovi_tool",description:"dovi_tool is a command line tool written in Rust combining multiple utilities for working with Dolby Vision.",source:"@site/docs/utilities/dovi_tool.mdx",sourceDirName:"utilities",slug:"/utilities/dovi_tool",permalink:"/docs/utilities/dovi_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/dovi_tool.mdx",tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"dovi_tool",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"FFMetrics",permalink:"/docs/utilities/FFMetrics"},next:{title:"eac3to",permalink:"/docs/utilities/eac3to"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"dovi_tool",children:"dovi_tool"}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"dovi_tool"})," is a command line tool written in Rust combining multiple utilities for working with Dolby Vision."]}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(i.A,{children:[(0,o.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,o.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,o.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,o.jsx)(t.a,{href:"https://github.com/quietvoid/dovi_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,o.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/dovi_tool.git\ncd dovi_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,o.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"dovi_tool [OPTIONS] \n"})}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"dovi_tool --help\n"})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var o=n(4164);const r={tabItem:"tabItem_Ymn6"};var i=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>j});var o=n(6540),r=n(4164),i=n(3104),a=n(6347),l=n(205),s=n(7485),u=n(1682),c=n(9466);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,o.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:o,default:r}}=e;return{value:t,label:n,attributes:o,default:r}}))}(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const r=(0,a.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,s.aZ)(i),(0,o.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=h(e),[a,s]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const o=n.find((e=>e.default))??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:i}))),[u,d]=m({queryString:n,groupId:r}),[b,f]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(n);return[r,(0,o.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),v=(()=>{const e=u??b;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{v&&s(v)}),[v]);return{selectedValue:a,selectValue:(0,o.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),f(e)}),[d,f,i]),tabValues:i}}var f=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:o,selectValue:a,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:u}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=s.indexOf(t),r=l[n].value;r!==o&&(u(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,ref:e=>s.push(e),onKeyDown:d,onClick:c,...i,className:(0,r.A)("tabs__item",v.tabItem,i?.className,{"tabs__item--active":o===t}),children:n??t},t)}))})}function w(e){let{lazy:t,children:n,selectedValue:r}=e;const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,r.A)("tabs-container",v.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(w,{...t,...e})]})}function j(e){const t=(0,f.A)();return(0,g.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var o=n(6540);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f0f157d6.fb5629bb.js b/assets/js/f0f157d6.fb5629bb.js deleted file mode 100644 index 60b1068df..000000000 --- a/assets/js/f0f157d6.fb5629bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3456],{701:s=>{s.exports=JSON.parse('{"label":"discord","permalink":"/blog/tags/discord","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f9208490.61e0c496.js b/assets/js/f9208490.a08976fa.js similarity index 97% rename from assets/js/f9208490.61e0c496.js rename to assets/js/f9208490.a08976fa.js index d65f490d7..973f03ae2 100644 --- a/assets/js/f9208490.61e0c496.js +++ b/assets/js/f9208490.a08976fa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3229],{1865:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(4848),a=n(8453),l=n(1470),s=n(9365);const i={title:"hdr10plus_tool",sidebar_position:11},o="hdr10plus_tool",u={id:"utilities/hdr10plus_tool",title:"hdr10plus_tool",description:"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named hdr10plus_parser.",source:"@site/docs/utilities/hdr10plus_tool.mdx",sourceDirName:"utilities",slug:"/utilities/hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"hdr10plus_tool",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"MP4Box",permalink:"/docs/utilities/mp4box"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Removing HDR10+ Metadata",id:"removing-hdr10-metadata",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"hdr10plus_tool",children:"hdr10plus_tool"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"hdr10plus_tool"})," is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named ",(0,r.jsx)(t.em,{children:"hdr10plus_parser"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,r.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"hdr10plus_tool [OPTIONS] \n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"hdr10plus_tool --help\n"})}),"\n",(0,r.jsx)(t.h3,{id:"extracting",children:"Extracting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract from raw bitstream"',children:"hdr10plus_tool extract video.hevc -o metadata.json\n"})}),"\n",(0,r.jsx)(t.h3,{id:"injecting",children:"Injecting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Inject to raw bitstream"',children:"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n"})}),"\n",(0,r.jsx)(t.h3,{id:"removing-hdr10-metadata",children:"Removing HDR10+ Metadata"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove from raw bitstream"',children:"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>s});n(6540);var r=n(8215);const a={tabItem:"tabItem_Ymn6"};var l=n(4848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),a=n(8215),l=n(3104),s=n(6347),i=n(205),o=n(7485),u=n(1682),c=n(9466);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=h(e),[s,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,d]=m({queryString:n,groupId:a}),[b,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),f=(()=>{const e=u??b;return p({value:e,tabValues:l})?e:null})();(0,i.A)((()=>{f&&o(f)}),[f]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),v(e)}),[d,v,l]),tabValues:l}}var v=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:i}=e;const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.a_)(),c=e=>{const t=e.currentTarget,n=o.indexOf(t),a=i[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:c,...l,className:(0,a.A)("tabs__item",f.tabItem,l?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function _(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,a.A)("tabs-container",f.tabList),children:[(0,g.jsx)(x,{...e,...t}),(0,g.jsx)(j,{...e,...t})]})}function w(e){const t=(0,v.A)();return(0,g.jsx)(_,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const a={},l=r.createContext(a);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3229],{1865:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var r=n(4848),a=n(8453),l=n(1470),s=n(9365);const i={title:"hdr10plus_tool",sidebar_position:11},o="hdr10plus_tool",u={id:"utilities/hdr10plus_tool",title:"hdr10plus_tool",description:"hdr10plus_tool is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named hdr10plus_parser.",source:"@site/docs/utilities/hdr10plus_tool.mdx",sourceDirName:"utilities",slug:"/utilities/hdr10plus_tool",permalink:"/docs/utilities/hdr10plus_tool",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/utilities/hdr10plus_tool.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"hdr10plus_tool",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"eac3to",permalink:"/docs/utilities/eac3to"},next:{title:"MP4Box",permalink:"/docs/utilities/mp4box"}},c={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Extracting",id:"extracting",level:3},{value:"Injecting",id:"injecting",level:3},{value:"Removing HDR10+ Metadata",id:"removing-hdr10-metadata",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"hdr10plus_tool",children:"hdr10plus_tool"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"hdr10plus_tool"})," is a command line tool written in Rust for working with HDR10+ in HEVC files. It was previously named ",(0,r.jsx)(t.em,{children:"hdr10plus_parser"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Linux & macOS from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})})]}),(0,r.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,r.jsxs)(t.p,{children:["You can download official pre-built binaries for Windows from ",(0,r.jsx)(t.a,{href:"https://github.com/quietvoid/hdr10plus_tool/releases",children:"the GitHub Releases"}),", or you may compile the tool yourself via the instructions below."]}),(0,r.jsx)(t.p,{children:"Ensure you have Rust installed."}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-pwsh",children:"git clone https://github.com/quietvoid/hdr10plus_tool.git\ncd hdr10plus_tool\nset RUSTFLAGS=-C target-cpu=native \ncargo build --release\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="General usage"',children:"hdr10plus_tool [OPTIONS] \n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Get more options for a subcommand"',children:"hdr10plus_tool --help\n"})}),"\n",(0,r.jsx)(t.h3,{id:"extracting",children:"Extracting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool extract -o metadata.json -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Extract from raw bitstream"',children:"hdr10plus_tool extract video.hevc -o metadata.json\n"})}),"\n",(0,r.jsx)(t.h3,{id:"injecting",children:"Injecting"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Inject to raw bitstream"',children:"hdr10plus_tool inject -i video.hevc -j metadata.json -o injected_output.hevc\n"})}),"\n",(0,r.jsx)(t.h3,{id:"removing-hdr10-metadata",children:"Removing HDR10+ Metadata"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove using FFmpeg pipe (Recommended)"',children:"ffmpeg -hide_banner -strict -2 -i input.mkv -map 0:v:0 -c copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_tool remove -\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",metastring:'title="Remove from raw bitstream"',children:"hdr10plus_tool remove video.hevc -o hdr10plus_removed_output.hevc\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>s});n(6540);var r=n(4164);const a={tabItem:"tabItem_Ymn6"};var l=n(4848);function s(e){let{children:t,hidden:n,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,s),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),a=n(4164),l=n(3104),s=n(6347),i=n(205),o=n(7485),u=n(1682),c=n(9466);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=h(e),[s,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[u,d]=m({queryString:n,groupId:a}),[b,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),f=(()=>{const e=u??b;return p({value:e,tabValues:l})?e:null})();(0,i.A)((()=>{f&&o(f)}),[f]);return{selectedValue:s,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),v(e)}),[d,v,l]),tabValues:l}}var v=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:s,tabValues:i}=e;const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,l.a_)(),c=e=>{const t=e.currentTarget,n=o.indexOf(t),a=i[n].value;a!==r&&(u(t),s(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:l}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:c,...l,className:(0,a.A)("tabs__item",f.tabItem,l?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function _(e){const t=b(e);return(0,g.jsxs)("div",{className:(0,a.A)("tabs-container",f.tabList),children:[(0,g.jsx)(x,{...t,...e}),(0,g.jsx)(j,{...t,...e})]})}function w(e){const t=(0,v.A)();return(0,g.jsx)(_,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const a={},l=r.createContext(a);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fdae8881.dc05964b.js b/assets/js/fdae8881.dc05964b.js deleted file mode 100644 index f24518041..000000000 --- a/assets/js/fdae8881.dc05964b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[1278],{1244:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/discord","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fe210aea.406a6fa8.js b/assets/js/fe210aea.406a6fa8.js new file mode 100644 index 000000000..4ecb70dbc --- /dev/null +++ b/assets/js/fe210aea.406a6fa8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[96],{7748:e=>{e.exports=JSON.parse('{"tag":{"label":"web","permalink":"/blog/tags/web","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/web","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/main.50bd3ea4.js b/assets/js/main.50bd3ea4.js deleted file mode 100644 index b3f01be87..000000000 --- a/assets/js/main.50bd3ea4.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.50bd3ea4.js.LICENSE.txt */ -(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0092d9fd":[()=>n.e(9057).then(n.bind(n,7039)),"@site/docs/audio/FLAC.mdx",7039],"015d9d66":[()=>n.e(4598).then(n.bind(n,8861)),"@site/docs/metrics/PSNR.mdx",8861],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"03af419f":[()=>Promise.all([n.e(1869),n.e(9305)]).then(n.bind(n,5702)),"@site/docs/encoders/VVenC.mdx",5702],"03e95fdf":[()=>n.e(3485).then(n.bind(n,7476)),"@site/docs/video/VP8.mdx",7476],"059e36ab":[()=>n.e(6838).then(n.bind(n,722)),"@site/docs/video/utvideo.mdx",722],"06ed4e86":[()=>n.e(8161).then(n.bind(n,511)),"@site/docs/audio/Dolby.mdx",511],"09a8bfdb":[()=>n.e(5579).then(n.bind(n,1689)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",1689],"09bc817a":[()=>n.e(1554).then(n.bind(n,2120)),"@site/docs/audio/Opus.mdx",2120],"0b185270":[()=>n.e(3482).then(n.bind(n,5754)),"@site/docs/FAQ.mdx",5754],"0c06159a":[()=>n.e(8258).then(n.bind(n,5420)),"@site/docs/data/tar.mdx",5420],"0e7f53a8":[()=>n.e(9954).then(n.bind(n,970)),"@site/docs/images/PNG.mdx",970],"112763a5":[()=>n.e(1779).then(n.bind(n,9503)),"@site/docs/terms-of-use.mdx",9503],"12b076f3":[()=>n.e(7222).then(n.bind(n,5340)),"@site/docs/data/zstd.mdx",5340],"12df3b9e":[()=>n.e(9993).then(n.bind(n,4154)),"@site/docs/images/QOI.mdx",4154],17896441:[()=>Promise.all([n.e(1869),n.e(8509),n.e(8401)]).then(n.bind(n,2447)),"@theme/DocItem",2447],"180751f5":[()=>n.e(3662).then(n.t.bind(n,5967,19)),"~blog/default/blog-tags-image-bfd-list.json",5967],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,1283)),"@theme/SearchPage",1283],"1b67d0f3":[()=>n.e(842).then(n.bind(n,6825)),"@site/docs/data/gzip.mdx",6825],"1ca2b1db":[()=>n.e(7855).then(n.bind(n,6054)),"@site/docs/encoders_hw/mediacodec.mdx",6054],"1ec3ce74":[()=>Promise.all([n.e(1869),n.e(2142)]).then(n.bind(n,4187)),"@site/docs/encoders/rav1e.mdx",4187],"1f227c78":[()=>n.e(2761).then(n.bind(n,6015)),"@site/docs/filtering/detelecine.mdx",6015],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(8509),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"202a438d":[()=>n.e(2989).then(n.t.bind(n,1142,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",1142],"20d769d8":[()=>n.e(3121).then(n.bind(n,7114)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx?truncated=true",7114],"229f7513":[()=>n.e(7146).then(n.bind(n,606)),"@site/docs/subtitles/webvtt.mdx",606],"239a6b34":[()=>n.e(7877).then(n.t.bind(n,1966,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],"28bd9d7a":[()=>n.e(888).then(n.bind(n,3560)),"@site/docs/utilities/FFMetrics.mdx",3560],"299beccc":[()=>n.e(5479).then(n.bind(n,1882)),"@site/docs/data/7z.mdx",1882],"2d25ac87":[()=>n.e(5949).then(n.bind(n,1449)),"@site/docs/utilities/autocompressor.mdx",1449],"318608aa":[()=>Promise.all([n.e(1869),n.e(6003)]).then(n.bind(n,1306)),"@site/docs/encoders/vpxenc.mdx",1306],"319244b6":[()=>n.e(5274).then(n.t.bind(n,1229,19)),"~blog/default/blog-tags-compression-c1f.json",1229],32987299:[()=>n.e(7754).then(n.bind(n,6820)),"@site/docs/filtering/vapoursynth.mdx",6820],"345ef4f9":[()=>n.e(6509).then(n.bind(n,7410)),"@site/docs/utilities/MKVToolNix.mdx",7410],39634027:[()=>n.e(5299).then(n.t.bind(n,4061,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"3d6cf458":[()=>n.e(2614).then(n.bind(n,7075)),"@site/docs/video/VC-1.mdx",7075],"44e37655":[()=>Promise.all([n.e(1869),n.e(5958)]).then(n.bind(n,962)),"@site/docs/metrics/SSIMULACRA2.mdx",962],"45f4020c":[()=>n.e(4897).then(n.bind(n,1806)),"@site/docs/encoders_hw/videotoolbox.mdx",1806],"48b7ca01":[()=>Promise.all([n.e(772),n.e(1347)]).then(n.bind(n,9350)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx?truncated=true",9350],"49b64d14":[()=>Promise.all([n.e(1869),n.e(5993)]).then(n.bind(n,7490)),"@site/docs/encoders/SVT-AV1.mdx",7490],"4c678320":[()=>n.e(9664).then(n.bind(n,2262)),"@site/src/pages/markdown-page.mdx",2262],"4d877b09":[()=>n.e(2150).then(n.bind(n,6780)),"@site/docs/encoders_hw/qsv.mdx",6780],"522a92e3":[()=>n.e(5220).then(n.bind(n,1542)),"@site/docs/encoders_hw/nvenc.mdx",1542],"54a9c2bb":[()=>n.e(561).then(n.bind(n,8490)),"@site/docs/utilities/YUView.mdx",8490],56786013:[()=>n.e(8741).then(n.bind(n,9449)),"@site/docs/images/JPEG.mdx",9449],"5b209502":[()=>n.e(4176).then(n.bind(n,4817)),"@site/docs/filtering/deinterlace.mdx",4817],"5d1a7e8b":[()=>n.e(5936).then(n.bind(n,5826)),"@site/docs/video-players.mdx",5826],"5db6705b":[()=>n.e(1624).then(n.bind(n,5529)),"@site/docs/utilities/nmkoder.mdx",5529],"5e069031":[()=>n.e(5968).then(n.bind(n,6398)),"@site/docs/introduction/prologue.mdx",6398],"5e1194df":[()=>n.e(4822).then(n.bind(n,7633)),"@site/docs/data/zpaq.mdx",7633],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ec46d54":[()=>n.e(1481).then(n.bind(n,3844)),"@site/docs/video/ECM.mdx",3844],"5f74c797":[()=>Promise.all([n.e(1869),n.e(5745)]).then(n.bind(n,2316)),"@site/docs/utilities/av1an.mdx",2316],"60d0076e":[()=>n.e(7613).then(n.bind(n,1483)),"@site/docs/filtering/intro.mdx",1483],"632d0ef1":[()=>n.e(106).then(n.bind(n,9497)),"@site/docs/encoders/VTM.mdx",9497],"6549b2b5":[()=>n.e(4846).then(n.bind(n,2417)),"@site/blog/2023-07-21-site-optimization.mdx",2417],"6875c492":[()=>Promise.all([n.e(1869),n.e(8509),n.e(3242),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"6bf0f114":[()=>n.e(881).then(n.bind(n,6020)),"@site/docs/data/zip.mdx",6020],"6c179ac5":[()=>n.e(4072).then(n.bind(n,4603)),"@site/docs/video/Theora.mdx",4603],"6d85920a":[()=>n.e(7800).then(n.bind(n,624)),"@site/docs/introduction/terminology.mdx",624],70006292:[()=>n.e(9987).then(n.bind(n,7978)),"@site/docs/encoders/x266.mdx",7978],"70de1c07":[()=>Promise.all([n.e(772),n.e(544)]).then(n.bind(n,850)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",850],"7385c97b":[()=>n.e(8415).then(n.bind(n,975)),"@site/docs/images/AVIF.mdx",975],74450489:[()=>n.e(7686).then(n.t.bind(n,4939,19)),"~blog/default/blog-tags-web-0e7.json",4939],"76096a15":[()=>n.e(8924).then(n.bind(n,9101)),"@site/docs/subtitles/SRT.mdx",9101],"7d044f50":[()=>n.e(8963).then(n.t.bind(n,7365,19)),"~blog/default/blog-tags-video-835-list.json",7365],"7d09a242":[()=>Promise.all([n.e(1869),n.e(6692)]).then(n.bind(n,1991)),"@site/docs/encoders/aomenc.mdx",1991],"7ec778da":[()=>n.e(3657).then(n.t.bind(n,4718,19)),"~blog/default/blog-tags-video-835.json",4718],"7eff0f1a":[()=>n.e(2515).then(n.bind(n,4802)),"@site/docs/video/AVC.mdx",4802],"7f76a12e":[()=>n.e(1502).then(n.bind(n,2225)),"@site/blog/2023-09-03-av1-for-dummies.mdx",2225],"7fa695a7":[()=>n.e(1363).then(n.bind(n,3041)),"@site/docs/images/GIF.mdx",3041],80447496:[()=>n.e(7715).then(n.bind(n,6477)),"@site/docs/video/VVC.mdx",6477],"80bfa96b":[()=>n.e(2901).then(n.bind(n,9553)),"@site/docs/resources.mdx",9553],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],81739261:[()=>n.e(4794).then(n.bind(n,8089)),"@site/docs/video/prores.mdx",8089],"83732ada":[()=>n.e(6840).then(n.bind(n,7860)),"@site/docs/video/HEVC.mdx",7860],"842a7beb":[()=>n.e(6866).then(n.bind(n,5227)),"@site/docs/utilities/rAV1ator.mdx",5227],"84e198a2":[()=>n.e(6711).then(n.bind(n,80)),"@site/docs/utilities/eac3to.mdx",80],"86ba2311":[()=>n.e(8141).then(n.bind(n,1577)),"@site/docs/video/VP9.mdx",1577],"8a894f7b":[()=>n.e(538).then(n.bind(n,9990)),"@site/docs/introduction/video-artifacts.mdx",9990],"8aacd032":[()=>n.e(2897).then(n.bind(n,9592)),"@site/docs/video/AV1.mdx",9592],"8bdabb45":[()=>n.e(7957).then(n.bind(n,6476)),"@site/docs/encoders/AVM.mdx",6476],"8eb2df80":[()=>Promise.all([n.e(1869),n.e(7796)]).then(n.bind(n,4582)),"@site/docs/utilities/rav1ator-cli.mdx",4582],"9060e84a":[()=>n.e(8320).then(n.bind(n,1705)),"@site/docs/encoders/HM.mdx",1705],"90aedb84":[()=>n.e(1691).then(n.bind(n,8909)),"@site/docs/introduction/psychovisual.mdx",8909],"915a111c":[()=>n.e(5889).then(n.bind(n,2622)),"@site/docs/filtering/dehalo.mdx",2622],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"998d107e":[()=>n.e(274).then(n.bind(n,1083)),"@site/docs/video/FFV1.mdx",1083],"99c26446":[()=>n.e(8026).then(n.bind(n,698)),"@site/docs/metrics/butteraugli.mdx",698],"9b6fb453":[()=>n.e(6732).then(n.t.bind(n,2945,19)),"/Users/giannim2/git-cloning/codec-wiki/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",2945],"9ba56b79":[()=>n.e(1288).then(n.bind(n,3578)),"@site/docs/encoders_hw/amf.mdx",3578],"9c171e5c":[()=>n.e(8773).then(n.bind(n,6854)),"@site/docs/metrics/SSIM.mdx",6854],"9cae5962":[()=>Promise.all([n.e(1869),n.e(71)]).then(n.bind(n,149)),"@site/docs/images/JXL.mdx",149],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9efd8a4a":[()=>n.e(5415).then(n.bind(n,3885)),"@site/docs/images/WebP.mdx",3885],"9f640ee8":[()=>n.e(6810).then(n.bind(n,5811)),"@site/docs/encoders/Aurora1.mdx",5811],"9f709603":[()=>n.e(5341).then(n.bind(n,2925)),"@site/docs/filtering/deband.mdx",2925],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8509),n.e(3242),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7023ddc:[()=>n.e(9267).then(n.t.bind(n,8289,19)),"~blog/default/blog-tags-tags-4c2.json",8289],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a8f610c9:[()=>n.e(8599).then(n.bind(n,753)),"@site/docs/data/brotli.mdx",753],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],afe5e22f:[()=>n.e(8117).then(n.bind(n,9765)),"@site/docs/encoders/x265.mdx",9765],b0535000:[()=>n.e(7238).then(n.bind(n,851)),"@site/blog/2023-07-21-site-optimization.mdx?truncated=true",851],b059735e:[()=>n.e(5571).then(n.t.bind(n,6666,19)),"~blog/default/blog-tags-web-0e7-list.json",6666],b2b675dd:[()=>n.e(1991).then(n.t.bind(n,9775,19)),"~blog/default/blog-c06.json",9775],b2f554cd:[()=>n.e(5894).then(n.t.bind(n,6042,19)),"~blog/default/blog-archive-80c.json",6042],b4030b4d:[()=>Promise.all([n.e(1869),n.e(3408)]).then(n.bind(n,4557)),"@site/docs/utilities/Aviator.mdx",4557],b4bbde8e:[()=>n.e(7989).then(n.bind(n,7128)),"@site/docs/audio/AAC.mdx",7128],b59b8cf7:[()=>n.e(1271).then(n.bind(n,7592)),"@site/docs/audio/Vorbis.mdx",7592],b8af02bf:[()=>n.e(3222).then(n.bind(n,8348)),"@site/docs/images/JPEG2000.mdx",8348],bc32b9c5:[()=>n.e(786).then(n.bind(n,1839)),"@site/docs/metrics/XPSNR.mdx",1839],bd173b27:[()=>n.e(1651).then(n.bind(n,8647)),"@site/docs/data/xz.mdx",8647],be236901:[()=>n.e(6795).then(n.bind(n,5349)),"@site/docs/contribution-guide.mdx",5349],bf9d09b6:[()=>Promise.all([n.e(1869),n.e(8270)]).then(n.bind(n,9094)),"@site/docs/encoders/SVT-HEVC.mdx",9094],c224274c:[()=>n.e(3356).then(n.bind(n,4372)),"@site/docs/video/AVS3.mdx",4372],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,1459)),"@site/src/pages/index.js",1459],c7deb2e0:[()=>n.e(9551).then(n.bind(n,7868)),"@site/docs/audio/WavPack.mdx",7868],c92fe796:[()=>n.e(3034).then(n.bind(n,6264)),"@site/docs/utilities/ffmpeg.mdx",6264],c943a24a:[()=>n.e(5512).then(n.bind(n,4421)),"@site/docs/introduction/high-dynamic-range.mdx",4421],ccc49370:[()=>Promise.all([n.e(1869),n.e(8509),n.e(3242),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cce09ffa:[()=>n.e(5556).then(n.bind(n,1939)),"@site/blog/2023-09-03-av1-for-dummies.mdx?truncated=true",1939],cd6cf5b7:[()=>n.e(5365).then(n.bind(n,4203)),"@site/docs/encoders/SVT-VP9.mdx",4203],ce98a713:[()=>n.e(6168).then(n.bind(n,8448)),"@site/docs/filtering/denoise.mdx",8448],cf7588c6:[()=>n.e(5971).then(n.bind(n,9520)),"@site/docs/encoders/x264.mdx",9520],d1becb09:[()=>n.e(8843).then(n.bind(n,7519)),"@site/docs/privacy-policy.mdx",7519],d5ab79da:[()=>n.e(8382).then(n.bind(n,9419)),"@site/docs/audio/MP3.mdx",9419],d5f89569:[()=>n.e(1401).then(n.bind(n,2348)),"@site/docs/encoders/Kvazaar.mdx",2348],d6535278:[()=>Promise.all([n.e(1869),n.e(6977)]).then(n.bind(n,3096)),"@site/docs/metrics/VMAF.mdx",3096],ddce1156:[()=>n.e(1408).then(n.bind(n,6019)),"@site/docs/utilities/mp4box.mdx",6019],e157395a:[()=>n.e(7967).then(n.bind(n,2238)),"@site/docs/images/HEIC.mdx",2238],e1a437f7:[()=>n.e(9381).then(n.bind(n,8690)),"@site/docs/data/bzip2.mdx",8690],e3b00369:[()=>n.e(921).then(n.bind(n,237)),"@site/docs/utilities/av1an-command-gen.mdx",237],e641ee58:[()=>n.e(5738).then(n.bind(n,3528)),"@site/docs/audio/Speex.mdx",3528],e66c2e3c:[()=>n.e(7090).then(n.t.bind(n,177,19)),"~blog/default/blog-tags-benchmarks-e1b.json",177],e6fe0126:[()=>n.e(6368).then(n.t.bind(n,5848,19)),"~blog/default/blog-tags-image-bfd.json",5848],e73e1d83:[()=>n.e(6555).then(n.t.bind(n,9344,19)),"~blog/default/blog-tags-benchmarks-e1b-list.json",9344],e80106d6:[()=>n.e(2909).then(n.t.bind(n,7756,19)),"~blog/default/blog-tags-compression-c1f-list.json",7756],ee513c31:[()=>Promise.all([n.e(1869),n.e(1137)]).then(n.bind(n,2154)),"@site/docs/utilities/dovi_tool.mdx",2154],ee8c27e3:[()=>n.e(9819).then(n.bind(n,7346)),"@site/docs/encoders/uvg266.mdx",7346],f0f157d6:[()=>n.e(3456).then(n.t.bind(n,701,19)),"~blog/default/blog-tags-discord-ee6.json",701],f4fea690:[()=>n.e(4924).then(n.bind(n,6387)),"@site/docs/encoders/JM.mdx",6387],f9208490:[()=>Promise.all([n.e(1869),n.e(3229)]).then(n.bind(n,1865)),"@site/docs/utilities/hdr10plus_tool.mdx",1865],fdae8881:[()=>n.e(1278).then(n.t.bind(n,1244,19)),"~blog/default/blog-tags-discord-ee6-list.json",1244]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/blog",component:d("/blog","51c"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","6b5"),exact:!0},{path:"/blog/av1-encoding-for-dummies",component:d("/blog/av1-encoding-for-dummies","85a"),exact:!0},{path:"/blog/embedding-the-un-embeddable",component:d("/blog/embedding-the-un-embeddable","288"),exact:!0},{path:"/blog/site-optimization",component:d("/blog/site-optimization","f26"),exact:!0},{path:"/blog/svt-av1-deep-dive",component:d("/blog/svt-av1-deep-dive","8fd"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","b03"),exact:!0},{path:"/blog/tags/benchmarks",component:d("/blog/tags/benchmarks","2af"),exact:!0},{path:"/blog/tags/compression",component:d("/blog/tags/compression","067"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","209"),exact:!0},{path:"/blog/tags/image",component:d("/blog/tags/image","4fc"),exact:!0},{path:"/blog/tags/video",component:d("/blog/tags/video","0ba"),exact:!0},{path:"/blog/tags/web",component:d("/blog/tags/web","ef7"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","5e5"),exact:!0},{path:"/search",component:d("/search","1b3"),exact:!0},{path:"/docs",component:d("/docs","773"),routes:[{path:"/docs",component:d("/docs","10e"),routes:[{path:"/docs",component:d("/docs","401"),routes:[{path:"/docs/audio/AAC",component:d("/docs/audio/AAC","cc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Dolby",component:d("/docs/audio/Dolby","be7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/FLAC",component:d("/docs/audio/FLAC","68a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/MP3",component:d("/docs/audio/MP3","8b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Opus",component:d("/docs/audio/Opus","ede"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Speex",component:d("/docs/audio/Speex","efd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Vorbis",component:d("/docs/audio/Vorbis","e65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/WavPack",component:d("/docs/audio/WavPack","faf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/contribution-guide",component:d("/docs/contribution-guide","a83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/7z",component:d("/docs/data/7z","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/brotli",component:d("/docs/data/brotli","f1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/bzip2",component:d("/docs/data/bzip2","aea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/gzip",component:d("/docs/data/gzip","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/tar",component:d("/docs/data/tar","548"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/xz",component:d("/docs/data/xz","a88"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zip",component:d("/docs/data/zip","2e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zpaq",component:d("/docs/data/zpaq","407"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zstd",component:d("/docs/data/zstd","78a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/amf",component:d("/docs/encoders_hw/amf","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/mediacodec",component:d("/docs/encoders_hw/mediacodec","e64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/nvenc",component:d("/docs/encoders_hw/nvenc","851"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/qsv",component:d("/docs/encoders_hw/qsv","ce1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/videotoolbox",component:d("/docs/encoders_hw/videotoolbox","426"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aomenc",component:d("/docs/encoders/aomenc","3c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Aurora1",component:d("/docs/encoders/Aurora1","96b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/AVM",component:d("/docs/encoders/AVM","1b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/HM",component:d("/docs/encoders/HM","09e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/JM",component:d("/docs/encoders/JM","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Kvazaar",component:d("/docs/encoders/Kvazaar","723"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/rav1e",component:d("/docs/encoders/rav1e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1",component:d("/docs/encoders/SVT-AV1","c47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-HEVC",component:d("/docs/encoders/SVT-HEVC","d5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-VP9",component:d("/docs/encoders/SVT-VP9","952"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uvg266",component:d("/docs/encoders/uvg266","d2d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/vpxenc",component:d("/docs/encoders/vpxenc","9fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VTM",component:d("/docs/encoders/VTM","e57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VVenC",component:d("/docs/encoders/VVenC","469"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x264",component:d("/docs/encoders/x264","26c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x265",component:d("/docs/encoders/x265","fb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x266",component:d("/docs/encoders/x266","74f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/FAQ",component:d("/docs/FAQ","5ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deband",component:d("/docs/filtering/deband","2ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/dehalo",component:d("/docs/filtering/dehalo","c4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deinterlace",component:d("/docs/filtering/deinterlace","62f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/denoise",component:d("/docs/filtering/denoise","129"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/detelecine",component:d("/docs/filtering/detelecine","ee9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/intro",component:d("/docs/filtering/intro","ee2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/vapoursynth",component:d("/docs/filtering/vapoursynth","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/AVIF",component:d("/docs/images/AVIF","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/GIF",component:d("/docs/images/GIF","677"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/HEIC",component:d("/docs/images/HEIC","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG",component:d("/docs/images/JPEG","7f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG2000",component:d("/docs/images/JPEG2000","3f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JXL",component:d("/docs/images/JXL","abb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/PNG",component:d("/docs/images/PNG","9b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/QOI",component:d("/docs/images/QOI","c2e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/WebP",component:d("/docs/images/WebP","b27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/high-dynamic-range",component:d("/docs/introduction/high-dynamic-range","7e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/prologue",component:d("/docs/introduction/prologue","b4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/psychovisual",component:d("/docs/introduction/psychovisual","539"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/terminology",component:d("/docs/introduction/terminology","041"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/video-artifacts",component:d("/docs/introduction/video-artifacts","0af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/butteraugli",component:d("/docs/metrics/butteraugli","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/PSNR",component:d("/docs/metrics/PSNR","1e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIM",component:d("/docs/metrics/SSIM","1ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIMULACRA2",component:d("/docs/metrics/SSIMULACRA2","a14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/VMAF",component:d("/docs/metrics/VMAF","62e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/XPSNR",component:d("/docs/metrics/XPSNR","646"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/privacy-policy",component:d("/docs/privacy-policy","923"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/resources",component:d("/docs/resources","0e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SRT",component:d("/docs/subtitles/SRT","af2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/webvtt",component:d("/docs/subtitles/webvtt","d8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/terms-of-use",component:d("/docs/terms-of-use","70c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/autocompressor",component:d("/docs/utilities/autocompressor","43c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an",component:d("/docs/utilities/av1an","53c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an-command-gen",component:d("/docs/utilities/av1an-command-gen","f4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Aviator",component:d("/docs/utilities/Aviator","b18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/dovi_tool",component:d("/docs/utilities/dovi_tool","6fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/eac3to",component:d("/docs/utilities/eac3to","fde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/FFMetrics",component:d("/docs/utilities/FFMetrics","bb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/ffmpeg",component:d("/docs/utilities/ffmpeg","07b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/hdr10plus_tool",component:d("/docs/utilities/hdr10plus_tool","d8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/MKVToolNix",component:d("/docs/utilities/MKVToolNix","2d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/mp4box",component:d("/docs/utilities/mp4box","d04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/nmkoder",component:d("/docs/utilities/nmkoder","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rAV1ator",component:d("/docs/utilities/rAV1ator","88b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rav1ator-cli",component:d("/docs/utilities/rav1ator-cli","930"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/YUView",component:d("/docs/utilities/YUView","017"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video-players",component:d("/docs/video-players","870"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AV1",component:d("/docs/video/AV1","28f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVC",component:d("/docs/video/AVC","e47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVS3",component:d("/docs/video/AVS3","42e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/ECM",component:d("/docs/video/ECM","568"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/FFV1",component:d("/docs/video/FFV1","ec1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/HEVC",component:d("/docs/video/HEVC","df9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/prores",component:d("/docs/video/prores","770"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/Theora",component:d("/docs/video/Theora","4cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/utvideo",component:d("/docs/video/utvideo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VC-1",component:d("/docs/video/VC-1","d82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP8",component:d("/docs/video/VP8","88c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP9",component:d("/docs/video/VP9","dc7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VVC",component:d("/docs/video/VVC","1f7"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","874"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(4625),i=n(545),s=n(8193);const l=[n(119),n(6134),n(6294),n(1043),n(8015)];var c=n(8328),u=n(6347),d=n(2831),p=n(4848);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5260),m=n(4586),g=n(6025),b=n(6342),y=n(1213),v=n(2131),x=n(4090),w=n(2967),k=n(440),S=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.A)(),r=(0,v.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.A)(),{pathname:r}=(0,u.zy)();return e+(0,k.applyTrailingSlash)((0,g.A)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.w})]}),n&&(0,p.jsx)(y.be,{image:n}),(0,p.jsx)(_,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.A,{tag:w.Cy,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const A=new Map;function T(e){if(A.has(e.pathname))return{...e,pathname:A.get(e.pathname)};if((0,d.u)(c.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}var P=n(6125),L=n(6988),N=n(205);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const j=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),O("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(j,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.qh,{location:t,render:()=>e})})}}const F=I,M="__docusaurus-base-url-issue-banner-container",z="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(6921);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),R(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.vd,{children:(0,p.jsx)(a.Kd,{children:(0,p.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};R(window.location.pathname).then(s)}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduction/prologue","docs":[{"id":"audio/AAC","path":"/docs/audio/AAC","sidebar":"tutorialSidebar"},{"id":"audio/Dolby","path":"/docs/audio/Dolby","sidebar":"tutorialSidebar"},{"id":"audio/FLAC","path":"/docs/audio/FLAC","sidebar":"tutorialSidebar"},{"id":"audio/MP3","path":"/docs/audio/MP3","sidebar":"tutorialSidebar"},{"id":"audio/Opus","path":"/docs/audio/Opus","sidebar":"tutorialSidebar"},{"id":"audio/Speex","path":"/docs/audio/Speex","sidebar":"tutorialSidebar"},{"id":"audio/Vorbis","path":"/docs/audio/Vorbis","sidebar":"tutorialSidebar"},{"id":"audio/WavPack","path":"/docs/audio/WavPack","sidebar":"tutorialSidebar"},{"id":"contribution-guide","path":"/docs/contribution-guide","sidebar":"tutorialSidebar"},{"id":"data/7z","path":"/docs/data/7z","sidebar":"tutorialSidebar"},{"id":"data/brotli","path":"/docs/data/brotli","sidebar":"tutorialSidebar"},{"id":"data/bzip2","path":"/docs/data/bzip2","sidebar":"tutorialSidebar"},{"id":"data/gzip","path":"/docs/data/gzip","sidebar":"tutorialSidebar"},{"id":"data/tar","path":"/docs/data/tar","sidebar":"tutorialSidebar"},{"id":"data/xz","path":"/docs/data/xz","sidebar":"tutorialSidebar"},{"id":"data/zip","path":"/docs/data/zip","sidebar":"tutorialSidebar"},{"id":"data/zpaq","path":"/docs/data/zpaq","sidebar":"tutorialSidebar"},{"id":"data/zstd","path":"/docs/data/zstd","sidebar":"tutorialSidebar"},{"id":"encoders_hw/amf","path":"/docs/encoders_hw/amf","sidebar":"tutorialSidebar"},{"id":"encoders_hw/mediacodec","path":"/docs/encoders_hw/mediacodec","sidebar":"tutorialSidebar"},{"id":"encoders_hw/nvenc","path":"/docs/encoders_hw/nvenc","sidebar":"tutorialSidebar"},{"id":"encoders_hw/qsv","path":"/docs/encoders_hw/qsv","sidebar":"tutorialSidebar"},{"id":"encoders_hw/videotoolbox","path":"/docs/encoders_hw/videotoolbox","sidebar":"tutorialSidebar"},{"id":"encoders/aomenc","path":"/docs/encoders/aomenc","sidebar":"tutorialSidebar"},{"id":"encoders/Aurora1","path":"/docs/encoders/Aurora1","sidebar":"tutorialSidebar"},{"id":"encoders/AVM","path":"/docs/encoders/AVM","sidebar":"tutorialSidebar"},{"id":"encoders/HM","path":"/docs/encoders/HM","sidebar":"tutorialSidebar"},{"id":"encoders/JM","path":"/docs/encoders/JM","sidebar":"tutorialSidebar"},{"id":"encoders/Kvazaar","path":"/docs/encoders/Kvazaar","sidebar":"tutorialSidebar"},{"id":"encoders/rav1e","path":"/docs/encoders/rav1e","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1","path":"/docs/encoders/SVT-AV1","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-HEVC","path":"/docs/encoders/SVT-HEVC","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-VP9","path":"/docs/encoders/SVT-VP9","sidebar":"tutorialSidebar"},{"id":"encoders/uvg266","path":"/docs/encoders/uvg266","sidebar":"tutorialSidebar"},{"id":"encoders/vpxenc","path":"/docs/encoders/vpxenc","sidebar":"tutorialSidebar"},{"id":"encoders/VTM","path":"/docs/encoders/VTM","sidebar":"tutorialSidebar"},{"id":"encoders/VVenC","path":"/docs/encoders/VVenC","sidebar":"tutorialSidebar"},{"id":"encoders/x264","path":"/docs/encoders/x264","sidebar":"tutorialSidebar"},{"id":"encoders/x265","path":"/docs/encoders/x265","sidebar":"tutorialSidebar"},{"id":"encoders/x266","path":"/docs/encoders/x266","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/docs/FAQ","sidebar":"tutorialSidebar"},{"id":"filtering/deband","path":"/docs/filtering/deband","sidebar":"tutorialSidebar"},{"id":"filtering/dehalo","path":"/docs/filtering/dehalo","sidebar":"tutorialSidebar"},{"id":"filtering/deinterlace","path":"/docs/filtering/deinterlace","sidebar":"tutorialSidebar"},{"id":"filtering/denoise","path":"/docs/filtering/denoise","sidebar":"tutorialSidebar"},{"id":"filtering/detelecine","path":"/docs/filtering/detelecine","sidebar":"tutorialSidebar"},{"id":"filtering/intro","path":"/docs/filtering/intro","sidebar":"tutorialSidebar"},{"id":"filtering/vapoursynth","path":"/docs/filtering/vapoursynth","sidebar":"tutorialSidebar"},{"id":"images/AVIF","path":"/docs/images/AVIF","sidebar":"tutorialSidebar"},{"id":"images/GIF","path":"/docs/images/GIF","sidebar":"tutorialSidebar"},{"id":"images/HEIC","path":"/docs/images/HEIC","sidebar":"tutorialSidebar"},{"id":"images/JPEG","path":"/docs/images/JPEG","sidebar":"tutorialSidebar"},{"id":"images/JPEG2000","path":"/docs/images/JPEG2000","sidebar":"tutorialSidebar"},{"id":"images/JXL","path":"/docs/images/JXL","sidebar":"tutorialSidebar"},{"id":"images/PNG","path":"/docs/images/PNG","sidebar":"tutorialSidebar"},{"id":"images/QOI","path":"/docs/images/QOI","sidebar":"tutorialSidebar"},{"id":"images/WebP","path":"/docs/images/WebP","sidebar":"tutorialSidebar"},{"id":"introduction/high-dynamic-range","path":"/docs/introduction/high-dynamic-range","sidebar":"tutorialSidebar"},{"id":"introduction/prologue","path":"/docs/introduction/prologue","sidebar":"tutorialSidebar"},{"id":"introduction/psychovisual","path":"/docs/introduction/psychovisual","sidebar":"tutorialSidebar"},{"id":"introduction/terminology","path":"/docs/introduction/terminology","sidebar":"tutorialSidebar"},{"id":"introduction/video-artifacts","path":"/docs/introduction/video-artifacts","sidebar":"tutorialSidebar"},{"id":"metrics/butteraugli","path":"/docs/metrics/butteraugli","sidebar":"tutorialSidebar"},{"id":"metrics/PSNR","path":"/docs/metrics/PSNR","sidebar":"tutorialSidebar"},{"id":"metrics/SSIM","path":"/docs/metrics/SSIM","sidebar":"tutorialSidebar"},{"id":"metrics/SSIMULACRA2","path":"/docs/metrics/SSIMULACRA2","sidebar":"tutorialSidebar"},{"id":"metrics/VMAF","path":"/docs/metrics/VMAF","sidebar":"tutorialSidebar"},{"id":"metrics/XPSNR","path":"/docs/metrics/XPSNR","sidebar":"tutorialSidebar"},{"id":"privacy-policy","path":"/docs/privacy-policy","sidebar":"tutorialSidebar"},{"id":"resources","path":"/docs/resources","sidebar":"tutorialSidebar"},{"id":"subtitles/SRT","path":"/docs/subtitles/SRT","sidebar":"tutorialSidebar"},{"id":"subtitles/webvtt","path":"/docs/subtitles/webvtt","sidebar":"tutorialSidebar"},{"id":"terms-of-use","path":"/docs/terms-of-use","sidebar":"tutorialSidebar"},{"id":"utilities/autocompressor","path":"/docs/utilities/autocompressor","sidebar":"tutorialSidebar"},{"id":"utilities/av1an","path":"/docs/utilities/av1an","sidebar":"tutorialSidebar"},{"id":"utilities/av1an-command-gen","path":"/docs/utilities/av1an-command-gen","sidebar":"tutorialSidebar"},{"id":"utilities/Aviator","path":"/docs/utilities/Aviator","sidebar":"tutorialSidebar"},{"id":"utilities/dovi_tool","path":"/docs/utilities/dovi_tool","sidebar":"tutorialSidebar"},{"id":"utilities/eac3to","path":"/docs/utilities/eac3to","sidebar":"tutorialSidebar"},{"id":"utilities/FFMetrics","path":"/docs/utilities/FFMetrics","sidebar":"tutorialSidebar"},{"id":"utilities/ffmpeg","path":"/docs/utilities/ffmpeg","sidebar":"tutorialSidebar"},{"id":"utilities/hdr10plus_tool","path":"/docs/utilities/hdr10plus_tool","sidebar":"tutorialSidebar"},{"id":"utilities/MKVToolNix","path":"/docs/utilities/MKVToolNix","sidebar":"tutorialSidebar"},{"id":"utilities/mp4box","path":"/docs/utilities/mp4box","sidebar":"tutorialSidebar"},{"id":"utilities/nmkoder","path":"/docs/utilities/nmkoder","sidebar":"tutorialSidebar"},{"id":"utilities/rAV1ator","path":"/docs/utilities/rAV1ator","sidebar":"tutorialSidebar"},{"id":"utilities/rav1ator-cli","path":"/docs/utilities/rav1ator-cli","sidebar":"tutorialSidebar"},{"id":"utilities/YUView","path":"/docs/utilities/YUView","sidebar":"tutorialSidebar"},{"id":"video-players","path":"/docs/video-players","sidebar":"tutorialSidebar"},{"id":"video/AV1","path":"/docs/video/AV1","sidebar":"tutorialSidebar"},{"id":"video/AVC","path":"/docs/video/AVC","sidebar":"tutorialSidebar"},{"id":"video/AVS3","path":"/docs/video/AVS3","sidebar":"tutorialSidebar"},{"id":"video/ECM","path":"/docs/video/ECM","sidebar":"tutorialSidebar"},{"id":"video/FFV1","path":"/docs/video/FFV1","sidebar":"tutorialSidebar"},{"id":"video/HEVC","path":"/docs/video/HEVC","sidebar":"tutorialSidebar"},{"id":"video/prores","path":"/docs/video/prores","sidebar":"tutorialSidebar"},{"id":"video/Theora","path":"/docs/video/Theora","sidebar":"tutorialSidebar"},{"id":"video/utvideo","path":"/docs/video/utvideo","sidebar":"tutorialSidebar"},{"id":"video/VC-1","path":"/docs/video/VC-1","sidebar":"tutorialSidebar"},{"id":"video/VP8","path":"/docs/video/VP8","sidebar":"tutorialSidebar"},{"id":"video/VP9","path":"/docs/video/VP9","sidebar":"tutorialSidebar"},{"id":"video/VVC","path":"/docs/video/VVC","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/introduction/prologue","label":"introduction/prologue"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.2.1","siteVersion":"0.1.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.2.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.2.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.2.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.2.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.2.1"},"docusaurus-plugin-image-zoom":{"type":"package","name":"plugin-image-zoom","version":"1.2.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(5476),l=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:x}}=(0,i.A)(),{withBaseUrl:w}=(0,u.h)(),k=(0,c.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=p||f;const _=(0,s.A)(E),C=E?.replace("pathname://","");let A=void 0!==C?(T=C,b&&(e=>e.startsWith("/"))(T)?w(T):T):void 0;var T;A&&_&&(A=(0,a.applyTrailingSlash)(A,{trailingSlash:v,baseUrl:x}));const P=(0,r.useRef)(!1),L=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,O=(0,r.useRef)(),j=()=>{P.current||null==A||(window.docusaurus.preload(A),P.current=!0)};(0,r.useEffect)((()=>(!N&&_&&null!=A&&window.docusaurus.prefetch(A),()=>{N&&O.current&&O.current.disconnect()})),[O,A,N,_]);const R=A?.startsWith("#")??!1,I=!y.target||"_self"===y.target,F=!A||!_||!I||R;return g||!R&&F||k.collectLink(A),y.id&&k.collectAnchor(y.id),F?(0,d.jsx)("a",{ref:S,href:A,...E&&!_&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(L,{...y,onMouseEnter:j,onTouchStart:j,innerRef:e=>{S.current=e,N&&e&&_&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),O.current.observe(e))},to:A,...n&&{isActive:m,activeClassName:h}})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,h:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.z)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>p,Gy:()=>u,HW:()=>g,ht:()=>d,r7:()=>h,jh:()=>f});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function f(e){return d(e).versions}function h(e){const t=d(e);return s(t)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return l(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(8181),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(875)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},5476:(e,t,n)=>{"use strict";n.d(t,{A:()=>It});var r=n(6540),o=n(8215),a=n(7489),i=n(1213),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var x=n(6342),w=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.Mj)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var P=n(2069),L=n(3104);var N=n(9532),O=n(5600);const j=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,P.M)(),t=(0,O.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,N.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(j.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(j);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,O.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=F();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var z=n(5293),D=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function V(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,D.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(V),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,z.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var G=n(3465);function q(){return(0,u.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,P.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.A)(r),p=(0,X.A)(t),f=(0,X.A)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ge,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ge,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(2131);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",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"})})}const ge="iconLanguage_nlXk";var be=n(1088),ye=n(53),ve=n(5597),xe=n(4070),we=n(5891),ke=n(2384),Se=n(4471),Ee=n(7674),_e=n(6841),Ce=n(3810);const Ae='',Te='',Pe='',Le='',Ne='',Oe='',je='',Re={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ie(e){let{document:t,type:n,page:r,metadata:o,tokens:a,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,c=1===n,u=[];i?u.push(Oe):s&&u.push(je);const d=u.map((e=>`${e}`)),p=`${l?Ae:c?Te:Pe}`,f=[`${(0,Ce.C)(t.t,(0,Ee.g)(o,"t"),a)}`];if(!i&&!s&&be.tb){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Se.$)(e??[])}`)}else l||f.push(`${(0,_e.Z)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),a)}`);const h=`${Le}`;return[...d,p,``,...f,"",h].join("")}function Fe(){return`${Ne}${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(2849),ze=n(3385);async function De(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Be="_highlight";const $e=function(e){let{handleSearchBarToggle:t}=e;const n=(0,D.A)(),{siteConfig:{baseUrl:o},i18n:{currentLocale:a}}=(0,le.A)(),i=(0,xe.vT)();let c=o;try{const{preferredVersion:e}=(0,ve.g1)(i?.pluginId??be.UB);e&&!e.isLast&&(c=e.path+"/")}catch(M){if(be.I$&&!(M instanceof N.dV))throw M}const d=(0,s.W6)(),p=(0,s.zy)(),f=(0,r.useRef)(null),h=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[g,b]=(0,r.useState)(!1),[y,v]=(0,r.useState)(!1),[x,w]=(0,r.useState)(""),k=(0,r.useRef)(null),S=(0,r.useRef)(""),[E,_]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Hg))return;let e="";if(p.pathname.startsWith(c)){const t=p.pathname.substring(c.length);let n;for(const e of be.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}S.current!==e&&(h.current.delete(e),S.current=e),_(e)}),[p.pathname,c]);const C=!!be.O6&&Array.isArray(be.Hg)&&""===E,A=(0,r.useCallback)((async()=>{if(C||h.current.get(E))return;h.current.set(E,"loading"),k.current?.autocomplete.destroy(),b(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,we.Z)(c,E),De()]);if(k.current=n(f.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.A)(Re.searchBar,{[Re.searchBarLeft]:"left"===be.ZG}),noPrefix:!0,dropdownMenu:Re.dropdownMenu,input:Re.input,hint:Re.hint,suggestions:Re.suggestions,suggestion:Re.suggestion,cursor:Re.cursor,dataset:Re.dataset,empty:Re.empty}},[{source:(0,ke.m)(e,t,be.AT),templates:{suggestion:Ie,empty:Fe,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!be.dz))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),i=new URLSearchParams;let s;if(i.set("q",t),E){const e=E&&Array.isArray(be.Hg)?be.Hg.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,ze.p)(e,a).label:E;s=be.dz&&n?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(be.Hg)||be.dz&&n||i.set("ctx",E),c!==o){if(!c.startsWith(o))throw new Error(`Version url '${c}' does not start with base url '${o}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);i.set("version",c.substring(o.length))}const u=`${o}search?${i.toString()}`;return r.href=u,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),d.push(u))})),r})({query:t,isEmpty:n}),i=document.createElement("div");return i.className=Re.hitFooter,i.appendChild(r),i}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:o}=t;f.current?.blur();let a=n;if(be.CU&&o.length>0){const e=new URLSearchParams;for(const t of o)e.append(Be,t);a+=`?${e.toString()}`}r&&(a+=r),d.push(a)})).on("autocomplete:closed",(()=>{f.current?.blur()})),h.current.set(E,"done"),b(!1),m.current){const e=f.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[C,E,c,o,d]);(0,r.useEffect)((()=>{if(!be.CU)return;const e=n?new URLSearchParams(p.search).getAll(Be):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.CU(t);n.unmark(),0!==e.length&&n.mark(e),w(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[n,p.search,p.pathname]);const[T,P]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{m.current=!0,A(),P(!0),t?.(!0)}),[t,A]),O=(0,r.useCallback)((()=>{P(!1),t?.(!1)}),[t]),j=(0,r.useCallback)((()=>{A()}),[A]),R=(0,r.useCallback)((e=>{w(e.target.value),e.target.value&&v(!0)}),[]),I=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.WW)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),f.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,L]);const F=(0,r.useCallback)((()=>{const e=new URLSearchParams(p.search);e.delete(Be);const t=e.toString(),n=p.pathname+(""!=t?`?${t}`:"")+p.hash;n!=p.pathname+p.search+p.hash&&d.push(n),w(""),k.current?.autocomplete.setVal("")}),[p.pathname,p.search,p.hash,d]);return(0,u.jsxs)("div",{className:(0,ye.A)("navbar__search",Re.searchBarContainer,{[Re.searchIndexLoading]:g&&y,[Re.focused]:T}),hidden:C,children:[(0,u.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:j,onFocus:L,onBlur:O,onChange:R,ref:f,value:x}),(0,u.jsx)(Me.A,{className:Re.searchBarLoadingRing}),be.WW&&be.pk&&(""!==x?(0,u.jsx)("button",{className:Re.searchClearButton,onClick:F,children:"\u2715"}):n&&(0,u.jsxs)("div",{className:Re.searchHintContainer,children:[(0,u.jsx)("kbd",{className:Re.searchHint,children:I?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:Re.searchHint,children:"K"})]}))]})},Ue={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Ue.navbarSearchContainer),children:t})}var He=n(4142);const Qe=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,he.o)(),{search:f,hash:h}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ve,{className:n,children:(0,u.jsx)($e,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,xe.zK)(r),i=(0,He.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,xe.zK)(r),i=(0,He.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,He.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,xe.zK)(n),f=(0,xe.jh)(n),{savePreferredVersionName:h}=(0,ve.g1)(n),m=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Qe(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...a],g=(0,He.Vd)(n)[0],b=t&&m.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&m.length>1?void 0:Qe(g).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function Ge(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=We[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function qe(){const e=(0,P.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ge,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ye(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ke(){const e=0===(0,x.p)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ye,{onClick:()=>t.hide()}),t.content]})}function Ze(){const e=(0,P.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(K,{}),primaryMenu:(0,u.jsx)(qe,{}),secondaryMenu:(0,u.jsx)(Ke,{})}):null}const Xe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Je(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function et(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,P.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Xe.navbarHideable,!d&&Xe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Je,{onClick:i.toggle}),(0,u.jsx)(Ze,{})]})}var tt=n(440);const nt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function rt(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function ot(e){let{error:t}=e;const n=(0,tt.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:nt.errorBoundaryError,children:n})}class at extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const it="right";function st(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function lt(){const{toggle:e,shown:t}=(0,P.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(st,{})})}const ct={colorModeToggle:"colorModeToggle_DEke"};function ut(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(at,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ge,{...e})},t)))})}function dt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function pt(){const e=(0,P.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??it)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(dt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(lt,{}),(0,u.jsx)(q,{}),(0,u.jsx)(ut,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ut,{items:r}),(0,u.jsx)(W,{className:ct.colorModeToggle}),!o&&(0,u.jsx)(Ve,{children:(0,u.jsx)($e,{})})]})})}function ft(){return(0,u.jsx)(et,{children:(0,u.jsx)(pt,{})})}function ht(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.A)(n),l=(0,X.A)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function mt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(ht,{item:t})},t.href??t.to)}function gt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(mt,{item:e},t)))})]})}function bt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(gt,{column:e},t)))})}function yt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function vt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(ht,{item:t})}function xt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(vt,{item:e}),t.length!==n+1&&(0,u.jsx)(yt,{})]},n)))})})}function wt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(bt,{columns:t}):(0,u.jsx)(xt,{links:t})}var kt=n(1122);const St={footerLogoLink:"footerLogoLink_BH7S"};function Et(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(kt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function _t(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:St.footerLogoLink,target:t.target,children:(0,u.jsx)(Et,{logo:t})}):(0,u.jsx)(Et,{logo:t})}function Ct(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function At(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Tt(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(At,{style:o,links:n&&n.length>0&&(0,u.jsx)(wt,{links:n}),logo:r&&(0,u.jsx)(_t,{logo:r}),copyright:t&&(0,u.jsx)(Ct,{copyright:t})})}const Pt=r.memo(Tt),Lt=(0,N.fM)([z.a,w.oq,L.Tv,ve.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(O.y_,{children:(0,u.jsx)(P.e,{children:(0,u.jsx)(R,{children:t})})})}]);function Nt(e){let{children:t}=e;return(0,u.jsx)(Lt,{children:t})}var Ot=n(1107);function jt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Ot.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(rt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(ot,{error:t})})]})})})}const Rt={mainWrapper:"mainWrapper_z2l0"};function It(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(Nt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(ft,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,Rt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(jt,{...e}),children:t})}),!n&&(0,u.jsx)(Pt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.A)(t.src),dark:(0,o.A)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.A)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function h(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>m,oq:()=>h});var r=n(6540),o=n(2303),a=n(9466),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(9466),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,g1:()=>v});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(4142),l=n(9532),c=n(9466),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=r.createContext(null);function m(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return(0,u.jsx)(h.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(h);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},4142:(e,t,n)=>{"use strict";n.d(t,{B5:()=>E,C5:()=>p,Nr:()=>f,OF:()=>x,QB:()=>S,Vd:()=>w,Y:()=>y,fW:()=>k,w8:()=>g});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(5597),l=n(2252),c=n(6588),u=n(1682),d=n(9169);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const h=(e,t)=>void 0!==e&&(0,d.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,u.s)([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.s)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.v)(i),sidebarName:c,sidebarItems:u}}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>s});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{X:()=>r,s:()=>o})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),o=n(5066),a=n(5260),i=n(6803),s=n(6025),l=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.h)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>h,gk:()=>m});var r=n(6540),o=n(8193),a=n(2303),i=n(205),s=n(9532),l=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function h(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>o});n(4586);const r="default";function o(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{Dv:()=>u,Wf:()=>c});var r=n(6540);const o="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?l:c(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,n?o(l):a(l));var l;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return o.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return o.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return o.removeTrailingSlash}});var a=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return a.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return a.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return a.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return a.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},2849:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var r=n(53);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var a=n(4848);function i(e){let{className:t}=e;return(0,a.jsxs)("div",{className:(0,r.A)(o.loadingRing,t),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(8291),o=n.n(r),a=n(1088);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${a.IH.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},2384:(e,t,n)=>{"use strict";n.d(t,{m:()=>l});var r=n(8291),o=n.n(r);var a=n(1088);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,a.BH);if(0===l.length)return void s([]);const c=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const a=r[0];if(/\p{Unified_Ideograph}/u.test(a)){const n=function(e,t){const n=[];return function e(r,o){let a=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:o.missed,term:o.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>a;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){a=t;const s={missed:o.missed,term:o.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(a,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:a});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const i of a.BH)if("en"===i)a.sx||r.unshift(o().stopWordFilter);else{const e=o()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const o of s)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)l.push(o.slice(0,e).concat(o.slice(e+1)));return i(n).concat(i(l))}(l,t),u=[];e:for(const{term:t,tokens:o}of c)for(const{documents:r,index:a,type:i}of e)if(u.push(...a.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!u.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-u.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),u.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,o=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===o&&(o=n.index),r===o?0===t.type?-1:0===n.type?1:t.index-n.index:r-o}))}(u),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},3103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},7674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{g:()=>r})},6841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(3103);function o(e,t,n){const a=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&a.push(o(e.substr(0,n),t)),a.push(`${(0,r.Z)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):a.join("")}},3810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(3103),o=n(6841);const a=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(a);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var s=n(1088);function l(e,t,n,a){void 0===a&&(a=s.rG);const{chunkIndex:l,chunks:c}=function(e,t,n){const a=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}-1===c&&(c=a.length),l=u+d,a.push({html:(0,o.Z)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}return{chunkIndex:c,chunks:a}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let h=d.textLength,m=0,g=0,b=!1,y=!1;for(;h0){const e=u.pop();h+e.textLength<=a?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=a?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},3385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},1088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>a,UB:()=>f,tb:()=>c,O6:()=>g,I$:()=>h,BH:()=>r,sx:()=>o,ZG:()=>p,WW:()=>u,pk:()=>d,Hg:()=>m,IH:()=>i,rG:()=>l,AT:()=>s,dz:()=>b});n(8291);const r=["en"],o=!1,a=null,i="search-index{dir}.json",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,h=!0,m=null,g=!1,b=!1},53:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},8291:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,h,m,g,b,y,v,x,w,k,S,E,_,C,A,T,P,L,N,O,j,R,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new I.Token(n.slice(i,a),l))}i=a+1}}return o},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new I.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new I.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new I.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new I.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(o.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=o)}()},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var h=e[i],m=n[2],g=n[3],b=n[4],y=n[5],v=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=m&&null!=h&&h!==m,k="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,_=b||y;r.push({name:g||a++,prefix:m||"",delimiter:E,optional:S,repeat:k,partial:w,asterisk:!!x,pattern:_?c(_):x?".*":"[^"+l(E)+"]+?"})}}return i{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(4784),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},a=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(b.container)if(b.container instanceof Object)t=(e=o({},e,b.container)).width-e.left-e.right-2*b.margin,n=e.height-e.top-e.bottom-2*b.margin;else{var r=(i(b.container)?b.container:document.querySelector(b.container)).getBoundingClientRect(),a=r.width,l=r.height,c=r.left,u=r.top;e=o({},e,{width:a,height:l,left:c,top:u})}t=t||e.width-2*b.margin,n=n||e.height-2*b.margin;var d=y.zoomedHd||y.original,p=s(d)?t:d.naturalWidth||t,f=s(d)?n:d.naturalHeight||n,h=d.getBoundingClientRect(),m=h.top,g=h.left,v=h.width,x=h.height,w=Math.min(Math.max(v,p),t)/v,k=Math.min(Math.max(x,f),n)/x,S=Math.min(w,k),E="scale("+S+") translate3d("+((t-v)/2-g+b.margin+e.left)/S+"px, "+((n-x)/2-m+b.margin+e.top)/S+"px, 0)";y.zoomed.style.transform=E,y.zoomedHd&&(y.zoomedHd.style.transform=E)};return new r((function(n){if(e&&-1===f.indexOf(e))n(x);else{if(y.zoomed)n(x);else{if(e)y.original=e;else{if(!(f.length>0))return void n(x);var r=f;y.original=r[0]}if(y.original.dispatchEvent(c("medium-zoom:open",{detail:{zoom:x}})),g=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,m=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),s=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+s+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(y.original),document.body.appendChild(v),b.template){var o=i(b.template)?b.template:document.querySelector(b.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){m=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(c("medium-zoom:opened",{detail:{zoom:x}})),n(x)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var a=setInterval((function(){y.zoomedHd.complete&&(clearInterval(a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var s=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}}))},d=function(){return new r((function(e){if(!m&&y.original){m=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(c("medium-zoom:close",{detail:{zoom:x}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(v),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),m=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(c("medium-zoom:closed",{detail:{zoom:x}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(x)}))}else e(x)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():u({target:e})},f=[],h=[],m=!1,g=0,b=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?b=t:(t||"string"==typeof t)&&a(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((b=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},b)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!m&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(g-e)>b.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var x={open:u,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},b.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return b=o({},b,t),f.forEach((function(e){e.dispatchEvent(c("medium-zoom:update",{detail:{zoom:x}}))})),x},clone:function(){return e(o({},b,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:a,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(c("medium-zoom:detach",{detail:{zoom:x}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),x},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),h.push({type:"medium-zoom:"+e,listener:t,options:n}),x},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),h=h.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),x},getOptions:function(){return b},getImages:function(){return f},getZoomedImage:function(){return y.original}};return x},{themeConfig:d}=r.default,p=function(){if("undefined"==typeof window)return null;const{zoomSelector:e=".markdown img"}=d,{imageZoom:{selector:t=e,options:n}={}}=d;return setTimeout((()=>{u(t,n)}),1e3),{onRouteUpdate({location:e,previousLocation:r}){e&&e.hash&&e.hash.length||r&&e.pathname!==r.pathname&&setTimeout((()=>{u(t,n)}),1e3)}}}()},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},6976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},5294:()=>{!function(e){var t=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:t,alias:"regex"}};e.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:t,alias:"selector"},punctuation:/[[\]{}&]/},e.languages.tex=e.languages.latex,e.languages.context=e.languages.latex}(Prism)},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},875:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-diff":7839,"./prism-java":6976,"./prism-json":2514,"./prism-latex":5294};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=875},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n