@qilin-agent/experimental-inspector 0.0.0-stage → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +49 -0
- package/README.md +179 -2
- package/README.zh.md +180 -0
- package/cordis.patch.yml +5 -0
- package/icon.svg +12 -0
- package/lib/client.js +3572 -0
- package/lib/client.page.js +314 -0
- package/lib/devtools/Images/3d-center.svg +3 -0
- package/lib/devtools/Images/3d-pan.svg +3 -0
- package/lib/devtools/Images/3d-rotate.svg +3 -0
- package/lib/devtools/Images/accelerometer-back.svg +69 -0
- package/lib/devtools/Images/accelerometer-bottom.png +0 -0
- package/lib/devtools/Images/accelerometer-front.svg +28 -0
- package/lib/devtools/Images/accelerometer-left.png +0 -0
- package/lib/devtools/Images/accelerometer-right.png +0 -0
- package/lib/devtools/Images/accelerometer-top.png +0 -0
- package/lib/devtools/Images/account-tree.svg +10 -0
- package/lib/devtools/Images/add-photo.svg +3 -0
- package/lib/devtools/Images/ai-explorer-badge.svg +114 -0
- package/lib/devtools/Images/align-content-center.svg +5 -0
- package/lib/devtools/Images/align-content-end.svg +5 -0
- package/lib/devtools/Images/align-content-space-around.svg +6 -0
- package/lib/devtools/Images/align-content-space-between.svg +4 -0
- package/lib/devtools/Images/align-content-space-evenly.svg +6 -0
- package/lib/devtools/Images/align-content-start.svg +5 -0
- package/lib/devtools/Images/align-content-stretch.svg +4 -0
- package/lib/devtools/Images/align-items-baseline.svg +4 -0
- package/lib/devtools/Images/align-items-center.svg +5 -0
- package/lib/devtools/Images/align-items-end.svg +5 -0
- package/lib/devtools/Images/align-items-start.svg +5 -0
- package/lib/devtools/Images/align-items-stretch.svg +6 -0
- package/lib/devtools/Images/align-self-center.svg +3 -0
- package/lib/devtools/Images/align-self-end.svg +4 -0
- package/lib/devtools/Images/align-self-start.svg +4 -0
- package/lib/devtools/Images/align-self-stretch.svg +5 -0
- package/lib/devtools/Images/animation.svg +3 -0
- package/lib/devtools/Images/arrow-back.svg +4 -0
- package/lib/devtools/Images/arrow-collapse.svg +3 -0
- package/lib/devtools/Images/arrow-down.svg +10 -0
- package/lib/devtools/Images/arrow-drop-down-dark.svg +3 -0
- package/lib/devtools/Images/arrow-drop-down-light.svg +3 -0
- package/lib/devtools/Images/arrow-drop-down.svg +3 -0
- package/lib/devtools/Images/arrow-forward.svg +4 -0
- package/lib/devtools/Images/arrow-right-circle.svg +3 -0
- package/lib/devtools/Images/arrow-up-down-circle.svg +3 -0
- package/lib/devtools/Images/arrow-up-down.svg +3 -0
- package/lib/devtools/Images/arrow-up.svg +10 -0
- package/lib/devtools/Images/attach-file.svg +3 -0
- package/lib/devtools/Images/baseline-high-availability.svg +17 -0
- package/lib/devtools/Images/baseline-limited-availability.svg +19 -0
- package/lib/devtools/Images/baseline-low-availability.svg +31 -0
- package/lib/devtools/Images/bell.svg +3 -0
- package/lib/devtools/Images/bezier-curve-filled.svg +3 -0
- package/lib/devtools/Images/bin.svg +1 -0
- package/lib/devtools/Images/bottom-panel-close.svg +1 -0
- package/lib/devtools/Images/bottom-panel-open.svg +1 -0
- package/lib/devtools/Images/brackets.svg +1 -0
- package/lib/devtools/Images/breakpoint-circle.svg +4 -0
- package/lib/devtools/Images/breakpoint-crossed-filled.svg +1 -0
- package/lib/devtools/Images/breakpoint-crossed.svg +1 -0
- package/lib/devtools/Images/brush-2.svg +3 -0
- package/lib/devtools/Images/brush-filled.svg +1 -0
- package/lib/devtools/Images/brush.svg +1 -0
- package/lib/devtools/Images/bucket.svg +4 -0
- package/lib/devtools/Images/bug.svg +3 -0
- package/lib/devtools/Images/button-magic.svg +3 -0
- package/lib/devtools/Images/calendar-today.svg +3 -0
- package/lib/devtools/Images/center-focus-weak.svg +3 -0
- package/lib/devtools/Images/check-circle.svg +3 -0
- package/lib/devtools/Images/check-double.svg +3 -0
- package/lib/devtools/Images/checker.svg +12 -0
- package/lib/devtools/Images/checkmark.svg +1 -0
- package/lib/devtools/Images/chevron-double-right.svg +3 -0
- package/lib/devtools/Images/chevron-down.svg +3 -0
- package/lib/devtools/Images/chevron-left-dot.svg +4 -0
- package/lib/devtools/Images/chevron-left.svg +3 -0
- package/lib/devtools/Images/chevron-right.svg +3 -0
- package/lib/devtools/Images/chevron-up.svg +3 -0
- package/lib/devtools/Images/chromeLeft.avif +0 -0
- package/lib/devtools/Images/chromeMiddle.avif +0 -0
- package/lib/devtools/Images/chromeRight.avif +0 -0
- package/lib/devtools/Images/class.svg +6 -0
- package/lib/devtools/Images/clear-list.svg +3 -0
- package/lib/devtools/Images/clear.svg +3 -0
- package/lib/devtools/Images/cloud.svg +3 -0
- package/lib/devtools/Images/code-circle.svg +5 -0
- package/lib/devtools/Images/code-whisperer-badge.svg +166 -0
- package/lib/devtools/Images/code.svg +3 -0
- package/lib/devtools/Images/colon.svg +4 -0
- package/lib/devtools/Images/color-picker-filled.svg +3 -0
- package/lib/devtools/Images/color-picker.svg +3 -0
- package/lib/devtools/Images/compress.svg +8 -0
- package/lib/devtools/Images/console-conditional-breakpoint.svg +1 -0
- package/lib/devtools/Images/console-logpoint.svg +1 -0
- package/lib/devtools/Images/container.svg +4 -0
- package/lib/devtools/Images/cookie.svg +3 -0
- package/lib/devtools/Images/cookie_off.svg +3 -0
- package/lib/devtools/Images/copy.svg +3 -0
- package/lib/devtools/Images/corporate-fare.svg +3 -0
- package/lib/devtools/Images/credit-card.svg +3 -0
- package/lib/devtools/Images/cross-circle-filled.svg +3 -0
- package/lib/devtools/Images/cross-circle.svg +3 -0
- package/lib/devtools/Images/cross.svg +3 -0
- package/lib/devtools/Images/cssoverview_icons_2x.avif +0 -0
- package/lib/devtools/Images/database-off.svg +1 -0
- package/lib/devtools/Images/database.svg +3 -0
- package/lib/devtools/Images/deployed.svg +3 -0
- package/lib/devtools/Images/device-fold.svg +1 -0
- package/lib/devtools/Images/devices.svg +3 -0
- package/lib/devtools/Images/devtools-thumbnail.svg +57 -0
- package/lib/devtools/Images/devtools-tips.svg +61 -0
- package/lib/devtools/Images/devtools-user-badge.svg +129 -0
- package/lib/devtools/Images/devtools.svg +13 -0
- package/lib/devtools/Images/difference.svg +3 -0
- package/lib/devtools/Images/dock-bottom.svg +3 -0
- package/lib/devtools/Images/dock-left.svg +3 -0
- package/lib/devtools/Images/dock-right.svg +3 -0
- package/lib/devtools/Images/dock-window.svg +3 -0
- package/lib/devtools/Images/document.svg +3 -0
- package/lib/devtools/Images/dog-paw.svg +10 -0
- package/lib/devtools/Images/dom-detective-badge.svg +136 -0
- package/lib/devtools/Images/domain.svg +3 -0
- package/lib/devtools/Images/dots-horizontal.svg +1 -0
- package/lib/devtools/Images/dots-vertical.svg +3 -0
- package/lib/devtools/Images/download.svg +3 -0
- package/lib/devtools/Images/edit.svg +1 -0
- package/lib/devtools/Images/empty.svg +2 -0
- package/lib/devtools/Images/errorWave.svg +74 -0
- package/lib/devtools/Images/exclamation.svg +3 -0
- package/lib/devtools/Images/expand.svg +1 -0
- package/lib/devtools/Images/experiment-check.svg +1 -0
- package/lib/devtools/Images/experiment.svg +3 -0
- package/lib/devtools/Images/extension.svg +1 -0
- package/lib/devtools/Images/eye-crossed.svg +3 -0
- package/lib/devtools/Images/eye.svg +3 -0
- package/lib/devtools/Images/file-document.svg +3 -0
- package/lib/devtools/Images/file-fetch-xhr.svg +3 -0
- package/lib/devtools/Images/file-font.svg +4 -0
- package/lib/devtools/Images/file-generic.svg +3 -0
- package/lib/devtools/Images/file-image.svg +3 -0
- package/lib/devtools/Images/file-json.svg +4 -0
- package/lib/devtools/Images/file-manifest.svg +3 -0
- package/lib/devtools/Images/file-media.svg +3 -0
- package/lib/devtools/Images/file-script.svg +3 -0
- package/lib/devtools/Images/file-snippet.svg +4 -0
- package/lib/devtools/Images/file-stylesheet.svg +4 -0
- package/lib/devtools/Images/file-wasm.svg +5 -0
- package/lib/devtools/Images/file-websocket.svg +3 -0
- package/lib/devtools/Images/filter-clear.svg +3 -0
- package/lib/devtools/Images/filter-filled.svg +3 -0
- package/lib/devtools/Images/filter.svg +3 -0
- package/lib/devtools/Images/flex-direction.svg +5 -0
- package/lib/devtools/Images/flex-no-wrap.svg +5 -0
- package/lib/devtools/Images/flex-wrap.svg +8 -0
- package/lib/devtools/Images/flow.svg +3 -0
- package/lib/devtools/Images/flowsheet.svg +1 -0
- package/lib/devtools/Images/fold-more.svg +3 -0
- package/lib/devtools/Images/folder-asterisk.svg +10 -0
- package/lib/devtools/Images/folder-off.svg +3 -0
- package/lib/devtools/Images/folder.svg +3 -0
- package/lib/devtools/Images/frame-crossed.svg +3 -0
- package/lib/devtools/Images/frame-icon.svg +54 -0
- package/lib/devtools/Images/frame.svg +3 -0
- package/lib/devtools/Images/gdp-logo-dark.png +0 -0
- package/lib/devtools/Images/gdp-logo-light.png +0 -0
- package/lib/devtools/Images/gear-filled.svg +3 -0
- package/lib/devtools/Images/gear.svg +4 -0
- package/lib/devtools/Images/gears.svg +3 -0
- package/lib/devtools/Images/geminiInDevTools.png +0 -0
- package/lib/devtools/Images/geminiInDevTools_2x.png +0 -0
- package/lib/devtools/Images/global.svg +5 -0
- package/lib/devtools/Images/google.svg +3 -0
- package/lib/devtools/Images/goto-filled.svg +1 -0
- package/lib/devtools/Images/grid-direction.svg +6 -0
- package/lib/devtools/Images/grid-on.svg +10 -0
- package/lib/devtools/Images/group.svg +3 -0
- package/lib/devtools/Images/heap-snapshot.svg +6 -0
- package/lib/devtools/Images/heap-snapshots.svg +7 -0
- package/lib/devtools/Images/help.svg +3 -0
- package/lib/devtools/Images/history.svg +3 -0
- package/lib/devtools/Images/home.svg +3 -0
- package/lib/devtools/Images/hover.svg +6 -0
- package/lib/devtools/Images/iframe-crossed.svg +3 -0
- package/lib/devtools/Images/iframe.svg +3 -0
- package/lib/devtools/Images/import.svg +3 -0
- package/lib/devtools/Images/indeterminate-question-box.svg +3 -0
- package/lib/devtools/Images/info-filled.svg +3 -0
- package/lib/devtools/Images/info.svg +3 -0
- package/lib/devtools/Images/issue-cross-filled.svg +3 -0
- package/lib/devtools/Images/issue-exclamation-filled.svg +3 -0
- package/lib/devtools/Images/issue-questionmark-filled.svg +3 -0
- package/lib/devtools/Images/issue-text-filled.svg +3 -0
- package/lib/devtools/Images/justify-content-center.svg +5 -0
- package/lib/devtools/Images/justify-content-end.svg +5 -0
- package/lib/devtools/Images/justify-content-space-around.svg +6 -0
- package/lib/devtools/Images/justify-content-space-between.svg +4 -0
- package/lib/devtools/Images/justify-content-space-evenly.svg +6 -0
- package/lib/devtools/Images/justify-content-start.svg +5 -0
- package/lib/devtools/Images/justify-content-stretch.svg +4 -0
- package/lib/devtools/Images/justify-items-center.svg +4 -0
- package/lib/devtools/Images/justify-items-end.svg +4 -0
- package/lib/devtools/Images/justify-items-start.svg +4 -0
- package/lib/devtools/Images/justify-items-stretch.svg +4 -0
- package/lib/devtools/Images/keyboard-arrow-right.svg +1 -0
- package/lib/devtools/Images/keyboard-full.svg +10 -0
- package/lib/devtools/Images/keyboard-pen.svg +1 -0
- package/lib/devtools/Images/keyboard.svg +3 -0
- package/lib/devtools/Images/label-auto.svg +3 -0
- package/lib/devtools/Images/label.svg +10 -0
- package/lib/devtools/Images/large-arrow-right-filled.svg +1 -0
- package/lib/devtools/Images/layers-filled.svg +1 -0
- package/lib/devtools/Images/layers.svg +1 -0
- package/lib/devtools/Images/left-panel-close.svg +1 -0
- package/lib/devtools/Images/left-panel-open.svg +1 -0
- package/lib/devtools/Images/lightbulb-spark.svg +13 -0
- package/lib/devtools/Images/lightbulb.svg +3 -0
- package/lib/devtools/Images/lighthouse_logo.svg +158 -0
- package/lib/devtools/Images/list.svg +3 -0
- package/lib/devtools/Images/location-on.svg +3 -0
- package/lib/devtools/Images/lock-person.svg +1 -0
- package/lib/devtools/Images/lock.svg +3 -0
- package/lib/devtools/Images/mark-email-unread.svg +3 -0
- package/lib/devtools/Images/match-case.svg +3 -0
- package/lib/devtools/Images/match-whole-word.svg +1 -0
- package/lib/devtools/Images/memory.svg +6 -0
- package/lib/devtools/Images/minus.svg +3 -0
- package/lib/devtools/Images/mop.svg +1 -0
- package/lib/devtools/Images/mouse.svg +4 -0
- package/lib/devtools/Images/navigationControls.png +0 -0
- package/lib/devtools/Images/navigationControls_2x.png +0 -0
- package/lib/devtools/Images/network-settings.svg +3 -0
- package/lib/devtools/Images/node-stack-icon.svg +1 -0
- package/lib/devtools/Images/nodeIcon.avif +0 -0
- package/lib/devtools/Images/open-externally.svg +3 -0
- package/lib/devtools/Images/override.svg +11 -0
- package/lib/devtools/Images/palette.svg +10 -0
- package/lib/devtools/Images/pause-circle.svg +1 -0
- package/lib/devtools/Images/pause.svg +1 -0
- package/lib/devtools/Images/pen-spark.svg +3 -0
- package/lib/devtools/Images/performance-panel-delete-annotation.svg +32 -0
- package/lib/devtools/Images/performance-panel-diagram.svg +34 -0
- package/lib/devtools/Images/performance-panel-entry-label.svg +75 -0
- package/lib/devtools/Images/performance-panel-time-range.svg +15 -0
- package/lib/devtools/Images/performance.svg +3 -0
- package/lib/devtools/Images/person.svg +3 -0
- package/lib/devtools/Images/photo-camera.svg +10 -0
- package/lib/devtools/Images/play.svg +3 -0
- package/lib/devtools/Images/plus.svg +3 -0
- package/lib/devtools/Images/policy.svg +3 -0
- package/lib/devtools/Images/popoverArrows.png +0 -0
- package/lib/devtools/Images/popup.svg +3 -0
- package/lib/devtools/Images/preview_feature_video_thumbnail.svg +92 -0
- package/lib/devtools/Images/profile.svg +3 -0
- package/lib/devtools/Images/psychiatry.svg +3 -0
- package/lib/devtools/Images/puzzle.svg +3 -0
- package/lib/devtools/Images/record-start.svg +4 -0
- package/lib/devtools/Images/record-stop.svg +4 -0
- package/lib/devtools/Images/redo.svg +3 -0
- package/lib/devtools/Images/refresh.svg +10 -0
- package/lib/devtools/Images/regular-expression.svg +3 -0
- package/lib/devtools/Images/replace.svg +1 -0
- package/lib/devtools/Images/replay.svg +3 -0
- package/lib/devtools/Images/report.svg +1 -0
- package/lib/devtools/Images/resizeDiagonal.svg +1 -0
- package/lib/devtools/Images/resizeHorizontal.svg +1 -0
- package/lib/devtools/Images/resizeVertical.svg +1 -0
- package/lib/devtools/Images/resume.svg +1 -0
- package/lib/devtools/Images/revert.svg +3 -0
- package/lib/devtools/Images/review.svg +5 -0
- package/lib/devtools/Images/right-panel-close.svg +1 -0
- package/lib/devtools/Images/right-panel-open.svg +1 -0
- package/lib/devtools/Images/scissors.svg +3 -0
- package/lib/devtools/Images/screen-rotation.svg +1 -0
- package/lib/devtools/Images/search.svg +3 -0
- package/lib/devtools/Images/select-element.svg +3 -0
- package/lib/devtools/Images/send.svg +3 -0
- package/lib/devtools/Images/shadow.svg +3 -0
- package/lib/devtools/Images/shield.svg +3 -0
- package/lib/devtools/Images/small-status-dot.svg +3 -0
- package/lib/devtools/Images/smart-assistant.svg +3 -0
- package/lib/devtools/Images/snippet.svg +4 -0
- package/lib/devtools/Images/spark-info.svg +3 -0
- package/lib/devtools/Images/spark.svg +3 -0
- package/lib/devtools/Images/speculative-loads.svg +1 -0
- package/lib/devtools/Images/speedster-badge.svg +166 -0
- package/lib/devtools/Images/star.svg +3 -0
- package/lib/devtools/Images/step-into.svg +1 -0
- package/lib/devtools/Images/step-out.svg +1 -0
- package/lib/devtools/Images/step-over.svg +1 -0
- package/lib/devtools/Images/step.svg +1 -0
- package/lib/devtools/Images/stop.svg +3 -0
- package/lib/devtools/Images/symbol.svg +3 -0
- package/lib/devtools/Images/sync.svg +3 -0
- package/lib/devtools/Images/tab-move.svg +1 -0
- package/lib/devtools/Images/table.svg +3 -0
- package/lib/devtools/Images/terminal.svg +10 -0
- package/lib/devtools/Images/text-analysis.svg +3 -0
- package/lib/devtools/Images/thumb-down-filled.svg +3 -0
- package/lib/devtools/Images/thumb-down.svg +3 -0
- package/lib/devtools/Images/thumb-up-filled.svg +3 -0
- package/lib/devtools/Images/thumb-up.svg +3 -0
- package/lib/devtools/Images/tonality.svg +10 -0
- package/lib/devtools/Images/toolbarResizerVertical.png +0 -0
- package/lib/devtools/Images/top-panel-close.svg +1 -0
- package/lib/devtools/Images/top-panel-open.svg +1 -0
- package/lib/devtools/Images/touch-app.svg +4 -0
- package/lib/devtools/Images/touchCursor.png +0 -0
- package/lib/devtools/Images/touchCursor_2x.png +0 -0
- package/lib/devtools/Images/triangle-bottom-right.svg +3 -0
- package/lib/devtools/Images/triangle-down.svg +1 -0
- package/lib/devtools/Images/triangle-left.svg +1 -0
- package/lib/devtools/Images/triangle-right.svg +1 -0
- package/lib/devtools/Images/triangle-up.svg +3 -0
- package/lib/devtools/Images/trophy.svg +3 -0
- package/lib/devtools/Images/tune.svg +3 -0
- package/lib/devtools/Images/undo.svg +1 -0
- package/lib/devtools/Images/warning-filled.svg +3 -0
- package/lib/devtools/Images/warning.svg +3 -0
- package/lib/devtools/Images/watch.svg +3 -0
- package/lib/devtools/Images/whatsnew.svg +61 -0
- package/lib/devtools/Images/width.svg +3 -0
- package/lib/devtools/Images/zoom-in.svg +3 -0
- package/lib/devtools/LICENSE +27 -0
- package/lib/devtools/application_tokens.css +413 -0
- package/lib/devtools/chunks/FormatterActions-FcPgI0uV.js +19 -0
- package/lib/devtools/chunks/UIFilter-CIzBruM3.js +18 -0
- package/lib/devtools/chunks/UIRequestLocation-CtGcVN3I.js +48 -0
- package/lib/devtools/chunks/_qilin-devtools_empty-BvRk9kiK.js +0 -0
- package/lib/devtools/chunks/accessibility-CwvHp3sj.js +2718 -0
- package/lib/devtools/chunks/acorn-_jSanihy.js +3232 -0
- package/lib/devtools/chunks/adorners-D4aU6nuY.js +45 -0
- package/lib/devtools/chunks/ai_assistance-BU6E0Wio.js +4255 -0
- package/lib/devtools/chunks/angular-Dutmu-L9.js +117 -0
- package/lib/devtools/chunks/animation-TEwO5UI_.js +922 -0
- package/lib/devtools/chunks/application-SCf6MiCN.js +12740 -0
- package/lib/devtools/chunks/autofill-Dp3nMnuK.js +198 -0
- package/lib/devtools/chunks/autofill_manager-BXntqfdp.js +58 -0
- package/lib/devtools/chunks/bindings-DgoVEdsr.js +4105 -0
- package/lib/devtools/chunks/browser-DL1S1Kiu.js +62 -0
- package/lib/devtools/chunks/browser_debugger-p7Rr4IBR.js +629 -0
- package/lib/devtools/chunks/changes-DeW5MC9u.js +2 -0
- package/lib/devtools/chunks/changes-k42bihtm.js +393 -0
- package/lib/devtools/chunks/checkbox.css-CZJJ6atQ.js +4 -0
- package/lib/devtools/chunks/chunk-DF993M8W.js +11 -0
- package/lib/devtools/chunks/code_highlighter-BnTPt9_G.js +210 -0
- package/lib/devtools/chunks/codemirror-CBR9VJma.js +15842 -0
- package/lib/devtools/chunks/color_picker-Cuh_X19Y.js +1566 -0
- package/lib/devtools/chunks/common-DjRFwulW.js +15145 -0
- package/lib/devtools/chunks/common-Uu9A2glf.js +2 -0
- package/lib/devtools/chunks/common-qd_KLeYO.js +6639 -0
- package/lib/devtools/chunks/components-CnPGgDUW.js +704 -0
- package/lib/devtools/chunks/components-Cw5tHQqN.js +1338 -0
- package/lib/devtools/chunks/components-EJwviLtZ.js +1090 -0
- package/lib/devtools/chunks/console-D1WlMaFQ.js +3855 -0
- package/lib/devtools/chunks/console-yMm3XVTY.js +2 -0
- package/lib/devtools/chunks/console_counters-9SfIdrUo.js +103 -0
- package/lib/devtools/chunks/coverage-BbFH390Q.js +1176 -0
- package/lib/devtools/chunks/coverage-CLBpovLw.js +2 -0
- package/lib/devtools/chunks/cpp-CdElSCaB.js +435 -0
- package/lib/devtools/chunks/css_overview-cITV9auE.js +1288 -0
- package/lib/devtools/chunks/data_grid-pC5qqfsJ.js +1671 -0
- package/lib/devtools/chunks/developer_resources-4DqQIvy6.js +240 -0
- package/lib/devtools/chunks/diff-qn55JSCS.js +444 -0
- package/lib/devtools/chunks/dom_extension-BfrKZ4JG.js +172 -0
- package/lib/devtools/chunks/elements-CgEYz3mX.js +2 -0
- package/lib/devtools/chunks/elements-Dbx4q9-v.js +11407 -0
- package/lib/devtools/chunks/emulation-C6XKPPGu.js +1306 -0
- package/lib/devtools/chunks/emulation-D8xbdsAj.js +2 -0
- package/lib/devtools/chunks/emulation-EtJlEukP.js +2732 -0
- package/lib/devtools/chunks/emulation-cjFPXHT9.js +157 -0
- package/lib/devtools/chunks/event_listeners-BeTH3gi2.js +414 -0
- package/lib/devtools/chunks/explain-P_aDGFSD.js +747 -0
- package/lib/devtools/chunks/greendev-BU0QcVPX.js +152 -0
- package/lib/devtools/chunks/heap_snapshot-CZt2KUPL.js +427 -0
- package/lib/devtools/chunks/helper-CI72KvIC.js +33 -0
- package/lib/devtools/chunks/helpers--xrfGSwQ.js +29 -0
- package/lib/devtools/chunks/i18n-DvFMqQdJ.js +17 -0
- package/lib/devtools/chunks/icon_button-BebVdJD8.js +83 -0
- package/lib/devtools/chunks/inline_editor-D54X5UUr.js +1309 -0
- package/lib/devtools/chunks/inspector_main-DRbdXLmF.js +279 -0
- package/lib/devtools/chunks/issue_counter-CeOjTNGW.js +193 -0
- package/lib/devtools/chunks/issues-CegBKEda.js +1649 -0
- package/lib/devtools/chunks/issues_manager-D7nfNPN1.js +3009 -0
- package/lib/devtools/chunks/java-7g_qfFa2.js +263 -0
- package/lib/devtools/chunks/layer_viewer-CaFC5oyv.js +1423 -0
- package/lib/devtools/chunks/layers-CXqlD9zH.js +370 -0
- package/lib/devtools/chunks/legacy-Bqn4Q0Tf.js +41804 -0
- package/lib/devtools/chunks/legacy-DOCLCisy.js +1434 -0
- package/lib/devtools/chunks/less-DXiRNbd4.js +195 -0
- package/lib/devtools/chunks/lighthouse-DtpzvfT6.js +3920 -0
- package/lib/devtools/chunks/lighthouse-T9ZpmENr.js +2 -0
- package/lib/devtools/chunks/linear_memory_inspector-C50PtM45.js +305 -0
- package/lib/devtools/chunks/live-metrics-Bs7wxibB.js +284 -0
- package/lib/devtools/chunks/main-C5y6NscM.js +2 -0
- package/lib/devtools/chunks/main-DcgYyEI0.js +755 -0
- package/lib/devtools/chunks/markdown-tZoR6Bsu.js +1512 -0
- package/lib/devtools/chunks/markdown_view-C67b2DdG.js +461 -0
- package/lib/devtools/chunks/marked-zGgfoDxO.js +1362 -0
- package/lib/devtools/chunks/media-BhuqASbO.js +1337 -0
- package/lib/devtools/chunks/media-Wfo1AbXC.js +2 -0
- package/lib/devtools/chunks/menus-BAUukA5-.js +969 -0
- package/lib/devtools/chunks/mobile_throttling-C26zde8o.js +2 -0
- package/lib/devtools/chunks/mobile_throttling-Cw4AkJH4.js +1052 -0
- package/lib/devtools/chunks/network-C3gIloDN.js +2 -0
- package/lib/devtools/chunks/network-CaxdpGU2.js +9181 -0
- package/lib/devtools/chunks/objectValue.css-C9o9fdM2.js +4 -0
- package/lib/devtools/chunks/object_ui-BYgPTK_b.js +1461 -0
- package/lib/devtools/chunks/object_ui-E7eR7aD-.js +2 -0
- package/lib/devtools/chunks/perf_ui-BqzJrt4p.js +2 -0
- package/lib/devtools/chunks/perf_ui-CQMkYfn3.js +3143 -0
- package/lib/devtools/chunks/performance_monitor-B2kUoCv0.js +385 -0
- package/lib/devtools/chunks/php-tl5gKrxu.js +423 -0
- package/lib/devtools/chunks/platform-BzB373NB.js +600 -0
- package/lib/devtools/chunks/profiler-BGu3akEf.js +4608 -0
- package/lib/devtools/chunks/protocol_client-Cwf_jb8R.js +24329 -0
- package/lib/devtools/chunks/protocol_monitor-B9nMqAAE.js +2 -0
- package/lib/devtools/chunks/protocol_monitor-CvLQ8ms1.js +1224 -0
- package/lib/devtools/chunks/puppeteer-CaOjgj3v.js +13299 -0
- package/lib/devtools/chunks/python-D9AdRkMm.js +580 -0
- package/lib/devtools/chunks/quick_open-C3IZ69m9.js +2 -0
- package/lib/devtools/chunks/quick_open-DRITaPnZ.js +722 -0
- package/lib/devtools/chunks/recorder-C0f1n95b.js +5465 -0
- package/lib/devtools/chunks/recorder-actions-S2RfLX4H.js +6 -0
- package/lib/devtools/chunks/request_link_icon-fGy57GcW.js +87 -0
- package/lib/devtools/chunks/root-DbVQo07X.js +255 -0
- package/lib/devtools/chunks/sass-BPQlMmw2.js +370 -0
- package/lib/devtools/chunks/security-NbgKa3ux.js +898 -0
- package/lib/devtools/chunks/sensors-nM7qcBE4.js +752 -0
- package/lib/devtools/chunks/settings-aKtQC12v.js +1433 -0
- package/lib/devtools/chunks/settings_ui-CzxAFzIb.js +175 -0
- package/lib/devtools/chunks/snackbars-lPThuWYs.js +12010 -0
- package/lib/devtools/chunks/snippets-dIuBmVBv.js +173 -0
- package/lib/devtools/chunks/source_frame-CSjno3kf.js +1352 -0
- package/lib/devtools/chunks/sources-BIZssBei.js +8216 -0
- package/lib/devtools/chunks/sources-Bf8QJxju.js +2 -0
- package/lib/devtools/chunks/suggestion_input-Duuu5pyd.js +196 -0
- package/lib/devtools/chunks/svelte-DJS1itbE.js +744 -0
- package/lib/devtools/chunks/textInput.css-DPvwvIic.js +4 -0
- package/lib/devtools/chunks/text_editor-Dq1P6D2J.js +15706 -0
- package/lib/devtools/chunks/text_utils-ohNt_gua.js +608 -0
- package/lib/devtools/chunks/theme_support-CbSSLkbO.js +92 -0
- package/lib/devtools/chunks/third-party-web-DGiPoc0U.js +12626 -0
- package/lib/devtools/chunks/timeline-BE_ysZxO.js +2 -0
- package/lib/devtools/chunks/timeline-C4vCX79k.js +16347 -0
- package/lib/devtools/chunks/utils-CELci976.js +298 -0
- package/lib/devtools/chunks/vue-CjH9yovn.js +73 -0
- package/lib/devtools/chunks/wast-CbGHiqaW.js +109 -0
- package/lib/devtools/chunks/web_audio-IdfBLjwV.js +277 -0
- package/lib/devtools/chunks/webauthn-iRZlbjGV.js +522 -0
- package/lib/devtools/chunks/whats_new-DOTPf2xJ.js +177 -0
- package/lib/devtools/chunks/xml-DI9dcP5w.js +327 -0
- package/lib/devtools/connect.js +9 -0
- package/lib/devtools/design_system_tokens.css +1061 -0
- package/lib/devtools/device_mode_emulation_frame.html +25 -0
- package/lib/devtools/devtools_app.html +25 -0
- package/lib/devtools/emulated_devices/optimized/MotoG4-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/MotoG4-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/Nexus5X-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/Nexus5X-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/Nexus6P-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/Nexus6P-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nest-hub-horizontal.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nest-hub-max-horizontal.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-default-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-default-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-keyboard-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-navigation-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-horizontal-navigation-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-default-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-default-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-keyboard-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-keyboard-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-navigation-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5-vertical-navigation-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-default-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-default-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-keyboard-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-horizontal-navigation-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-default-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-default-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-keyboard-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-navigation-1x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/google-nexus-5x-vertical-navigation-2x.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPad-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPad-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone5-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone5-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone6-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone6-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone6Plus-landscape.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/iPhone6Plus-portrait.avif +0 -0
- package/lib/devtools/emulated_devices/optimized/optimized_images.gni +53 -0
- package/lib/devtools/entrypoints/device_mode_emulation_frame/device_mode_emulation_frame.js +4 -0
- package/lib/devtools/entrypoints/devtools_app/devtools_app.js +6240 -0
- package/lib/devtools/entrypoints/formatter_worker/formatter_worker-entrypoint.js +2810 -0
- package/lib/devtools/entrypoints/heap_snapshot_worker/heap_snapshot_worker-entrypoint.js +2142 -0
- package/lib/devtools/entrypoints/lighthouse_worker/lighthouse_worker.js +290095 -0
- package/lib/devtools/entrypoints/wasmparser_worker/wasmparser_worker-entrypoint.js +3403 -0
- package/lib/devtools/models/issues_manager/descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/CoepCorpNotSameOrigin.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +18 -0
- package/lib/devtools/models/issues_manager/descriptions/CoepCorpNotSameSite.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/CoepFrameResourceNeedsCoepHeader.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/CompatibilityModeQuirks.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/CookieAttributeValueExceedsMaxSize.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/LowTextContrast.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeRead.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeSet.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteExcludeNavigationContextDowngrade.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteNoneInsecureErrorRead.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteNoneInsecureErrorSet.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteNoneInsecureWarnRead.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteNoneInsecureWarnSet.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeRead.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeSet.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/arInsecureContext.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/arInvalidInfoHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/arNoWebOrOsSupport.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/arOsSourceIgnored.md +18 -0
- package/lib/devtools/models/issues_manager/descriptions/arOsTriggerIgnored.md +19 -0
- package/lib/devtools/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/arSourceIgnored.md +13 -0
- package/lib/devtools/models/issues_manager/descriptions/arTriggerIgnored.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/arWebAndOsHeaders.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/bounceTrackingMitigations.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/clientHintMetaTagAllowListInvalidOrigin.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/clientHintMetaTagModifiedHTML.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistInvalidAllowlistItemType.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistInvalidHeader.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistInvalidUrlPattern.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistItemNotInnerList.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistMoreThanOneList.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/connectionAllowlistReportingEndpointNotToken.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieCrossSiteRedirectDowngrade.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludeDomainNonAscii.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludePortMismatch.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludeThirdPartyPhaseoutRead.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieExcludeThirdPartyPhaseoutSet.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieWarnDomainNonAscii.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieWarnMetadataGrantRead.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieWarnMetadataGrantSet.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieWarnThirdPartyPhaseoutRead.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/cookieWarnThirdPartyPhaseoutSet.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/corsAllowCredentialsRequired.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/corsDisabledScheme.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/corsDisallowedByMode.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/corsHeaderDisallowedByPreflightResponse.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/corsInvalidHeaderValues.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +19 -0
- package/lib/devtools/models/issues_manager/descriptions/corsMethodDisallowedByPreflightResponse.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/corsNoCorsRedirectModeNotFollow.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/corsOriginMismatch.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/corsPreflightResponseInvalid.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/corsRedirectContainsCredentials.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/corsWildcardOriginNotAllowed.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/cspEvalViolation.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/cspInlineViolation.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/cspTrustedTypesPolicyViolation.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/cspTrustedTypesSinkViolation.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/cspURLViolation.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/deprecation.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestDnsFetchFailed.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestInvalidEmail.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestTokenNoResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestUserLoggedOut.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestAccountsNoResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestApprovalDeclined.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestCanceled.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestErrorIdToken.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestManifestNoResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthRequestTooManyRequests.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/fetchingPartitionedBlobURL.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/genericBackUINavigationWouldSkipAd.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormAriaLabelledByToNonExistingIdError.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormAutocompleteAttributeEmptyError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormDuplicateIdForInputError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormInputWithNoLabelError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormLabelForMatchesNonExistingIdError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormLabelForNameError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormModelContextMissingToolDescription.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormModelContextMissingToolName.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormModelContextParameterMissingName.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormModelContextParameterMissingTitleAndDescription.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericFormModelContextRequiredParameterMissingName.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/genericResponseWasBlockedByORB.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/heavyAd.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/mixedContent.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/navigatingPartitionedBlobURL.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/placeholderDescriptionForInvisibleIssues.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/propertyRuleInvalidNameIssue.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/propertyRuleIssue.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityDisallowedSelectChild.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/selectivePermissionsIntervention.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedArrayBuffer.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryUseErrorDictionaryLoadFailure.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorExpiredResponse.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorInsufficientResources.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidMatchField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidTTLField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNavigationRequest.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNoMatchField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonIntegerTTLField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonListMatchDestField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonSecureContext.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonStringIdField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonStringInMatchDestList.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonStringMatchField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorNonTokenTypeField.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorRequestAborted.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorShuttingDown.md +1 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorTooLongIdField.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sharedDictionaryWriteErrorUnsupportedType.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/sriInvalidSignatureHeader.md +14 -0
- package/lib/devtools/models/issues_manager/descriptions/sriInvalidSignatureInputHeader.md +15 -0
- package/lib/devtools/models/issues_manager/descriptions/sriMissingSignatureHeader.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/sriMissingSignatureInputHeader.md +7 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureHeaderValueIsIncorrectLength.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureHeaderValueIsNotByteSequence.md +14 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureHeaderValueIsParameterized.md +15 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentName.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentType.md +13 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidParameter.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderKeyIdLength.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderMissingLabel.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +8 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderValueMissingComponents.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md +10 -0
- package/lib/devtools/models/issues_manager/descriptions/sriValidationFailedInvalidLength.md +5 -0
- package/lib/devtools/models/issues_manager/descriptions/sriValidationFailedSignatureExpired.md +6 -0
- package/lib/devtools/models/issues_manager/descriptions/sriValidationFailedSignatureMismatch.md +11 -0
- package/lib/devtools/models/issues_manager/descriptions/stylesheetLateImport.md +4 -0
- package/lib/devtools/models/issues_manager/descriptions/stylesheetRequestFailed.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +3 -0
- package/lib/devtools/models/issues_manager/descriptions/unencodedDigestIncorrectDigestLength.md +12 -0
- package/lib/devtools/models/issues_manager/descriptions/unencodedDigestIncorrectDigestType.md +17 -0
- package/lib/devtools/models/issues_manager/descriptions/unencodedDigestMalformedDictionary.md +14 -0
- package/lib/devtools/models/issues_manager/descriptions/unencodedDigestUnknownAlgorithm.md +15 -0
- package/lib/devtools/models/live-metrics/web-vitals-injected/web-vitals-injected.generated.js +1 -0
- package/lib/devtools/panels/recorder/injected/injected.generated.js +1 -0
- package/lib/devtools/panels/whats_new/resources/WNDT.md +14 -0
- package/lib/devtools/resource-manifest.json +3818 -0
- package/lib/devtools/third_party/acorn/package/LICENSE +21 -0
- package/lib/devtools/third_party/axe-core/LICENSE +362 -0
- package/lib/devtools/third_party/chromium/LICENSE +27 -0
- package/lib/devtools/third_party/codemirror/package/LICENSE +21 -0
- package/lib/devtools/third_party/codemirror.next/LICENSE +21 -0
- package/lib/devtools/third_party/csp_evaluator/package/LICENSE +202 -0
- package/lib/devtools/third_party/diff/LICENSE +202 -0
- package/lib/devtools/third_party/i18n/LICENSE +202 -0
- package/lib/devtools/third_party/intl-messageformat/LICENSE +33 -0
- package/lib/devtools/third_party/intl-messageformat/package/LICENSE.md +33 -0
- package/lib/devtools/third_party/json5/LICENSE +23 -0
- package/lib/devtools/third_party/legacy-javascript/LICENSE +202 -0
- package/lib/devtools/third_party/lighthouse/LICENSE +202 -0
- package/lib/devtools/third_party/lit/LICENSE +28 -0
- package/lib/devtools/third_party/marked/LICENSE +39 -0
- package/lib/devtools/third_party/marked/package/LICENSE.md +44 -0
- package/lib/devtools/third_party/puppeteer/LICENSE +202 -0
- package/lib/devtools/third_party/puppeteer/third_party/mitt/LICENSE +21 -0
- package/lib/devtools/third_party/puppeteer/third_party/parsel/LICENSE +21 -0
- package/lib/devtools/third_party/puppeteer/third_party/rxjs/LICENSE +201 -0
- package/lib/devtools/third_party/puppeteer-replay/package/LICENSE +202 -0
- package/lib/devtools/third_party/source-map-scopes-codec/LICENSE +26 -0
- package/lib/devtools/third_party/source-map-scopes-codec/package/LICENSE +26 -0
- package/lib/devtools/third_party/third-party-web/LICENSE +20 -0
- package/lib/devtools/third_party/third-party-web/package/LICENSE +20 -0
- package/lib/devtools/third_party/vscode.web-custom-data/package/LICENSE.md +21 -0
- package/lib/devtools/third_party/wasmparser/package/LICENSE +177 -0
- package/lib/devtools/third_party/web-vitals/package/LICENSE +202 -0
- package/lib/index.js +2554 -0
- package/lib/types/client/bottom/keyboard.d.ts +10 -0
- package/lib/types/client/bottom/locales.d.ts +17 -0
- package/lib/types/client/bottom/page.d.ts +10 -0
- package/lib/types/client/bottom/resize.d.ts +12 -0
- package/lib/types/client/bridge/controller.d.ts +10 -0
- package/lib/types/client/bridge/dispatcher.d.ts +26 -0
- package/lib/types/client/bridge/lifecycle.d.ts +22 -0
- package/lib/types/client/bridge/locales.d.ts +3 -0
- package/lib/types/client/bridge/publisher.d.ts +42 -0
- package/lib/types/client/bridge/rpc.d.ts +13 -0
- package/lib/types/client/bridge/transport.d.ts +41 -0
- package/lib/types/client/cdp/console.d.ts +45 -0
- package/lib/types/client/cdp/debugger.d.ts +8 -0
- package/lib/types/client/cdp/errors.d.ts +8 -0
- package/lib/types/client/cdp/heap-profiler.d.ts +8 -0
- package/lib/types/client/cdp/index.d.ts +10 -0
- package/lib/types/client/cdp/objects.d.ts +69 -0
- package/lib/types/client/cdp/profiler.d.ts +8 -0
- package/lib/types/client/cdp/properties.d.ts +16 -0
- package/lib/types/client/cdp/runtime.d.ts +79 -0
- package/lib/types/client/cdp/sources.d.ts +53 -0
- package/lib/types/client/cdp/stack.d.ts +27 -0
- package/lib/types/client/index.d.ts +3 -0
- package/lib/types/client/inspection/cordis.d.ts +3 -0
- package/lib/types/client/inspection/network.d.ts +4 -0
- package/lib/types/client/inspection/realm.d.ts +27 -0
- package/lib/types/client/plugin.d.ts +29 -0
- package/lib/types/host/bridge/controller.d.ts +108 -0
- package/lib/types/host/bridge/dispatcher.d.ts +16 -0
- package/lib/types/host/bridge/lifecycle.d.ts +42 -0
- package/lib/types/host/bridge/publisher.d.ts +31 -0
- package/lib/types/host/bridge/rpc.d.ts +15 -0
- package/lib/types/host/bridge/transport.d.ts +28 -0
- package/lib/types/host/cdp/console.d.ts +14 -0
- package/lib/types/host/cdp/debugger.d.ts +8 -0
- package/lib/types/host/cdp/errors.d.ts +6 -0
- package/lib/types/host/cdp/heap-profiler.d.ts +8 -0
- package/lib/types/host/cdp/index.d.ts +10 -0
- package/lib/types/host/cdp/objects.d.ts +8 -0
- package/lib/types/host/cdp/profiler.d.ts +8 -0
- package/lib/types/host/cdp/properties.d.ts +7 -0
- package/lib/types/host/cdp/runtime.d.ts +16 -0
- package/lib/types/host/cdp/sources.d.ts +14 -0
- package/lib/types/host/cdp/stack.d.ts +4 -0
- package/lib/types/host/index.d.ts +3 -0
- package/lib/types/host/inspection/cordis.d.ts +3 -0
- package/lib/types/host/inspection/network.d.ts +23 -0
- package/lib/types/host/inspection/realm.d.ts +9 -0
- package/lib/types/host/plugin.d.ts +19 -0
- package/lib/types/index.d.ts +50 -0
- package/lib/types/shared/bridge/buffer.d.ts +62 -0
- package/lib/types/shared/bridge/codec.d.ts +4 -0
- package/lib/types/shared/bridge/control-codec.d.ts +27 -0
- package/lib/types/shared/bridge/ids.d.ts +19 -0
- package/lib/types/shared/bridge/messages/control.d.ts +64 -0
- package/lib/types/shared/bridge/messages/cordis.d.ts +4 -0
- package/lib/types/shared/bridge/messages/network.d.ts +4 -0
- package/lib/types/shared/bridge/messages/observation.d.ts +110 -0
- package/lib/types/shared/bridge/messages/query/codec.d.ts +40 -0
- package/lib/types/shared/bridge/messages/query/commands.d.ts +35 -0
- package/lib/types/shared/bridge/messages/query/frames.d.ts +31 -0
- package/lib/types/shared/bridge/messages/query/index.d.ts +5 -0
- package/lib/types/shared/bridge/messages/runtime/command-codec.d.ts +9 -0
- package/lib/types/shared/bridge/messages/runtime/commands.d.ts +76 -0
- package/lib/types/shared/bridge/messages/runtime/console-frames.d.ts +52 -0
- package/lib/types/shared/bridge/messages/runtime/frames.d.ts +98 -0
- package/lib/types/shared/bridge/messages/runtime/index.d.ts +5 -0
- package/lib/types/shared/bridge/messages/runtime/value-codec.d.ts +28 -0
- package/lib/types/shared/bridge/messages/sources/codec.d.ts +15 -0
- package/lib/types/shared/bridge/messages/sources/commands.d.ts +42 -0
- package/lib/types/shared/bridge/messages/sources/frames.d.ts +67 -0
- package/lib/types/shared/bridge/messages/sources/index.d.ts +5 -0
- package/lib/types/shared/bridge/publisher.d.ts +33 -0
- package/lib/types/shared/bridge/query-reader.d.ts +10 -0
- package/lib/types/shared/bridge/rpc.d.ts +62 -0
- package/lib/types/shared/bridge/validation.d.ts +3 -0
- package/lib/types/shared/bridge/version.d.ts +3 -0
- package/lib/types/shared/cdp/capabilities.d.ts +17 -0
- package/lib/types/shared/cdp/console.d.ts +28 -0
- package/lib/types/shared/cdp/debugger.d.ts +69 -0
- package/lib/types/shared/cdp/errors.d.ts +27 -0
- package/lib/types/shared/cdp/ids.d.ts +9 -0
- package/lib/types/shared/cdp/index.d.ts +11 -0
- package/lib/types/shared/cdp/operations.d.ts +86 -0
- package/lib/types/shared/cdp/property.d.ts +28 -0
- package/lib/types/shared/cdp/realm.d.ts +137 -0
- package/lib/types/shared/cdp/remote-object.d.ts +44 -0
- package/lib/types/shared/cdp/sources.d.ts +18 -0
- package/lib/types/shared/cordis/collector.d.ts +26 -0
- package/lib/types/shared/cordis/ids.d.ts +7 -0
- package/lib/types/shared/cordis/model.d.ts +61 -0
- package/lib/types/shared/cordis/object-reference.d.ts +14 -0
- package/lib/types/shared/cordis/object-registry.d.ts +80 -0
- package/lib/types/shared/cordis/observer.d.ts +15 -0
- package/lib/types/shared/cordis/projector.d.ts +34 -0
- package/lib/types/shared/cordis/publisher.d.ts +13 -0
- package/lib/types/shared/cordis/reader.d.ts +18 -0
- package/lib/types/shared/cordis/snapshot.d.ts +39 -0
- package/lib/types/shared/dispose.d.ts +11 -0
- package/lib/types/shared/identity.d.ts +12 -0
- package/lib/types/shared/index.d.ts +18 -0
- package/lib/types/shared/json.d.ts +35 -0
- package/lib/types/shared/network/event-source.d.ts +20 -0
- package/lib/types/shared/network/observation.d.ts +52 -0
- package/lib/types/shared/service.d.ts +23 -0
- package/lib/types/shared/validation.d.ts +52 -0
- package/lib/types/shared/web.d.ts +16 -0
- package/lib/types/worker/bridge/endpoint.d.ts +49 -0
- package/lib/types/worker/bridge/hub.d.ts +108 -0
- package/lib/types/worker/bridge/runtime-rpc.d.ts +90 -0
- package/lib/types/worker/bridge/session.d.ts +15 -0
- package/lib/types/worker/bridge/source-rpc.d.ts +42 -0
- package/lib/types/worker/cdp/domains/debugger/cdp-params.d.ts +15 -0
- package/lib/types/worker/cdp/domains/debugger/index.d.ts +6 -0
- package/lib/types/worker/cdp/domains/debugger/projector.d.ts +22 -0
- package/lib/types/worker/cdp/domains/debugger/script-registry.d.ts +70 -0
- package/lib/types/worker/cdp/domains/debugger/session.d.ts +47 -0
- package/lib/types/worker/cdp/domains/dom/index.d.ts +4 -0
- package/lib/types/worker/cdp/domains/dom/model.d.ts +121 -0
- package/lib/types/worker/cdp/domains/dom/session.d.ts +78 -0
- package/lib/types/worker/cdp/domains/native.d.ts +25 -0
- package/lib/types/worker/cdp/domains/network/session.d.ts +46 -0
- package/lib/types/worker/cdp/domains/runtime/cdp-params.d.ts +82 -0
- package/lib/types/worker/cdp/domains/runtime/index.d.ts +3 -0
- package/lib/types/worker/cdp/domains/runtime/object-table.d.ts +117 -0
- package/lib/types/worker/cdp/domains/runtime/session.d.ts +97 -0
- package/lib/types/worker/cdp/ids.d.ts +37 -0
- package/lib/types/worker/cdp/protocol.d.ts +46 -0
- package/lib/types/worker/cdp/realm-sessions.d.ts +67 -0
- package/lib/types/worker/cdp/session.d.ts +39 -0
- package/lib/types/worker/cdp/target.d.ts +17 -0
- package/lib/types/worker/entry.d.ts +3 -0
- package/lib/types/worker/inspection/cordis-query.d.ts +11 -0
- package/lib/types/worker/inspection/cordis-store.d.ts +94 -0
- package/lib/types/worker/inspection/network-store.d.ts +110 -0
- package/lib/types/worker/inspection/query-router.d.ts +78 -0
- package/lib/types/worker/inspection/realm-store.d.ts +58 -0
- package/lib/types/worker/inspection/realm.d.ts +43 -0
- package/lib/types/worker/realms/client/bridge.d.ts +18 -0
- package/lib/types/worker/realms/client/console.d.ts +21 -0
- package/lib/types/worker/realms/client/debugger.d.ts +8 -0
- package/lib/types/worker/realms/client/index.d.ts +18 -0
- package/lib/types/worker/realms/client/runtime.d.ts +28 -0
- package/lib/types/worker/realms/client/scripts.d.ts +15 -0
- package/lib/types/worker/realms/client/sources.d.ts +30 -0
- package/lib/types/worker/realms/client/values.d.ts +55 -0
- package/lib/types/worker/realms/host/bridge.d.ts +49 -0
- package/lib/types/worker/realms/host/console.d.ts +25 -0
- package/lib/types/worker/realms/host/debugger.d.ts +25 -0
- package/lib/types/worker/realms/host/index.d.ts +13 -0
- package/lib/types/worker/realms/host/runtime.d.ts +54 -0
- package/lib/types/worker/realms/host/scripts.d.ts +9 -0
- package/lib/types/worker/realms/host/sources.d.ts +26 -0
- package/lib/types/worker/realms/host/values.d.ts +22 -0
- package/lib/types/worker/server.d.ts +16 -0
- package/lib/worker.js +7289 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +90 -3
|
@@ -0,0 +1,3920 @@
|
|
|
1
|
+
import { n as e, t } from "./chunk-DF993M8W.js";
|
|
2
|
+
import { gt as n } from "./platform-BzB373NB.js";
|
|
3
|
+
import { At as r, F as i, Ot as a, Z as o, _n as s, at as c, bt as l, d as u, u as d, vt as f, wt as p } from "./common-qd_KLeYO.js";
|
|
4
|
+
import { $i as m, $r as h, Ad as g, B as _, Dt as v, Fo as y, Ft as b, Ht as x, Jo as S, La as C, Md as w, Na as T, No as E, Po as D, Qn as O, S as k, St as ee, Ur as te, V as ne, Vc as re, Wc as ie, Wo as ae, Xn as oe, Yo as A, Zo as se, bn as ce, cf as le, cr as ue, fa as de, fc as fe, hd as pe, jr as me, lc as he, lr as ge, ma as _e, mf as ve, mo as ye, ni as be, ns as xe, pf as j, sr as Se, tl as Ce, tr as we, ts as Te, ut as Ee, vf as M, vi as De, vn as Oe, yf as ke } from "./legacy-Bqn4Q0Tf.js";
|
|
5
|
+
import { g as Ae } from "./text_utils-ohNt_gua.js";
|
|
6
|
+
import { P as je } from "./bindings-DgoVEdsr.js";
|
|
7
|
+
import { C as Me, c as Ne } from "./common-DjRFwulW.js";
|
|
8
|
+
import { a as Pe, l as Fe, t as Ie } from "./emulation-EtJlEukP.js";
|
|
9
|
+
import { n as Le, t as Re } from "./theme_support-CbSSLkbO.js";
|
|
10
|
+
import { n as ze } from "./emulation-C6XKPPGu.js";
|
|
11
|
+
(/* @__PURE__ */ t(((e, t) => {
|
|
12
|
+
(function(e, n) {
|
|
13
|
+
typeof define == "function" && define.amd ? define(n) : typeof t == "object" && t.exports ? t.exports = n() : (e.Lighthouse = e.Lighthouse || {}, e.Lighthouse.ReportGenerator = n(), e.Lighthouse.ReportGenerator.ReportGenerator = e.Lighthouse.ReportGenerator);
|
|
14
|
+
})(typeof self < "u" ? self : e, function() {
|
|
15
|
+
var e = (() => {
|
|
16
|
+
var e = Object.defineProperty, t = Object.getOwnPropertyDescriptor, n = Object.getOwnPropertyNames, r = Object.prototype.hasOwnProperty, i = (t, n) => {
|
|
17
|
+
for (var r in n) e(t, r, {
|
|
18
|
+
get: n[r],
|
|
19
|
+
enumerable: !0
|
|
20
|
+
});
|
|
21
|
+
}, a = (i, a, o, s) => {
|
|
22
|
+
if (a && typeof a == "object" || typeof a == "function") for (let c of n(a)) !r.call(i, c) && c !== o && e(i, c, {
|
|
23
|
+
get: () => a[c],
|
|
24
|
+
enumerable: !(s = t(a, c)) || s.enumerable
|
|
25
|
+
});
|
|
26
|
+
return i;
|
|
27
|
+
}, o = (t) => a(e({}, "__esModule", { value: !0 }), t), s = {};
|
|
28
|
+
i(s, { ReportGenerator: () => l });
|
|
29
|
+
var c = {
|
|
30
|
+
REPORT_TEMPLATE: "<!--\n@license\nCopyright 2018 Google LLC\nSPDX-License-Identifier: Apache-2.0\n-->\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1\">\n <link rel=\"icon\" href='data:image/svg+xml;utf8,<svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z\" fill=\"%23F63\"/><path d=\"M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z\" fill=\"%23FFA385\"/><path fill=\"%23FF3\" d=\"M20.5 10h7v7h-7z\"/></svg>'>\n <title>Lighthouse Report</title>\n <style>body {margin: 0}</style>\n</head>\n<body>\n <noscript>Lighthouse report requires JavaScript. Please enable.</noscript>\n\n <div id=\"lh-log\"></div>\n\n <script>window.__LIGHTHOUSE_JSON__ = %%LIGHTHOUSE_JSON%%;<\/script>\n <script>%%LIGHTHOUSE_JAVASCRIPT%%\n __initLighthouseReport__();\n //# sourceURL=compiled-reportrenderer.js\n <\/script>\n <script>console.log('window.__LIGHTHOUSE_JSON__', __LIGHTHOUSE_JSON__);<\/script>\n</body>\n</html>\n",
|
|
31
|
+
REPORT_JAVASCRIPT: "\"use strict\";(()=>{function e({median:e,p10:t},n){if(e<=0)throw new Error(\"median must be greater than zero\");if(t<=0)throw new Error(\"p10 must be greater than zero\");if(t>=e)throw new Error(\"p10 must be less than the median\");if(n<=0)return 1;let r,i=Math.max(Number.MIN_VALUE,n/e),a=Math.log(i),o=Math.max(Number.MIN_VALUE,t/e),l=(1-function(e){let t=Math.sign(e),n=1/(1+.3275911*(e=Math.abs(e)));return t*(1-n*(.254829592+n*(n*(1.421413741+n*(1.061405429*n-1.453152027))-.284496736))*Math.exp(-e*e))}(.9061938024368232*a/-Math.log(o)))/2;return r=n<=t?Math.max(.9,Math.min(1,l)):n<=e?Math.max(.5,Math.min(.8999999999999999,l)):Math.max(0,Math.min(.49999999999999994,l)),r}var t=\"…\",n={PASS:{label:\"pass\",minScore:.9},AVERAGE:{label:\"average\",minScore:.5},FAIL:{label:\"fail\"},ERROR:{label:\"error\"}},r=[\"com\",\"co\",\"gov\",\"edu\",\"ac\",\"org\",\"go\",\"gob\",\"or\",\"net\",\"in\",\"ne\",\"nic\",\"gouv\",\"web\",\"spb\",\"blog\",\"jus\",\"kiev\",\"mil\",\"wi\",\"qc\",\"ca\",\"bel\",\"on\"],i=class i{static get RATINGS(){return n}static get PASS_THRESHOLD(){return.9}static get MS_DISPLAY_VALUE(){return\"%10d\xA0ms\"}static getFinalDisplayedUrl(e){if(e.finalDisplayedUrl)return e.finalDisplayedUrl;if(e.finalUrl)return e.finalUrl;throw new Error(\"Could not determine final displayed URL\")}static getMainDocumentUrl(e){return e.mainDocumentUrl||e.finalUrl}static getFullPageScreenshot(e){return e.fullPageScreenshot?e.fullPageScreenshot:e.audits[\"full-page-screenshot\"]?.details}static getEntityFromUrl(e,t){return t&&t.find((t=>t.origins.find((t=>e.startsWith(t)))))||i.getPseudoRootDomain(e)}static splitMarkdownCodeSpans(e){let t=[],n=e.split(/`(.*?)`/g);for(let e=0;e<n.length;e++){let r=n[e];if(!r)continue;let i=e%2!=0;t.push({isCode:i,text:r})}return t}static splitMarkdownLink(e){let t=[],n=e.split(/\\[([^\\]]+?)\\]\\((https?:\\/\\/.*?)\\)/g);for(;n.length;){let[e,r,i]=n.splice(0,3);e&&t.push({isLink:!1,text:e}),r&&i&&t.push({isLink:!0,text:r,linkHref:i})}return t}static truncate(e,t,n=\"…\"){if(e.length<=t)return e;let r=new Intl.Segmenter(void 0,{granularity:\"grapheme\"}).segment(e)[Symbol.iterator](),i=0;for(let a=0;a<=t-n.length;a++){let t=r.next();if(t.done)return e;i=t.value.index}for(let t=0;t<n.length;t++)if(r.next().done)return e;return e.slice(0,i)+n}static getURLDisplayName(e,n){let r,i=void 0!==(n=n||{numPathParts:void 0,preserveQuery:void 0,preserveHost:void 0}).numPathParts?n.numPathParts:2,a=void 0===n.preserveQuery||n.preserveQuery,o=n.preserveHost||!1;if(\"about:\"===e.protocol||\"data:\"===e.protocol)r=e.href;else{r=e.pathname;let n=r.split(\"/\").filter((e=>e.length));i&&n.length>i&&(r=t+n.slice(-1*i).join(\"/\")),o&&(r=`${e.host}/${r.replace(/^\\//,\"\")}`),a&&(r=`${r}${e.search}`)}if(\"data:\"!==e.protocol&&(r=r.slice(0,200),r=r.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${t}`),r=r.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,`$1${t}`),r=r.replace(/(\\d{3})\\d{6,}/g,`$1${t}`),r=r.replace(/\\u2026+/g,t),r.length>64&&r.includes(\"?\")&&(r=r.replace(/\\?([^=]*)(=)?.*/,`?$1$2${t}`),r.length>64&&(r=r.replace(/\\?.*/,`?${t}`)))),r.length>64){let e=r.lastIndexOf(\".\");r=e>=0?r.slice(0,63-(r.length-e))+`${t}${r.slice(e)}`:r.slice(0,63)+t}return r}static getChromeExtensionOrigin(e){let t=new URL(e);return t.protocol+\"//\"+t.host}static parseURL(e){let t=new URL(e);return{file:i.getURLDisplayName(t),hostname:t.hostname,origin:\"chrome-extension:\"===t.protocol?i.getChromeExtensionOrigin(e):t.origin}}static createOrReturnURL(e){return e instanceof URL?e:new URL(e)}static getPseudoTld(e){let t=e.split(\".\").slice(-2);return r.includes(t[0])?`.${t.join(\".\")}`:`.${t[t.length-1]}`}static getPseudoRootDomain(e){let t=i.createOrReturnURL(e).hostname,n=i.getPseudoTld(t).split(\".\");return t.split(\".\").slice(-n.length).join(\".\")}static filterRelevantLines(e,t,n){if(0===t.length)return e.slice(0,2*n+1);let r=new Set;return(t=t.sort(((e,t)=>(e.lineNumber||0)-(t.lineNumber||0)))).forEach((({lineNumber:e})=>{let t=e-n,i=e+n;for(;t<1;)t++,i++;r.has(t-3-1)&&(t-=3);for(let e=t;e<=i;e++){let t=e;r.add(t)}})),e.filter((e=>r.has(e.lineNumber)))}static computeLogNormalScore(t,n){let r=e(t,n);return r>.9&&(r+=.05*(r-.9)),Math.floor(100*r)/100}};var a=class{constructor(e,t){this._document=e,this._lighthouseChannel=\"unknown\",this._componentCache=new Map,this.rootEl=t}createElement(e,t){let n=this._document.createElement(e);if(t)for(let e of t.split(/\\s+/))e&&n.classList.add(e);return n}createElementNS(e,t,n){let r=this._document.createElementNS(e,t);if(n)for(let e of n.split(/\\s+/))e&&r.classList.add(e);return r}createSVGElement(e,t){return this._document.createElementNS(\"http://www.w3.org/2000/svg\",e,t)}createFragment(){return this._document.createDocumentFragment()}createTextNode(e){return this._document.createTextNode(e)}createChildOf(e,t,n){let r=this.createElement(t,n);return e.append(r),r}createComponent(e){let t=this._componentCache.get(e);if(t){let e=t.cloneNode(!0);return this.findAll(\"style\",e).forEach((e=>e.remove())),e}return t=function(e,t){switch(t){case\"3pFilter\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");n.append(\"\\n .lh-3p-filter {\\n color: var(--color-gray-600);\\n float: right;\\n padding: 6px var(--stackpack-padding-horizontal);\\n }\\n .lh-3p-filter-label, .lh-3p-filter-input {\\n vertical-align: middle;\\n user-select: none;\\n }\\n .lh-3p-filter-input:disabled + .lh-3p-ui-string {\\n text-decoration: line-through;\\n }\\n \"),t.append(n);let r=e.createElement(\"div\",\"lh-3p-filter\"),i=e.createElement(\"label\",\"lh-3p-filter-label\"),a=e.createElement(\"input\",\"lh-3p-filter-input\");a.setAttribute(\"type\",\"checkbox\"),a.setAttribute(\"checked\",\"\");let o=e.createElement(\"span\",\"lh-3p-ui-string\");o.append(\"Show 3rd party resources\");let l=e.createElement(\"span\",\"lh-3p-filter-count\");return i.append(\" \",a,\" \",o,\" (\",l,\") \"),r.append(\" \",i,\" \"),t.append(r),t}(e);case\"audit\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-audit\"),r=e.createElement(\"details\",\"lh-expandable-details\"),i=e.createElement(\"summary\"),a=e.createElement(\"div\",\"lh-audit__header lh-expandable-details__summary\"),o=e.createElement(\"span\",\"lh-audit__score-icon\"),l=e.createElement(\"span\",\"lh-audit__title-and-text\"),s=e.createElement(\"span\",\"lh-audit__title\"),c=e.createElement(\"span\",\"lh-audit__display-text\");l.append(\" \",s,\" \",c,\" \");let d=e.createElement(\"div\",\"lh-chevron-container\");a.append(\" \",o,\" \",l,\" \",d,\" \"),i.append(\" \",a,\" \");let h=e.createElement(\"div\",\"lh-audit__description\"),p=e.createElement(\"div\",\"lh-audit__stackpacks\");return r.append(\" \",i,\" \",h,\" \",p,\" \"),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"categoryHeader\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-category-header\"),r=e.createElement(\"div\",\"lh-score__gauge\");r.setAttribute(\"role\",\"heading\"),r.setAttribute(\"aria-level\",\"2\");let i=e.createElement(\"div\",\"lh-category-header__description\");return n.append(\" \",r,\" \",i,\" \"),t.append(n),t}(e);case\"chevron\":return function(e){let t=e.createFragment(),n=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\",\"lh-chevron\");n.setAttribute(\"viewBox\",\"0 0 100 100\");let r=e.createElementNS(\"http://www.w3.org/2000/svg\",\"g\",\"lh-chevron__lines\"),i=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\",\"lh-chevron__line lh-chevron__line-left\");i.setAttribute(\"d\",\"M10 50h40\");let a=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\",\"lh-chevron__line lh-chevron__line-right\");return a.setAttribute(\"d\",\"M90 50H50\"),r.append(\" \",i,\" \",a,\" \"),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"clump\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-audit-group\"),r=e.createElement(\"details\",\"lh-clump\"),i=e.createElement(\"summary\"),a=e.createElement(\"div\",\"lh-audit-group__summary\"),o=e.createElement(\"div\",\"lh-audit-group__header\"),l=e.createElement(\"span\",\"lh-audit-group__title\"),s=e.createElement(\"span\",\"lh-audit-group__itemcount\");o.append(\" \",l,\" \",s,\" \",\" \",\" \");let c=e.createElement(\"div\",\"lh-clump-toggle\"),d=e.createElement(\"span\",\"lh-clump-toggletext--show\"),h=e.createElement(\"span\",\"lh-clump-toggletext--hide\");return c.append(\" \",d,\" \",h,\" \"),a.append(\" \",o,\" \",c,\" \"),i.append(\" \",a,\" \"),r.append(\" \",i,\" \"),n.append(\" \",\" \",r,\" \"),t.append(n),t}(e);case\"crc\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-crc-container\"),r=e.createElement(\"style\");r.append('\\n .lh-crc .lh-tree-marker {\\n width: 12px;\\n height: 26px;\\n display: block;\\n float: left;\\n background-position: top left;\\n }\\n .lh-crc .lh-horiz-down {\\n background: url(\\'data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"%23D8D8D8\" fill-rule=\"evenodd\"><path d=\"M16 12v2H-2v-2z\"/><path d=\"M9 12v14H7V12z\"/></g></svg>\\');\\n }\\n .lh-crc .lh-right {\\n background: url(\\'data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 12v2H0v-2z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>\\');\\n }\\n .lh-crc .lh-up-right {\\n background: url(\\'data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v14H7zm2 12h7v2H9z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>\\');\\n }\\n .lh-crc .lh-vert-right {\\n background: url(\\'data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v27H7zm2 12h7v2H9z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>\\');\\n }\\n .lh-crc .lh-vert {\\n background: url(\\'data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v26H7z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>\\');\\n }\\n .lh-crc .lh-crc-tree {\\n font-size: 14px;\\n width: 100%;\\n overflow-x: auto;\\n }\\n .lh-crc .lh-crc-node {\\n height: 26px;\\n line-height: 26px;\\n white-space: nowrap;\\n }\\n .lh-crc .lh-crc-node__longest {\\n color: var(--color-average-secondary);\\n }\\n .lh-crc .lh-crc-node__tree-value {\\n margin-left: 10px;\\n }\\n .lh-crc .lh-crc-node__tree-value div {\\n display: inline;\\n }\\n .lh-crc .lh-crc-node__chain-duration {\\n font-weight: 700;\\n }\\n .lh-crc .lh-crc-initial-nav {\\n color: #595959;\\n font-style: italic;\\n }\\n .lh-crc__summary-value {\\n margin-bottom: 10px;\\n }\\n ');let i=e.createElement(\"div\"),a=e.createElement(\"div\",\"lh-crc__summary-value\"),o=e.createElement(\"span\",\"lh-crc__longest_duration_label\"),l=e.createElement(\"b\",\"lh-crc__longest_duration\");a.append(\" \",o,\" \",l,\" \"),i.append(\" \",a,\" \");let s=e.createElement(\"div\",\"lh-crc\"),c=e.createElement(\"div\",\"lh-crc-initial-nav\");return s.append(\" \",c,\" \",\" \"),n.append(\" \",r,\" \",i,\" \",s,\" \"),t.append(n),t}(e);case\"crcChain\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-crc-node\"),r=e.createElement(\"span\",\"lh-crc-node__tree-marker\"),i=e.createElement(\"span\",\"lh-crc-node__tree-value\");return n.append(\" \",r,\" \",i,\" \"),t.append(n),t}(e);case\"elementScreenshot\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-element-screenshot\"),r=e.createElement(\"div\",\"lh-element-screenshot__content\"),i=e.createElement(\"div\",\"lh-element-screenshot__image\"),a=e.createElement(\"div\",\"lh-element-screenshot__mask\"),o=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");o.setAttribute(\"height\",\"0\"),o.setAttribute(\"width\",\"0\");let l=e.createElementNS(\"http://www.w3.org/2000/svg\",\"defs\"),s=e.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\");s.setAttribute(\"clipPathUnits\",\"objectBoundingBox\"),l.append(\" \",s,\" \",\" \"),o.append(\" \",l,\" \"),a.append(\" \",o,\" \");let c=e.createElement(\"div\",\"lh-element-screenshot__element-marker\");return i.append(\" \",a,\" \",c,\" \"),r.append(\" \",i,\" \"),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"explodeyGauge\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-exp-gauge-component\"),r=e.createElement(\"div\",\"lh-exp-gauge__wrapper\");r.setAttribute(\"target\",\"_blank\");let i=e.createElement(\"div\",\"lh-exp-gauge__svg-wrapper\"),a=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\",\"lh-exp-gauge\"),o=e.createElementNS(\"http://www.w3.org/2000/svg\",\"g\",\"lh-exp-gauge__inner\"),l=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-exp-gauge__bg\"),s=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-exp-gauge__base lh-exp-gauge--faded\"),c=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-exp-gauge__arc\"),d=e.createElementNS(\"http://www.w3.org/2000/svg\",\"text\",\"lh-exp-gauge__percentage\");o.append(\" \",l,\" \",s,\" \",c,\" \",d,\" \");let h=e.createElementNS(\"http://www.w3.org/2000/svg\",\"g\",\"lh-exp-gauge__outer\"),p=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-cover\");h.append(\" \",p,\" \");let g=e.createElementNS(\"http://www.w3.org/2000/svg\",\"text\",\"lh-exp-gauge__label\");return g.setAttribute(\"text-anchor\",\"middle\"),g.setAttribute(\"x\",\"0\"),g.setAttribute(\"y\",\"60\"),a.append(\" \",o,\" \",h,\" \",g,\" \"),i.append(\" \",a,\" \"),r.append(\" \",i,\" \"),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"footer\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");n.append(\"\\n .lh-footer {\\n padding: var(--footer-padding-vertical) calc(var(--default-padding) * 2);\\n max-width: var(--report-content-max-width);\\n margin: 0 auto;\\n }\\n .lh-footer .lh-generated {\\n text-align: center;\\n }\\n \"),t.append(n);let r=e.createElement(\"footer\",\"lh-footer\"),i=e.createElement(\"ul\",\"lh-meta__items\");i.append(\" \");let a=e.createElement(\"div\",\"lh-generated\"),o=e.createElement(\"b\");o.append(\"Lighthouse\");let l=e.createElement(\"span\",\"lh-footer__version\"),s=e.createElement(\"a\",\"lh-footer__version_issue\");return s.setAttribute(\"href\",\"https://github.com/GoogleChrome/Lighthouse/issues\"),s.setAttribute(\"target\",\"_blank\"),s.setAttribute(\"rel\",\"noopener\"),s.append(\"File an issue\"),a.append(\" \",\" Generated by \",o,\" \",l,\" | \",s,\" \"),r.append(\" \",i,\" \",a,\" \"),t.append(r),t}(e);case\"fraction\":return function(e){let t=e.createFragment(),n=e.createElement(\"a\",\"lh-fraction__wrapper\"),r=e.createElement(\"div\",\"lh-fraction__content-wrapper\"),i=e.createElement(\"div\",\"lh-fraction__content\"),a=e.createElement(\"div\",\"lh-fraction__background\");i.append(\" \",a,\" \"),r.append(\" \",i,\" \");let o=e.createElement(\"div\",\"lh-fraction__label\");return n.append(\" \",r,\" \",o,\" \"),t.append(n),t}(e);case\"gauge\":return function(e){let t=e.createFragment(),n=e.createElement(\"a\",\"lh-gauge__wrapper\"),r=e.createElement(\"div\",\"lh-gauge__svg-wrapper\"),i=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\",\"lh-gauge\");i.setAttribute(\"viewBox\",\"0 0 120 120\");let a=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-gauge-base\");a.setAttribute(\"r\",\"56\"),a.setAttribute(\"cx\",\"60\"),a.setAttribute(\"cy\",\"60\"),a.setAttribute(\"stroke-width\",\"8\");let o=e.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\",\"lh-gauge-arc\");o.setAttribute(\"r\",\"56\"),o.setAttribute(\"cx\",\"60\"),o.setAttribute(\"cy\",\"60\"),o.setAttribute(\"stroke-width\",\"8\"),i.append(\" \",a,\" \",o,\" \"),r.append(\" \",i,\" \");let l=e.createElement(\"div\",\"lh-gauge__percentage\"),s=e.createElement(\"div\",\"lh-gauge__label\");return n.append(\" \",\" \",r,\" \",l,\" \",\" \",s,\" \"),t.append(n),t}(e);case\"heading\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");n.append(\"\\n /* CSS Fireworks. Originally by Eddie Lin\\n https://codepen.io/paulirish/pen/yEVMbP\\n */\\n .lh-pyro {\\n display: none;\\n z-index: 1;\\n pointer-events: none;\\n }\\n .lh-score100 .lh-pyro {\\n display: block;\\n }\\n .lh-score100 .lh-lighthouse stop:first-child {\\n stop-color: hsla(200, 12%, 95%, 0);\\n }\\n .lh-score100 .lh-lighthouse stop:last-child {\\n stop-color: hsla(65, 81%, 76%, 1);\\n }\\n\\n .lh-pyro > .lh-pyro-before, .lh-pyro > .lh-pyro-after {\\n position: absolute;\\n width: 5px;\\n height: 5px;\\n border-radius: 2.5px;\\n box-shadow: 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff;\\n animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;\\n animation-delay: 1s, 1s, 1s;\\n }\\n\\n .lh-pyro > .lh-pyro-after {\\n animation-delay: 2.25s, 2.25s, 2.25s;\\n animation-duration: 1.25s, 1.25s, 6.25s;\\n }\\n\\n @keyframes bang {\\n to {\\n opacity: 1;\\n box-shadow: -70px -115.67px #47ebbc, -28px -99.67px #eb47a4, 58px -31.67px #7eeb47, 13px -141.67px #eb47c5, -19px 6.33px #7347eb, -2px -74.67px #ebd247, 24px -151.67px #eb47e0, 57px -138.67px #b4eb47, -51px -104.67px #479eeb, 62px 8.33px #ebcf47, -93px 0.33px #d547eb, -16px -118.67px #47bfeb, 53px -84.67px #47eb83, 66px -57.67px #eb47bf, -93px -65.67px #91eb47, 30px -13.67px #86eb47, -2px -59.67px #83eb47, -44px 1.33px #eb47eb, 61px -58.67px #47eb73, 5px -22.67px #47e8eb, -66px -28.67px #ebe247, 42px -123.67px #eb5547, -75px 26.33px #7beb47, 15px -52.67px #a147eb, 36px -51.67px #eb8347, -38px -12.67px #eb5547, -46px -59.67px #47eb81, 78px -114.67px #eb47ba, 15px -156.67px #eb47bf, -36px 1.33px #eb4783, -72px -86.67px #eba147, 31px -46.67px #ebe247, -68px 29.33px #47e2eb, -55px 19.33px #ebe047, -56px 27.33px #4776eb, -13px -91.67px #eb5547, -47px -138.67px #47ebc7, -18px -96.67px #eb47ac, 11px -88.67px #4783eb, -67px -28.67px #47baeb, 53px 10.33px #ba47eb, 11px 19.33px #5247eb, -5px -11.67px #eb4791, -68px -4.67px #47eba7, 95px -37.67px #eb478b, -67px -162.67px #eb5d47, -54px -120.67px #eb6847, 49px -12.67px #ebe047, 88px 8.33px #47ebda, 97px 33.33px #eb8147, 6px -71.67px #ebbc47;\\n }\\n }\\n @keyframes gravity {\\n from {\\n opacity: 1;\\n }\\n to {\\n transform: translateY(80px);\\n opacity: 0;\\n }\\n }\\n @keyframes position {\\n 0%, 19.9% {\\n margin-top: 4%;\\n margin-left: 47%;\\n }\\n 20%, 39.9% {\\n margin-top: 7%;\\n margin-left: 30%;\\n }\\n 40%, 59.9% {\\n margin-top: 6%;\\n margin-left: 70%;\\n }\\n 60%, 79.9% {\\n margin-top: 3%;\\n margin-left: 20%;\\n }\\n 80%, 99.9% {\\n margin-top: 3%;\\n margin-left: 80%;\\n }\\n }\\n \"),t.append(n);let r=e.createElement(\"div\",\"lh-header-container\"),i=e.createElement(\"div\",\"lh-scores-wrapper-placeholder\");return r.append(\" \",i,\" \"),t.append(r),t}(e);case\"metric\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-metric\"),r=e.createElement(\"div\",\"lh-metric__innerwrap\"),i=e.createElement(\"div\",\"lh-metric__icon\"),a=e.createElement(\"span\",\"lh-metric__title\"),o=e.createElement(\"div\",\"lh-metric__value\"),l=e.createElement(\"div\",\"lh-metric__description\");return r.append(\" \",i,\" \",a,\" \",o,\" \",l,\" \"),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"scorescale\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-scorescale\"),r=e.createElement(\"span\",\"lh-scorescale-range lh-scorescale-range--fail\");r.append(\"0–49\");let i=e.createElement(\"span\",\"lh-scorescale-range lh-scorescale-range--average\");i.append(\"50–89\");let a=e.createElement(\"span\",\"lh-scorescale-range lh-scorescale-range--pass\");return a.append(\"90–100\"),n.append(\" \",r,\" \",i,\" \",a,\" \"),t.append(n),t}(e);case\"scoresWrapper\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");n.append(\"\\n .lh-scores-container {\\n display: flex;\\n flex-direction: column;\\n padding: var(--default-padding) 0;\\n position: relative;\\n width: 100%;\\n }\\n\\n .lh-sticky-header {\\n --gauge-circle-size: var(--gauge-circle-size-sm);\\n --plugin-badge-size: 16px;\\n --plugin-icon-size: 75%;\\n --gauge-wrapper-width: 60px;\\n --gauge-percentage-font-size: 13px;\\n position: fixed;\\n left: 0;\\n right: 0;\\n top: var(--topbar-height);\\n font-weight: 500;\\n display: none;\\n justify-content: center;\\n background-color: var(--sticky-header-background-color);\\n border-bottom: 1px solid var(--color-gray-200);\\n padding-top: var(--score-container-padding);\\n padding-bottom: 4px;\\n z-index: 2;\\n pointer-events: none;\\n }\\n\\n .lh-devtools .lh-sticky-header {\\n /* The report within DevTools is placed in a container with overflow, which changes the placement of this header unless we change `position` to `sticky.` */\\n position: sticky;\\n }\\n\\n .lh-sticky-header--visible {\\n display: grid;\\n grid-auto-flow: column;\\n pointer-events: auto;\\n }\\n\\n /* Disable the gauge arc animation for the sticky header, so toggling display: none\\n does not play the animation. */\\n .lh-sticky-header .lh-gauge-arc {\\n animation: none;\\n }\\n\\n .lh-sticky-header .lh-gauge__label,\\n .lh-sticky-header .lh-fraction__label {\\n display: none;\\n }\\n\\n .lh-highlighter {\\n width: var(--gauge-wrapper-width);\\n height: 1px;\\n background-color: var(--highlighter-background-color);\\n /* Position at bottom of first gauge in sticky header. */\\n position: absolute;\\n grid-column: 1;\\n bottom: -1px;\\n left: 0px;\\n right: 0px;\\n }\\n \"),t.append(n);let r=e.createElement(\"div\",\"lh-scores-wrapper\"),i=e.createElement(\"div\",\"lh-scores-container\"),a=e.createElement(\"div\",\"lh-pyro\"),o=e.createElement(\"div\",\"lh-pyro-before\"),l=e.createElement(\"div\",\"lh-pyro-after\");return a.append(\" \",o,\" \",l,\" \"),i.append(\" \",a,\" \"),r.append(\" \",i,\" \"),t.append(r),t}(e);case\"snippet\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-snippet\"),r=e.createElement(\"style\");return r.append('\\n :root {\\n --snippet-highlight-light: #fbf1f2;\\n --snippet-highlight-dark: #ffd6d8;\\n }\\n\\n .lh-snippet__header {\\n position: relative;\\n overflow: hidden;\\n padding: 10px;\\n border-bottom: none;\\n color: var(--snippet-color);\\n background-color: var(--snippet-background-color);\\n border: 1px solid var(--report-border-color-secondary);\\n }\\n .lh-snippet__title {\\n font-weight: bold;\\n float: left;\\n }\\n .lh-snippet__node {\\n float: left;\\n margin-left: 4px;\\n }\\n .lh-snippet__toggle-expand {\\n padding: 1px 7px;\\n margin-top: -1px;\\n margin-right: -7px;\\n float: right;\\n background: transparent;\\n border: none;\\n cursor: pointer;\\n font-size: 14px;\\n color: #0c50c7;\\n }\\n\\n .lh-snippet__snippet {\\n overflow: auto;\\n border: 1px solid var(--report-border-color-secondary);\\n }\\n /* Container needed so that all children grow to the width of the scroll container */\\n .lh-snippet__snippet-inner {\\n display: inline-block;\\n min-width: 100%;\\n }\\n\\n .lh-snippet:not(.lh-snippet--expanded) .lh-snippet__show-if-expanded {\\n display: none;\\n }\\n .lh-snippet.lh-snippet--expanded .lh-snippet__show-if-collapsed {\\n display: none;\\n }\\n\\n .lh-snippet__line {\\n background: white;\\n white-space: pre;\\n display: flex;\\n }\\n .lh-snippet__line:not(.lh-snippet__line--message):first-child {\\n padding-top: 4px;\\n }\\n .lh-snippet__line:not(.lh-snippet__line--message):last-child {\\n padding-bottom: 4px;\\n }\\n .lh-snippet__line--content-highlighted {\\n background: var(--snippet-highlight-dark);\\n }\\n .lh-snippet__line--message {\\n background: var(--snippet-highlight-light);\\n }\\n .lh-snippet__line--message .lh-snippet__line-number {\\n padding-top: 10px;\\n padding-bottom: 10px;\\n }\\n .lh-snippet__line--message code {\\n padding: 10px;\\n padding-left: 5px;\\n color: var(--color-fail);\\n font-family: var(--report-font-family);\\n }\\n .lh-snippet__line--message code {\\n white-space: normal;\\n }\\n .lh-snippet__line-icon {\\n padding-top: 10px;\\n display: none;\\n }\\n .lh-snippet__line--message .lh-snippet__line-icon {\\n display: block;\\n }\\n .lh-snippet__line-icon:before {\\n content: \"\";\\n display: inline-block;\\n vertical-align: middle;\\n margin-right: 4px;\\n width: var(--score-icon-size);\\n height: var(--score-icon-size);\\n background-image: var(--fail-icon-url);\\n }\\n .lh-snippet__line-number {\\n flex-shrink: 0;\\n width: 40px;\\n text-align: right;\\n font-family: monospace;\\n padding-right: 5px;\\n margin-right: 5px;\\n color: var(--color-gray-600);\\n user-select: none;\\n }\\n '),n.append(\" \",r,\" \"),t.append(n),t}(e);case\"snippetContent\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-snippet__snippet\"),r=e.createElement(\"div\",\"lh-snippet__snippet-inner\");return n.append(\" \",r,\" \"),t.append(n),t}(e);case\"snippetHeader\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-snippet__header\"),r=e.createElement(\"div\",\"lh-snippet__title\"),i=e.createElement(\"div\",\"lh-snippet__node\"),a=e.createElement(\"button\",\"lh-snippet__toggle-expand\"),o=e.createElement(\"span\",\"lh-snippet__btn-label-collapse lh-snippet__show-if-expanded\"),l=e.createElement(\"span\",\"lh-snippet__btn-label-expand lh-snippet__show-if-collapsed\");return a.append(\" \",o,\" \",l,\" \"),n.append(\" \",r,\" \",i,\" \",a,\" \"),t.append(n),t}(e);case\"snippetLine\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-snippet__line\"),r=e.createElement(\"div\",\"lh-snippet__line-number\"),i=e.createElement(\"div\",\"lh-snippet__line-icon\"),a=e.createElement(\"code\");return n.append(\" \",r,\" \",i,\" \",a,\" \"),t.append(n),t}(e);case\"styles\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");return n.append('/**\\n * @license\\n * Copyright 2017 Google LLC\\n * SPDX-License-Identifier: Apache-2.0\\n */\\n\\n/*\\n Naming convention:\\n\\n If a variable is used for a specific component: --{component}-{property name}-{modifier}\\n\\n Both {component} and {property name} should be kebab-case. If the target is the entire page,\\n use \\'report\\' for the component. The property name should not be abbreviated. Use the\\n property name the variable is intended for - if it\\'s used for multiple, a common descriptor\\n is fine (ex: \\'size\\' for a variable applied to \\'width\\' and \\'height\\'). If a variable is shared\\n across multiple components, either create more variables or just drop the \"{component}-\"\\n part of the name. Append any modifiers at the end (ex: \\'big\\', \\'dark\\').\\n\\n For colors: --color-{hue}-{intensity}\\n\\n {intensity} is the Material Design tag - 700, A700, etc.\\n*/\\n.lh-vars {\\n /* Palette using Material Design Colors\\n * https://www.materialui.co/colors */\\n --color-amber-50: #FFF8E1;\\n --color-blue-200: #90CAF9;\\n --color-blue-900: #0D47A1;\\n --color-blue-A700: #2962FF;\\n --color-blue-primary: #06f;\\n --color-cyan-500: #00BCD4;\\n --color-gray-100: #F5F5F5;\\n --color-gray-300: #CFCFCF;\\n --color-gray-200: #E0E0E0;\\n --color-gray-400: #BDBDBD;\\n --color-gray-50: #FAFAFA;\\n --color-gray-500: #9E9E9E;\\n --color-gray-600: #757575;\\n --color-gray-700: #616161;\\n --color-gray-800: #424242;\\n --color-gray-900: #212121;\\n --color-gray: #000000;\\n --color-green-700: #080;\\n --color-green: #0c6;\\n --color-lime-400: #D3E156;\\n --color-orange-50: #FFF3E0;\\n --color-orange-700: #C33300;\\n --color-orange: #fa3;\\n --color-red-700: #c00;\\n --color-red: #f33;\\n --color-teal-600: #00897B;\\n --color-white: #FFFFFF;\\n\\n /* Context-specific colors */\\n --color-average-secondary: var(--color-orange-700);\\n --color-average: var(--color-orange);\\n --color-fail-secondary: var(--color-red-700);\\n --color-fail: var(--color-red);\\n --color-hover: var(--color-gray-50);\\n --color-informative: var(--color-blue-900);\\n --color-pass-secondary: var(--color-green-700);\\n --color-pass: var(--color-green);\\n --color-not-applicable: var(--color-gray-600);\\n\\n /* Component variables */\\n --audit-description-padding-left: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right));\\n --audit-explanation-line-height: 16px;\\n --audit-group-margin-bottom: calc(var(--default-padding) * 6);\\n --audit-group-padding-vertical: 8px;\\n --audit-margin-horizontal: 5px;\\n --audit-padding-vertical: 8px;\\n --category-padding: calc(var(--default-padding) * 6) var(--edge-gap-padding) calc(var(--default-padding) * 4);\\n --chevron-line-stroke: var(--color-gray-600);\\n --chevron-size: 12px;\\n --default-padding: 8px;\\n --edge-gap-padding: calc(var(--default-padding) * 4);\\n --env-item-background-color: var(--color-gray-100);\\n --env-item-font-size: 28px;\\n --env-item-line-height: 36px;\\n --env-item-padding: 10px 0px;\\n --env-name-min-width: 220px;\\n --footer-padding-vertical: 16px;\\n --gauge-circle-size-big: 96px;\\n --gauge-circle-size: 48px;\\n --gauge-circle-size-sm: 32px;\\n --gauge-label-font-size-big: 18px;\\n --gauge-label-font-size: var(--report-font-size-secondary);\\n --gauge-label-line-height-big: 24px;\\n --gauge-label-line-height: var(--report-line-height-secondary);\\n --gauge-percentage-font-size-big: 38px;\\n --gauge-percentage-font-size: var(--report-font-size-secondary);\\n --gauge-wrapper-width: 120px;\\n --header-line-height: 24px;\\n --highlighter-background-color: var(--report-text-color);\\n --icon-square-size: calc(var(--score-icon-size) * 0.88);\\n --image-preview-size: 48px;\\n --link-color: var(--color-blue-primary);\\n --locale-selector-background-color: var(--color-white);\\n --metric-toggle-lines-fill: #7F7F7F;\\n --metric-value-font-size: calc(var(--report-font-size) * 1.8);\\n --metrics-toggle-background-color: var(--color-gray-200);\\n --plugin-badge-background-color: var(--color-white);\\n --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);\\n --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);\\n --plugin-icon-size: 65%;\\n --report-background-color: #fff;\\n --report-border-color-secondary: #ebebeb;\\n --report-font-family-monospace: monospace, \\'Roboto Mono\\', \\'Menlo\\', \\'dejavu sans mono\\', \\'Consolas\\', \\'Lucida Console\\';\\n --report-font-family: system-ui, Roboto, Helvetica, Arial, sans-serif;\\n --report-font-size: 14px;\\n --report-font-size-secondary: 12px;\\n --report-icon-size: var(--score-icon-background-size);\\n --report-line-height: 24px;\\n --report-line-height-secondary: 20px;\\n --report-monospace-font-size: calc(var(--report-font-size) * 0.85);\\n --report-text-color-secondary: var(--color-gray-800);\\n --report-text-color: var(--color-gray-900);\\n --report-content-max-width: calc(60 * var(--report-font-size)); /* defaults to 840px */\\n --report-content-min-width: 360px;\\n --report-content-max-width-minus-edge-gap: calc(var(--report-content-max-width) - var(--edge-gap-padding) * 2);\\n --score-container-padding: 8px;\\n --score-icon-background-size: 24px;\\n --score-icon-margin-left: 6px;\\n --score-icon-margin-right: 14px;\\n --score-icon-margin: 0 var(--score-icon-margin-right) 0 var(--score-icon-margin-left);\\n --score-icon-size: 12px;\\n --score-icon-size-big: 16px;\\n --screenshot-overlay-background: rgba(0, 0, 0, 0.3);\\n --section-padding-vertical: calc(var(--default-padding) * 6);\\n --snippet-background-color: var(--color-gray-50);\\n --snippet-color: #0938C2;\\n --stackpack-padding-horizontal: 10px;\\n --sticky-header-background-color: var(--report-background-color);\\n --sticky-header-buffer: var(--topbar-height);\\n --sticky-header-height: calc(var(--gauge-circle-size-sm) + var(--score-container-padding) * 2 + 1em);\\n --table-group-header-background-color: #EEF1F4;\\n --table-group-header-text-color: var(--color-gray-700);\\n --table-higlight-background-color: #F5F7FA;\\n --tools-icon-color: var(--color-gray-600);\\n --topbar-background-color: var(--color-white);\\n --topbar-height: 32px;\\n --topbar-logo-size: 24px;\\n --topbar-padding: 0 8px;\\n --toplevel-warning-background-color: hsla(30, 100%, 75%, 10%);\\n --toplevel-warning-message-text-color: var(--color-average-secondary);\\n --toplevel-warning-padding: 18px;\\n --toplevel-warning-text-color: var(--report-text-color);\\n\\n /* SVGs */\\n --plugin-icon-url-dark: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"%23FFFFFF\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z\"/></svg>\\');\\n --plugin-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"%23757575\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z\"/></svg>\\');\\n\\n --pass-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>check</title><path fill=\"%23178239\" d=\"M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z\"/></svg>\\');\\n --average-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>info</title><path fill=\"%23E67700\" d=\"M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm2 30h-4V22h4v12zm0-16h-4v-4h4v4z\"/></svg>\\');\\n --fail-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>warn</title><path fill=\"%23C7221F\" d=\"M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z\"/></svg>\\');\\n --error-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 3 15\"><title>error</title><path d=\"M0 15H 3V 12H 0V\" fill=\"%23FF4E42\"/><path d=\"M0 9H 3V 0H 0V\" fill=\"%23FF4E42\"/></svg>\\');\\n\\n --swap-locale-icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"%23000000\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\"/></svg>\\');\\n \\n --baseline-high-icon-url: url(\"data:image/svg+xml;utf8,<svg width=\\'18\\' height=\\'10\\' viewBox=\\'0 0 540 300\\' fill=\\'none\\' xmlns=\\'http://www.w3.org/2000/svg\\'> <path d=\\'M420 30L390 60L480 150L390 240L330 180L300 210L390 300L540 150L420 30Z\\' fill=\\'%23C4EED0\\'/> <path d=\\'M150 0L30 120L60 150L150 60L210 120L240 90L150 0Z\\' fill=\\'%23C4EED0\\'/> <path d=\\'M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z\\' fill=\\'%231EA446\\'/> </svg>\");\\n --baseline-low-icon-url: url(\"data:image/svg+xml;utf8,<svg width=\\'18\\' height=\\'10\\' viewBox=\\'0 0 540 300\\' fill=\\'none\\' xmlns=\\'http://www.w3.org/2000/svg\\'> <path d=\\'M150 0L180 30L150 60L120 30L150 0Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M210 60L240 90L210 120L180 90L210 60Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M450 60L480 90L450 120L420 90L450 60Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M510 120L540 150L510 180L480 150L510 120Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M450 180L480 210L450 240L420 210L450 180Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M390 240L420 270L390 300L360 270L390 240Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M330 180L360 210L330 240L300 210L330 180Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M90 60L120 90L90 120L60 90L90 60Z\\' fill=\\'%23A8C7FA\\'/> <path d=\\'M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z\\' fill=\\'%231B6EF3\\'/> </svg>\");\\n --baseline-limited-icon-url: url(\"data:image/svg+xml;utf8,<svg width=\\'18\\' height=\\'10\\' viewBox=\\'0 0 540 300\\' fill=\\'none\\' xmlns=\\'http://www.w3.org/2000/svg\\'> <path d=\\'M150 0L240 90L210 120L120 30L150 0Z\\' fill=\\'%23F09409\\'/> <path d=\\'M420 30L540 150L420 270L390 240L480 150L390 60L420 30Z\\' fill=\\'%23C6C6C6\\'/> <path d=\\'M330 180L300 210L390 300L420 270L330 180Z\\' fill=\\'%23F09409\\'/> <path d=\\'M120 30L150 60L60 150L150 240L120 270L0 150L120 30Z\\' fill=\\'%23C6C6C6\\'/> <path d=\\'M390 0L420 30L150 300L120 270L390 0Z\\' fill=\\'%23F09409\\'/> </svg>\");\\n}\\n\\n@media not print {\\n .lh-dark {\\n /* Pallete */\\n --color-gray-200: var(--color-gray-800);\\n --color-gray-300: #616161;\\n --color-gray-400: var(--color-gray-600);\\n --color-gray-700: var(--color-gray-400);\\n --color-gray-50: #757575;\\n --color-gray-600: var(--color-gray-500);\\n --color-green-700: var(--color-green);\\n --color-orange-700: var(--color-orange);\\n --color-red-700: var(--color-red);\\n --color-teal-600: var(--color-cyan-500);\\n\\n /* Context-specific colors */\\n --color-hover: rgba(0, 0, 0, 0.2);\\n --color-informative: var(--color-blue-200);\\n\\n /* Component variables */\\n --env-item-background-color: #393535;\\n --link-color: var(--color-blue-200);\\n --locale-selector-background-color: var(--color-gray-200);\\n --plugin-badge-background-color: var(--color-gray-800);\\n --report-background-color: var(--color-gray-900);\\n --report-border-color-secondary: var(--color-gray-200);\\n --report-text-color-secondary: var(--color-gray-400);\\n --report-text-color: var(--color-gray-100);\\n --snippet-color: var(--color-cyan-500);\\n --topbar-background-color: var(--color-gray);\\n --toplevel-warning-background-color: hsl(33deg 14% 18%);\\n --toplevel-warning-message-text-color: var(--color-orange-700);\\n --toplevel-warning-text-color: var(--color-gray-100);\\n --table-group-header-background-color: rgba(186, 196, 206, 0.15);\\n --table-group-header-text-color: var(--color-gray-100);\\n --table-higlight-background-color: rgba(186, 196, 206, 0.09);\\n\\n /* SVGs */\\n --plugin-icon-url: var(--plugin-icon-url-dark);\\n }\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media only screen and (max-width: 480px) {\\n .lh-vars {\\n --audit-group-margin-bottom: 20px;\\n --edge-gap-padding: var(--default-padding);\\n --env-name-min-width: 120px;\\n --gauge-circle-size-big: 96px;\\n --gauge-circle-size: 72px;\\n --gauge-label-font-size-big: 22px;\\n --gauge-label-font-size: 14px;\\n --gauge-label-line-height-big: 26px;\\n --gauge-label-line-height: 20px;\\n --gauge-percentage-font-size-big: 34px;\\n --gauge-percentage-font-size: 26px;\\n --gauge-wrapper-width: 112px;\\n --header-padding: 16px 0 16px 0;\\n --image-preview-size: 24px;\\n --plugin-icon-size: 75%;\\n --report-font-size: 14px;\\n --report-line-height: 20px;\\n --score-icon-margin-left: 2px;\\n --score-icon-size: 10px;\\n --topbar-height: 28px;\\n --topbar-logo-size: 20px;\\n }\\n}\\n\\n@container lh-container (max-width: 480px) {\\n .lh-vars {\\n --audit-group-margin-bottom: 20px;\\n --edge-gap-padding: var(--default-padding);\\n --env-name-min-width: 120px;\\n --gauge-circle-size-big: 96px;\\n --gauge-circle-size: 72px;\\n --gauge-label-font-size-big: 22px;\\n --gauge-label-font-size: 14px;\\n --gauge-label-line-height-big: 26px;\\n --gauge-label-line-height: 20px;\\n --gauge-percentage-font-size-big: 34px;\\n --gauge-percentage-font-size: 26px;\\n --gauge-wrapper-width: 112px;\\n --header-padding: 16px 0 16px 0;\\n --image-preview-size: 24px;\\n --plugin-icon-size: 75%;\\n --report-font-size: 14px;\\n --report-line-height: 20px;\\n --score-icon-margin-left: 2px;\\n --score-icon-size: 10px;\\n --topbar-height: 28px;\\n --topbar-logo-size: 20px;\\n }\\n}\\n\\n.lh-vars.lh-devtools {\\n --audit-explanation-line-height: 14px;\\n --audit-group-margin-bottom: 20px;\\n --audit-group-padding-vertical: 12px;\\n --audit-padding-vertical: 4px;\\n --category-padding: 12px;\\n --default-padding: 12px;\\n --env-name-min-width: 120px;\\n --footer-padding-vertical: 8px;\\n --gauge-circle-size-big: 72px;\\n --gauge-circle-size: 64px;\\n --gauge-label-font-size-big: 22px;\\n --gauge-label-font-size: 14px;\\n --gauge-label-line-height-big: 26px;\\n --gauge-label-line-height: 20px;\\n --gauge-percentage-font-size-big: 34px;\\n --gauge-percentage-font-size: 26px;\\n --gauge-wrapper-width: 97px;\\n --header-line-height: 20px;\\n --header-padding: 16px 0 16px 0;\\n --screenshot-overlay-background: transparent;\\n --plugin-icon-size: 75%;\\n --report-font-size: 12px;\\n --report-line-height: 20px;\\n --score-icon-margin-left: 2px;\\n --score-icon-size: 10px;\\n --section-padding-vertical: 8px;\\n}\\n\\n.lh-devtools :focus-visible {\\n outline: -webkit-focus-ring-color auto 1px;\\n}\\n\\n.lh-container:has(.lh-sticky-header) {\\n --sticky-header-buffer: calc(var(--topbar-height) + var(--sticky-header-height));\\n}\\n\\n.lh-container:not(.lh-topbar + .lh-container) {\\n --topbar-height: 0;\\n --sticky-header-height: 0;\\n --sticky-header-buffer: 0;\\n}\\n\\n.lh-max-viewport {\\n display: flex;\\n flex-direction: column;\\n min-height: 100vh;\\n width: 100%;\\n}\\n\\n.lh-devtools.lh-root {\\n height: 100%;\\n}\\n.lh-devtools.lh-root img {\\n /* Override devtools default \\'min-width: 0\\' so svg without size in a flexbox isn\\'t collapsed. */\\n min-width: auto;\\n}\\n.lh-devtools .lh-container {\\n overflow-y: scroll;\\n height: calc(100% - var(--topbar-height));\\n /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */\\n --sticky-header-buffer: 0;\\n}\\n.lh-devtools .lh-container:has(.lh-sticky-header) {\\n /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */\\n --sticky-header-buffer: var(--sticky-header-height);\\n}\\n@media print {\\n .lh-devtools .lh-container {\\n overflow: unset;\\n }\\n}\\n.lh-devtools .lh-sticky-header {\\n /* This is normally the height of the topbar, but we want it to stick to the top of our scroll container .lh-container` */\\n top: 0;\\n}\\n.lh-devtools .lh-element-screenshot__overlay {\\n position: absolute;\\n}\\n\\n@keyframes fadeIn {\\n 0% { opacity: 0;}\\n 100% { opacity: 0.6;}\\n}\\n\\n.lh-root *, .lh-root *::before, .lh-root *::after {\\n box-sizing: border-box;\\n}\\n\\n.lh-root {\\n font-family: var(--report-font-family);\\n font-size: var(--report-font-size);\\n margin: 0;\\n line-height: var(--report-line-height);\\n background: var(--report-background-color);\\n color: var(--report-text-color);\\n}\\n\\n.lh-root [hidden] {\\n display: none !important;\\n}\\n\\n.lh-root pre {\\n margin: 0;\\n}\\n\\n.lh-root pre,\\n.lh-root code {\\n font-family: var(--report-font-family-monospace);\\n}\\n\\n.lh-root details > summary {\\n cursor: pointer;\\n}\\n\\n.lh-hidden {\\n display: none !important;\\n}\\n\\n.lh-container {\\n /*\\n Text wrapping in the report is so much FUN!\\n We have a `word-break: break-word;` globally here to prevent a few common scenarios, namely\\n long non-breakable text (usually URLs) found in:\\n 1. The footer\\n 2. .lh-node (outerHTML)\\n 3. .lh-code\\n\\n With that sorted, the next challenge is appropriate column sizing and text wrapping inside our\\n .lh-details tables. Even more fun.\\n * We don\\'t want table headers (\"Est Savings (ms)\") to wrap or their column values, but\\n we\\'d be happy for the URL column to wrap if the URLs are particularly long.\\n * We want the narrow columns to remain narrow, providing the most column width for URL\\n * We don\\'t want the table to extend past 100% width.\\n * Long URLs in the URL column can wrap. Util.getURLDisplayName maxes them out at 64 characters,\\n but they do not get any overflow:ellipsis treatment.\\n */\\n word-break: break-word;\\n\\n container-name: lh-container;\\n container-type: inline-size;\\n}\\n\\n.lh-audit-group a,\\n.lh-category-header__description a,\\n.lh-audit__description a,\\n.lh-warnings a,\\n.lh-footer a,\\n.lh-table-column--link a {\\n color: var(--link-color);\\n}\\n\\n.lh-audit__description, .lh-audit__stackpack, .lh-list-section__description {\\n --inner-audit-padding-right: var(--stackpack-padding-horizontal);\\n padding-left: var(--audit-description-padding-left);\\n padding-right: var(--inner-audit-padding-right);\\n padding-top: 8px;\\n padding-bottom: 8px;\\n}\\n\\n.lh-details {\\n margin-top: var(--default-padding);\\n margin-bottom: var(--default-padding);\\n margin-left: var(--audit-description-padding-left);\\n}\\n\\n.lh-audit__stackpack {\\n display: flex;\\n align-items: center;\\n}\\n\\n.lh-audit__stackpack__img {\\n max-width: 30px;\\n margin-right: var(--default-padding)\\n}\\n\\n/* Report header */\\n\\n.lh-report-icon {\\n display: flex;\\n align-items: center;\\n padding: 10px 12px;\\n cursor: pointer;\\n}\\n.lh-report-icon[disabled] {\\n opacity: 0.3;\\n pointer-events: none;\\n}\\n\\n.lh-report-icon::before {\\n content: \"\";\\n margin: 4px;\\n background-repeat: no-repeat;\\n width: var(--report-icon-size);\\n height: var(--report-icon-size);\\n opacity: 0.7;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.lh-report-icon:hover::before {\\n opacity: 1;\\n}\\n.lh-dark .lh-report-icon::before {\\n filter: invert(1);\\n}\\n.lh-report-icon--print::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"/><path fill=\"none\" d=\"M0 0h24v24H0z\"/></svg>\\');\\n}\\n.lh-report-icon--copy::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"/></svg>\\');\\n}\\n.lh-report-icon--open::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></svg>\\');\\n}\\n.lh-report-icon--download::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/></svg>\\');\\n}\\n.lh-report-icon--dark::before {\\n background-image:url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 100 125\"><path d=\"M50 23.587c-16.27 0-22.799 12.574-22.799 21.417 0 12.917 10.117 22.451 12.436 32.471h20.726c2.32-10.02 12.436-19.554 12.436-32.471 0-8.843-6.528-21.417-22.799-21.417zM39.637 87.161c0 3.001 1.18 4.181 4.181 4.181h.426l.41 1.231C45.278 94.449 46.042 95 48.019 95h3.963c1.978 0 2.74-.551 3.365-2.427l.409-1.231h.427c3.002 0 4.18-1.18 4.18-4.181V80.91H39.637v6.251zM50 18.265c1.26 0 2.072-.814 2.072-2.073v-9.12C52.072 5.813 51.26 5 50 5c-1.259 0-2.072.813-2.072 2.073v9.12c0 1.259.813 2.072 2.072 2.072zM68.313 23.727c.994.774 2.135.634 2.91-.357l5.614-7.187c.776-.992.636-2.135-.356-2.909-.992-.776-2.135-.636-2.91.357l-5.613 7.186c-.778.993-.636 2.135.355 2.91zM91.157 36.373c-.306-1.222-1.291-1.815-2.513-1.51l-8.85 2.207c-1.222.305-1.814 1.29-1.51 2.512.305 1.223 1.291 1.814 2.513 1.51l8.849-2.206c1.223-.305 1.816-1.291 1.511-2.513zM86.757 60.48l-8.331-3.709c-1.15-.512-2.225-.099-2.736 1.052-.512 1.151-.1 2.224 1.051 2.737l8.33 3.707c1.15.514 2.225.101 2.736-1.05.513-1.149.1-2.223-1.05-2.737zM28.779 23.37c.775.992 1.917 1.131 2.909.357.992-.776 1.132-1.917.357-2.91l-5.615-7.186c-.775-.992-1.917-1.132-2.909-.357s-1.131 1.917-.356 2.909l5.614 7.187zM21.715 39.583c.305-1.223-.288-2.208-1.51-2.513l-8.849-2.207c-1.222-.303-2.208.289-2.513 1.511-.303 1.222.288 2.207 1.511 2.512l8.848 2.206c1.222.304 2.208-.287 2.513-1.509zM21.575 56.771l-8.331 3.711c-1.151.511-1.563 1.586-1.05 2.735.511 1.151 1.586 1.563 2.736 1.052l8.331-3.711c1.151-.511 1.563-1.586 1.05-2.735-.512-1.15-1.585-1.562-2.736-1.052z\"/></svg>\\');\\n}\\n.lh-report-icon--treemap::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"black\"><path d=\"M3 5v14h19V5H3zm2 2h15v4H5V7zm0 10v-4h4v4H5zm6 0v-4h9v4h-9z\"/></svg>\\');\\n}\\n\\n.lh-report-icon--date::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 11h2v2H7v-2zm14-5v14a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h1V2h2v2h8V2h2v2h1a2 2 0 012 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></svg>\\');\\n}\\n.lh-report-icon--devices::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 6h18V4H4a2 2 0 00-2 2v11H0v3h14v-3H4V6zm19 2h-6a1 1 0 00-1 1v10c0 .6.5 1 1 1h6c.6 0 1-.5 1-1V9c0-.6-.5-1-1-1zm-1 9h-4v-7h4v7z\"/></svg>\\');\\n}\\n.lh-report-icon--world::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm7 6h-3c-.3-1.3-.8-2.5-1.4-3.6A8 8 0 0 1 18.9 8zm-7-4a14 14 0 0 1 2 4h-4a14 14 0 0 1 2-4zM4.3 14a8.2 8.2 0 0 1 0-4h3.3a16.5 16.5 0 0 0 0 4H4.3zm.8 2h3a14 14 0 0 0 1.3 3.6A8 8 0 0 1 5.1 16zm3-8H5a8 8 0 0 1 4.3-3.6L8 8zM12 20a14 14 0 0 1-2-4h4a14 14 0 0 1-2 4zm2.3-6H9.7a14.7 14.7 0 0 1 0-4h4.6a14.6 14.6 0 0 1 0 4zm.3 5.6c.6-1.2 1-2.4 1.4-3.6h3a8 8 0 0 1-4.4 3.6zm1.8-5.6a16.5 16.5 0 0 0 0-4h3.3a8.2 8.2 0 0 1 0 4h-3.3z\"/></svg>\\');\\n}\\n.lh-report-icon--stopwatch::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.1-6.6L20.5 6l-1.4-1.4L17.7 6A9 9 0 0 0 3 13a9 9 0 1 0 16-5.6zm-7 12.6a7 7 0 1 1 0-14 7 7 0 0 1 0 14z\"/></svg>\\');\\n}\\n.lh-report-icon--networkspeed::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.9 5c-.2 0-.3 0-.4.2v.2L10.1 17a2 2 0 0 0-.2 1 2 2 0 0 0 4 .4l2.4-12.9c0-.3-.2-.5-.5-.5zM1 9l2 2c2.9-2.9 6.8-4 10.5-3.6l1.2-2.7C10 3.8 4.7 5.3 1 9zm20 2 2-2a15.4 15.4 0 0 0-5.6-3.6L17 8.2c1.5.7 2.9 1.6 4.1 2.8zm-4 4 2-2a9.9 9.9 0 0 0-2.7-1.9l-.5 3 1.2.9zM5 13l2 2a7.1 7.1 0 0 1 4-2l1.3-2.9C9.7 10.1 7 11 5 13z\"/></svg>\\');\\n}\\n.lh-report-icon--samples-one::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"7\" cy=\"14\" r=\"3\"/><path d=\"M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></svg>\\');\\n}\\n.lh-report-icon--samples-many::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/><circle cx=\"7\" cy=\"14\" r=\"3\"/><circle cx=\"11\" cy=\"6\" r=\"3\"/></svg>\\');\\n}\\n.lh-report-icon--chrome::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-50 -50 562 562\"><path d=\"M256 25.6v25.6a204 204 0 0 1 144.8 60 204 204 0 0 1 60 144.8 204 204 0 0 1-60 144.8 204 204 0 0 1-144.8 60 204 204 0 0 1-144.8-60 204 204 0 0 1-60-144.8 204 204 0 0 1 60-144.8 204 204 0 0 1 144.8-60V0a256 256 0 1 0 0 512 256 256 0 0 0 0-512v25.6z\"/><path d=\"M256 179.2v25.6a51.3 51.3 0 0 1 0 102.4 51.3 51.3 0 0 1 0-102.4v-51.2a102.3 102.3 0 1 0-.1 204.7 102.3 102.3 0 0 0 .1-204.7v25.6z\"/><path d=\"M256 204.8h217.6a25.6 25.6 0 0 0 0-51.2H256a25.6 25.6 0 0 0 0 51.2m44.3 76.8L191.5 470.1a25.6 25.6 0 1 0 44.4 25.6l108.8-188.5a25.6 25.6 0 1 0-44.4-25.6m-88.6 0L102.9 93.2a25.7 25.7 0 0 0-35-9.4 25.7 25.7 0 0 0-9.4 35l108.8 188.5a25.7 25.7 0 0 0 35 9.4 25.9 25.9 0 0 0 9.4-35.1\"/></svg>\\');\\n}\\n.lh-report-icon--external::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.15 11.9a1.01 1.01 0 0 1-.743-.307 1.01 1.01 0 0 1-.306-.743v-7.7c0-.292.102-.54.306-.744a1.01 1.01 0 0 1 .744-.306H7v1.05H3.15v7.7h7.7V7h1.05v3.85c0 .291-.103.54-.307.743a1.01 1.01 0 0 1-.743.307h-7.7Zm2.494-2.8-.743-.744 5.206-5.206H8.401V2.1h3.5v3.5h-1.05V3.893L5.644 9.1Z\"/></svg>\\');\\n}\\n.lh-report-icon--experiment::before {\\n background-image: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M4.50002 17C3.86136 17 3.40302 16.7187 3.12502 16.156C2.84702 15.5933 2.90936 15.069 3.31202 14.583L7.50002 9.5V4.5H6.75002C6.54202 4.5 6.36502 4.427 6.21902 4.281C6.07302 4.135 6.00002 3.958 6.00002 3.75C6.00002 3.542 6.07302 3.365 6.21902 3.219C6.36502 3.073 6.54202 3 6.75002 3H13.25C13.458 3 13.635 3.073 13.781 3.219C13.927 3.365 14 3.542 14 3.75C14 3.958 13.927 4.135 13.781 4.281C13.635 4.427 13.458 4.5 13.25 4.5H12.5V9.5L16.688 14.583C17.0767 15.069 17.132 15.5933 16.854 16.156C16.5767 16.7187 16.1254 17 15.5 17H4.50002ZM4.50002 15.5H15.5L11 10V4.5H9.00002V10L4.50002 15.5Z\" fill=\"black\"/></svg>\\');\\n}\\n\\n/** These are still icons, but w/o the auto-color invert / opacity / etc. that come with .lh-report-icon */\\n\\n.lh-report-plain-icon {\\n display: flex;\\n align-items: center;\\n}\\n.lh-report-plain-icon::before {\\n content: \"\";\\n background-repeat: no-repeat;\\n width: var(--report-icon-size);\\n height: var(--report-icon-size);\\n display: inline-block;\\n margin-right: 5px;\\n}\\n\\n.lh-report-plain-icon--checklist-pass::before {\\n --icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M8.938 13L13.896 8.062L12.833 7L8.938 10.875L7.167 9.125L6.104 10.188L8.938 13ZM10 18C8.90267 18 7.868 17.7917 6.896 17.375C5.924 16.9583 5.07333 16.3853 4.344 15.656C3.61467 14.9267 3.04167 14.076 2.625 13.104C2.20833 12.132 2 11.0973 2 10C2 8.88867 2.20833 7.85033 2.625 6.885C3.04167 5.92033 3.61467 5.07333 4.344 4.344C5.07333 3.61467 5.924 3.04167 6.896 2.625C7.868 2.20833 8.90267 2 10 2C11.1113 2 12.1497 2.20833 13.115 2.625C14.0797 3.04167 14.9267 3.61467 15.656 4.344C16.3853 5.07333 16.9583 5.92033 17.375 6.885C17.7917 7.85033 18 8.88867 18 10C18 11.0973 17.7917 12.132 17.375 13.104C16.9583 14.076 16.3853 14.9267 15.656 15.656C14.9267 16.3853 14.0797 16.9583 13.115 17.375C12.1497 17.7917 11.1113 18 10 18ZM10 16.5C11.8053 16.5 13.34 15.868 14.604 14.604C15.868 13.34 16.5 11.8053 16.5 10C16.5 8.19467 15.868 6.66 14.604 5.396C13.34 4.132 11.8053 3.5 10 3.5C8.19467 3.5 6.66 4.132 5.396 5.396C4.132 6.66 3.5 8.19467 3.5 10C3.5 11.8053 4.132 13.34 5.396 14.604C6.66 15.868 8.19467 16.5 10 16.5Z\" fill=\"black\"/></svg>\\');\\n background-color: var(--color-pass);\\n mask: var(--icon-url) center / contain no-repeat;\\n}\\n.lh-report-plain-icon--checklist-fail::before {\\n --icon-url: url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.5 10C17.5 14.1421 14.1421 17.5 10 17.5C5.85786 17.5 2.5 14.1421 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5C14.1421 2.5 17.5 5.85786 17.5 10ZM16 10C16 13.3137 13.3137 16 10 16C8.6135 16 7.33683 15.5297 6.32083 14.7399L14.7399 6.32083C15.5297 7.33683 16 8.6135 16 10ZM5.26016 13.6793L13.6793 5.26016C12.6633 4.47033 11.3866 4 10 4C6.68629 4 4 6.68629 4 10C4 11.3866 4.47033 12.6633 5.26016 13.6793Z\" fill=\"black\"/></svg>\\');\\n background-color: var(--color-fail);\\n mask: var(--icon-url) center / contain no-repeat;\\n}\\n\\n.lh-buttons {\\n display: flex;\\n flex-wrap: wrap;\\n margin: var(--default-padding) 0;\\n}\\n.lh-button {\\n height: 32px;\\n border: 1px solid var(--report-border-color-secondary);\\n border-radius: 3px;\\n color: var(--link-color);\\n background-color: var(--report-background-color);\\n margin: 5px;\\n}\\n\\n.lh-button:first-of-type {\\n margin-left: 0;\\n}\\n\\n/* Node */\\n.lh-node {\\n display: flow-root;\\n}\\n\\n.lh-node__snippet {\\n font-family: var(--report-font-family-monospace);\\n color: var(--snippet-color);\\n font-size: var(--report-monospace-font-size);\\n line-height: 20px;\\n}\\n\\n.lh-checklist {\\n list-style: none;\\n padding: 0;\\n}\\n\\n.lh-checklist-item {\\n margin: 10px 0 10px 0;\\n}\\n\\n/* Baseline Status */\\n.lh-baseline-status {\\n display: flex;\\n align-items: center;\\n}\\n.lh-baseline-status::before {\\n content: \"\";\\n display: inline-block;\\n width: 18px;\\n height: 10px;\\n margin-right: 6px;\\n background-repeat: no-repeat;\\n background-size: contain;\\n}\\n.lh-baseline-status--high::before {\\n background-image: var(--baseline-high-icon-url);\\n}\\n.lh-baseline-status--low::before {\\n background-image: var(--baseline-low-icon-url);\\n}\\n.lh-baseline-status--limited::before {\\n background-image: var(--baseline-limited-icon-url);\\n}\\n\\n/* Score */\\n\\n.lh-audit__score-icon {\\n width: var(--score-icon-size);\\n height: var(--score-icon-size);\\n margin: var(--score-icon-margin);\\n}\\n\\n.lh-audit--pass .lh-audit__display-text {\\n color: var(--color-pass-secondary);\\n}\\n.lh-audit--pass .lh-audit__score-icon,\\n.lh-scorescale-range--pass::before {\\n border-radius: 100%;\\n background: var(--color-pass);\\n}\\n\\n.lh-audit--average .lh-audit__display-text {\\n color: var(--color-average-secondary);\\n}\\n.lh-audit--average .lh-audit__score-icon,\\n.lh-scorescale-range--average::before {\\n background: var(--color-average);\\n width: var(--icon-square-size);\\n height: var(--icon-square-size);\\n}\\n\\n.lh-audit--fail .lh-audit__display-text {\\n color: var(--color-fail-secondary);\\n}\\n.lh-audit--fail .lh-audit__score-icon,\\n.lh-audit--error .lh-audit__score-icon,\\n.lh-scorescale-range--fail::before {\\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\\n border-bottom: var(--score-icon-size) solid var(--color-fail);\\n}\\n\\n.lh-audit--error .lh-audit__score-icon,\\n.lh-metric--error .lh-metric__icon {\\n background-image: var(--error-icon-url);\\n background-repeat: no-repeat;\\n background-position: center;\\n border: none;\\n}\\n\\n.lh-gauge__wrapper--fail .lh-gauge--error {\\n background-image: var(--error-icon-url);\\n background-repeat: no-repeat;\\n background-position: center;\\n transform: scale(0.5);\\n top: var(--score-container-padding);\\n}\\n\\n.lh-audit--manual .lh-audit__display-text,\\n.lh-audit--notapplicable .lh-audit__display-text {\\n color: var(--color-gray-600);\\n}\\n.lh-audit--manual .lh-audit__score-icon,\\n.lh-audit--notapplicable .lh-audit__score-icon {\\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\\n border-radius: 100%;\\n background: none;\\n}\\n\\n.lh-audit--informative .lh-audit__display-text {\\n color: var(--color-gray-600);\\n}\\n\\n.lh-audit--informative .lh-audit__score-icon {\\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\\n border-radius: 100%;\\n}\\n\\n.lh-audit__description,\\n.lh-audit__stackpack {\\n color: var(--report-text-color-secondary);\\n}\\n.lh-audit__adorn {\\n border: 1px solid var(--color-gray-500);\\n border-radius: 3px;\\n margin: 0 3px;\\n padding: 0 2px;\\n line-height: 1.1;\\n display: inline-block;\\n font-size: 90%;\\n color: var(--report-text-color-secondary);\\n}\\n\\n.lh-category-header__description {\\n text-align: center;\\n color: var(--color-gray-700);\\n margin: 0px auto;\\n max-width: 400px;\\n}\\n\\n\\n.lh-audit__display-text,\\n.lh-chevron-container {\\n margin: 0 var(--audit-margin-horizontal);\\n}\\n.lh-chevron-container {\\n margin-right: 0;\\n}\\n\\n.lh-audit__title-and-text {\\n flex: 1;\\n}\\n\\n.lh-audit__title-and-text code {\\n color: var(--snippet-color);\\n font-size: var(--report-monospace-font-size);\\n}\\n\\n/* Prepend display text with em dash separator. */\\n.lh-audit__display-text:not(:empty):before {\\n content: \\'—\\';\\n margin-right: var(--audit-margin-horizontal);\\n}\\n\\n/* Expandable Details (Audit Groups, Audits) */\\n.lh-audit__header {\\n display: flex;\\n align-items: center;\\n padding: var(--default-padding);\\n}\\n\\n\\n.lh-metricfilter {\\n display: grid;\\n justify-content: end;\\n align-items: center;\\n grid-auto-flow: column;\\n gap: 4px;\\n color: var(--color-gray-700);\\n}\\n\\n.lh-metricfilter__radio {\\n /*\\n * Instead of hiding, position offscreen so it\\'s still accessible to screen readers\\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1439785\\n */\\n position: fixed;\\n left: -9999px;\\n}\\n.lh-metricfilter input[type=\\'radio\\']:focus-visible + label {\\n outline: -webkit-focus-ring-color auto 1px;\\n}\\n\\n.lh-metricfilter__label {\\n display: inline-flex;\\n padding: 0 4px;\\n height: 16px;\\n text-decoration: underline;\\n align-items: center;\\n cursor: pointer;\\n font-size: 90%;\\n}\\n\\n.lh-metricfilter__label--active {\\n background: var(--color-blue-primary);\\n color: var(--color-white);\\n border-radius: 3px;\\n text-decoration: none;\\n}\\n/* Give the \\'All\\' choice a more muted display */\\n.lh-metricfilter__label--active[for=\"metric-All\"] {\\n background-color: var(--color-blue-200) !important;\\n color: black !important;\\n}\\n\\n.lh-metricfilter__text {\\n margin-right: 8px;\\n}\\n\\n/* If audits are filtered, hide the itemcount for Passed Audits… */\\n.lh-category--filtered .lh-audit-group .lh-audit-group__itemcount {\\n display: none;\\n}\\n\\n\\n.lh-audit__header:hover {\\n background-color: var(--color-hover);\\n}\\n\\n/* We want to hide the browser\\'s default arrow marker on summary elements. Admittedly, it\\'s complicated. */\\n.lh-root details > summary {\\n /* Blink 89+ and Firefox will hide the arrow when display is changed from (new) default of `list-item` to block. https://chromestatus.com/feature/6730096436051968*/\\n display: block;\\n}\\n/* Safari and Blink <=88 require using the -webkit-details-marker selector */\\n.lh-root details > summary::-webkit-details-marker {\\n display: none;\\n}\\n\\n/* Perf Metric */\\n\\n.lh-metrics-container {\\n display: grid;\\n grid-auto-rows: 1fr;\\n grid-template-columns: 1fr 1fr;\\n grid-column-gap: var(--report-line-height);\\n margin-bottom: var(--default-padding);\\n}\\n\\n.lh-metric {\\n border-top: 1px solid var(--report-border-color-secondary);\\n}\\n\\n.lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(-n+2) {\\n border-bottom: 1px solid var(--report-border-color-secondary);\\n}\\n\\n.lh-metric__innerwrap {\\n display: grid;\\n /**\\n * Icon -- Metric Name\\n * -- Metric Value\\n */\\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 1fr;\\n align-items: center;\\n padding: var(--default-padding);\\n}\\n\\n.lh-metric__details {\\n order: -1;\\n}\\n\\n.lh-metric__title {\\n flex: 1;\\n}\\n\\n.lh-calclink {\\n padding-left: calc(1ex / 3);\\n}\\n\\n.lh-metric__description {\\n display: none;\\n grid-column-start: 2;\\n grid-column-end: 4;\\n color: var(--report-text-color-secondary);\\n}\\n\\n.lh-metric__value {\\n font-size: var(--metric-value-font-size);\\n margin: calc(var(--default-padding) / 2) 0;\\n white-space: nowrap; /* No wrapping between metric value and the icon */\\n grid-column-start: 2;\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 535px) {\\n .lh-metrics-container {\\n display: block;\\n }\\n\\n .lh-metric {\\n border-bottom: none !important;\\n }\\n .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\\n border-bottom: 1px solid var(--report-border-color-secondary) !important;\\n }\\n\\n /* Change the grid to 3 columns for narrow viewport. */\\n .lh-metric__innerwrap {\\n /**\\n * Icon -- Metric Name -- Metric Value\\n */\\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\\n }\\n .lh-metric__value {\\n justify-self: end;\\n grid-column-start: unset;\\n }\\n}\\n\\n@container lh-container (max-width: 535px) {\\n .lh-metrics-container {\\n display: block;\\n }\\n\\n .lh-metric {\\n border-bottom: none !important;\\n }\\n .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\\n border-bottom: 1px solid var(--report-border-color-secondary) !important;\\n }\\n\\n /* Change the grid to 3 columns for narrow viewport. */\\n .lh-metric__innerwrap {\\n /**\\n * Icon -- Metric Name -- Metric Value\\n */\\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\\n }\\n .lh-metric__value {\\n justify-self: end;\\n grid-column-start: unset;\\n }\\n}\\n\\n/* No-JS toggle switch */\\n/* Keep this selector sync\\'d w/ `magicSelector` in report-ui-features-test.js */\\n .lh-metrics-toggle__input:checked ~ .lh-metrics-container .lh-metric__description {\\n display: block;\\n}\\n\\n/* TODO get rid of the SVGS and clean up these some more */\\n.lh-metrics-toggle__input {\\n opacity: 0;\\n position: absolute;\\n right: 0;\\n top: 0px;\\n}\\n\\n.lh-metrics-toggle__input + div > label > .lh-metrics-toggle__labeltext--hide,\\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--show {\\n display: none;\\n}\\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--hide {\\n display: inline;\\n}\\n.lh-metrics-toggle__input:focus + div > label {\\n outline: -webkit-focus-ring-color auto 3px;\\n}\\n\\n.lh-metrics-toggle__label {\\n cursor: pointer;\\n font-size: var(--report-font-size-secondary);\\n line-height: var(--report-line-height-secondary);\\n color: var(--color-gray-700);\\n}\\n\\n/* Pushes the metric description toggle button to the right. */\\n.lh-audit-group--metrics .lh-audit-group__header {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.lh-metric__icon,\\n.lh-scorescale-range::before {\\n content: \\'\\';\\n width: var(--score-icon-size);\\n height: var(--score-icon-size);\\n display: inline-block;\\n margin: var(--score-icon-margin);\\n}\\n\\n.lh-metric--pass .lh-metric__value {\\n color: var(--color-pass-secondary);\\n}\\n.lh-metric--pass .lh-metric__icon {\\n border-radius: 100%;\\n background: var(--color-pass);\\n}\\n\\n.lh-metric--average .lh-metric__value {\\n color: var(--color-average-secondary);\\n}\\n.lh-metric--average .lh-metric__icon {\\n background: var(--color-average);\\n width: var(--icon-square-size);\\n height: var(--icon-square-size);\\n}\\n\\n.lh-metric--fail .lh-metric__value {\\n color: var(--color-fail-secondary);\\n}\\n.lh-metric--fail .lh-metric__icon {\\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\\n border-bottom: var(--score-icon-size) solid var(--color-fail);\\n}\\n\\n.lh-metric--error .lh-metric__value,\\n.lh-metric--error .lh-metric__description {\\n color: var(--color-fail-secondary);\\n}\\n\\n/* Filmstrip */\\n\\n.lh-filmstrip-container {\\n /* smaller gap between metrics and filmstrip */\\n margin: -8px auto 0 auto;\\n}\\n\\n.lh-filmstrip {\\n display: flex;\\n justify-content: space-between;\\n justify-items: center;\\n margin-bottom: var(--default-padding);\\n width: 100%;\\n}\\n\\n.lh-filmstrip__frame {\\n overflow: hidden;\\n line-height: 0;\\n}\\n\\n.lh-filmstrip__thumbnail {\\n border: 1px solid var(--report-border-color-secondary);\\n max-height: 150px;\\n max-width: 120px;\\n}\\n\\n.lh-dark .lh-perf-toggle-text {\\n color: rgba(30, 164, 70, 1);\\n}\\n\\n.lh-perf-toggle-text a {\\n color: var(--link-color);\\n}\\n\\n/* Audit */\\n\\n.lh-audit {\\n border-bottom: 1px solid var(--report-border-color-secondary);\\n}\\n\\n/* Apply border-top to just the first audit. */\\n.lh-audit {\\n border-top: 1px solid var(--report-border-color-secondary);\\n}\\n.lh-audit ~ .lh-audit {\\n border-top: none;\\n}\\n\\n\\n.lh-audit--error .lh-audit__display-text {\\n color: var(--color-fail-secondary);\\n}\\n\\n/* Audit Group */\\n\\n.lh-audit-group {\\n margin-bottom: var(--audit-group-margin-bottom);\\n position: relative;\\n}\\n.lh-audit-group--metrics {\\n margin-bottom: calc(var(--audit-group-margin-bottom) / 2);\\n}\\n\\n.lh-audit-group--metrics .lh-audit-group__summary {\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.lh-audit-group__summary {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n}\\n\\n.lh-audit-group__header .lh-chevron {\\n margin-top: calc((var(--report-line-height) - 5px) / 2);\\n}\\n\\n.lh-audit-group__header {\\n letter-spacing: 0.8px;\\n padding: var(--default-padding);\\n padding-left: 0;\\n}\\n\\n.lh-audit-group__header, .lh-audit-group__summary {\\n font-size: var(--report-font-size-secondary);\\n line-height: var(--report-line-height-secondary);\\n color: var(--color-gray-700);\\n}\\n\\n.lh-audit-group__title {\\n text-transform: uppercase;\\n font-weight: 500;\\n}\\n\\n.lh-audit-group__itemcount {\\n color: var(--color-gray-600);\\n}\\n\\n.lh-audit-group__footer {\\n color: var(--color-gray-600);\\n display: block;\\n margin-top: var(--default-padding);\\n}\\n\\n.lh-details,\\n.lh-category-header__description,\\n.lh-audit-group__footer {\\n font-size: var(--report-font-size-secondary);\\n line-height: var(--report-line-height-secondary);\\n}\\n\\n.lh-audit-explanation {\\n margin: var(--audit-padding-vertical) 0 calc(var(--audit-padding-vertical) / 2) var(--audit-margin-horizontal);\\n line-height: var(--audit-explanation-line-height);\\n display: inline-block;\\n}\\n\\n.lh-audit--fail .lh-audit-explanation {\\n color: var(--color-fail-secondary);\\n}\\n\\n/* Report */\\n.lh-list {\\n margin-right: calc(var(--default-padding) * 2);\\n}\\n.lh-list > :not(:last-child) {\\n margin-bottom: calc(var(--default-padding) * 2);\\n border-bottom: 1px solid #A8C7FA;\\n}\\n.lh-list-section {\\n padding: calc(var(--default-padding) * 2) 0;\\n}\\n.lh-list-section__title {\\n text-decoration: underline;\\n}\\n\\n.lh-header-container {\\n display: block;\\n margin: 0 auto;\\n position: relative;\\n word-wrap: break-word;\\n}\\n\\n.lh-header-container .lh-scores-wrapper {\\n border-bottom: 1px solid var(--color-gray-200);\\n}\\n\\n\\n.lh-report {\\n min-width: var(--report-content-min-width);\\n}\\n\\n.lh-exception {\\n font-size: large;\\n}\\n\\n.lh-code {\\n white-space: normal;\\n margin-top: 0;\\n font-size: var(--report-monospace-font-size);\\n}\\n\\n.lh-warnings {\\n --item-margin: calc(var(--report-line-height) / 6);\\n color: var(--color-average-secondary);\\n margin: var(--audit-padding-vertical) 0;\\n padding: var(--default-padding)\\n var(--default-padding)\\n var(--default-padding)\\n calc(var(--audit-description-padding-left));\\n background-color: var(--toplevel-warning-background-color);\\n}\\n.lh-warnings span {\\n font-weight: bold;\\n}\\n\\n.lh-warnings--toplevel {\\n --item-margin: calc(var(--header-line-height) / 4);\\n color: var(--toplevel-warning-text-color);\\n margin-left: auto;\\n margin-right: auto;\\n max-width: var(--report-content-max-width-minus-edge-gap);\\n padding: var(--toplevel-warning-padding);\\n border-radius: 8px;\\n}\\n\\n.lh-warnings__msg {\\n color: var(--toplevel-warning-message-text-color);\\n margin: 0;\\n}\\n\\n.lh-warnings ul {\\n margin: 0;\\n}\\n.lh-warnings li {\\n margin: var(--item-margin) 0;\\n}\\n.lh-warnings li:last-of-type {\\n margin-bottom: 0;\\n}\\n\\n.lh-scores-header {\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: center;\\n}\\n.lh-scores-header__solo {\\n padding: 0;\\n border: 0;\\n}\\n\\n/* Gauge */\\n\\n.lh-gauge__wrapper--pass {\\n color: var(--color-pass-secondary);\\n fill: var(--color-pass);\\n stroke: var(--color-pass);\\n}\\n\\n.lh-gauge__wrapper--average {\\n color: var(--color-average-secondary);\\n fill: var(--color-average);\\n stroke: var(--color-average);\\n}\\n\\n.lh-gauge__wrapper--fail {\\n color: var(--color-fail-secondary);\\n fill: var(--color-fail);\\n stroke: var(--color-fail);\\n}\\n\\n.lh-gauge__wrapper--not-applicable {\\n color: var(--color-not-applicable);\\n fill: var(--color-not-applicable);\\n stroke: var(--color-not-applicable);\\n}\\n\\n.lh-fraction__wrapper .lh-fraction__content::before {\\n content: \\'\\';\\n height: var(--score-icon-size);\\n width: var(--score-icon-size);\\n margin: var(--score-icon-margin);\\n display: inline-block;\\n}\\n.lh-fraction__wrapper--pass .lh-fraction__content {\\n color: var(--color-pass-secondary);\\n}\\n.lh-fraction__wrapper--pass .lh-fraction__background {\\n background-color: var(--color-pass);\\n}\\n.lh-fraction__wrapper--pass .lh-fraction__content::before {\\n background-color: var(--color-pass);\\n border-radius: 50%;\\n}\\n.lh-fraction__wrapper--average .lh-fraction__content {\\n color: var(--color-average-secondary);\\n}\\n.lh-fraction__wrapper--average .lh-fraction__background,\\n.lh-fraction__wrapper--average .lh-fraction__content::before {\\n background-color: var(--color-average);\\n}\\n.lh-fraction__wrapper--fail .lh-fraction__content {\\n color: var(--color-fail);\\n}\\n.lh-fraction__wrapper--fail .lh-fraction__background {\\n background-color: var(--color-fail);\\n}\\n.lh-fraction__wrapper--fail .lh-fraction__content::before {\\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\\n border-bottom: var(--score-icon-size) solid var(--color-fail);\\n}\\n.lh-fraction__wrapper--null .lh-fraction__content {\\n color: var(--color-gray-700);\\n}\\n.lh-fraction__wrapper--null .lh-fraction__background {\\n background-color: var(--color-gray-700);\\n}\\n.lh-fraction__wrapper--null .lh-fraction__content::before {\\n border-radius: 50%;\\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-700);\\n}\\n\\n.lh-fraction__background {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n border-radius: calc(var(--gauge-circle-size) / 2);\\n opacity: 0.1;\\n z-index: -1;\\n}\\n\\n.lh-fraction__content-wrapper {\\n height: var(--gauge-circle-size);\\n display: flex;\\n align-items: center;\\n}\\n\\n.lh-fraction__content {\\n display: flex;\\n position: relative;\\n align-items: center;\\n justify-content: center;\\n font-size: calc(0.3 * var(--gauge-circle-size));\\n line-height: calc(0.4 * var(--gauge-circle-size));\\n width: max-content;\\n min-width: calc(1.5 * var(--gauge-circle-size));\\n padding: calc(0.1 * var(--gauge-circle-size)) calc(0.2 * var(--gauge-circle-size));\\n --score-icon-size: calc(0.21 * var(--gauge-circle-size));\\n --score-icon-margin: 0 calc(0.15 * var(--gauge-circle-size)) 0 0;\\n}\\n\\n.lh-gauge {\\n stroke-linecap: round;\\n width: var(--gauge-circle-size);\\n height: var(--gauge-circle-size);\\n}\\n\\n.lh-category .lh-gauge {\\n --gauge-circle-size: var(--gauge-circle-size-big);\\n}\\n\\n.lh-gauge-base {\\n opacity: 0.1;\\n}\\n\\n.lh-gauge-arc {\\n fill: none;\\n transform-origin: 50% 50%;\\n animation: load-gauge var(--transition-length) ease both;\\n animation-delay: 250ms;\\n}\\n\\n.lh-gauge__svg-wrapper {\\n position: relative;\\n height: var(--gauge-circle-size);\\n}\\n.lh-category .lh-gauge__svg-wrapper,\\n.lh-category .lh-fraction__wrapper {\\n --gauge-circle-size: var(--gauge-circle-size-big);\\n}\\n\\n/* The plugin badge overlay */\\n.lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {\\n width: var(--plugin-badge-size);\\n height: var(--plugin-badge-size);\\n background-color: var(--plugin-badge-background-color);\\n background-image: var(--plugin-icon-url);\\n background-repeat: no-repeat;\\n background-size: var(--plugin-icon-size);\\n background-position: 58% 50%;\\n content: \"\";\\n position: absolute;\\n right: -6px;\\n bottom: 0px;\\n display: block;\\n z-index: 100;\\n box-shadow: 0 0 4px rgba(0,0,0,.2);\\n border-radius: 25%;\\n}\\n.lh-category .lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {\\n width: var(--plugin-badge-size-big);\\n height: var(--plugin-badge-size-big);\\n}\\n\\n@keyframes load-gauge {\\n from { stroke-dasharray: 0 352; }\\n}\\n\\n.lh-gauge__percentage {\\n width: 100%;\\n height: var(--gauge-circle-size);\\n line-height: var(--gauge-circle-size);\\n position: absolute;\\n font-family: var(--report-font-family-monospace);\\n font-size: calc(var(--gauge-circle-size) * 0.34 + 1.3px);\\n text-align: center;\\n top: var(--score-container-padding);\\n}\\n\\n.lh-category .lh-gauge__percentage {\\n --gauge-circle-size: var(--gauge-circle-size-big);\\n --gauge-percentage-font-size: var(--gauge-percentage-font-size-big);\\n}\\n\\n.lh-gauge__wrapper,\\n.lh-fraction__wrapper {\\n position: relative;\\n display: flex;\\n align-items: center;\\n flex-direction: column;\\n text-decoration: none;\\n padding: var(--score-container-padding);\\n\\n --transition-length: 1s;\\n\\n /* Contain the layout style paint & layers during animation*/\\n contain: content;\\n will-change: opacity; /* Only using for layer promotion */\\n}\\n\\n.lh-gauge__label,\\n.lh-fraction__label {\\n font-size: var(--gauge-label-font-size);\\n font-weight: 500;\\n line-height: var(--gauge-label-line-height);\\n margin-top: 10px;\\n text-align: center;\\n color: var(--report-text-color);\\n word-break: keep-all;\\n}\\n\\n/* TODO(#8185) use more BEM (.lh-gauge__label--big) instead of relying on descendant selector */\\n.lh-category .lh-gauge__label,\\n.lh-category .lh-fraction__label {\\n --gauge-label-font-size: var(--gauge-label-font-size-big);\\n --gauge-label-line-height: var(--gauge-label-line-height-big);\\n margin-top: 14px;\\n}\\n\\n.lh-scores-header .lh-gauge__wrapper,\\n.lh-scores-header .lh-fraction__wrapper,\\n.lh-sticky-header .lh-gauge__wrapper,\\n.lh-sticky-header .lh-fraction__wrapper {\\n width: var(--gauge-wrapper-width);\\n}\\n\\n.lh-scorescale {\\n display: inline-flex;\\n\\n gap: calc(var(--default-padding) * 4);\\n margin: 16px auto 0 auto;\\n font-size: var(--report-font-size-secondary);\\n color: var(--color-gray-700);\\n\\n}\\n\\n.lh-scorescale-range {\\n display: flex;\\n align-items: center;\\n font-family: var(--report-font-family-monospace);\\n white-space: nowrap;\\n}\\n\\n.lh-category-header__finalscreenshot .lh-scorescale {\\n border: 0;\\n display: flex;\\n justify-content: center;\\n}\\n\\n.lh-category-header__finalscreenshot .lh-scorescale-range {\\n font-family: unset;\\n font-size: 12px;\\n}\\n\\n.lh-scorescale-wrap {\\n display: contents;\\n}\\n\\n/* Hide category score gauages if it\\'s a single category report */\\n.lh-header--solo-category .lh-scores-wrapper {\\n display: none;\\n}\\n\\n\\n.lh-categories {\\n width: 100%;\\n}\\n\\n.lh-category {\\n padding: var(--category-padding);\\n max-width: var(--report-content-max-width);\\n margin: 0 auto;\\n\\n scroll-margin-top: calc(var(--sticky-header-buffer) - 1em);\\n}\\n\\n.lh-category-wrapper {\\n border-bottom: 1px solid var(--color-gray-200);\\n}\\n.lh-category-wrapper:last-of-type {\\n border-bottom: 0;\\n}\\n\\n.lh-category-header {\\n margin-bottom: var(--section-padding-vertical);\\n}\\n\\n.lh-category-header .lh-score__gauge {\\n max-width: 400px;\\n width: auto;\\n margin: 0px auto;\\n}\\n\\n.lh-category-header__finalscreenshot {\\n display: grid;\\n grid-template: none / 1fr 1px 1fr;\\n justify-items: center;\\n align-items: center;\\n gap: var(--report-line-height);\\n min-height: 288px;\\n margin-bottom: var(--default-padding);\\n}\\n\\n.lh-final-ss-image {\\n /* constrain the size of the image to not be too large */\\n max-height: calc(var(--gauge-circle-size-big) * 2.8);\\n max-width: calc(var(--gauge-circle-size-big) * 3.5);\\n border: 1px solid var(--color-gray-200);\\n padding: 4px;\\n border-radius: 3px;\\n display: block;\\n}\\n\\n.lh-category-headercol--separator {\\n background: var(--color-gray-200);\\n width: 1px;\\n height: var(--gauge-circle-size-big);\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 780px) {\\n .lh-category-header__finalscreenshot {\\n grid-template: 1fr 1fr / none\\n }\\n .lh-category-headercol--separator {\\n display: none;\\n }\\n}\\n\\n@container lh-container (max-width: 780px) {\\n .lh-category-header__finalscreenshot {\\n grid-template: 1fr 1fr / none\\n }\\n .lh-category-headercol--separator {\\n display: none;\\n }\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 964px) {\\n .lh-report {\\n margin-left: 0;\\n width: 100%;\\n }\\n}\\n\\n/* 964 fits the min-width of the filmstrip */\\n@container lh-container (max-width: 964px) {\\n .lh-report {\\n margin-left: 0;\\n width: 100%;\\n }\\n}\\n\\n@media print {\\n body {\\n -webkit-print-color-adjust: exact; /* print background colors */\\n }\\n .lh-container {\\n display: block;\\n }\\n .lh-report {\\n margin-left: 0;\\n padding-top: 0;\\n }\\n .lh-categories {\\n margin-top: 0;\\n }\\n .lh-buttons, .lh-highlighter {\\n /* hide stickyheader marker when printing. crbug.com/41486992 */\\n display: none;\\n }\\n}\\n\\n.lh-table {\\n position: relative;\\n border-collapse: separate;\\n border-spacing: 0;\\n /* Can\\'t assign padding to table, so shorten the width instead. */\\n width: calc(100% - var(--audit-description-padding-left) - var(--stackpack-padding-horizontal));\\n border: 1px solid var(--report-border-color-secondary);\\n}\\n\\n.lh-table thead th {\\n position: sticky;\\n top: var(--sticky-header-buffer);\\n z-index: 1;\\n background-color: var(--report-background-color);\\n border-bottom: 1px solid var(--report-border-color-secondary);\\n font-weight: normal;\\n color: var(--color-gray-600);\\n /* See text-wrapping comment on .lh-container. */\\n word-break: normal;\\n}\\n\\n.lh-row--group {\\n background-color: var(--table-group-header-background-color);\\n}\\n\\n.lh-row--group td {\\n font-weight: bold;\\n font-size: 1.05em;\\n color: var(--table-group-header-text-color);\\n}\\n\\n.lh-row--group td:first-child {\\n display: block;\\n min-width: max-content;\\n font-weight: normal;\\n}\\n\\n.lh-row--group .lh-text {\\n color: inherit;\\n text-decoration: none;\\n display: inline-block;\\n}\\n\\n.lh-row--group a.lh-link:hover {\\n text-decoration: underline;\\n}\\n\\n.lh-row--group .lh-audit__adorn {\\n text-transform: capitalize;\\n font-weight: normal;\\n padding: 2px 3px 1px 3px;\\n}\\n\\n.lh-row--group .lh-audit__adorn1p {\\n color: var(--link-color);\\n border-color: var(--link-color);\\n}\\n\\n.lh-row--group .lh-report-icon--external::before {\\n content: \"\";\\n background-repeat: no-repeat;\\n width: 14px;\\n height: 16px;\\n opacity: 0.7;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n\\n.lh-row--group .lh-report-icon--external {\\n visibility: hidden;\\n}\\n\\n.lh-row--group:hover .lh-report-icon--external {\\n visibility: visible;\\n}\\n\\n.lh-dark .lh-report-icon--external::before {\\n filter: invert(1);\\n}\\n\\n/** Manages indentation of two-level and three-level nested adjacent rows */\\n\\n.lh-row--group ~ [data-entity]:not(.lh-row--group) td:first-child {\\n padding-left: 20px;\\n}\\n\\n.lh-row--group ~ [data-entity]:not(.lh-row--group) ~ .lh-sub-item-row td:first-child {\\n margin-left: 20px;\\n padding-left: 10px;\\n border-left: 1px solid #A8C7FA;\\n display: block;\\n}\\n\\n.lh-row--even {\\n background-color: var(--table-group-header-background-color);\\n}\\n.lh-row--hidden {\\n display: none;\\n}\\n\\n.lh-table th,\\n.lh-table td {\\n padding: var(--default-padding);\\n}\\n\\n.lh-table tr {\\n vertical-align: middle;\\n}\\n\\n.lh-table tr:hover {\\n background-color: var(--table-higlight-background-color);\\n}\\n\\n/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */\\n.lh-table-column--text,\\n.lh-table-column--source-location,\\n.lh-table-column--url,\\n/* .lh-table-column--thumbnail, */\\n/* .lh-table-column--empty,*/\\n.lh-table-column--code,\\n.lh-table-column--node {\\n text-align: left;\\n}\\n\\n.lh-table-column--code {\\n min-width: 100px;\\n}\\n\\n.lh-table-column--bytes,\\n.lh-table-column--timespanMs,\\n.lh-table-column--ms,\\n.lh-table-column--numeric {\\n text-align: right;\\n word-break: normal;\\n}\\n\\n\\n\\n.lh-table .lh-table-column--thumbnail {\\n width: var(--image-preview-size);\\n}\\n\\n.lh-table-column--url {\\n min-width: 250px;\\n}\\n\\n.lh-table-column--text {\\n min-width: 80px;\\n}\\n\\n/* Keep columns narrow if they follow the URL column */\\n/* 12% was determined to be a decent narrow width, but wide enough for column headings */\\n.lh-table-column--url + th.lh-table-column--bytes,\\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes,\\n.lh-table-column--url + .lh-table-column--ms,\\n.lh-table-column--url + .lh-table-column--ms + th.lh-table-column--bytes,\\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--timespanMs {\\n width: 12%;\\n}\\n\\n/** Tweak styling for tables in insight audits. */\\n.lh-audit[id$=\"-insight\"] .lh-table {\\n border: none;\\n}\\n\\n.lh-audit[id$=\"-insight\"] .lh-table thead th {\\n font-weight: bold;\\n color: unset;\\n}\\n\\n.lh-audit[id$=\"-insight\"] .lh-table th,\\n.lh-audit[id$=\"-insight\"] .lh-table td {\\n padding: calc(var(--default-padding) / 2);\\n}\\n\\n.lh-audit[id$=\"-insight\"] .lh-table .lh-row--even,\\n.lh-audit[id$=\"-insight\"] .lh-table tr:not(.lh-row--group):hover {\\n background-color: unset;\\n}\\n\\n.lh-text__url-host {\\n display: inline;\\n}\\n\\n.lh-text__url-host {\\n margin-left: calc(var(--report-font-size) / 2);\\n opacity: 0.6;\\n font-size: 90%\\n}\\n\\n.lh-thumbnail {\\n object-fit: cover;\\n width: var(--image-preview-size);\\n height: var(--image-preview-size);\\n display: block;\\n}\\n\\n.lh-unknown pre {\\n overflow: scroll;\\n border: solid 1px var(--color-gray-200);\\n}\\n\\n.lh-text__url > a {\\n color: inherit;\\n text-decoration: none;\\n}\\n\\n.lh-text__url > a:hover {\\n text-decoration: underline dotted #999;\\n}\\n\\n.lh-sub-item-row {\\n margin-left: 20px;\\n margin-bottom: 0;\\n color: var(--color-gray-700);\\n}\\n\\n.lh-sub-item-row td {\\n padding-top: 4px;\\n padding-bottom: 4px;\\n padding-left: 20px;\\n}\\n\\n.lh-sub-item-row .lh-element-screenshot {\\n zoom: 0.6;\\n}\\n\\n/* Chevron\\n https://codepen.io/paulirish/pen/LmzEmK\\n */\\n.lh-chevron {\\n --chevron-angle: 42deg;\\n /* Edge doesn\\'t support transform: rotate(calc(...)), so we define it here */\\n --chevron-angle-right: -42deg;\\n width: var(--chevron-size);\\n height: var(--chevron-size);\\n margin-top: calc((var(--report-line-height) - 12px) / 2);\\n}\\n\\n.lh-chevron__lines {\\n transition: transform 0.4s;\\n transform: translateY(var(--report-line-height));\\n}\\n.lh-chevron__line {\\n stroke: var(--chevron-line-stroke);\\n stroke-width: var(--chevron-size);\\n stroke-linecap: square;\\n transform-origin: 50%;\\n transform: rotate(var(--chevron-angle));\\n transition: transform 300ms, stroke 300ms;\\n}\\n\\n.lh-expandable-details .lh-chevron__line-right,\\n.lh-expandable-details[open] .lh-chevron__line-left {\\n transform: rotate(var(--chevron-angle-right));\\n}\\n\\n.lh-expandable-details[open] .lh-chevron__line-right {\\n transform: rotate(var(--chevron-angle));\\n}\\n\\n\\n.lh-expandable-details[open] .lh-chevron__lines {\\n transform: translateY(calc(var(--chevron-size) * -1));\\n}\\n\\n.lh-expandable-details[open] {\\n animation: 300ms openDetails forwards;\\n padding-bottom: var(--default-padding);\\n}\\n\\n@keyframes openDetails {\\n from {\\n outline: 1px solid var(--report-background-color);\\n }\\n to {\\n outline: 1px solid;\\n box-shadow: 0 2px 4px rgba(0, 0, 0, .24);\\n }\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 780px) {\\n /* no black outline if we\\'re not confident the entire table can be displayed within bounds */\\n .lh-expandable-details[open] {\\n animation: none;\\n }\\n}\\n\\n@container lh-container (max-width: 780px) {\\n /* no black outline if we\\'re not confident the entire table can be displayed within bounds */\\n .lh-expandable-details[open] {\\n animation: none;\\n }\\n}\\n\\n.lh-expandable-details[open] summary, details.lh-clump > summary {\\n border-bottom: 1px solid var(--report-border-color-secondary);\\n}\\ndetails.lh-clump[open] > summary {\\n border-bottom-width: 0;\\n}\\n\\n\\n\\ndetails .lh-clump-toggletext--hide,\\ndetails[open] .lh-clump-toggletext--show { display: none; }\\ndetails[open] .lh-clump-toggletext--hide { display: block;}\\n\\n\\n/* Tooltip */\\n.lh-tooltip-boundary {\\n position: relative;\\n}\\n\\n.lh-tooltip {\\n position: absolute;\\n display: none; /* Don\\'t retain these layers when not needed */\\n opacity: 0;\\n background: #ffffff;\\n white-space: pre-line; /* Render newlines in the text */\\n min-width: 246px;\\n max-width: 275px;\\n padding: 15px;\\n border-radius: 5px;\\n text-align: initial;\\n line-height: 1.4;\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 535px) {\\n .lh-tooltip {\\n min-width: 45cqi;\\n padding: 3cqi;\\n }\\n}\\n\\n/* shrink tooltips to not be cutoff on left edge of narrow container\\n 45vw is chosen to be ~= width of the left column of metrics\\n*/\\n@container lh-container (max-width: 535px) {\\n .lh-tooltip {\\n min-width: 45cqi;\\n padding: 3cqi;\\n }\\n}\\n\\n.lh-tooltip-boundary:hover .lh-tooltip {\\n display: block;\\n animation: fadeInTooltip 250ms;\\n animation-fill-mode: forwards;\\n animation-delay: 850ms;\\n bottom: 100%;\\n z-index: 1;\\n will-change: opacity;\\n right: 0;\\n pointer-events: none;\\n}\\n\\n.lh-tooltip::before {\\n content: \"\";\\n border: solid transparent;\\n border-bottom-color: #fff;\\n border-width: 10px;\\n position: absolute;\\n bottom: -20px;\\n right: 6px;\\n transform: rotate(180deg);\\n pointer-events: none;\\n}\\n\\n@keyframes fadeInTooltip {\\n 0% { opacity: 0; }\\n 75% { opacity: 1; }\\n 100% { opacity: 1; filter: drop-shadow(1px 0px 1px #aaa) drop-shadow(0px 2px 4px hsla(206, 6%, 25%, 0.15)); pointer-events: auto; }\\n}\\n\\n/* Element screenshot */\\n.lh-element-screenshot {\\n float: left;\\n margin-right: 20px;\\n}\\n.lh-element-screenshot__content {\\n overflow: hidden;\\n min-width: 110px;\\n display: flex;\\n justify-content: center;\\n background-color: var(--report-background-color);\\n}\\n.lh-element-screenshot__image {\\n position: relative;\\n /* Set by ElementScreenshotRenderer.installFullPageScreenshotCssVariable */\\n background-image: var(--element-screenshot-url);\\n outline: 2px solid #777;\\n background-color: white;\\n background-repeat: no-repeat;\\n}\\n.lh-element-screenshot__mask {\\n position: absolute;\\n background: #555;\\n opacity: 0.8;\\n}\\n.lh-element-screenshot__element-marker {\\n position: absolute;\\n outline: 2px solid var(--color-lime-400);\\n}\\n.lh-element-screenshot__overlay {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 2000; /* .lh-topbar is 1000 */\\n background: var(--screenshot-overlay-background);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: zoom-out;\\n}\\n\\n.lh-element-screenshot__overlay .lh-element-screenshot {\\n margin-right: 0; /* clearing margin used in thumbnail case */\\n outline: 1px solid var(--color-gray-700);\\n}\\n\\n.lh-screenshot-overlay--enabled .lh-element-screenshot {\\n cursor: zoom-out;\\n}\\n.lh-screenshot-overlay--enabled .lh-node .lh-element-screenshot {\\n cursor: zoom-in;\\n}\\n\\n\\n.lh-meta__items {\\n --meta-icon-size: calc(var(--report-icon-size) * 0.667);\\n padding: var(--default-padding);\\n display: grid;\\n grid-template-columns: 1fr 1fr 1fr;\\n background-color: var(--env-item-background-color);\\n border-radius: 3px;\\n margin: 0 0 var(--default-padding) 0;\\n font-size: 12px;\\n column-gap: var(--default-padding);\\n color: var(--color-gray-700);\\n}\\n\\n.lh-meta__item {\\n display: block;\\n list-style-type: none;\\n position: relative;\\n padding: 0 0 0 calc(var(--meta-icon-size) + var(--default-padding) * 2);\\n cursor: unset; /* disable pointer cursor from report-icon */\\n}\\n\\n.lh-meta__item.lh-tooltip-boundary {\\n text-decoration: dotted underline var(--color-gray-500);\\n cursor: help;\\n}\\n\\n.lh-meta__item.lh-report-icon::before {\\n position: absolute;\\n left: var(--default-padding);\\n width: var(--meta-icon-size);\\n height: var(--meta-icon-size);\\n}\\n\\n.lh-meta__item.lh-report-icon:hover::before {\\n opacity: 0.7;\\n}\\n\\n.lh-meta__item .lh-tooltip {\\n color: var(--color-gray-800);\\n}\\n\\n.lh-meta__item .lh-tooltip::before {\\n right: auto; /* Set the tooltip arrow to the leftside */\\n left: 6px;\\n}\\n\\n.lh-meta__item:hover .lh-tooltip {\\n right: auto;\\n left: 6px;\\n}\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 640px) {\\n .lh-meta__items {\\n grid-template-columns: 1fr 1fr;\\n }\\n}\\n\\n/* Change the grid for narrow container */\\n@container lh-container (max-width: 640px) {\\n .lh-meta__items {\\n grid-template-columns: 1fr 1fr;\\n }\\n}\\n\\n/**\\n* This media query is a temporary fallback for browsers that do not support `@container query`.\\n* TODO: remove this media query when `@container query` is fully supported by browsers\\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\\n*/\\n@media screen and (max-width: 535px) {\\n .lh-meta__items {\\n display: block;\\n }\\n}\\n\\n@container lh-container (max-width: 535px) {\\n .lh-meta__items {\\n display: block;\\n }\\n}\\n\\n/* Explodey gauge */\\n\\n.lh-exp-gauge-component {\\n margin-bottom: 10px;\\n}\\n\\n.lh-exp-gauge-component circle {\\n stroke: currentcolor;\\n r: var(--radius);\\n}\\n\\n.lh-exp-gauge-component text {\\n font-size: calc(var(--radius) * 0.2);\\n}\\n\\n.lh-exp-gauge-component .lh-exp-gauge {\\n margin: 0 auto;\\n width: 225px;\\n stroke-width: var(--stroke-width);\\n stroke-linecap: round;\\n\\n /* for better rendering perf */\\n contain: strict;\\n height: 225px;\\n will-change: transform;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge--faded {\\n opacity: 0.1;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper {\\n font-family: var(--report-font-family-monospace);\\n text-align: center;\\n text-decoration: none;\\n transition: .3s;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass {\\n color: var(--color-pass);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average {\\n color: var(--color-average);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail {\\n color: var(--color-fail);\\n}\\n.lh-exp-gauge-component .state--expanded {\\n transition: color .3s;\\n}\\n.lh-exp-gauge-component .state--highlight {\\n color: var(--color-highlight);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__svg-wrapper {\\n display: flex;\\n flex-direction: column-reverse;\\n}\\n\\n.lh-exp-gauge-component .lh-exp-gauge__label {\\n fill: var(--report-text-color);\\n font-family: var(--report-font-family);\\n font-size: 12px;\\n}\\n\\n.lh-exp-gauge-component .lh-exp-gauge__cutout {\\n opacity: .999;\\n transition: opacity .3s;\\n}\\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__cutout {\\n opacity: 0;\\n}\\n\\n.lh-exp-gauge-component .lh-exp-gauge__inner {\\n color: inherit;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__base {\\n fill: currentcolor;\\n}\\n\\n\\n.lh-exp-gauge-component .lh-exp-gauge__arc {\\n fill: none;\\n transition: opacity .3s;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric {\\n color: var(--metric-color);\\n stroke-dashoffset: var(--metric-offset);\\n opacity: 0.3;\\n}\\n.lh-exp-gauge-component .lh-exp-gauge-hovertarget {\\n color: currentcolor;\\n opacity: 0.001;\\n stroke-linecap: butt;\\n stroke-width: 24;\\n /* hack. move the hover target out of the center. ideally i tweak the r instead but that rquires considerably more math. */\\n transform: scale(1.15);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\\n opacity: 0;\\n stroke-dasharray: 0 calc(var(--circle-meas) * var(--radius));\\n transition: 0s .005s;\\n}\\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\\n opacity: .999;\\n stroke-dasharray: var(--metric-array);\\n transition: 0.3s; /* calc(.005s + var(--i)*.05s); entrace animation */\\n}\\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__inner .lh-exp-gauge__arc {\\n opacity: 0;\\n}\\n\\n\\n.lh-exp-gauge-component .lh-exp-gauge__percentage {\\n text-anchor: middle;\\n dominant-baseline: middle;\\n opacity: .999;\\n font-size: calc(var(--radius) * 0.625);\\n transition: opacity .3s ease-in;\\n}\\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__percentage {\\n opacity: 0;\\n}\\n\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail .lh-exp-gauge__percentage {\\n fill: var(--color-fail);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average .lh-exp-gauge__percentage {\\n fill: var(--color-average);\\n}\\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass .lh-exp-gauge__percentage {\\n fill: var(--color-pass);\\n}\\n\\n.lh-exp-gauge-component .lh-cover {\\n fill: none;\\n opacity: .001;\\n pointer-events: none;\\n}\\n.lh-exp-gauge-component .state--expanded .lh-cover {\\n pointer-events: auto;\\n}\\n\\n.lh-exp-gauge-component .metric {\\n transform: scale(var(--scale-initial));\\n opacity: 0;\\n transition: transform .1s .2s ease-out, opacity .3s ease-out;\\n pointer-events: none;\\n}\\n.lh-exp-gauge-component .metric text {\\n pointer-events: none;\\n}\\n.lh-exp-gauge-component .metric__value {\\n fill: currentcolor;\\n opacity: 0;\\n transition: opacity 0.2s;\\n}\\n.lh-exp-gauge-component .state--expanded .metric {\\n transform: scale(1);\\n opacity: .999;\\n transition: transform .3s ease-out, opacity .3s ease-in, stroke-width .1s ease-out;\\n transition-delay: calc(var(--i)*.05s);\\n pointer-events: auto;\\n}\\n.lh-exp-gauge-component .state--highlight .metric {\\n opacity: .3;\\n}\\n.lh-exp-gauge-component .state--highlight .metric--highlight {\\n opacity: .999;\\n stroke-width: calc(1.5*var(--stroke-width));\\n}\\n.lh-exp-gauge-component .state--highlight .metric--highlight .metric__value {\\n opacity: 0.999;\\n}\\n\\n\\n/*\\n the initial first load peek\\n*/\\n.lh-exp-gauge-component .lh-exp-gauge__bg { /* needed for the use zindex stacking w/ transparency */\\n fill: var(--report-background-color);\\n stroke: var(--report-background-color);\\n}\\n.lh-exp-gauge-component .state--peek .metric {\\n transition-delay: 0ms;\\n animation: peek var(--peek-dur) cubic-bezier(0.46, 0.03, 0.52, 0.96);\\n animation-fill-mode: forwards;\\n}\\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__inner .lh-exp-gauge__arc {\\n opacity: 1;\\n}\\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc.lh-exp-gauge--faded {\\n opacity: 0.3; /* just a tad stronger cuz its fighting with a big solid arg */\\n}\\n/* do i need to set expanded and override this? */\\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\\n transition: opacity 0.3s;\\n}\\n.lh-exp-gauge-component .state--peek {\\n color: unset;\\n}\\n.lh-exp-gauge-component .state--peek .metric__label {\\n display: none;\\n}\\n\\n.lh-exp-gauge-component .metric__label {\\n fill: var(--report-text-color);\\n}\\n\\n@keyframes peek {\\n /* biggest it should go is 0.92. smallest is 0.8 */\\n 0% {\\n transform: scale(0.8);\\n opacity: 0.8;\\n }\\n\\n 50% {\\n transform: scale(0.92);\\n opacity: 1;\\n }\\n\\n 100% {\\n transform: scale(0.8);\\n opacity: 0.8;\\n }\\n}\\n\\n.lh-exp-gauge-component .wrapper {\\n width: 620px;\\n}\\n\\n/*# sourceURL=report-styles.css */\\n'),t.append(n),t}(e);case\"topbar\":return function(e){let t=e.createFragment(),n=e.createElement(\"style\");n.append(\"\\n .lh-topbar {\\n position: sticky;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 1000;\\n display: flex;\\n align-items: center;\\n height: var(--topbar-height);\\n padding: var(--topbar-padding);\\n font-size: var(--report-font-size-secondary);\\n background-color: var(--topbar-background-color);\\n border-bottom: 1px solid var(--color-gray-200);\\n }\\n\\n .lh-topbar__logo {\\n width: var(--topbar-logo-size);\\n height: var(--topbar-logo-size);\\n user-select: none;\\n flex: none;\\n }\\n\\n .lh-topbar__url {\\n margin: var(--topbar-padding);\\n text-decoration: none;\\n color: var(--report-text-color);\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n }\\n\\n .lh-tools {\\n display: flex;\\n align-items: center;\\n margin-left: auto;\\n will-change: transform;\\n min-width: var(--report-icon-size);\\n }\\n .lh-tools__button {\\n width: var(--report-icon-size);\\n min-width: 24px;\\n height: var(--report-icon-size);\\n cursor: pointer;\\n margin-right: 5px;\\n /* This is actually a button element, but we want to style it like a transparent div. */\\n display: flex;\\n background: none;\\n color: inherit;\\n border: none;\\n padding: 0;\\n font: inherit;\\n }\\n .lh-tools__button svg {\\n fill: var(--tools-icon-color);\\n }\\n .lh-dark .lh-tools__button svg {\\n filter: invert(1);\\n }\\n .lh-tools__button.lh-active + .lh-tools__dropdown {\\n opacity: 1;\\n clip: rect(-1px, 194px, 270px, -3px);\\n visibility: visible;\\n }\\n .lh-tools__dropdown {\\n position: absolute;\\n background-color: var(--report-background-color);\\n border: 1px solid var(--report-border-color);\\n border-radius: 3px;\\n padding: calc(var(--default-padding) / 2) 0;\\n cursor: pointer;\\n top: 36px;\\n right: 0;\\n box-shadow: 1px 1px 3px #ccc;\\n min-width: 125px;\\n clip: rect(0, 164px, 0, 0);\\n visibility: hidden;\\n opacity: 0;\\n transition: all 200ms cubic-bezier(0,0,0.2,1);\\n }\\n .lh-tools__dropdown a {\\n color: currentColor;\\n text-decoration: none;\\n white-space: nowrap;\\n padding: 0 6px;\\n line-height: 2;\\n }\\n .lh-tools__dropdown a:hover,\\n .lh-tools__dropdown a:focus {\\n background-color: var(--color-gray-200);\\n outline: none;\\n }\\n /* save-gist option hidden in report. */\\n .lh-tools__dropdown a[data-action='save-gist'] {\\n display: none;\\n }\\n\\n .lh-locale-selector {\\n width: 100%;\\n color: var(--report-text-color);\\n background-color: var(--locale-selector-background-color);\\n padding: 2px;\\n }\\n .lh-tools-locale {\\n display: flex;\\n align-items: center;\\n flex-direction: row-reverse;\\n }\\n .lh-tools-locale__selector-wrapper {\\n transition: opacity 0.15s;\\n opacity: 0;\\n max-width: 200px;\\n }\\n .lh-button.lh-tool-locale__button {\\n height: var(--topbar-height);\\n color: var(--tools-icon-color);\\n padding: calc(var(--default-padding) / 2);\\n }\\n .lh-tool-locale__button.lh-active + .lh-tools-locale__selector-wrapper {\\n opacity: 1;\\n clip: rect(-1px, 255px, 242px, -3px);\\n visibility: visible;\\n margin: 0 4px;\\n }\\n\\n /**\\n * This media query is a temporary fallback for browsers that do not support `@container query`.\\n * TODO: remove this media query when `@container query` is fully supported by browsers\\n * See https://github.com/GoogleChrome/lighthouse/pull/16332\\n */\\n @media screen and (max-width: 964px) {\\n .lh-tools__dropdown {\\n right: 0;\\n left: initial;\\n }\\n }\\n\\n @container lh-container (max-width: 964px) {\\n .lh-tools__dropdown {\\n right: 0;\\n left: initial;\\n }\\n }\\n\\n @media print {\\n .lh-topbar {\\n position: static;\\n margin-left: 0;\\n }\\n\\n .lh-tools__dropdown {\\n display: none;\\n }\\n }\\n \"),t.append(n);let r=e.createElement(\"div\",\"lh-topbar\"),i=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\",\"lh-topbar__logo\");i.setAttribute(\"role\",\"img\"),i.setAttribute(\"title\",\"Lighthouse logo\"),i.setAttribute(\"fill\",\"none\"),i.setAttribute(\"xmlns\",\"http://www.w3.org/2000/svg\"),i.setAttribute(\"viewBox\",\"0 0 48 48\");let a=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");a.setAttribute(\"d\",\"m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z\"),a.setAttribute(\"fill\",\"#F63\");let o=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");o.setAttribute(\"d\",\"M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z\"),o.setAttribute(\"fill\",\"#FFA385\");let l=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");l.setAttribute(\"fill\",\"#FF3\"),l.setAttribute(\"d\",\"M20.5 10h7v7h-7z\"),i.append(\" \",a,\" \",o,\" \",l,\" \");let s=e.createElement(\"a\",\"lh-topbar__url\");s.setAttribute(\"href\",\"\"),s.setAttribute(\"target\",\"_blank\"),s.setAttribute(\"rel\",\"noopener\");let c=e.createElement(\"div\",\"lh-tools\"),d=e.createElement(\"div\",\"lh-tools-locale lh-hidden\"),h=e.createElement(\"button\",\"lh-button lh-tool-locale__button\");h.setAttribute(\"id\",\"lh-button__swap-locales\"),h.setAttribute(\"title\",\"Show Language Picker\"),h.setAttribute(\"aria-label\",\"Toggle language picker\"),h.setAttribute(\"aria-haspopup\",\"menu\"),h.setAttribute(\"aria-expanded\",\"false\"),h.setAttribute(\"aria-controls\",\"lh-tools-locale__selector-wrapper\");let p=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");p.setAttribute(\"width\",\"20px\"),p.setAttribute(\"height\",\"20px\"),p.setAttribute(\"viewBox\",\"0 0 24 24\"),p.setAttribute(\"fill\",\"currentColor\");let g=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");g.setAttribute(\"d\",\"M0 0h24v24H0V0z\"),g.setAttribute(\"fill\",\"none\");let u=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");u.setAttribute(\"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\"),p.append(g,u),h.append(\" \",p,\" \");let m=e.createElement(\"div\",\"lh-tools-locale__selector-wrapper\");m.setAttribute(\"id\",\"lh-tools-locale__selector-wrapper\"),m.setAttribute(\"role\",\"menu\"),m.setAttribute(\"aria-labelledby\",\"lh-button__swap-locales\"),m.setAttribute(\"aria-hidden\",\"true\"),m.append(\" \",\" \"),d.append(\" \",h,\" \",m,\" \");let f=e.createElement(\"button\",\"lh-tools__button\");f.setAttribute(\"id\",\"lh-tools-button\"),f.setAttribute(\"title\",\"Tools menu\"),f.setAttribute(\"aria-label\",\"Toggle report tools menu\"),f.setAttribute(\"aria-haspopup\",\"menu\"),f.setAttribute(\"aria-expanded\",\"false\"),f.setAttribute(\"aria-controls\",\"lh-tools-dropdown\");let v=e.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");v.setAttribute(\"width\",\"100%\"),v.setAttribute(\"height\",\"100%\"),v.setAttribute(\"viewBox\",\"0 0 24 24\");let b=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");b.setAttribute(\"d\",\"M0 0h24v24H0z\"),b.setAttribute(\"fill\",\"none\");let _=e.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");_.setAttribute(\"d\",\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"),v.append(\" \",b,\" \",_,\" \"),f.append(\" \",v,\" \");let w=e.createElement(\"div\",\"lh-tools__dropdown\");w.setAttribute(\"id\",\"lh-tools-dropdown\"),w.setAttribute(\"role\",\"menu\"),w.setAttribute(\"aria-labelledby\",\"lh-tools-button\");let y=e.createElement(\"a\",\"lh-report-icon lh-report-icon--print\");y.setAttribute(\"role\",\"menuitem\"),y.setAttribute(\"tabindex\",\"-1\"),y.setAttribute(\"href\",\"#\"),y.setAttribute(\"data-i18n\",\"dropdownPrintSummary\"),y.setAttribute(\"data-action\",\"print-summary\");let x=e.createElement(\"a\",\"lh-report-icon lh-report-icon--print\");x.setAttribute(\"role\",\"menuitem\"),x.setAttribute(\"tabindex\",\"-1\"),x.setAttribute(\"href\",\"#\"),x.setAttribute(\"data-i18n\",\"dropdownPrintExpanded\"),x.setAttribute(\"data-action\",\"print-expanded\");let k=e.createElement(\"a\",\"lh-report-icon lh-report-icon--copy\");k.setAttribute(\"role\",\"menuitem\"),k.setAttribute(\"tabindex\",\"-1\"),k.setAttribute(\"href\",\"#\"),k.setAttribute(\"data-i18n\",\"dropdownCopyJSON\"),k.setAttribute(\"data-action\",\"copy\");let E=e.createElement(\"a\",\"lh-report-icon lh-report-icon--download lh-hidden\");E.setAttribute(\"role\",\"menuitem\"),E.setAttribute(\"tabindex\",\"-1\"),E.setAttribute(\"href\",\"#\"),E.setAttribute(\"data-i18n\",\"dropdownSaveHTML\"),E.setAttribute(\"data-action\",\"save-html\");let L=e.createElement(\"a\",\"lh-report-icon lh-report-icon--download\");L.setAttribute(\"role\",\"menuitem\"),L.setAttribute(\"tabindex\",\"-1\"),L.setAttribute(\"href\",\"#\"),L.setAttribute(\"data-i18n\",\"dropdownSaveJSON\"),L.setAttribute(\"data-action\",\"save-json\");let C=e.createElement(\"a\",\"lh-report-icon lh-report-icon--open\");C.setAttribute(\"role\",\"menuitem\"),C.setAttribute(\"tabindex\",\"-1\"),C.setAttribute(\"href\",\"#\"),C.setAttribute(\"data-i18n\",\"dropdownViewer\"),C.setAttribute(\"data-action\",\"open-viewer\");let A=e.createElement(\"a\",\"lh-report-icon lh-report-icon--open\");A.setAttribute(\"role\",\"menuitem\"),A.setAttribute(\"tabindex\",\"-1\"),A.setAttribute(\"href\",\"#\"),A.setAttribute(\"data-i18n\",\"dropdownSaveGist\"),A.setAttribute(\"data-action\",\"save-gist\");let S=e.createElement(\"a\",\"lh-report-icon lh-report-icon--open lh-hidden\");S.setAttribute(\"role\",\"menuitem\"),S.setAttribute(\"tabindex\",\"-1\"),S.setAttribute(\"href\",\"#\"),S.setAttribute(\"data-i18n\",\"dropdownViewUnthrottledTrace\"),S.setAttribute(\"data-action\",\"view-unthrottled-trace\");let z=e.createElement(\"a\",\"lh-report-icon lh-report-icon--dark\");return z.setAttribute(\"role\",\"menuitem\"),z.setAttribute(\"tabindex\",\"-1\"),z.setAttribute(\"href\",\"#\"),z.setAttribute(\"data-i18n\",\"dropdownDarkTheme\"),z.setAttribute(\"data-action\",\"toggle-dark\"),w.append(\" \",y,\" \",x,\" \",k,\" \",\" \",E,\" \",L,\" \",C,\" \",A,\" \",\" \",S,\" \",z,\" \"),c.append(\" \",d,\" \",f,\" \",w,\" \"),r.append(\" \",\" \",i,\" \",s,\" \",c,\" \"),t.append(r),t}(e);case\"warningsToplevel\":return function(e){let t=e.createFragment(),n=e.createElement(\"div\",\"lh-warnings lh-warnings--toplevel\"),r=e.createElement(\"p\",\"lh-warnings__msg\"),i=e.createElement(\"ul\");return n.append(\" \",r,\" \",i,\" \"),t.append(n),t}(e)}throw new Error(\"unexpected component: \"+t)}(this,e),this._componentCache.set(e,t),t.cloneNode(!0)}clearComponentCache(){this._componentCache.clear()}convertMarkdownLinkSnippets(e,t={}){let n=this.createElement(\"span\");for(let r of i.splitMarkdownLink(e)){let e=r.text.includes(\"`\")?this.convertMarkdownCodeSnippets(r.text):r.text;if(!r.isLink){n.append(e);continue}let i=new URL(r.linkHref);([\"https://developers.google.com\",\"https://web.dev\",\"https://developer.chrome.com\"].includes(i.origin)||t.alwaysAppendUtmSource)&&(i.searchParams.set(\"utm_source\",\"lighthouse\"),i.searchParams.set(\"utm_medium\",this._lighthouseChannel));let a=this.createElement(\"a\");a.rel=\"noopener\",a.target=\"_blank\",a.append(e),this.safelySetHref(a,i.href),n.append(a)}return n}safelySetHref(e,t){if((t=t||\"\").startsWith(\"#\"))return void(e.href=t);let n;try{n=new URL(t)}catch{}n&&[\"https:\",\"http:\"].includes(n.protocol)&&(e.href=n.href)}safelySetBlobHref(e,t){if(\"text/html\"!==t.type&&\"application/json\"!==t.type)throw new Error(\"Unsupported blob type\");let n=URL.createObjectURL(t);e.href=n}convertMarkdownCodeSnippets(e){let t=this.createElement(\"span\");for(let n of i.splitMarkdownCodeSpans(e))if(n.isCode){let e=this.createElement(\"code\");e.textContent=n.text,t.append(e)}else t.append(this._document.createTextNode(n.text));return t}setLighthouseChannel(e){this._lighthouseChannel=e}document(){return this._document}isDevTools(){return!!this._document.querySelector(\".lh-devtools\")}find(e,t=this.rootEl??this._document){let n=this.maybeFind(e,t);if(null===n)throw new Error(`query ${e} not found`);return n}maybeFind(e,t=this.rootEl??this._document){return t.querySelector(e)}findAll(e,t){return Array.from(t.querySelectorAll(e))}fireEventOn(e,t=this._document,n){let r=new CustomEvent(e,n?{detail:n}:void 0);t.dispatchEvent(r)}saveFile(e,t){let n=this.createElement(\"a\");n.download=t,this.safelySetBlobHref(n,e),this._document.body.append(n),n.click(),this._document.body.removeChild(n),setTimeout((()=>URL.revokeObjectURL(n.href)),500)}},o=0,l=class e{static i18n=null;static strings={};static reportJson=null;static apply(t){e.strings={...h,...t.providedStrings},e.i18n=t.i18n,e.reportJson=t.reportJson}static getUniqueSuffix(){return o++}static resetUniqueSuffix(){o=0}},s=\"data:image/jpeg;base64,\";var c=i.RATINGS,d=class e{static prepareReportResult(t){let n=JSON.parse(JSON.stringify(t));!function(e){e.configSettings.locale||(e.configSettings.locale=\"en\"),e.configSettings.formFactor||(e.configSettings.formFactor=e.configSettings.emulatedFormFactor),e.finalDisplayedUrl=i.getFinalDisplayedUrl(e),e.mainDocumentUrl=i.getMainDocumentUrl(e);for(let t of Object.values(e.audits))if((\"not_applicable\"===t.scoreDisplayMode||\"not-applicable\"===t.scoreDisplayMode)&&(t.scoreDisplayMode=\"notApplicable\"),\"informative\"===t.scoreDisplayMode&&(t.score=1),t.details){if((void 0===t.details.type||\"diagnostic\"===t.details.type)&&(t.details.type=\"debugdata\"),\"filmstrip\"===t.details.type)for(let e of t.details.items)e.data.startsWith(s)||(e.data=s+e.data);if(\"table\"===t.details.type)for(let e of t.details.headings){let{itemType:t,text:n}=e;void 0!==t&&(e.valueType=t,delete e.itemType),void 0!==n&&(e.label=n,delete e.text);let r=e.subItemsHeading?.itemType;e.subItemsHeading&&void 0!==r&&(e.subItemsHeading.valueType=r,delete e.subItemsHeading.itemType)}if(\"third-party-summary\"===t.id&&(\"opportunity\"===t.details.type||\"table\"===t.details.type)){let{headings:e,items:n}=t.details;if(\"link\"===e[0].valueType){e[0].valueType=\"text\";for(let e of n)\"object\"==typeof e.entity&&\"link\"===e.entity.type&&(e.entity=e.entity.text);t.details.isEntityGrouped=!0}}}let[t]=e.lighthouseVersion.split(\".\").map(Number),n=e.categories.performance;if(n)if(t<9){e.categoryGroups||(e.categoryGroups={}),e.categoryGroups.hidden={title:\"\"};for(let e of n.auditRefs)e.group?\"load-opportunities\"===e.group&&(e.group=\"diagnostics\"):e.group=\"hidden\"}else if(t<12)for(let e of n.auditRefs)e.group||(e.group=\"diagnostics\");if(t<12&&n){let t=new Map;for(let e of n.auditRefs){let n=e.relevantAudits;if(n&&e.acronym)for(let r of n){let n=t.get(r)||[];n.push(e.acronym),t.set(r,n)}}for(let[n,r]of t){if(!r.length)continue;let t=e.audits[n];if(t&&!t.metricSavings){t.metricSavings={};for(let e of r)t.metricSavings[e]=0}}}if(e.environment||(e.environment={benchmarkIndex:0,networkUserAgent:e.userAgent,hostUserAgent:e.userAgent}),e.configSettings.screenEmulation||(e.configSettings.screenEmulation={width:-1,height:-1,deviceScaleFactor:-1,mobile:/mobile/i.test(e.environment.hostUserAgent),disabled:!1}),e.i18n||(e.i18n={}),e.audits[\"full-page-screenshot\"]){let t=e.audits[\"full-page-screenshot\"].details;e.fullPageScreenshot=t?{screenshot:t.screenshot,nodes:t.nodes}:null,delete e.audits[\"full-page-screenshot\"]}}(n);for(let t of Object.values(n.audits))t.details&&(\"opportunity\"===t.details.type||\"table\"===t.details.type)&&!t.details.isEntityGrouped&&n.entities&&e.classifyEntities(n.entities,t.details);if(\"object\"!=typeof n.categories)throw new Error(\"No categories provided.\");let r=new Map;for(let e of Object.values(n.categories))e.auditRefs.forEach((e=>{e.acronym&&r.set(e.acronym,e)})),e.auditRefs.forEach((e=>{let t=n.audits[e.id];e.result=t;let i=Object.keys(e.result.metricSavings||{});if(i.length){e.relevantMetrics=[];for(let t of i){let n=r.get(t);n&&e.relevantMetrics.push(n)}}if(n.stackPacks){let t=[e.id,...e.result.replacesAudits??[]];n.stackPacks.forEach((n=>{let r=t.find((e=>n.descriptions[e]));r&&n.descriptions[r]&&(e.stackPacks=e.stackPacks||[],e.stackPacks.push({title:n.title,iconDataURL:n.iconDataURL,description:n.descriptions[r]}))}))}}));return n}static getUrlLocatorFn(e){let t=e.find((e=>\"url\"===e.valueType))?.key;if(t&&\"string\"==typeof t)return e=>{let n=e[t];if(\"string\"==typeof n)return n};let n=e.find((e=>\"source-location\"===e.valueType))?.key;return n?e=>{let t=e[n];if(\"object\"==typeof t&&\"source-location\"===t.type)return t.url}:void 0}static classifyEntities(t,n){let{items:r,headings:a}=n;if(!r.length||r.some((e=>e.entity)))return;let o=e.getUrlLocatorFn(a);if(o)for(let e of r){let n=o(e);if(!n)continue;let r=\"\";try{r=i.parseURL(n).origin}catch{}if(!r)continue;let a=t.find((e=>e.origins.includes(r)));a&&(e.entity=a.name)}}static getTableItemSortComparator(e){return(t,n)=>{for(let r of e){let e=t[r],i=n[r];if((typeof e!=typeof i||![\"number\",\"string\"].includes(typeof e))&&console.warn(`Warning: Attempting to sort unsupported value type: ${r}.`),\"number\"==typeof e&&\"number\"==typeof i&&e!==i)return i-e;if(\"string\"==typeof e&&\"string\"==typeof i&&e!==i)return e.localeCompare(i)}return 0}}static getEmulationDescriptions(e){let t,n,r,i=e.throttling,a=l.i18n,o=l.strings;switch(e.throttlingMethod){case\"provided\":r=n=t=o.throttlingProvided;break;case\"devtools\":{let{cpuSlowdownMultiplier:e,requestLatencyMs:l}=i;t=`${a.formatNumber(e)}x slowdown (DevTools)`,n=`${a.formatMilliseconds(l)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`,r=562.5===l&&i.downloadThroughputKbps===1638.4*.9&&675===i.uploadThroughputKbps?o.runtimeSlow4g:o.runtimeCustom;break}case\"simulate\":{let{cpuSlowdownMultiplier:e,rttMs:l,throughputKbps:s}=i;t=`${a.formatNumber(e)}x slowdown (Simulated)`,n=`${a.formatMilliseconds(l)} TCP RTT, ${a.formatKbps(s)} throughput (Simulated)`,r=150===l&&1638.4===s?o.runtimeSlow4g:o.runtimeCustom;break}default:r=t=n=o.runtimeUnknown}let s=\"devtools\"!==e.channel&&e.screenEmulation.disabled,c=\"devtools\"===e.channel?\"mobile\"===e.formFactor:e.screenEmulation.mobile,d=o.runtimeMobileEmulation;return s?d=o.runtimeNoEmulation:c||(d=o.runtimeDesktopEmulation),{deviceEmulation:d,screenEmulation:s?void 0:`${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`,cpuThrottling:t,networkThrottling:n,summary:r}}static showAsPassed(e){switch(e.scoreDisplayMode){case\"manual\":case\"notApplicable\":return!0;case\"error\":case\"informative\":return!1;default:return Number(e.score)>=c.PASS.minScore}}static calculateRating(e,t){if(\"manual\"===t||\"notApplicable\"===t)return c.PASS.label;if(\"error\"===t)return c.ERROR.label;if(null===e)return c.FAIL.label;let n=c.FAIL.label;return e>=c.PASS.minScore?n=c.PASS.label:e>=c.AVERAGE.minScore&&(n=c.AVERAGE.label),n}static calculateCategoryFraction(t){let n=0,r=0,i=0,a=0;for(let o of t.auditRefs){let t=e.showAsPassed(o.result);if(\"hidden\"!==o.group&&\"manual\"!==o.result.scoreDisplayMode&&\"notApplicable\"!==o.result.scoreDisplayMode){if(\"informative\"===o.result.scoreDisplayMode){t||++i;continue}++n,a+=o.weight,t&&r++}}return{numPassed:r,numPassableAudits:n,numInformative:i,totalWeight:a}}static isPluginCategory(e){return e.startsWith(\"lighthouse-plugin-\")}static shouldDisplayAsFraction(e,t){return\"timespan\"===e||\"snapshot\"===e||\"fraction\"===t?.categoryScoreDisplayMode}},h={varianceDisclaimer:\"Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.\",calculatorLink:\"See calculator.\",showRelevantAudits:\"Show audits relevant to:\",opportunityResourceColumnLabel:\"Opportunity\",opportunitySavingsColumnLabel:\"Estimated Savings\",errorMissingAuditInfo:\"Report error: no audit information\",errorLabel:\"Error!\",warningHeader:\"Warnings: \",warningAuditsGroupTitle:\"Passed audits but with warnings\",passedAuditsGroupTitle:\"Passed audits\",notApplicableAuditsGroupTitle:\"Not applicable\",manualAuditsGroupTitle:\"Additional items to manually check\",toplevelWarningsMessage:\"There were issues affecting this run of Lighthouse:\",crcInitialNavigation:\"Initial Navigation\",crcLongestDurationLabel:\"Maximum critical path latency:\",snippetExpandButtonLabel:\"Expand snippet\",snippetCollapseButtonLabel:\"Collapse snippet\",lsPerformanceCategoryDescription:\"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.\",labDataTitle:\"Lab Data\",thirdPartyResourcesLabel:\"Show 3rd-party resources\",viewTreemapLabel:\"View Treemap\",viewTraceLabel:\"View Trace\",dropdownPrintSummary:\"Print Summary\",dropdownPrintExpanded:\"Print Expanded\",dropdownCopyJSON:\"Copy JSON\",dropdownSaveHTML:\"Save as HTML\",dropdownSaveJSON:\"Save as JSON\",dropdownViewer:\"Open in Viewer\",dropdownSaveGist:\"Save as Gist\",dropdownDarkTheme:\"Toggle Dark Theme\",dropdownViewUnthrottledTrace:\"View Unthrottled Trace\",runtimeSettingsDevice:\"Device\",runtimeSettingsNetworkThrottling:\"Network throttling\",runtimeSettingsCPUThrottling:\"CPU throttling\",runtimeSettingsUANetwork:\"User agent (network)\",runtimeSettingsBenchmark:\"Unthrottled CPU/Memory Power\",runtimeSettingsAxeVersion:\"Axe version\",runtimeSettingsScreenEmulation:\"Screen emulation\",footerIssue:\"File an issue\",runtimeNoEmulation:\"No emulation\",runtimeMobileEmulation:\"Emulated Moto G Power\",runtimeDesktopEmulation:\"Emulated Desktop\",runtimeUnknown:\"Unknown\",runtimeSingleLoad:\"Single page session\",runtimeAnalysisWindow:\"Initial page load\",runtimeAnalysisWindowTimespan:\"User interactions timespan\",runtimeAnalysisWindowSnapshot:\"Point-in-time snapshot\",runtimeSingleLoadTooltip:\"This data is taken from a single page session, as opposed to field data summarizing many sessions.\",throttlingProvided:\"Provided by environment\",show:\"Show\",hide:\"Hide\",expandView:\"Expand view\",collapseView:\"Collapse view\",runtimeSlow4g:\"Slow 4G throttling\",runtimeCustom:\"Custom throttling\",firstPartyChipLabel:\"1st party\",openInANewTabTooltip:\"Open in a new tab\",unattributable:\"Unattributable\",unscoredLabel:\"Unscored\",unscoredTitle:\"This audit does not contribute to the overall category score.\"},p=class{constructor(e,t){this.dom=e,this.detailsRenderer=t}get _clumpTitles(){return{warning:l.strings.warningAuditsGroupTitle,manual:l.strings.manualAuditsGroupTitle,passed:l.strings.passedAuditsGroupTitle,notApplicable:l.strings.notApplicableAuditsGroupTitle}}renderAudit(e){let t=l.strings,n=this.dom.createComponent(\"audit\"),r=this.dom.find(\"div.lh-audit\",n);r.id=e.result.id;let i=e.result.scoreDisplayMode;e.result.displayValue&&(this.dom.find(\".lh-audit__display-text\",r).textContent=e.result.displayValue);let a=this.dom.find(\".lh-audit__title\",r);a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));let o=this.dom.find(\".lh-audit__description\",r);o.append(this.dom.convertMarkdownLinkSnippets(e.result.description));for(let t of e.relevantMetrics||[]){let e=this.dom.createChildOf(o,\"span\",\"lh-audit__adorn\");e.title=`Relevant to ${t.result.title}`,e.textContent=t.acronym||t.id}if(0===e.weight){let e=this.dom.createChildOf(o,\"span\",\"lh-audit__adorn\");e.title=l.strings.unscoredTitle,e.textContent=l.strings.unscoredLabel}e.stackPacks&&e.stackPacks.forEach((e=>{let t=this.dom.createElement(\"img\",\"lh-audit__stackpack__img\");t.src=e.iconDataURL,t.alt=e.title;let n=this.dom.convertMarkdownLinkSnippets(e.description,{alwaysAppendUtmSource:!0}),i=this.dom.createElement(\"div\",\"lh-audit__stackpack\");i.append(t,n),this.dom.find(\".lh-audit__stackpacks\",r).append(i)}));let s=this.dom.find(\"details\",r);if(e.result.details){let t=this.detailsRenderer.render(e.result.details);t&&(t.classList.add(\"lh-details\"),s.append(t))}if(this.dom.find(\".lh-chevron-container\",r).append(this._createChevron()),this._setRatingClass(r,e.result.score,i),\"error\"===e.result.scoreDisplayMode){r.classList.add(\"lh-audit--error\");let n=this.dom.find(\".lh-audit__display-text\",r);n.textContent=t.errorLabel,n.classList.add(\"lh-tooltip-boundary\"),this.dom.createChildOf(n,\"div\",\"lh-tooltip lh-tooltip--error\").textContent=e.result.errorMessage||t.errorMissingAuditInfo}else if(e.result.explanation){this.dom.createChildOf(a,\"div\",\"lh-audit-explanation\").textContent=e.result.explanation}let c=e.result.warnings;if(!c||0===c.length)return r;let d=this.dom.find(\"summary\",s),h=this.dom.createChildOf(d,\"div\",\"lh-warnings\");if(this.dom.createChildOf(h,\"span\").textContent=t.warningHeader,1===c.length)h.append(this.dom.createTextNode(c.join(\"\")));else{let e=this.dom.createChildOf(h,\"ul\");for(let t of c){this.dom.createChildOf(e,\"li\").textContent=t}}return r}injectFinalScreenshot(e,t,n){let r=t[\"final-screenshot\"];if(!r||\"error\"===r.scoreDisplayMode||!r.details||\"screenshot\"!==r.details.type)return null;let i=this.dom.createElement(\"img\",\"lh-final-ss-image\"),a=r.details.data;i.src=a,i.alt=r.title;let o=this.dom.find(\".lh-category .lh-category-header\",e),l=this.dom.createElement(\"div\",\"lh-category-headercol\"),s=this.dom.createElement(\"div\",\"lh-category-headercol lh-category-headercol--separator\"),c=this.dom.createElement(\"div\",\"lh-category-headercol\");l.append(...o.childNodes),l.append(n),c.append(i),o.append(l,s,c),o.classList.add(\"lh-category-header__finalscreenshot\")}_createChevron(){let e=this.dom.createComponent(\"chevron\");return this.dom.find(\"svg.lh-chevron\",e)}_setRatingClass(e,t,n){let r=d.calculateRating(t,n);return e.classList.add(`lh-audit--${n.toLowerCase()}`),\"informative\"!==n&&e.classList.add(`lh-audit--${r}`),e}renderCategoryHeader(e,t,n){let r=this.dom.createComponent(\"categoryHeader\"),i=this.dom.find(\".lh-score__gauge\",r),a=this.renderCategoryScore(e,t,n);if(i.append(a),e.description){let t=this.dom.convertMarkdownLinkSnippets(e.description);this.dom.find(\".lh-category-header__description\",r).append(t)}return r}renderAuditGroup(e){let t=this.dom.createElement(\"div\",\"lh-audit-group\"),n=this.dom.createElement(\"div\",\"lh-audit-group__header\");this.dom.createChildOf(n,\"span\",\"lh-audit-group__title\").textContent=e.title,t.append(n);let r=null;return e.description&&(r=this.dom.convertMarkdownLinkSnippets(e.description),r.classList.add(\"lh-audit-group__description\",\"lh-audit-group__footer\"),t.append(r)),[t,r]}_renderGroupedAudits(e,t){let n=new Map,r=\"NotAGroup\";n.set(r,[]);for(let t of e){let e=t.group||r,i=n.get(e)||[];i.push(t),n.set(e,i)}let i=[];for(let[e,a]of n){if(e===r){for(let e of a)i.push(this.renderAudit(e));continue}let n=t[e],[o,l]=this.renderAuditGroup(n);for(let e of a)o.insertBefore(this.renderAudit(e),l);o.classList.add(`lh-audit-group--${e}`),i.push(o)}return i}renderUnexpandableClump(e,t){let n=this.dom.createElement(\"div\");return this._renderGroupedAudits(e,t).forEach((e=>n.append(e))),n}renderClump(e,{auditRefsOrEls:t,description:n,openByDefault:r}){let i=this.dom.createComponent(\"clump\"),a=this.dom.find(\".lh-clump\",i);r&&a.setAttribute(\"open\",\"\");let o=this.dom.find(\".lh-audit-group__header\",a),s=this._clumpTitles[e];this.dom.find(\".lh-audit-group__title\",o).textContent=s,this.dom.find(\".lh-audit-group__itemcount\",a).textContent=`(${t.length})`;let c=t.map((e=>e instanceof HTMLElement?e:this.renderAudit(e)));a.append(...c);let d=this.dom.find(\".lh-audit-group\",i);if(n){let e=this.dom.convertMarkdownLinkSnippets(n);e.classList.add(\"lh-audit-group__description\",\"lh-audit-group__footer\"),d.append(e)}return this.dom.find(\".lh-clump-toggletext--show\",d).textContent=l.strings.show,this.dom.find(\".lh-clump-toggletext--hide\",d).textContent=l.strings.hide,a.classList.add(`lh-clump--${e.toLowerCase()}`),d}renderCategoryScore(e,t,n){let r;if(r=n&&d.shouldDisplayAsFraction(n.gatherMode,e)?this.renderCategoryFraction(e):this.renderScoreGauge(e,t),n?.omitLabel&&this.dom.find(\".lh-gauge__label,.lh-fraction__label\",r).remove(),n?.onPageAnchorRendered){let e=this.dom.find(\"a\",r);n.onPageAnchorRendered(e)}return r}renderScoreGauge(e,t){let n=this.dom.createComponent(\"gauge\"),r=this.dom.find(\"a.lh-gauge__wrapper\",n);d.isPluginCategory(e.id)&&r.classList.add(\"lh-gauge__wrapper--plugin\");let i=Number(e.score),a=this.dom.find(\".lh-gauge\",n),o=this.dom.find(\"circle.lh-gauge-arc\",a);o&&this._setGaugeArc(o,i);let s=Math.round(100*i),c=this.dom.find(\"div.lh-gauge__percentage\",n);return c.textContent=s.toString(),null===e.score&&(c.classList.add(\"lh-gauge--error\"),c.textContent=\"\",c.title=l.strings.errorLabel),0===e.auditRefs.length||this.hasApplicableAudits(e)?r.classList.add(`lh-gauge__wrapper--${d.calculateRating(e.score)}`):(r.classList.add(\"lh-gauge__wrapper--not-applicable\"),c.textContent=\"-\",c.title=l.strings.notApplicableAuditsGroupTitle),this.dom.find(\".lh-gauge__label\",n).textContent=e.title,n}renderCategoryFraction(e){let t=this.dom.createComponent(\"fraction\"),n=this.dom.find(\"a.lh-fraction__wrapper\",t),{numPassed:r,numPassableAudits:i,totalWeight:a}=d.calculateCategoryFraction(e),o=r/i,l=this.dom.find(\".lh-fraction__content\",t),s=this.dom.createElement(\"span\");s.textContent=`${r}/${i}`,l.append(s);let c=d.calculateRating(o);return 0===a&&(c=\"null\"),n.classList.add(`lh-fraction__wrapper--${c}`),this.dom.find(\".lh-fraction__label\",t).textContent=e.title,t}hasApplicableAudits(e){return e.auditRefs.some((e=>\"notApplicable\"!==e.result.scoreDisplayMode))}_setGaugeArc(e,t){let n=2*Math.PI*Number(e.getAttribute(\"r\")),r=Number(e.getAttribute(\"stroke-width\")),i=.25*r/n;e.style.transform=`rotate(${360*i-90}deg)`;let a=t*n-r/2;0===t&&(e.style.opacity=\"0\"),1===t&&(a=n),e.style.strokeDasharray=`${Math.max(a,0)} ${n}`}_auditHasWarning(e){return!!e.result.warnings?.length}_getClumpIdForAuditRef(e){let t=e.result.scoreDisplayMode;return\"manual\"===t||\"notApplicable\"===t?t:d.showAsPassed(e.result)?this._auditHasWarning(e)?\"warning\":\"passed\":\"failed\"}render(e,t={},n){let r=this.dom.createElement(\"div\",\"lh-category\");r.id=e.id,r.append(this.renderCategoryHeader(e,t,n));let i=new Map;i.set(\"failed\",[]),i.set(\"warning\",[]),i.set(\"manual\",[]),i.set(\"passed\",[]),i.set(\"notApplicable\",[]);for(let t of e.auditRefs){if(\"hidden\"===t.group)continue;let e=this._getClumpIdForAuditRef(t),n=i.get(e);n.push(t),i.set(e,n)}for(let e of i.values())e.sort(((e,t)=>t.weight-e.weight));let a=i.get(\"failed\")?.length;for(let[n,o]of i){if(0===o.length)continue;if(\"failed\"===n){let e=this.renderUnexpandableClump(o,t);e.classList.add(\"lh-clump--failed\"),r.append(e);continue}let i=\"manual\"===n?e.manualDescription:void 0,l=\"warning\"===n||\"manual\"===n&&0===a,s=this.renderClump(n,{auditRefsOrEls:o,description:i,openByDefault:l});r.append(s)}return r}},g=class{static createSegment(e,t,n,r){let i=e[t],a=Object.keys(e),o=a.indexOf(t)===a.length-1,l=!!i.children&&Object.keys(i.children).length>0,s=Array.isArray(n)?n.slice(0):[];return typeof r<\"u\"&&s.push(!r),{node:i,isLastChild:o,hasChildren:l,treeMarkers:s}}static createChainNode(e,t,n){let r,i,a,o,s,c=e.createComponent(\"crcChain\");\"request\"in t.node?(i=t.node.request.transferSize,a=t.node.request.url,r=1e3*(t.node.request.endTime-t.node.request.startTime),o=!1):(i=t.node.transferSize,a=t.node.url,r=t.node.navStartToEndTime,o=!0,s=t.node.isLongest);let d=e.find(\".lh-crc-node\",c);d.setAttribute(\"title\",a),s&&d.classList.add(\"lh-crc-node__longest\");let h=e.find(\".lh-crc-node__tree-marker\",c);t.treeMarkers.forEach((t=>{let n=t?\"lh-tree-marker lh-vert\":\"lh-tree-marker\";h.append(e.createElement(\"span\",n),e.createElement(\"span\",\"lh-tree-marker\"))}));let p=t.isLastChild?\"lh-tree-marker lh-up-right\":\"lh-tree-marker lh-vert-right\",g=t.hasChildren?\"lh-tree-marker lh-horiz-down\":\"lh-tree-marker lh-right\";h.append(e.createElement(\"span\",p),e.createElement(\"span\",\"lh-tree-marker lh-right\"),e.createElement(\"span\",g));let u=n.renderTextURL(a),m=e.find(\".lh-crc-node__tree-value\",c);if(m.append(u),!t.hasChildren||o){let t=e.createElement(\"span\",\"lh-crc-node__chain-duration\");t.textContent=\" - \"+l.i18n.formatMilliseconds(r)+\", \";let n=e.createElement(\"span\",\"lh-crc-node__chain-size\");n.textContent=l.i18n.formatBytesToKiB(i,.01),m.append(t,n)}return c}static buildTree(e,t,n,r){if(n.append(u.createChainNode(e,t,r)),t.node.children)for(let i of Object.keys(t.node.children)){let a=u.createSegment(t.node.children,i,t.treeMarkers,t.isLastChild);u.buildTree(e,a,n,r)}}static render(e,t,n){let r=e.createComponent(\"crc\"),i=e.find(\".lh-crc\",r);e.find(\".lh-crc-initial-nav\",r).textContent=l.strings.crcInitialNavigation,e.find(\".lh-crc__longest_duration_label\",r).textContent=l.strings.crcLongestDurationLabel,e.find(\".lh-crc__longest_duration\",r).textContent=l.i18n.formatMilliseconds(t.longestChain.duration);let a=t.chains;for(let t of Object.keys(a)){let r=u.createSegment(a,t);u.buildTree(e,r,i,n)}return e.find(\".lh-crc-container\",r)}},u=g;function m(e,t,n){return e<t?t:e>n?n:e}var f=class e{static getScreenshotPositions(e,t,n){let r=function(e){return{x:e.left+e.width/2,y:e.top+e.height/2}}(e),i=m(r.x-t.width/2,0,n.width-t.width),a=m(r.y-t.height/2,0,n.height-t.height);return{screenshot:{left:i,top:a},clip:{left:e.left-i,top:e.top-a}}}static renderClipPathInScreenshot(e,t,n,r,i){let a=e.find(\"clipPath\",t),o=`clip-${l.getUniqueSuffix()}`;a.id=o,t.style.clipPath=`url(#${o})`;let s=n.top/i.height,c=s+r.height/i.height,d=n.left/i.width,h=d+r.width/i.width,p=[`0,0 1,0 1,${s} 0,${s}`,`0,${c} 1,${c} 1,1 0,1`,`0,${s} ${d},${s} ${d},${c} 0,${c}`,`${h},${s} 1,${s} 1,${c} ${h},${c}`];for(let t of p){let n=e.createElementNS(\"http://www.w3.org/2000/svg\",\"polygon\");n.setAttribute(\"points\",t),a.append(n)}}static installFullPageScreenshot(e,t){e.style.setProperty(\"--element-screenshot-url\",`url('${t.data}')`)}static installOverlayFeature(t){let{dom:n,rootEl:r,overlayContainerEl:i,fullPageScreenshot:a}=t,o=\"lh-screenshot-overlay--enabled\";r.classList.contains(o)||(r.classList.add(o),r.addEventListener(\"click\",(t=>{let r=t.target;if(!r)return;let o=r.closest(\".lh-node > .lh-element-screenshot\");if(!o)return;let l=n.createElement(\"div\",\"lh-element-screenshot__overlay\");i.append(l);let s={width:.95*l.clientWidth,height:.8*l.clientHeight},c={width:Number(o.dataset.rectWidth),height:Number(o.dataset.rectHeight),left:Number(o.dataset.rectLeft),right:Number(o.dataset.rectLeft)+Number(o.dataset.rectWidth),top:Number(o.dataset.rectTop),bottom:Number(o.dataset.rectTop)+Number(o.dataset.rectHeight)},d=e.render(n,a.screenshot,c,s);d?(l.append(d),l.addEventListener(\"click\",(()=>l.remove()))):l.remove()})))}static _computeZoomFactor(e,t){let n={x:t.width/e.width,y:t.height/e.height},r=.75*Math.min(n.x,n.y);return Math.min(1,r)}static render(t,n,r,i){if(!function(e,t){return t.left<=e.width&&0<=t.right&&t.top<=e.height&&0<=t.bottom}(n,r))return null;let a=t.createComponent(\"elementScreenshot\"),o=t.find(\"div.lh-element-screenshot\",a);o.dataset.rectWidth=r.width.toString(),o.dataset.rectHeight=r.height.toString(),o.dataset.rectLeft=r.left.toString(),o.dataset.rectTop=r.top.toString();let l=this._computeZoomFactor(r,i),s={width:i.width/l,height:i.height/l};s.width=Math.min(n.width,s.width),s.height=Math.min(n.height,s.height);let c=s.width*l,d=s.height*l,h=e.getScreenshotPositions(r,s,{width:n.width,height:n.height}),p=t.find(\"div.lh-element-screenshot__image\",o);p.style.width=c+\"px\",p.style.height=d+\"px\",p.style.backgroundPositionY=-h.screenshot.top*l+\"px\",p.style.backgroundPositionX=-h.screenshot.left*l+\"px\",p.style.backgroundSize=`${n.width*l}px ${n.height*l}px`;let g=t.find(\"div.lh-element-screenshot__element-marker\",o);g.style.width=r.width*l+\"px\",g.style.height=r.height*l+\"px\",g.style.left=h.clip.left*l+\"px\",g.style.top=h.clip.top*l+\"px\";let u=t.find(\"div.lh-element-screenshot__mask\",o);return u.style.width=c+\"px\",u.style.height=d+\"px\",e.renderClipPathInScreenshot(t,u,h.clip,r,s),o}},v=[\"http://\",\"https://\",\"data:\"],b=[\"bytes\",\"numeric\",\"ms\",\"timespanMs\"],_=class{constructor(e){\"en-XA\"===e&&(e=\"de\"),this._locale=e,this._cachedNumberFormatters=new Map}_formatNumberWithGranularity(e,t,n={}){if(void 0!==t){let r=-Math.log10(t);Number.isInteger(r)||(console.warn(`granularity of ${t} is invalid. Using 1 instead`),t=1),t<1&&((n={...n}).minimumFractionDigits=n.maximumFractionDigits=Math.ceil(r)),e=Math.round(e/t)*t,Object.is(e,-0)&&(e=0)}else Math.abs(e)<5e-4&&(e=0);let r,i=[n.minimumFractionDigits,n.maximumFractionDigits,n.style,n.unit,n.unitDisplay,this._locale].join(\"\");return r=this._cachedNumberFormatters.get(i),r||(r=new Intl.NumberFormat(this._locale,n),this._cachedNumberFormatters.set(i,r)),r.format(e).replace(\" \",\"\xA0\")}formatNumber(e,t){return this._formatNumberWithGranularity(e,t)}formatInteger(e){return this._formatNumberWithGranularity(e,1)}formatPercent(e){return new Intl.NumberFormat(this._locale,{style:\"percent\"}).format(e)}formatBytesToKiB(e,t=void 0){return this._formatNumberWithGranularity(e/1024,t)+\"\xA0KiB\"}formatBytesToMiB(e,t=void 0){return this._formatNumberWithGranularity(e/1048576,t)+\"\xA0MiB\"}formatBytes(e,t=1){return this._formatNumberWithGranularity(e,t,{style:\"unit\",unit:\"byte\",unitDisplay:\"long\"})}formatBytesWithBestUnit(e,t=.1){return e>=1048576?this.formatBytesToMiB(e,t):e>=1024?this.formatBytesToKiB(e,t):this._formatNumberWithGranularity(e,t,{style:\"unit\",unit:\"byte\",unitDisplay:\"narrow\"})}formatKbps(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:\"unit\",unit:\"kilobit-per-second\",unitDisplay:\"short\"})}formatMilliseconds(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:\"unit\",unit:\"millisecond\",unitDisplay:\"short\"})}formatSeconds(e,t=void 0){return this._formatNumberWithGranularity(e/1e3,t,{style:\"unit\",unit:\"second\",unitDisplay:\"narrow\"})}formatDateTime(e){let t,n={month:\"short\",day:\"numeric\",year:\"numeric\",hour:\"numeric\",minute:\"numeric\",timeZoneName:\"short\"};try{t=new Intl.DateTimeFormat(this._locale,n)}catch{n.timeZone=\"UTC\",t=new Intl.DateTimeFormat(this._locale,n)}return t.format(new Date(e))}formatDuration(e){let t=e/1e3;if(0===Math.round(t))return\"None\";let n=[],r={day:86400,hour:3600,minute:60,second:1};return Object.keys(r).forEach((e=>{let i=r[e],a=Math.floor(t/i);if(a>0){t-=a*i;let r=this._formatNumberWithGranularity(a,1,{style:\"unit\",unit:e,unitDisplay:\"narrow\"});n.push(r)}})),n.join(\" \")}};function w(e,t,n){let r=e.find(\"div.lh-exp-gauge__wrapper\",t);r.className=\"\",r.classList.add(\"lh-exp-gauge__wrapper\",`lh-exp-gauge__wrapper--${d.calculateRating(n.score)}`),function(e,t,n){let r=Number(n.score),{radiusInner:i,radiusOuter:a,circumferenceInner:o,circumferenceOuter:l,getArcLength:s,getMetricArcLength:c,endDiffInner:h,endDiffOuter:p,strokeWidth:g,strokeGap:u}=function(e,t,n){n=n||e/32;let r=e/n,i=.5*n,a=r+i+n,o=2*Math.PI*r,l=Math.acos(1-.5*Math.pow(.5*n/r,2))*r,s=2*Math.PI*a,c=Math.acos(1-.5*Math.pow(.5*n/a,2))*a;return{radiusInner:r,radiusOuter:a,circumferenceInner:o,circumferenceOuter:s,getArcLength:()=>Math.max(0,Number(t*o)),getMetricArcLength:(e,t=!1)=>{let n=t?0:2*c;return Math.max(0,Number(e*s-i-n))},endDiffInner:l,endDiffOuter:c,strokeWidth:n,strokeGap:i}}(128,r),m=e.find(\"svg.lh-exp-gauge\",t);e.find(\".lh-exp-gauge__label\",m).textContent=n.title,m.setAttribute(\"viewBox\",[-64,-32,128,64].join(\" \")),m.style.setProperty(\"--stroke-width\",`${g}px`),m.style.setProperty(\"--circle-meas\",(2*Math.PI).toFixed(4));let f=e.find(\"g.lh-exp-gauge__outer\",t),v=e.find(\"g.lh-exp-gauge__inner\",t),b=e.find(\"circle.lh-cover\",f),_=e.find(\"circle.lh-exp-gauge__arc\",v),w=e.find(\"text.lh-exp-gauge__percentage\",v);f.style.setProperty(\"--scale-initial\",String(i/a)),f.style.setProperty(\"--radius\",`${a}px`),b.style.setProperty(\"--radius\",.5*(i+a)+\"px\"),b.setAttribute(\"stroke-width\",String(u)),m.style.setProperty(\"--radius\",`${i}px`),_.setAttribute(\"stroke-dasharray\",`${s()} ${(o-s()).toFixed(4)}`),_.setAttribute(\"stroke-dashoffset\",String(.25*o-h)),w.textContent=Math.round(100*r).toString();let y=a+g,x=a-g,k=n.auditRefs.filter((e=>\"metrics\"===e.group&&e.weight)),E=k.reduce(((e,t)=>e+t.weight),0),L=.25*l-p-.5*u,C=-.5*Math.PI;f.querySelectorAll(\".metric\").forEach((e=>{k.map((e=>`metric--${e.id}`)).find((t=>e.classList.contains(t)))||e.remove()})),k.forEach(((t,n)=>{let r=t.acronym??t.id,i=!f.querySelector(`.metric--${r}`),a=e.maybeFind(`g.metric--${r}`,f)||e.createSVGElement(\"g\"),o=e.maybeFind(`.metric--${r} circle.lh-exp-gauge--faded`,f)||e.createSVGElement(\"circle\"),s=e.maybeFind(`.metric--${r} circle.lh-exp-gauge--miniarc`,f)||e.createSVGElement(\"circle\"),h=e.maybeFind(`.metric--${r} circle.lh-exp-gauge-hovertarget`,f)||e.createSVGElement(\"circle\"),g=e.maybeFind(`.metric--${r} text.metric__label`,f)||e.createSVGElement(\"text\"),u=e.maybeFind(`.metric--${r} text.metric__value`,f)||e.createSVGElement(\"text\");a.classList.add(\"metric\",`metric--${r}`),o.classList.add(\"lh-exp-gauge__arc\",\"lh-exp-gauge__arc--metric\",\"lh-exp-gauge--faded\"),s.classList.add(\"lh-exp-gauge__arc\",\"lh-exp-gauge__arc--metric\",\"lh-exp-gauge--miniarc\"),h.classList.add(\"lh-exp-gauge__arc\",\"lh-exp-gauge__arc--metric\",\"lh-exp-gauge-hovertarget\");let m=t.weight/E,v=c(m),b=t.result.score?t.result.score*m:0,_=c(b),w=m*l,k=c(m,!0),A=d.calculateRating(t.result.score,t.result.scoreDisplayMode);a.style.setProperty(\"--metric-rating\",A),a.style.setProperty(\"--metric-color\",`var(--color-${A})`),a.style.setProperty(\"--metric-offset\",`${L}`),a.style.setProperty(\"--i\",n.toString()),o.setAttribute(\"stroke-dasharray\",`${v} ${l-v}`),s.style.setProperty(\"--metric-array\",`${_} ${l-_}`),h.setAttribute(\"stroke-dasharray\",`${k} ${l-k-p}`),g.classList.add(\"metric__label\"),u.classList.add(\"metric__value\"),g.textContent=r,u.textContent=`+${Math.round(100*b)}`;let S=C+m*Math.PI,z=Math.cos(S),M=Math.sin(S);switch(!0){case z>0:u.setAttribute(\"text-anchor\",\"end\");break;case z<0:g.setAttribute(\"text-anchor\",\"end\");break;case 0===z:g.setAttribute(\"text-anchor\",\"middle\"),u.setAttribute(\"text-anchor\",\"middle\")}switch(!0){case M>0:g.setAttribute(\"dominant-baseline\",\"hanging\");break;case M<0:u.setAttribute(\"dominant-baseline\",\"hanging\");break;case 0===M:g.setAttribute(\"dominant-baseline\",\"middle\"),u.setAttribute(\"dominant-baseline\",\"middle\")}g.setAttribute(\"x\",(y*z).toFixed(2)),g.setAttribute(\"y\",(y*M).toFixed(2)),u.setAttribute(\"x\",(x*z).toFixed(2)),u.setAttribute(\"y\",(x*M).toFixed(2)),i&&(a.appendChild(o),a.appendChild(s),a.appendChild(h),a.appendChild(g),a.appendChild(u),f.appendChild(a)),L-=w,C+=2*m*Math.PI}));let A=f.querySelector(\".lh-exp-gauge-underhovertarget\")||e.createSVGElement(\"circle\");A.classList.add(\"lh-exp-gauge__arc\",\"lh-exp-gauge__arc--metric\",\"lh-exp-gauge-hovertarget\",\"lh-exp-gauge-underhovertarget\");let S=c(1,!0);if(A.setAttribute(\"stroke-dasharray\",`${S} ${l-S-p}`),A.isConnected||f.prepend(A),m.dataset.listenersSetup)return;async function z(t){if(await new Promise((e=>setTimeout(e,1e3))),t.classList.contains(\"state--expanded\"))return;let n=e.find(\".lh-exp-gauge__inner\",t),r=`uniq-${Math.random()}`;n.setAttribute(\"id\",r);let i=e.createSVGElement(\"use\");i.setAttribute(\"href\",`#${r}`),t.appendChild(i);let a=2.5;t.style.setProperty(\"--peek-dur\",`${a}s`),t.classList.add(\"state--peek\",\"state--expanded\");let o=()=>{t.classList.remove(\"state--peek\",\"state--expanded\"),i.remove()},l=setTimeout((()=>{t.removeEventListener(\"mouseenter\",s),o()}),1e3*a*1.5);function s(){clearTimeout(l),o()}t.addEventListener(\"mouseenter\",s,{once:!0})}m.dataset.listenersSetup=!0,z(m),m.addEventListener(\"pointerover\",(n=>{if(n.target===m&&m.classList.contains(\"state--expanded\"))return m.classList.remove(\"state--expanded\"),void(m.classList.contains(\"state--highlight\")&&(m.classList.remove(\"state--highlight\"),e.find(\".metric--highlight\",m).classList.remove(\"metric--highlight\")));if(!(n.target instanceof Element))return;let r=n.target.parentNode;if(r instanceof SVGElement){if(r&&r===v)return void(m.classList.contains(\"state--expanded\")?m.classList.contains(\"state--highlight\")&&(m.classList.remove(\"state--highlight\"),e.find(\".metric--highlight\",m).classList.remove(\"metric--highlight\")):m.classList.add(\"state--expanded\"));if(r&&r.classList&&r.classList.contains(\"metric\")){let n=r.style.getPropertyValue(\"--metric-rating\");if(t.style.setProperty(\"--color-highlight\",`var(--color-${n}-secondary)`),m.classList.contains(\"state--highlight\")){let t=e.find(\".metric--highlight\",m);r!==t&&(t.classList.remove(\"metric--highlight\"),r.classList.add(\"metric--highlight\"))}else m.classList.add(\"state--highlight\"),r.classList.add(\"metric--highlight\")}}})),m.addEventListener(\"mouseleave\",(()=>{m.classList.remove(\"state--highlight\"),m.querySelector(\".metric--highlight\")?.classList.remove(\"metric--highlight\")}))}(e,r,n)}var y=class extends p{_renderMetric(e){let t=this.dom.createComponent(\"metric\"),n=this.dom.find(\".lh-metric\",t);n.id=e.result.id;let r=d.calculateRating(e.result.score,e.result.scoreDisplayMode);n.classList.add(`lh-metric--${r}`),this.dom.find(\".lh-metric__title\",t).textContent=e.result.title;let i=this.dom.find(\".lh-metric__value\",t);i.textContent=e.result.displayValue||\"\";let a=this.dom.find(\".lh-metric__description\",t);if(a.append(this.dom.convertMarkdownLinkSnippets(e.result.description)),\"error\"===e.result.scoreDisplayMode){a.textContent=\"\",i.textContent=\"Error!\",this.dom.createChildOf(a,\"span\").textContent=e.result.errorMessage||\"Report error: no metric information\"}else\"notApplicable\"===e.result.scoreDisplayMode&&(i.textContent=\"--\");return n}_getScoringCalculatorHref(e){let t=e.filter((e=>\"metrics\"===e.group)),n=e.find((e=>\"interactive\"===e.id)),r=e.find((e=>\"first-cpu-idle\"===e.id)),i=e.find((e=>\"first-meaningful-paint\"===e.id));n&&t.push(n),r&&t.push(r),i&&\"number\"==typeof i.result.score&&t.push(i);let a=[...t.map((e=>{let t;return\"number\"==typeof e.result.numericValue?(t=\"cumulative-layout-shift\"===e.id?(e=>Math.round(100*e)/100)(e.result.numericValue):Math.round(e.result.numericValue),t=t.toString()):t=\"null\",[e.acronym||e.id,t]}))];l.reportJson&&(a.push([\"device\",l.reportJson.configSettings.formFactor]),a.push([\"version\",l.reportJson.lighthouseVersion]));let o=new URLSearchParams(a),s=new URL(\"https://googlechrome.github.io/lighthouse/scorecalc/\");return s.hash=o.toString(),s.href}overallImpact(e,t){if(!e.result.metricSavings)return{overallImpact:0,overallLinearImpact:0};let n=0,r=0;for(let[a,o]of Object.entries(e.result.metricSavings)){if(void 0===o)continue;let e=t.find((e=>e.acronym===a));if(!e||null===e.result.score)continue;let l=e.result.numericValue;if(!l)continue;r+=o/l*e.weight;let s=e.result.scoringOptions;s&&(n+=(i.computeLogNormalScore(s,l-o)-e.result.score)*e.weight)}return{overallImpact:n,overallLinearImpact:r}}render(e,t,n){let r=l.strings,i=this.dom.createElement(\"div\",\"lh-category\");i.id=e.id,i.append(this.renderCategoryHeader(e,t,n));let a=e.auditRefs.filter((e=>\"metrics\"===e.group));if(a.length){let[n,o]=this.renderAuditGroup(t.metrics),s=this.dom.createElement(\"input\",\"lh-metrics-toggle__input\"),c=`lh-metrics-toggle${l.getUniqueSuffix()}`;s.setAttribute(\"aria-label\",\"Toggle the display of metric descriptions\"),s.type=\"checkbox\",s.id=c,n.prepend(s);let d=this.dom.find(\".lh-audit-group__header\",n),h=this.dom.createChildOf(d,\"label\",\"lh-metrics-toggle__label\");h.htmlFor=c;let p=this.dom.createChildOf(h,\"span\",\"lh-metrics-toggle__labeltext--show\"),g=this.dom.createChildOf(h,\"span\",\"lh-metrics-toggle__labeltext--hide\");p.textContent=l.strings.expandView,g.textContent=l.strings.collapseView;let u=this.dom.createElement(\"div\",\"lh-metrics-container\");if(n.insertBefore(u,o),a.forEach((e=>{u.append(this._renderMetric(e))})),i.querySelector(\".lh-gauge__wrapper\")){let t=this.dom.find(\".lh-category-header__description\",i),n=this.dom.createChildOf(t,\"div\",\"lh-metrics__disclaimer\"),a=this.dom.convertMarkdownLinkSnippets(r.varianceDisclaimer);n.append(a);let o=this.dom.createChildOf(n,\"a\",\"lh-calclink\");o.target=\"_blank\",o.textContent=r.calculatorLink,this.dom.safelySetHref(o,this._getScoringCalculatorHref(e.auditRefs))}n.classList.add(\"lh-audit-group--metrics\"),i.append(n)}let o=this.dom.createChildOf(i,\"div\",\"lh-filmstrip-container\"),s=e.auditRefs.find((e=>\"screenshot-thumbnails\"===e.id))?.result;if(s?.details){o.id=s.id;let e=this.detailsRenderer.render(s.details);e&&o.append(e)}let c=this.renderFilterableSection(e,t,[\"insights\",\"diagnostics\"],a);if(c&&(c.classList.add(\"lh-perf-audits\"),i.append(c)),(!n||\"navigation\"===n?.gatherMode)&&null!==e.score){let t=function(e){let t=e.createComponent(\"explodeyGauge\");return e.find(\".lh-exp-gauge-component\",t)}(this.dom);w(this.dom,t,e),this.dom.find(\".lh-score__gauge\",i).replaceWith(t)}return i}renderFilterableSection(e,t,n,r){if(n.some((e=>!t[e])))return null;let i=this.dom.createElement(\"div\"),a=e=>e.group??\"\",o=e.auditRefs.filter((e=>n.includes(a(e)))).map((e=>{let{overallImpact:t,overallLinearImpact:n}=this.overallImpact(e,r),i=e.result.guidanceLevel||1;return{auditRef:e,auditEl:this.renderAudit(e),overallImpact:t,overallLinearImpact:n,guidanceLevel:i}})),l=o.filter((e=>!d.showAsPassed(e.auditRef.result))),s=o.filter((e=>d.showAsPassed(e.auditRef.result))),c={};for(let e of n){let n=this.renderAuditGroup(t[e]);n[0].classList.add(`lh-audit-group--${e}`),c[e]=n}function h(e){for(let t of o)if(\"All\"===e)t.auditEl.hidden=!1;else{let n=void 0===t.auditRef.result.metricSavings?.[e];t.auditEl.hidden=n}l.sort(((t,n)=>{let r=t.auditRef.result.score||0,i=n.auditRef.result.score||0;if(r!==i)return r-i;if(\"All\"!==e){let r=t.auditRef.result.metricSavings?.[e]??-1,i=n.auditRef.result.metricSavings?.[e]??-1;if(r!==i)return i-r}return t.overallImpact!==n.overallImpact?n.overallImpact*n.guidanceLevel-t.overallImpact*t.guidanceLevel:0===t.overallImpact&&0===n.overallImpact&&t.overallLinearImpact!==n.overallLinearImpact?n.overallLinearImpact*n.guidanceLevel-t.overallLinearImpact*t.guidanceLevel:n.guidanceLevel-t.guidanceLevel}));for(let e of l){if(!e.auditRef.group)continue;let t=c[a(e.auditRef)];if(!t)continue;let[n,r]=t;n.insertBefore(e.auditEl,r)}}let p=new Set;for(let e of l){let t=e.auditRef.result.metricSavings||{};for(let[e,n]of Object.entries(t))\"number\"==typeof n&&p.add(e)}let g=r.filter((e=>e.acronym&&p.has(e.acronym)));g.length&&this.renderMetricAuditFilter(g,i,h),h(\"All\");for(let e of n)if(l.some((t=>a(t.auditRef)===e))){let t=c[e];if(!t)continue;i.append(t[0])}if(!s.length)return i;let u={auditRefsOrEls:s.map((e=>e.auditEl)),groupDefinitions:t},m=this.renderClump(\"passed\",u);return i.append(m),i}renderMetricAuditFilter(e,t,n){let r=this.dom.createElement(\"div\",\"lh-metricfilter\");this.dom.createChildOf(r,\"span\",\"lh-metricfilter__text\").textContent=l.strings.showRelevantAudits;let i=[{acronym:\"All\",id:\"All\"},...e],a=l.getUniqueSuffix();for(let e of i){let i=`metric-${e.acronym}-${a}`,o=this.dom.createChildOf(r,\"input\",\"lh-metricfilter__radio\");o.type=\"radio\",o.name=`metricsfilter-${a}`,o.id=i;let l=this.dom.createChildOf(r,\"label\",\"lh-metricfilter__label\");l.htmlFor=i,l.title=\"result\"in e?e.result.title:\"\",l.textContent=e.acronym||e.id,\"All\"===e.acronym&&(o.checked=!0,l.classList.add(\"lh-metricfilter__label--active\")),t.append(r),o.addEventListener(\"input\",(r=>{for(let e of t.querySelectorAll(\"label.lh-metricfilter__label\"))e.classList.toggle(\"lh-metricfilter__label--active\",e.htmlFor===i);t.classList.toggle(\"lh-category--filtered\",\"All\"!==e.acronym),n(e.acronym||\"All\");let a=t.querySelectorAll(\"div.lh-audit-group, details.lh-audit-group\");for(let e of a){e.hidden=!1;let t=Array.from(e.querySelectorAll(\"div.lh-audit\")),n=!!t.length&&t.every((e=>e.hidden));e.hidden=n}}))}}},x=class{constructor(e){this._dom=e,this._opts={}}renderReport(e,t,n){if(!this._dom.rootEl&&t){console.warn(\"Please adopt the new report API in renderer/api.js.\");let e=t.closest(\".lh-root\");e?this._dom.rootEl=e:(t.classList.add(\"lh-root\",\"lh-vars\"),this._dom.rootEl=t)}else this._dom.rootEl&&t&&(this._dom.rootEl=t);n&&(this._opts=n),this._dom.setLighthouseChannel(e.configSettings.channel||\"unknown\");let r=d.prepareReportResult(e);return this._dom.rootEl.textContent=\"\",this._dom.rootEl.append(this._renderReport(r)),this._opts.occupyEntireViewport&&this._dom.rootEl.classList.add(\"lh-max-viewport\"),this._dom.rootEl}_renderReportTopbar(e){let t=this._dom.createComponent(\"topbar\"),n=this._dom.find(\"a.lh-topbar__url\",t);return n.textContent=e.finalDisplayedUrl,n.title=e.finalDisplayedUrl,this._dom.safelySetHref(n,e.finalDisplayedUrl),t}_renderReportHeader(){let e=this._dom.createComponent(\"heading\"),t=this._dom.createComponent(\"scoresWrapper\");return this._dom.find(\".lh-scores-wrapper-placeholder\",e).replaceWith(t),e}_renderReportFooter(e){let t=this._dom.createComponent(\"footer\");return this._renderMetaBlock(e,t),this._dom.find(\".lh-footer__version_issue\",t).textContent=l.strings.footerIssue,this._dom.find(\".lh-footer__version\",t).textContent=e.lighthouseVersion,t}_renderMetaBlock(e,t){let n=d.getEmulationDescriptions(e.configSettings||{}),r=e.userAgent.match(/(\\w*Chrome\\/[\\d.]+)/),i=Array.isArray(r)?r[1].replace(\"/\",\" \").replace(\"Chrome\",\"Chromium\"):\"Chromium\",a=e.configSettings.channel,o=e.environment.benchmarkIndex.toFixed(0),s=e.environment.credits?.[\"axe-core\"],c=[`${l.strings.runtimeSettingsBenchmark}: ${o}`,`${l.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];n.screenEmulation&&c.push(`${l.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`),s&&c.push(`${l.strings.runtimeSettingsAxeVersion}: ${s}`);let h=l.strings.runtimeAnalysisWindow;\"timespan\"===e.gatherMode?h=l.strings.runtimeAnalysisWindowTimespan:\"snapshot\"===e.gatherMode&&(h=l.strings.runtimeAnalysisWindowSnapshot);let p=[[\"date\",`Captured at ${l.i18n.formatDateTime(e.fetchTime)}`],[\"devices\",`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,c.join(\"\\n\")],[\"samples-one\",l.strings.runtimeSingleLoad,l.strings.runtimeSingleLoadTooltip],[\"stopwatch\",h],[\"networkspeed\",`${n.summary}`,`${l.strings.runtimeSettingsNetworkThrottling}: ${n.networkThrottling}`],[\"chrome\",`Using ${i}`+(a?` with ${a}`:\"\"),`${l.strings.runtimeSettingsUANetwork}: \"${e.environment.networkUserAgent}\"`]],g=this._dom.find(\".lh-meta__items\",t);for(let[e,t,n]of p){let r=this._dom.createChildOf(g,\"li\",\"lh-meta__item\");if(r.textContent=t,n){r.classList.add(\"lh-tooltip-boundary\"),this._dom.createChildOf(r,\"div\",\"lh-tooltip\").textContent=n}r.classList.add(\"lh-report-icon\",`lh-report-icon--${e}`)}}_renderReportWarnings(e){if(!e.runWarnings||0===e.runWarnings.length)return this._dom.createElement(\"div\");let t=this._dom.createComponent(\"warningsToplevel\");this._dom.find(\".lh-warnings__msg\",t).textContent=l.strings.toplevelWarningsMessage;let n=[];for(let t of e.runWarnings){let e=this._dom.createElement(\"li\");e.append(this._dom.convertMarkdownLinkSnippets(t)),n.push(e)}return this._dom.find(\"ul\",t).append(...n),t}_renderScoreGauges(e,t,n){let r=[],i=[];for(let a of Object.values(e.categories)){let o=(n[a.id]||t).renderCategoryScore(a,e.categoryGroups||{},{gatherMode:e.gatherMode}),l=this._dom.find(\"a.lh-gauge__wrapper, a.lh-fraction__wrapper\",o);l&&(this._dom.safelySetHref(l,`#${a.id}`),l.addEventListener(\"click\",(e=>{if(!l.matches('[href^=\"#\"]'))return;let t=l.getAttribute(\"href\"),n=this._dom.rootEl;if(!t||!n)return;let r=this._dom.find(t,n);e.preventDefault(),r.scrollIntoView()})),this._opts.onPageAnchorRendered?.(l)),d.isPluginCategory(a.id)?i.push(o):r.push(o)}return[...r,...i]}_renderReport(e){l.apply({providedStrings:e.i18n.rendererFormattedStrings,i18n:new _(e.configSettings.locale),reportJson:e});let t=new class{constructor(e,t={}){this._dom=e,this._fullPageScreenshot=t.fullPageScreenshot,this._entities=t.entities}render(e){switch(e.type){case\"filmstrip\":return this._renderFilmstrip(e);case\"list\":return this._renderList(e);case\"checklist\":return this._renderChecklist(e);case\"table\":case\"opportunity\":return this._renderTable(e);case\"network-tree\":case\"criticalrequestchain\":return g.render(this._dom,e,this);case\"screenshot\":case\"debugdata\":case\"treemap-data\":return null;default:return this._renderUnknown(e.type,e)}}_renderBytes(e){let t=l.i18n.formatBytesToKiB(e.value,e.granularity||.1),n=this._renderText(t);return n.title=l.i18n.formatBytes(e.value),n}_renderMilliseconds(e){let t;return t=\"duration\"===e.displayUnit?l.i18n.formatDuration(e.value):l.i18n.formatMilliseconds(e.value,e.granularity||10),this._renderText(t)}renderTextURL(e){let t,n,r,a=e;try{let e=i.parseURL(a);t=\"/\"===e.file?e.origin:e.file,n=\"/\"===e.file||\"\"===e.hostname?\"\":`(${e.hostname})`,r=a}catch{t=a}let o=this._dom.createElement(\"div\",\"lh-text__url\");if(o.append(this._renderLink({text:t,url:a})),n){let e=this._renderText(n);e.classList.add(\"lh-text__url-host\"),o.append(e)}return r&&(o.title=a,o.dataset.url=a),o}_renderLink(e){let t=this._dom.createElement(\"a\");if(this._dom.safelySetHref(t,e.url),!t.href){let t=this._renderText(e.text);return t.classList.add(\"lh-link\"),t}return t.rel=\"noopener\",t.target=\"_blank\",t.textContent=e.text,t.classList.add(\"lh-link\"),t}_renderText(e){let t=this._dom.createElement(\"div\",\"lh-text\");return t.textContent=e,t}_renderBaselineStatus(e){let t=this._dom.createElement(\"div\",\"lh-baseline-status\"),n=e.status;return t.classList.add(`lh-baseline-status--${n}`),t.textContent=String(e.displayString),t}_renderNumeric(e){let t=l.i18n.formatNumber(e.value,e.granularity||.1),n=this._dom.createElement(\"div\",\"lh-numeric\");return n.textContent=t,n}_renderThumbnail(e){let t=this._dom.createElement(\"img\",\"lh-thumbnail\"),n=e;return t.src=n,t.title=n,t.alt=\"\",t}_renderUnknown(e,t){console.error(`Unknown details type: ${e}`,t);let n=this._dom.createElement(\"details\",\"lh-unknown\");return this._dom.createChildOf(n,\"summary\").textContent=`We don't know how to render audit details of type \\`${e}\\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`,this._dom.createChildOf(n,\"pre\").textContent=JSON.stringify(t,null,2),n}_renderTableValue(e,t){if(null==e)return null;if(\"object\"==typeof e)switch(e.type){case\"code\":return this._renderCode(e.value);case\"link\":return this._renderLink(e);case\"node\":return this.renderNode(e);case\"numeric\":return this._renderNumeric(e);case\"text\":return this._renderText(e.value);case\"source-location\":return this.renderSourceLocation(e);case\"url\":return this.renderTextURL(e.value);case\"baseline-status\":return this._renderBaselineStatus(e);default:return this._renderUnknown(e.type,e)}switch(t.valueType){case\"bytes\":{let n=Number(e);return this._renderBytes({value:n,granularity:t.granularity})}case\"code\":{let t=String(e);return this._renderCode(t)}case\"ms\":{let n={value:Number(e),granularity:t.granularity,displayUnit:t.displayUnit};return this._renderMilliseconds(n)}case\"numeric\":{let n=Number(e);return this._renderNumeric({value:n,granularity:t.granularity})}case\"text\":{let t=String(e);return this._renderText(t)}case\"thumbnail\":{let t=String(e);return this._renderThumbnail(t)}case\"timespanMs\":{let t=Number(e);return this._renderMilliseconds({value:t})}case\"url\":{let t=String(e);return v.some((e=>t.startsWith(e)))?this.renderTextURL(t):this._renderCode(t)}default:return this._renderUnknown(t.valueType,e)}}_getDerivedSubItemsHeading(e){return e.subItemsHeading?{key:e.subItemsHeading.key||\"\",valueType:e.subItemsHeading.valueType||e.valueType,granularity:e.subItemsHeading.granularity||e.granularity,displayUnit:e.subItemsHeading.displayUnit||e.displayUnit,label:\"\"}:null}_renderTableRow(e,t){let n=this._dom.createElement(\"tr\");for(let r of t){if(!r||!r.key){this._dom.createChildOf(n,\"td\",\"lh-table-column--empty\");continue}let t,i=e[r.key];if(null!=i&&(t=this._renderTableValue(i,r)),t){let e=`lh-table-column--${r.valueType}`;this._dom.createChildOf(n,\"td\",e).append(t)}else this._dom.createChildOf(n,\"td\",\"lh-table-column--empty\")}return n}_renderTableRowsFromItem(e,t){let n=this._dom.createFragment();if(n.append(this._renderTableRow(e,t)),!e.subItems)return n;let r=t.map(this._getDerivedSubItemsHeading);if(!r.some(Boolean))return n;for(let t of e.subItems.items){let e=this._renderTableRow(t,r);e.classList.add(\"lh-sub-item-row\"),n.append(e)}return n}_adornEntityGroupRow(e){let t=e.dataset.entity;if(!t)return;let n=this._entities?.find((e=>e.name===t));if(!n)return;let r=this._dom.find(\"td\",e);if(n.category){let e=this._dom.createElement(\"span\");e.classList.add(\"lh-audit__adorn\"),e.textContent=n.category,r.append(\" \",e)}if(n.isFirstParty){let e=this._dom.createElement(\"span\");e.classList.add(\"lh-audit__adorn\",\"lh-audit__adorn1p\"),e.textContent=l.strings.firstPartyChipLabel,r.append(\" \",e)}if(n.homepage){let e=this._dom.createElement(\"a\");e.href=n.homepage,e.target=\"_blank\",e.title=l.strings.openInANewTabTooltip,e.classList.add(\"lh-report-icon--external\"),r.append(\" \",e)}}_renderEntityGroupRow(e,t){let n={...t[0]};n.valueType=\"text\";let r=[n,...t.slice(1)],i=this._dom.createFragment();return i.append(this._renderTableRow(e,r)),this._dom.find(\"tr\",i).classList.add(\"lh-row--group\"),i}_getEntityGroupItems(e){let{items:t,headings:n,sortedBy:r}=e;if(!t.length||e.isEntityGrouped||!t.some((e=>e.entity)))return[];let i=new Set(e.skipSumming||[]),a=[];for(let e of n)!e.key||i.has(e.key)||b.includes(e.valueType)&&a.push(e.key);let o=n[0].key;if(!o)return[];let s=new Map;for(let e of t){let t=\"string\"==typeof e.entity?e.entity:void 0,n=s.get(t)||{[o]:t||l.strings.unattributable,entity:t};for(let t of a)n[t]=Number(n[t]||0)+Number(e[t]||0);s.set(t,n)}let c=[...s.values()];return r&&c.sort(d.getTableItemSortComparator(r)),c}_renderTable(e){if(!e.items.length)return this._dom.createElement(\"span\");let t=this._dom.createElement(\"table\",\"lh-table\"),n=this._dom.createChildOf(t,\"thead\"),r=this._dom.createChildOf(n,\"tr\");for(let t of e.headings){let e=`lh-table-column--${t.valueType||\"text\"}`,n=this._dom.createElement(\"div\",\"lh-text\");n.textContent=t.label,this._dom.createChildOf(r,\"th\",e).append(n)}let i=this._getEntityGroupItems(e),a=this._dom.createChildOf(t,\"tbody\");if(i.length)for(let t of i){let n=\"string\"==typeof t.entity?t.entity:void 0,r=this._renderEntityGroupRow(t,e.headings);for(let t of e.items.filter((e=>e.entity===n)))r.append(this._renderTableRowsFromItem(t,e.headings));let i=this._dom.findAll(\"tr\",r);n&&i.length&&(i.forEach((e=>e.dataset.entity=n)),this._adornEntityGroupRow(i[0])),a.append(r)}else{let t=!0;for(let n of e.items){let r=this._renderTableRowsFromItem(n,e.headings),i=this._dom.findAll(\"tr\",r),o=i[0];if(\"string\"==typeof n.entity&&(o.dataset.entity=n.entity),e.isEntityGrouped&&n.entity)o.classList.add(\"lh-row--group\"),this._adornEntityGroupRow(o);else for(let e of i)e.classList.add(t?\"lh-row--even\":\"lh-row--odd\");t=!t,a.append(r)}}return t}_renderListValue(e){return\"node\"===e.type?this.renderNode(e):\"text\"===e.type?this._renderText(e.value):this.render(e)}_renderList(e){let t=this._dom.createElement(\"div\",\"lh-list\");return e.items.forEach((e=>{if(\"list-section\"===e.type){let n=this._dom.createElement(\"div\",\"lh-list-section\");e.title&&this._dom.createChildOf(n,\"div\",\"lh-list-section__title\").append(this._dom.convertMarkdownLinkSnippets(e.title)),e.description&&this._dom.createChildOf(n,\"div\",\"lh-list-section__description\").append(this._dom.convertMarkdownLinkSnippets(e.description));let r=this._renderListValue(e.value);return r&&n.append(r),void t.append(n)}let n=this._renderListValue(e);n&&t.append(n)})),t}_renderChecklist(e){let t=this._dom.createElement(\"ul\",\"lh-checklist\");return Object.values(e.items).forEach((e=>{let n=this._dom.createChildOf(t,\"li\",\"lh-checklist-item\"),r=e.value?\"lh-report-plain-icon--checklist-pass\":\"lh-report-plain-icon--checklist-fail\";this._dom.createChildOf(n,\"span\",`lh-report-plain-icon ${r}`).textContent=e.label})),t}renderNode(e){let t=this._dom.createElement(\"span\",\"lh-node\");if(e.nodeLabel){let n=this._dom.createElement(\"div\");n.textContent=e.nodeLabel,t.append(n)}if(e.snippet){let n=this._dom.createElement(\"div\");n.classList.add(\"lh-node__snippet\"),n.textContent=e.snippet,t.append(n)}if(e.selector&&(t.title=e.selector),e.path&&t.setAttribute(\"data-path\",e.path),e.selector&&t.setAttribute(\"data-selector\",e.selector),e.snippet&&t.setAttribute(\"data-snippet\",e.snippet),!this._fullPageScreenshot)return t;let n=e.lhId&&this._fullPageScreenshot.nodes[e.lhId];if(!n||0===n.width||0===n.height)return t;let r=f.render(this._dom,this._fullPageScreenshot.screenshot,n,{width:147,height:100});return r&&t.prepend(r),t}renderSourceLocation(e){if(!e.url)return null;let t,n,r=`${e.url}:${e.line+1}:${e.column}`;if(e.original&&(t=`${e.original.file||\"<unmapped>\"}:${e.original.line+1}:${e.original.column}`),\"network\"===e.urlProvider&&t)n=this._renderLink({url:e.url,text:t}),n.title=`maps to generated location ${r}`;else if(\"network\"!==e.urlProvider||t)if(\"comment\"===e.urlProvider&&t)n=this._renderText(`${t} (from source map)`),n.title=`${r} (from sourceURL)`;else{if(\"comment\"!==e.urlProvider||t)return null;n=this._renderText(`${r} (from sourceURL)`)}else n=this.renderTextURL(e.url),this._dom.find(\".lh-link\",n).textContent+=`:${e.line+1}:${e.column}`;return n.classList.add(\"lh-source-location\"),n.setAttribute(\"data-source-url\",e.url),n.setAttribute(\"data-source-line\",String(e.line)),n.setAttribute(\"data-source-column\",String(e.column)),n}_renderFilmstrip(e){let t=this._dom.createElement(\"div\",\"lh-filmstrip\");for(let n of e.items){let e=this._dom.createChildOf(t,\"div\",\"lh-filmstrip__frame\"),r=this._dom.createChildOf(e,\"img\",\"lh-filmstrip__thumbnail\");r.src=n.data,r.alt=\"Screenshot\"}return t}_renderCode(e){let t=this._dom.createElement(\"pre\",\"lh-code\");return t.textContent=e,t}}(this._dom,{fullPageScreenshot:e.fullPageScreenshot??void 0,entities:e.entities}),n=new p(this._dom,t),r={performance:new y(this._dom,t)},a=this._dom.createElement(\"div\");a.append(this._renderReportHeader());let o,s=this._dom.createElement(\"div\",\"lh-container\"),c=this._dom.createElement(\"div\",\"lh-report\");c.append(this._renderReportWarnings(e)),1===Object.keys(e.categories).length?a.classList.add(\"lh-header--solo-category\"):o=this._dom.createElement(\"div\",\"lh-scores-header\");let h=this._dom.createElement(\"div\");if(h.classList.add(\"lh-scorescale-wrap\"),h.append(this._dom.createComponent(\"scorescale\")),o){let t=this._dom.find(\".lh-scores-container\",a);o.append(...this._renderScoreGauges(e,n,r)),t.append(o,h);let i=this._dom.createElement(\"div\",\"lh-sticky-header\");i.append(...this._renderScoreGauges(e,n,r)),s.append(i)}let u=this._dom.createElement(\"div\",\"lh-categories\");c.append(u);let m={gatherMode:e.gatherMode};for(let t of Object.values(e.categories)){let i=r[t.id]||n;i.dom.createChildOf(u,\"div\",\"lh-category-wrapper\").append(i.render(t,e.categoryGroups,m))}n.injectFinalScreenshot(u,e.audits,h);let w=this._dom.createFragment();return this._opts.omitGlobalStyles||w.append(this._dom.createComponent(\"styles\")),this._opts.omitTopbar||w.append(this._renderReportTopbar(e)),w.append(s),c.append(this._renderReportFooter(e)),s.append(a,c),e.fullPageScreenshot&&f.installFullPageScreenshot(this._dom.rootEl,e.fullPageScreenshot.screenshot),w}};function k(e,t){let n=e.rootEl;typeof t>\"u\"?n.classList.toggle(\"lh-dark\"):n.classList.toggle(\"lh-dark\",t)}var E=typeof btoa<\"u\"?btoa:e=>Buffer.from(e).toString(\"base64\"),L=typeof atob<\"u\"?atob:e=>Buffer.from(e,\"base64\").toString();var C={toBase64:async function(e,t){let n=(new TextEncoder).encode(e);if(t.gzip)if(typeof CompressionStream<\"u\"){let e=new CompressionStream(\"gzip\"),t=e.writable.getWriter();t.write(n),t.close();let r=await new Response(e.readable).arrayBuffer();n=new Uint8Array(r)}else n=window.pako.gzip(e);let r=\"\";for(let e=0;e<n.length;e+=5e3)r+=String.fromCharCode(...n.subarray(e,e+5e3));return E(r)},fromBase64:function(e,t){let n=L(e),r=Uint8Array.from(n,(e=>e.charCodeAt(0)));return t.gzip?window.pako.ungzip(r,{to:\"string\"}):(new TextDecoder).decode(r)}};function A(){let e=window.location.host.endsWith(\".vercel.app\"),t=new URLSearchParams(window.location.search).has(\"dev\");return e?`https://${window.location.host}/gh-pages`:t?\"http://localhost:7333\":\"https://googlechrome.github.io/lighthouse\"}function S(e){let t=e.generatedTime,n=e.fetchTime||t;return`${e.lighthouseVersion}-${e.finalDisplayedUrl}-${n}`}async function z(e,t,n){let r=new URL(t),i=!!window.CompressionStream;r.hash=await C.toBase64(JSON.stringify(e),{gzip:i}),i&&r.searchParams.set(\"gzip\",\"1\"),window.open(r.toString(),n)}async function M(e){let t=\"viewer-\"+S(e);!function(e,t,n){let r=new URL(t).origin;window.addEventListener(\"message\",(function t(n){n.origin===r&&i&&n.data.opened&&(i.postMessage(e,r),window.removeEventListener(\"message\",t))}));let i=window.open(t,n)}({lhr:e},A()+\"/viewer/\",t)}function T(e){return function(e,t){let n=t?new Date(t):new Date,r=n.toLocaleTimeString(\"en-US\",{hour12:!1}),i=n.toLocaleDateString(\"en-US\",{year:\"numeric\",month:\"2-digit\",day:\"2-digit\"}).split(\"/\");return i.unshift(i.pop()),`${e}_${i.join(\"-\")}_${r}`.replace(/[/?<>\\\\:*|\"]/g,\"-\")}(new URL(e.finalDisplayedUrl).hostname,e.fetchTime)}var F=class{constructor(e,t={}){this.json,this._dom=e,this._opts=t,this._topbar=t.omitTopbar?null:new class{constructor(e,t){this.lhr,this._reportUIFeatures=e,this._dom=t,this._dropDownMenu=new class{constructor(e){this._dom=e,this._toggleEl,this._menuEl,this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onToggleClick=this.onToggleClick.bind(this),this.onToggleKeydown=this.onToggleKeydown.bind(this),this.onMenuFocusOut=this.onMenuFocusOut.bind(this),this.onMenuKeydown=this.onMenuKeydown.bind(this),this._getNextMenuItem=this._getNextMenuItem.bind(this),this._getNextSelectableNode=this._getNextSelectableNode.bind(this),this._getPreviousMenuItem=this._getPreviousMenuItem.bind(this)}setup(e){this._toggleEl=this._dom.find(\".lh-topbar button.lh-tools__button\",this._dom.rootEl),this._toggleEl.addEventListener(\"click\",this.onToggleClick),this._toggleEl.addEventListener(\"keydown\",this.onToggleKeydown),this._menuEl=this._dom.find(\".lh-topbar div.lh-tools__dropdown\",this._dom.rootEl),this._menuEl.addEventListener(\"keydown\",this.onMenuKeydown),this._menuEl.addEventListener(\"click\",e)}close(){this._toggleEl.classList.remove(\"lh-active\"),this._toggleEl.setAttribute(\"aria-expanded\",\"false\"),this._menuEl.contains(this._dom.document().activeElement)&&this._toggleEl.focus(),this._menuEl.removeEventListener(\"focusout\",this.onMenuFocusOut),this._dom.document().removeEventListener(\"keydown\",this.onDocumentKeyDown)}open(e){this._toggleEl.classList.contains(\"lh-active\")?e.focus():this._menuEl.addEventListener(\"transitionend\",(()=>{e.focus()}),{once:!0}),this._toggleEl.classList.add(\"lh-active\"),this._toggleEl.setAttribute(\"aria-expanded\",\"true\"),this._menuEl.addEventListener(\"focusout\",this.onMenuFocusOut),this._dom.document().addEventListener(\"keydown\",this.onDocumentKeyDown)}onToggleClick(e){e.preventDefault(),e.stopImmediatePropagation(),this._toggleEl.classList.contains(\"lh-active\")?this.close():this.open(this._getNextMenuItem())}onToggleKeydown(e){switch(e.code){case\"ArrowUp\":e.preventDefault(),this.open(this._getPreviousMenuItem());break;case\"ArrowDown\":case\"Enter\":case\" \":e.preventDefault(),this.open(this._getNextMenuItem())}}onMenuKeydown(e){let t=e.target;switch(e.code){case\"ArrowUp\":e.preventDefault(),this._getPreviousMenuItem(t).focus();break;case\"ArrowDown\":e.preventDefault(),this._getNextMenuItem(t).focus();break;case\"Home\":e.preventDefault(),this._getNextMenuItem().focus();break;case\"End\":e.preventDefault(),this._getPreviousMenuItem().focus()}}onDocumentKeyDown(e){27===e.keyCode&&this.close()}onMenuFocusOut(e){let t=e.relatedTarget;this._menuEl.contains(t)||this.close()}_getNextSelectableNode(e,t){let n=e.filter((e=>e instanceof HTMLElement)).filter((e=>!(e.hasAttribute(\"disabled\")||\"none\"===window.getComputedStyle(e).display))),r=t?n.indexOf(t)+1:0;return r>=n.length&&(r=0),n[r]}_getNextMenuItem(e){let t=Array.from(this._menuEl.childNodes);return this._getNextSelectableNode(t,e)}_getPreviousMenuItem(e){let t=Array.from(this._menuEl.childNodes).reverse();return this._getNextSelectableNode(t,e)}}(this._dom),this._copyAttempt=!1,this.topbarEl,this.categoriesEl,this.stickyHeaderEl,this.highlightEl,this.onDropDownMenuClick=this.onDropDownMenuClick.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onCopy=this.onCopy.bind(this),this.collapseAllDetails=this.collapseAllDetails.bind(this)}enable(e){this.lhr=e,this._dom.rootEl.addEventListener(\"keyup\",this.onKeyUp),this._dom.document().addEventListener(\"copy\",this.onCopy),this._dropDownMenu.setup(this.onDropDownMenuClick),this._setUpCollapseDetailsAfterPrinting(),this._dom.find(\".lh-topbar__logo\",this._dom.rootEl).addEventListener(\"click\",(()=>k(this._dom))),this._setupStickyHeader()}onDropDownMenuClick(e){e.preventDefault();let t=e.target;if(t&&t.hasAttribute(\"data-action\")){switch(t.getAttribute(\"data-action\")){case\"copy\":this.onCopyButtonClick();break;case\"print-summary\":this.collapseAllDetails(),this._print();break;case\"print-expanded\":this.expandAllDetails(),this._print();break;case\"save-json\":{let e=JSON.stringify(this.lhr,null,2);this._reportUIFeatures._saveFile(new Blob([e],{type:\"application/json\"}));break}case\"save-html\":{let e=this._reportUIFeatures.getReportHtml();try{this._reportUIFeatures._saveFile(new Blob([e],{type:\"text/html\"}))}catch(e){this._dom.fireEventOn(\"lh-log\",this._dom.document(),{cmd:\"error\",msg:\"Could not export as HTML. \"+e.message})}break}case\"open-viewer\":this._dom.isDevTools()?async function(e){let t=\"viewer-\"+S(e),n=A()+\"/viewer/\";await z({lhr:e},n,t)}(this.lhr):M(this.lhr);break;case\"save-gist\":this._reportUIFeatures.saveAsGist();break;case\"toggle-dark\":k(this._dom);break;case\"view-unthrottled-trace\":this._reportUIFeatures._opts.onViewTrace?.()}this._dropDownMenu.close()}}onCopy(e){this._copyAttempt&&e.clipboardData&&(e.preventDefault(),e.clipboardData.setData(\"text/plain\",JSON.stringify(this.lhr,null,2)),this._dom.fireEventOn(\"lh-log\",this._dom.document(),{cmd:\"log\",msg:\"Report JSON copied to clipboard\"})),this._copyAttempt=!1}onCopyButtonClick(){this._dom.fireEventOn(\"lh-analytics\",this._dom.document(),{name:\"copy\"});try{this._dom.document().queryCommandSupported(\"copy\")&&(this._copyAttempt=!0,this._dom.document().execCommand(\"copy\")||(this._copyAttempt=!1,this._dom.fireEventOn(\"lh-log\",this._dom.document(),{cmd:\"warn\",msg:\"Your browser does not support copy to clipboard.\"})))}catch(e){this._copyAttempt=!1,this._dom.fireEventOn(\"lh-log\",this._dom.document(),{cmd:\"log\",msg:e.message})}}onKeyUp(e){(e.ctrlKey||e.metaKey)&&80===e.keyCode&&this._dropDownMenu.close()}expandAllDetails(){this._dom.findAll(\".lh-categories details\",this._dom.rootEl).map((e=>e.open=!0))}collapseAllDetails(){this._dom.findAll(\".lh-categories details\",this._dom.rootEl).map((e=>e.open=!1))}_print(){this._reportUIFeatures._opts.onPrintOverride?this._reportUIFeatures._opts.onPrintOverride(this._dom.rootEl):self.print()}resetUIState(){this._dropDownMenu.close()}_getScrollParent(e){let{overflowY:t}=window.getComputedStyle(e);return\"visible\"!==t&&\"hidden\"!==t?e:e.parentElement?this._getScrollParent(e.parentElement):document}_setUpCollapseDetailsAfterPrinting(){\"onbeforeprint\"in self?self.addEventListener(\"afterprint\",this.collapseAllDetails):self.matchMedia(\"print\").addListener((e=>{e.matches?this.expandAllDetails():this.collapseAllDetails()}))}_setupStickyHeader(){this.topbarEl=this._dom.find(\"div.lh-topbar\",this._dom.rootEl),this.categoriesEl=this._dom.find(\"div.lh-categories\",this._dom.rootEl),requestAnimationFrame((()=>requestAnimationFrame((()=>{try{this.stickyHeaderEl=this._dom.find(\"div.lh-sticky-header\",this._dom.rootEl)}catch{return}this.highlightEl=this._dom.createChildOf(this.stickyHeaderEl,\"div\",\"lh-highlighter\");let e=this._getScrollParent(this._dom.find(\".lh-container\",this._dom.rootEl));e.addEventListener(\"scroll\",(()=>this._updateStickyHeader()));let t=e instanceof window.Document?document.documentElement:e;new window.ResizeObserver((()=>this._updateStickyHeader())).observe(t)}))))}_updateStickyHeader(){if(!this.stickyHeaderEl)return;let e=this.topbarEl.getBoundingClientRect().bottom>=this.categoriesEl.getBoundingClientRect().top,t=Array.from(this._dom.rootEl.querySelectorAll(\".lh-category\")).filter((e=>e.getBoundingClientRect().top-window.innerHeight/2<0)),n=t.length>0?t.length-1:0,r=this.stickyHeaderEl.querySelectorAll(\".lh-gauge__wrapper, .lh-fraction__wrapper\"),i=r[n],a=r[0].getBoundingClientRect().left,o=i.getBoundingClientRect().left-a;this.highlightEl.style.transform=`translate(${o}px)`,this.stickyHeaderEl.classList.toggle(\"lh-sticky-header--visible\",e)}}(this,e),this.onMediaQueryChange=this.onMediaQueryChange.bind(this)}initFeatures(e){this.json=e,this._fullPageScreenshot=i.getFullPageScreenshot(e),this._topbar&&(this._topbar.enable(e),this._topbar.resetUIState()),this._setupMediaQueryListeners(),this._setupThirdPartyFilter(),this._setupElementScreenshotOverlay(this._dom.rootEl);let t=this._dom.isDevTools()||this._opts.disableDarkMode||this._opts.disableAutoDarkModeAndFireworks;!t&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches&&k(this._dom,!0);let n=[\"performance\",\"accessibility\",\"best-practices\",\"seo\"].every((t=>{let n=e.categories[t];return n&&1===n.score})),r=this._opts.disableFireworks||this._opts.disableAutoDarkModeAndFireworks;if(n&&!r&&(this._enableFireworks(),t||k(this._dom,!0)),e.categories.performance&&e.categories.performance.auditRefs.some((t=>!(\"metrics\"!==t.group||!e.audits[t.id].errorMessage)))){this._dom.find(\"input.lh-metrics-toggle__input\",this._dom.rootEl).checked=!0}this.json.audits[\"script-treemap-data\"]&&this.json.audits[\"script-treemap-data\"].details&&this.addButton({text:l.strings.viewTreemapLabel,icon:\"treemap\",onClick:()=>function(e){if(!e.audits[\"script-treemap-data\"].details)throw new Error(\"no script treemap data found\");z({lhr:{mainDocumentUrl:e.mainDocumentUrl,finalUrl:e.finalUrl,finalDisplayedUrl:e.finalDisplayedUrl,audits:{\"script-treemap-data\":e.audits[\"script-treemap-data\"]},configSettings:{locale:e.configSettings.locale}}},A()+\"/treemap/\",\"treemap-\"+S(e))}(this.json)}),this._opts.onViewTrace&&(\"simulate\"===e.configSettings.throttlingMethod?this._dom.find('a[data-action=\"view-unthrottled-trace\"]',this._dom.rootEl).classList.remove(\"lh-hidden\"):this.addButton({text:l.strings.viewTraceLabel,onClick:()=>this._opts.onViewTrace?.()})),this._opts.getStandaloneReportHTML&&this._dom.find('a[data-action=\"save-html\"]',this._dom.rootEl).classList.remove(\"lh-hidden\");for(let e of this._dom.findAll(\"[data-i18n]\",this._dom.rootEl)){let t=e.getAttribute(\"data-i18n\");e.textContent=l.strings[t]}}addButton(e){let t=this._dom.rootEl.querySelector(\".lh-audit-group--metrics\");if(!t)return;let n=t.querySelector(\".lh-buttons\");n||(n=this._dom.createChildOf(t,\"div\",\"lh-buttons\"));let r=[\"lh-button\"];e.icon&&(r.push(\"lh-report-icon\"),r.push(`lh-report-icon--${e.icon}`));let i=this._dom.createChildOf(n,\"button\",r.join(\" \"));return i.textContent=e.text,i.addEventListener(\"click\",e.onClick),i}resetUIState(){this._topbar&&this._topbar.resetUIState()}getReportHtml(){if(!this._opts.getStandaloneReportHTML)throw new Error(\"`getStandaloneReportHTML` is not set\");return this.resetUIState(),this._opts.getStandaloneReportHTML()}saveAsGist(){throw new Error(\"Cannot save as gist from base report\")}_enableFireworks(){this._dom.find(\".lh-scores-container\",this._dom.rootEl).classList.add(\"lh-score100\")}_setupMediaQueryListeners(){let e=self.matchMedia(\"(max-width: 500px)\");e.addListener(this.onMediaQueryChange),this.onMediaQueryChange(e)}_resetUIState(){this._topbar&&this._topbar.resetUIState()}onMediaQueryChange(e){this._dom.rootEl.classList.toggle(\"lh-narrow\",e.matches)}_setupThirdPartyFilter(){let e=[\"uses-rel-preconnect\",\"third-party-facades\",\"network-dependency-tree-insight\"],t=[\"legacy-javascript\",\"legacy-javascript-insight\"];Array.from(this._dom.rootEl.querySelectorAll(\"table.lh-table\")).filter((e=>e.querySelector(\"td.lh-table-column--url, td.lh-table-column--source-location\"))).filter((t=>{let n=t.closest(\".lh-audit\");if(!n)throw new Error(\".lh-table not within audit\");return!e.includes(n.id)})).forEach((e=>{let n=(d=e,Array.from(d.tBodies[0].rows)),r=n.filter((e=>!e.classList.contains(\"lh-sub-item-row\"))),a=this._getThirdPartyRows(r,i.getFinalDisplayedUrl(this.json)),o=n.some((e=>e.classList.contains(\"lh-row--even\"))),s=this._dom.createComponent(\"3pFilter\"),c=this._dom.find(\"input\",s);var d;c.addEventListener(\"change\",(e=>{let t=e.target instanceof HTMLInputElement&&!e.target.checked,n=!0,i=r[0];for(;i;){let e=t&&a.includes(i);do{i.classList.toggle(\"lh-row--hidden\",e),o&&(i.classList.toggle(\"lh-row--even\",!e&&n),i.classList.toggle(\"lh-row--odd\",!e&&!n)),i=i.nextElementSibling}while(i&&i.classList.contains(\"lh-sub-item-row\"));e||(n=!n)}}));let h=a.filter((e=>!e.classList.contains(\"lh-row--group\"))).length;this._dom.find(\".lh-3p-filter-count\",s).textContent=`${h}`,this._dom.find(\".lh-3p-ui-string\",s).textContent=l.strings.thirdPartyResourcesLabel;let p=a.length===r.length,g=!a.length;if((p||g)&&(this._dom.find(\"div.lh-3p-filter\",s).hidden=!0),!e.parentNode)return;e.parentNode.insertBefore(s,e);let u=e.closest(\".lh-audit\");if(!u)throw new Error(\".lh-table not within audit\");t.includes(u.id)&&!p&&c.click()}))}_setupElementScreenshotOverlay(e){this._fullPageScreenshot&&f.installOverlayFeature({dom:this._dom,rootEl:e,overlayContainerEl:e,fullPageScreenshot:this._fullPageScreenshot})}_getThirdPartyRows(e,t){let n=i.getEntityFromUrl(t,this.json.entities),r=this.json.entities?.find((e=>!0===e.isFirstParty))?.name,a=[];for(let t of e){if(r){if(!t.dataset.entity||t.dataset.entity===r)continue}else{let e=t.querySelector(\"div.lh-text__url\");if(!e)continue;let r=e.dataset.url;if(!r||i.getEntityFromUrl(r,this.json.entities)===n)continue}a.push(t)}return a}_saveFile(e){let t=e.type.match(\"json\")?\".json\":\".html\",n=T({finalDisplayedUrl:i.getFinalDisplayedUrl(this.json),fetchTime:this.json.fetchTime})+t;this._opts.onSaveFileOverride?this._opts.onSaveFileOverride(e,n):this._dom.saveFile(e,n)}};window.__initLighthouseReport__=function(){let e=function(e,t={}){let n=document.createElement(\"article\");n.classList.add(\"lh-root\",\"lh-vars\");let r=new a(n.ownerDocument,n);return new x(r).renderReport(e,n,t),new F(r,t).initFeatures(e),n}(window.__LIGHTHOUSE_JSON__,{occupyEntireViewport:!0,getStandaloneReportHTML:()=>document.documentElement.outerHTML});document.body.append(e),document.addEventListener(\"lh-analytics\",(e=>{let t=e;\"gtag\"in window&&window.gtag(\"event\",t.detail.name,t.detail.data??{})})),document.addEventListener(\"lh-log\",(e=>{let t=document.querySelector(\"div#lh-log\");if(!t)return;let n=new class{constructor(e){this.el=e;let t=document.createElement(\"style\");if(t.textContent=\"\\n #lh-log {\\n position: fixed;\\n background-color: #323232;\\n color: #fff;\\n min-height: 48px;\\n min-width: 288px;\\n padding: 16px 24px;\\n box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\\n border-radius: 2px;\\n margin: 12px;\\n font-size: 14px;\\n cursor: default;\\n transition: transform 0.3s, opacity 0.3s;\\n transform: translateY(100px);\\n opacity: 0;\\n bottom: 0;\\n left: 0;\\n z-index: 3;\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n }\\n \\n #lh-log.lh-show {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n \",!this.el.parentNode)throw new Error(\"element needs to be in the DOM\");this.el.parentNode.insertBefore(t,this.el),this._id=void 0}log(e,t=!0){this._id&&clearTimeout(this._id),this.el.textContent=e,this.el.classList.add(\"lh-show\"),t&&(this._id=setTimeout((()=>{this.el.classList.remove(\"lh-show\")}),7e3))}warn(e){this.log(\"Warning: \"+e)}error(e){this.log(e),setTimeout((()=>{throw new Error(e)}),0)}hide(){this._id&&clearTimeout(this._id),this.el.classList.remove(\"lh-show\")}}(t),r=e.detail;switch(r.cmd){case\"log\":n.log(r.msg);break;case\"warn\":n.warn(r.msg);break;case\"error\":n.error(r.msg);break;case\"hide\":n.hide()}}))}})();\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n*/\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n *\n * Dummy text for ensuring report robustness: <\\/script> pre$`post %%LIGHTHOUSE_JSON%%\n * (this is handled by terser)\n */\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */"
|
|
32
|
+
}, l = class e {
|
|
33
|
+
static replaceStrings(t, n) {
|
|
34
|
+
if (n.length === 0) return t;
|
|
35
|
+
let r = n[0], i = n.slice(1);
|
|
36
|
+
return t.split(r.search).map((t) => e.replaceStrings(t, i)).join(r.replacement);
|
|
37
|
+
}
|
|
38
|
+
static sanitizeJson(e) {
|
|
39
|
+
return JSON.stringify(e).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
|
|
40
|
+
}
|
|
41
|
+
static generateReportHtml(t) {
|
|
42
|
+
let n = e.sanitizeJson(t), r = c.REPORT_JAVASCRIPT.replace(/<\//g, "\\u003c/");
|
|
43
|
+
return e.replaceStrings(c.REPORT_TEMPLATE, [{
|
|
44
|
+
search: "%%LIGHTHOUSE_JSON%%",
|
|
45
|
+
replacement: n
|
|
46
|
+
}, {
|
|
47
|
+
search: "%%LIGHTHOUSE_JAVASCRIPT%%",
|
|
48
|
+
replacement: r
|
|
49
|
+
}]);
|
|
50
|
+
}
|
|
51
|
+
static generateFlowReportHtml(t) {
|
|
52
|
+
let n = e.sanitizeJson(t), r = c.FLOW_REPORT_JAVASCRIPT.replace(/<\//g, "\\u003c/");
|
|
53
|
+
return e.replaceStrings(c.FLOW_REPORT_TEMPLATE, [
|
|
54
|
+
{
|
|
55
|
+
search: "%%LIGHTHOUSE_FLOW_JSON%%",
|
|
56
|
+
replacement: n
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
search: "%%LIGHTHOUSE_FLOW_JAVASCRIPT%%",
|
|
60
|
+
replacement: r
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
search: "/*%%LIGHTHOUSE_FLOW_CSS%%*/",
|
|
64
|
+
replacement: c.FLOW_REPORT_CSS
|
|
65
|
+
}
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
static generateReportCSV(e) {
|
|
69
|
+
let t = (e) => `"${e.replace(/"/g, "\"\"")}"`, n = (e) => e.map((e) => e === null ? "null" : e.toString()).map(t), r = [], i = [
|
|
70
|
+
"requestedUrl",
|
|
71
|
+
"finalDisplayedUrl",
|
|
72
|
+
"fetchTime",
|
|
73
|
+
"gatherMode"
|
|
74
|
+
];
|
|
75
|
+
r.push(n(i)), r.push(n(i.map((t) => e[t] ?? null))), r.push([]), r.push(["category", "score"]);
|
|
76
|
+
for (let t of Object.values(e.categories)) r.push(n([t.id, t.score]));
|
|
77
|
+
r.push([]), r.push([
|
|
78
|
+
"category",
|
|
79
|
+
"audit",
|
|
80
|
+
"score",
|
|
81
|
+
"displayValue",
|
|
82
|
+
"description"
|
|
83
|
+
]);
|
|
84
|
+
for (let t of Object.values(e.categories)) for (let i of t.auditRefs) {
|
|
85
|
+
let a = e.audits[i.id];
|
|
86
|
+
a && r.push(n([
|
|
87
|
+
t.id,
|
|
88
|
+
i.id,
|
|
89
|
+
a.score,
|
|
90
|
+
a.displayValue || "",
|
|
91
|
+
a.description
|
|
92
|
+
]));
|
|
93
|
+
}
|
|
94
|
+
return r.map((e) => e.join(",")).join("\r\n");
|
|
95
|
+
}
|
|
96
|
+
static isFlowResult(e) {
|
|
97
|
+
return "steps" in e;
|
|
98
|
+
}
|
|
99
|
+
static generateReport(t, n) {
|
|
100
|
+
let r = Array.isArray(n);
|
|
101
|
+
typeof n == "string" && (n = [n]);
|
|
102
|
+
let i = n.map((n) => {
|
|
103
|
+
if (n === "html") return e.isFlowResult(t) ? e.generateFlowReportHtml(t) : e.generateReportHtml(t);
|
|
104
|
+
if (n === "csv") {
|
|
105
|
+
if (e.isFlowResult(t)) throw Error("CSV output is not support for user flows");
|
|
106
|
+
return e.generateReportCSV(t);
|
|
107
|
+
}
|
|
108
|
+
if (n === "json") return JSON.stringify(t, null, 2);
|
|
109
|
+
throw Error("Invalid output mode: " + n);
|
|
110
|
+
});
|
|
111
|
+
return r ? i : i[0];
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
return o(s);
|
|
115
|
+
})();
|
|
116
|
+
return e.ReportGenerator ?? e;
|
|
117
|
+
});
|
|
118
|
+
})))();
|
|
119
|
+
var Be = /* @__PURE__ */ e({
|
|
120
|
+
Events: () => R,
|
|
121
|
+
LighthouseController: () => Ue,
|
|
122
|
+
getPresets: () => I,
|
|
123
|
+
getRuntimeSettings: () => L
|
|
124
|
+
}), N = {
|
|
125
|
+
canOnlyAuditHttphttpsPages: "Can only audit pages on HTTP or HTTPS. Navigate to a different page.",
|
|
126
|
+
thereMayBeStoredDataAffectingSingular: "There may be stored data affecting loading performance in this location: {PH1}. Audit this page in an incognito window to prevent those resources from affecting your scores.",
|
|
127
|
+
thereMayBeStoredDataAffectingLoadingPlural: "There may be stored data affecting loading performance in these locations: {PH1}. Audit this page in an incognito window to prevent those resources from affecting your scores.",
|
|
128
|
+
multipleTabsAreBeingControlledBy: "Multiple tabs are being controlled by the same `service worker`. Close your other tabs on the same origin to audit this page.",
|
|
129
|
+
atLeastOneCategoryMustBeSelected: "At least one category must be selected.",
|
|
130
|
+
localStorage: "Local storage",
|
|
131
|
+
indexeddb: "IndexedDB",
|
|
132
|
+
webSql: "Web SQL",
|
|
133
|
+
performance: "Performance",
|
|
134
|
+
howLongDoesThisAppTakeToShow: "How long does this app take to show content and become usable",
|
|
135
|
+
bestPractices: "Best practices",
|
|
136
|
+
doesThisPageFollowBestPractices: "Does this page follow best practices for modern web development",
|
|
137
|
+
accessibility: "Accessibility",
|
|
138
|
+
isThisPageUsableByPeopleWith: "Is this page usable by people with disabilities or impairments",
|
|
139
|
+
seo: "SEO",
|
|
140
|
+
isThisPageOptimizedForSearch: "Is this page optimized for search engine results ranking",
|
|
141
|
+
agenticBrowsing: "Agentic browsing",
|
|
142
|
+
agenticBrowsingDescription: "These checks ensure high-quality, browsable websites for AI agents and validate the correctness of WebMCP integrations. This category is still under development and subject to change.",
|
|
143
|
+
applyMobileEmulation: "Apply mobile emulation",
|
|
144
|
+
applyMobileEmulationDuring: "Apply mobile emulation during auditing",
|
|
145
|
+
applyDesktopEmulationDuring: "Apply desktop emulation during auditing",
|
|
146
|
+
lighthouseMode: "Lighthouse mode",
|
|
147
|
+
runLighthouseInMode: "Run Lighthouse in navigation, timespan, or snapshot mode",
|
|
148
|
+
navigation: "Navigation (Default)",
|
|
149
|
+
navigationTooltip: "Navigation mode analyzes a page load, exactly like the original Lighthouse reports.",
|
|
150
|
+
timespan: "Timespan",
|
|
151
|
+
timespanTooltip: "Timespan mode analyzes an arbitrary period of time, typically containing user interactions.",
|
|
152
|
+
snapshot: "Snapshot",
|
|
153
|
+
snapshotTooltip: "Snapshot mode analyzes the page in a particular state, typically after user interactions.",
|
|
154
|
+
mobile: "Mobile",
|
|
155
|
+
desktop: "Desktop",
|
|
156
|
+
throttlingMethod: "Throttling method",
|
|
157
|
+
simulatedThrottling: "Simulated throttling (default)",
|
|
158
|
+
devtoolsThrottling: "DevTools throttling (advanced)",
|
|
159
|
+
simulateASlowerPageLoadBasedOn: "Simulated throttling simulates a slower page load based on data from an initial unthrottled load. DevTools throttling actually slows down the page.",
|
|
160
|
+
clearStorage: "Clear storage",
|
|
161
|
+
resetStorageLocalstorage: "Reset storage (`cache`, `service workers`, etc) before auditing. (Good for performance & `PWA` testing)",
|
|
162
|
+
enableSampling: "Enable JS sampling",
|
|
163
|
+
enableJavaScriptSampling: "Enable JavaScript sampling during the Lighthouse run. This will provide more execution details in the performance panel when you view the trace, but has higher CPU overhead and may impact the performance of the page.",
|
|
164
|
+
javaScriptDisabled: "JavaScript is disabled. You need to enable JavaScript to audit this page. Open the Command Menu and run the Enable JavaScript command to enable JavaScript."
|
|
165
|
+
}, Ve = p("panels/lighthouse/LighthouseController.ts", N), P = l.bind(void 0, Ve), F = f.bind(void 0, Ve), He = class {
|
|
166
|
+
controller;
|
|
167
|
+
inspectedURL;
|
|
168
|
+
categoryIDs;
|
|
169
|
+
flags;
|
|
170
|
+
isAIControlled;
|
|
171
|
+
emulationStateBefore;
|
|
172
|
+
protocolService;
|
|
173
|
+
#e;
|
|
174
|
+
#t = null;
|
|
175
|
+
constructor(e, t, n, r, i, a) {
|
|
176
|
+
this.controller = e, this.protocolService = t, this.inspectedURL = n, this.categoryIDs = r, this.flags = i, this.isAIControlled = a, this.#e = !1;
|
|
177
|
+
}
|
|
178
|
+
isRunning() {
|
|
179
|
+
return this.#e;
|
|
180
|
+
}
|
|
181
|
+
async start() {
|
|
182
|
+
this.#e = !0;
|
|
183
|
+
try {
|
|
184
|
+
await this.setupEmulationAndProtocolConnection(), this.flags.mode === "timespan" && await this.protocolService.startTimespan({
|
|
185
|
+
inspectedURL: this.inspectedURL,
|
|
186
|
+
categoryIDs: this.categoryIDs,
|
|
187
|
+
flags: this.flags
|
|
188
|
+
});
|
|
189
|
+
} catch (e) {
|
|
190
|
+
throw await this.cancel(), e;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async collect() {
|
|
194
|
+
try {
|
|
195
|
+
let e = await this.protocolService.collectLighthouseResults({
|
|
196
|
+
inspectedURL: this.inspectedURL,
|
|
197
|
+
categoryIDs: this.categoryIDs,
|
|
198
|
+
flags: this.flags
|
|
199
|
+
});
|
|
200
|
+
if (!e) throw Error("No Lighthouse response");
|
|
201
|
+
if (e.fatal) {
|
|
202
|
+
let t = Error(e.message);
|
|
203
|
+
throw t.stack = e.stack, t;
|
|
204
|
+
}
|
|
205
|
+
return e;
|
|
206
|
+
} finally {
|
|
207
|
+
await this.cancel();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async cancel() {
|
|
211
|
+
return this.#t ||= (this.#e = !1, this.restoreEmulationAndProtocolConnection()), await this.#t;
|
|
212
|
+
}
|
|
213
|
+
async setupEmulationAndProtocolConnection() {
|
|
214
|
+
let e = Ie.instance();
|
|
215
|
+
if (this.emulationStateBefore = {
|
|
216
|
+
emulation: {
|
|
217
|
+
type: e.type(),
|
|
218
|
+
enabled: e.enabledSetting().get(),
|
|
219
|
+
outlineEnabled: e.deviceOutlineSetting().get(),
|
|
220
|
+
toolbarControlsEnabled: e.toolbarControlsEnabledSetting().get(),
|
|
221
|
+
scale: e.scaleSetting().get(),
|
|
222
|
+
device: e.device(),
|
|
223
|
+
mode: e.mode()
|
|
224
|
+
},
|
|
225
|
+
network: { conditions: pe.instance().networkConditions() }
|
|
226
|
+
}, e.toolbarControlsEnabledSetting().set(!1), "formFactor" in this.flags && this.flags.formFactor === "desktop") e.enabledSetting().set(!1), e.emulate(Pe.None, null, null);
|
|
227
|
+
else if (this.flags.formFactor === "mobile") {
|
|
228
|
+
e.enabledSetting().set(!0), e.deviceOutlineSetting().set(!0);
|
|
229
|
+
for (let t of Fe.instance().standard()) t.title === "Moto G Power" && e.emulate(Pe.Device, t, t.modes[0], 1);
|
|
230
|
+
}
|
|
231
|
+
await this.protocolService.attach();
|
|
232
|
+
}
|
|
233
|
+
async restoreEmulationAndProtocolConnection() {
|
|
234
|
+
if (await this.protocolService.detach(), this.emulationStateBefore) {
|
|
235
|
+
let e = Ie.instance();
|
|
236
|
+
e.emulate(Pe.None, null, null);
|
|
237
|
+
let { type: t, enabled: n, outlineEnabled: r, toolbarControlsEnabled: i, scale: a, device: o, mode: s } = this.emulationStateBefore.emulation;
|
|
238
|
+
e.enabledSetting().set(n), e.deviceOutlineSetting().set(r), e.toolbarControlsEnabledSetting().set(i), t === Pe.Responsive && e.scaleSetting().set(a), e.emulate(t, o, s, a), pe.instance().setNetworkConditions(this.emulationStateBefore.network.conditions), delete this.emulationStateBefore;
|
|
239
|
+
}
|
|
240
|
+
ze.instance().update(!0);
|
|
241
|
+
let e = w.instance().primaryPageTarget();
|
|
242
|
+
if (!e) return;
|
|
243
|
+
let t = e.model(ie);
|
|
244
|
+
if (t && this.flags.mode === "navigation") {
|
|
245
|
+
let e = await this.controller.getInspectedURL();
|
|
246
|
+
await t.navigate(e);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}, Ue = class extends r {
|
|
250
|
+
protocolService;
|
|
251
|
+
manager;
|
|
252
|
+
serviceWorkerListeners;
|
|
253
|
+
inspectedURL;
|
|
254
|
+
currentLighthouseRun;
|
|
255
|
+
lastAction = null;
|
|
256
|
+
constructor(e) {
|
|
257
|
+
super(), this.protocolService = e, e.registerStatusCallback((e) => this.dispatchEventToListeners("AuditProgressChanged", { message: e }));
|
|
258
|
+
for (let e of I()) e.setting.addChangeListener(this.recomputePageAuditability.bind(this));
|
|
259
|
+
for (let e of L()) e.setting.addChangeListener(this.recomputePageAuditability.bind(this));
|
|
260
|
+
u.instance().moduleSetting("java-script-disabled").addChangeListener(this.recomputePageAuditability.bind(this)), w.instance().observeModels(xe, this), w.instance().addEventListener(g.INSPECTED_URL_CHANGED, this.recomputePageAuditability, this);
|
|
261
|
+
}
|
|
262
|
+
modelAdded(e) {
|
|
263
|
+
e.target() === w.instance().primaryPageTarget() && (this.manager = e, this.serviceWorkerListeners = [this.manager.addEventListener(Te.REGISTRATION_UPDATED, this.recomputePageAuditability, this), this.manager.addEventListener(Te.REGISTRATION_DELETED, this.recomputePageAuditability, this)], this.recomputePageAuditability());
|
|
264
|
+
}
|
|
265
|
+
modelRemoved(e) {
|
|
266
|
+
this.manager === e && (this.serviceWorkerListeners && o(this.serviceWorkerListeners), this.manager = null, this.recomputePageAuditability());
|
|
267
|
+
}
|
|
268
|
+
hasActiveServiceWorker() {
|
|
269
|
+
if (!this.manager) return !1;
|
|
270
|
+
let e = this.manager.target();
|
|
271
|
+
if (!e) return !1;
|
|
272
|
+
let t = i.fromString(e.inspectedURL())?.securityOrigin();
|
|
273
|
+
for (let e of this.manager.registrations().values()) if (e.securityOrigin === t) {
|
|
274
|
+
for (let t of e.versions.values()) if (t.controlledClients.length > 1) return !0;
|
|
275
|
+
}
|
|
276
|
+
return !1;
|
|
277
|
+
}
|
|
278
|
+
hasAtLeastOneCategory() {
|
|
279
|
+
return I().some((e) => e.setting.get());
|
|
280
|
+
}
|
|
281
|
+
unauditablePageMessage() {
|
|
282
|
+
if (!this.manager || this.getFlags().mode !== "navigation") return null;
|
|
283
|
+
let e = this.manager.target()?.inspectedURL();
|
|
284
|
+
if (!e?.startsWith("http")) return P(N.canOnlyAuditHttphttpsPages);
|
|
285
|
+
try {
|
|
286
|
+
if (new URL(e).pathname.endsWith(".pdf")) return P(N.canOnlyAuditHttphttpsPages);
|
|
287
|
+
} catch {
|
|
288
|
+
return P(N.canOnlyAuditHttphttpsPages);
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
javaScriptDisabled() {
|
|
293
|
+
return u.instance().moduleSetting("java-script-disabled").get();
|
|
294
|
+
}
|
|
295
|
+
async hasImportantResourcesNotCleared() {
|
|
296
|
+
let e = L().find((e) => e.setting.name === "lighthouse.clear-storage");
|
|
297
|
+
if (e && !e.setting.get() || !this.manager) return "";
|
|
298
|
+
let t = this.manager.target(), n = t.inspectedURL();
|
|
299
|
+
if (!n) return "";
|
|
300
|
+
let r = await t.storageAgent().invoke_getUsageAndQuota({ origin: n });
|
|
301
|
+
if (r.getError()) return "";
|
|
302
|
+
let i = r.usageBreakdown.filter((e) => e.usage).map((e) => We.get(e.storageType)).map((e) => e ? e() : void 0).filter(Boolean);
|
|
303
|
+
return i.length === 1 ? P(N.thereMayBeStoredDataAffectingSingular, { PH1: String(i[0]) }) : i.length > 1 ? P(N.thereMayBeStoredDataAffectingLoadingPlural, { PH1: i.join(", ") }) : "";
|
|
304
|
+
}
|
|
305
|
+
async evaluateInspectedURL() {
|
|
306
|
+
let e = w.instance().primaryPageTarget();
|
|
307
|
+
if (!e) throw Error("Unable to find main target required for Lighthouse");
|
|
308
|
+
let t = e.inspectedURL(), n = e.model(ie), r = n && await n.navigationHistory();
|
|
309
|
+
if (!n || !r) return t;
|
|
310
|
+
let { currentIndex: i, entries: a } = r;
|
|
311
|
+
return a[i].url;
|
|
312
|
+
}
|
|
313
|
+
getCurrentRun() {
|
|
314
|
+
if (this.currentLighthouseRun?.isRunning()) return {
|
|
315
|
+
inspectedURL: this.currentLighthouseRun.inspectedURL,
|
|
316
|
+
categoryIDs: this.currentLighthouseRun.categoryIDs,
|
|
317
|
+
flags: this.currentLighthouseRun.flags,
|
|
318
|
+
isAIControlled: this.currentLighthouseRun.isAIControlled
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
getFlags() {
|
|
322
|
+
let e = {};
|
|
323
|
+
for (let t of L()) t.setFlags(e, t.setting.get());
|
|
324
|
+
return e;
|
|
325
|
+
}
|
|
326
|
+
getCategoryIDs() {
|
|
327
|
+
let { mode: e } = this.getFlags(), t = [];
|
|
328
|
+
for (let n of I()) e && !n.supportedModes.includes(e) || n.setting.get() && t.push(n.configID);
|
|
329
|
+
return t;
|
|
330
|
+
}
|
|
331
|
+
async getInspectedURL(e) {
|
|
332
|
+
return (e?.force || !this.inspectedURL) && (this.inspectedURL = await this.evaluateInspectedURL()), this.inspectedURL;
|
|
333
|
+
}
|
|
334
|
+
recomputePageAuditability() {
|
|
335
|
+
let e = this.hasActiveServiceWorker(), t = this.hasAtLeastOneCategory(), n = this.unauditablePageMessage(), r = this.javaScriptDisabled(), i = "";
|
|
336
|
+
e ? i = P(N.multipleTabsAreBeingControlledBy) : t ? n ? i = n : r && (i = P(N.javaScriptDisabled)) : i = P(N.atLeastOneCategoryMustBeSelected), this.dispatchEventToListeners("PageAuditabilityChanged", { helpText: i }), this.hasImportantResourcesNotCleared().then((e) => {
|
|
337
|
+
this.getFlags().mode !== "navigation" && (e = ""), this.dispatchEventToListeners("PageWarningsChanged", { warning: e });
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
recordMetrics(e, t) {
|
|
341
|
+
j.actionTaken(ve.LighthouseStarted);
|
|
342
|
+
for (let e of I()) t.includes(e.configID) && j.lighthouseCategoryUsed(e.userMetric);
|
|
343
|
+
switch (e.mode) {
|
|
344
|
+
case "navigation":
|
|
345
|
+
j.lighthouseModeRun(ke.NAVIGATION);
|
|
346
|
+
break;
|
|
347
|
+
case "timespan":
|
|
348
|
+
j.lighthouseModeRun(ke.TIMESPAN);
|
|
349
|
+
break;
|
|
350
|
+
case "snapshot":
|
|
351
|
+
j.lighthouseModeRun(ke.SNAPSHOT);
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async startLighthouse(e) {
|
|
356
|
+
return this.lastAction && await this.lastAction, this.lastAction = new Promise(async (t) => {
|
|
357
|
+
this.currentLighthouseRun &&= (await this.currentLighthouseRun.cancel(), void 0);
|
|
358
|
+
let n = await this.getInspectedURL({ force: !0 }), r = e?.categoryIds ?? this.getCategoryIDs(), i = this.getFlags();
|
|
359
|
+
e?.mode && (i.mode = e.mode), this.recordMetrics(i, r), this.currentLighthouseRun = new He(this, this.protocolService, n, r, i, !!e?.isAIControlled), await this.currentLighthouseRun.start(), t();
|
|
360
|
+
}), await this.lastAction;
|
|
361
|
+
}
|
|
362
|
+
async collectLighthouseResults() {
|
|
363
|
+
if (!this.currentLighthouseRun) throw Error("Lighthouse is not started");
|
|
364
|
+
let e = await this.currentLighthouseRun.collect();
|
|
365
|
+
return j.actionTaken(ve.LighthouseFinished), this.currentLighthouseRun = void 0, e;
|
|
366
|
+
}
|
|
367
|
+
async cancelLighthouse() {
|
|
368
|
+
return this.lastAction && await this.lastAction, this.lastAction = new Promise(async (e) => {
|
|
369
|
+
this.currentLighthouseRun &&= (await this.currentLighthouseRun.cancel(), void 0), e();
|
|
370
|
+
}), await this.lastAction;
|
|
371
|
+
}
|
|
372
|
+
}, We = new Map([
|
|
373
|
+
[le.StorageType.Local_storage, F(N.localStorage)],
|
|
374
|
+
[le.StorageType.Indexeddb, F(N.indexeddb)],
|
|
375
|
+
[le.StorageType.Websql, F(N.webSql)]
|
|
376
|
+
]), Ge = null;
|
|
377
|
+
function I() {
|
|
378
|
+
return Ge ||= [
|
|
379
|
+
{
|
|
380
|
+
setting: u.instance().createSetting("lighthouse.cat-perf", !0, d.SYNCED),
|
|
381
|
+
configID: "performance",
|
|
382
|
+
title: F(N.performance),
|
|
383
|
+
description: F(N.howLongDoesThisAppTakeToShow),
|
|
384
|
+
supportedModes: [
|
|
385
|
+
"navigation",
|
|
386
|
+
"timespan",
|
|
387
|
+
"snapshot"
|
|
388
|
+
],
|
|
389
|
+
userMetric: M.PERFORMANCE
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
setting: u.instance().createSetting("lighthouse.cat-a11y", !0, d.SYNCED),
|
|
393
|
+
configID: "accessibility",
|
|
394
|
+
title: F(N.accessibility),
|
|
395
|
+
description: F(N.isThisPageUsableByPeopleWith),
|
|
396
|
+
supportedModes: ["navigation", "snapshot"],
|
|
397
|
+
userMetric: M.ACCESSIBILITY
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
setting: u.instance().createSetting("lighthouse.cat-best-practices", !0, d.SYNCED),
|
|
401
|
+
configID: "best-practices",
|
|
402
|
+
title: F(N.bestPractices),
|
|
403
|
+
description: F(N.doesThisPageFollowBestPractices),
|
|
404
|
+
supportedModes: [
|
|
405
|
+
"navigation",
|
|
406
|
+
"timespan",
|
|
407
|
+
"snapshot"
|
|
408
|
+
],
|
|
409
|
+
userMetric: M.BEST_PRACTICES
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
setting: u.instance().createSetting("lighthouse.cat-seo", !0, d.SYNCED),
|
|
413
|
+
configID: "seo",
|
|
414
|
+
title: F(N.seo),
|
|
415
|
+
description: F(N.isThisPageOptimizedForSearch),
|
|
416
|
+
supportedModes: ["navigation", "snapshot"],
|
|
417
|
+
userMetric: M.SEO
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
setting: u.instance().createSetting("lighthouse.cat-agentic-browsing", !1, d.SYNCED),
|
|
421
|
+
configID: "agentic-browsing",
|
|
422
|
+
title: F(N.agenticBrowsing),
|
|
423
|
+
description: F(N.agenticBrowsingDescription),
|
|
424
|
+
supportedModes: ["navigation", "snapshot"],
|
|
425
|
+
userMetric: M.AGENTIC_BROWSING
|
|
426
|
+
}
|
|
427
|
+
], Ge;
|
|
428
|
+
}
|
|
429
|
+
var Ke = null;
|
|
430
|
+
function L() {
|
|
431
|
+
return Ke ||= [
|
|
432
|
+
{
|
|
433
|
+
setting: u.instance().createSetting("lighthouse.device-type", "mobile", d.SYNCED),
|
|
434
|
+
title: F(N.applyMobileEmulation),
|
|
435
|
+
description: F(N.applyMobileEmulationDuring),
|
|
436
|
+
setFlags: (e, t) => {
|
|
437
|
+
e.formFactor = t;
|
|
438
|
+
},
|
|
439
|
+
options: [{
|
|
440
|
+
label: F(N.mobile),
|
|
441
|
+
tooltip: F(N.applyMobileEmulationDuring),
|
|
442
|
+
value: "mobile"
|
|
443
|
+
}, {
|
|
444
|
+
label: F(N.desktop),
|
|
445
|
+
tooltip: F(N.applyDesktopEmulationDuring),
|
|
446
|
+
value: "desktop"
|
|
447
|
+
}]
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
setting: u.instance().createSetting("lighthouse.mode", "navigation", d.SYNCED),
|
|
451
|
+
title: F(N.lighthouseMode),
|
|
452
|
+
description: F(N.runLighthouseInMode),
|
|
453
|
+
setFlags: (e, t) => {
|
|
454
|
+
e.mode = t;
|
|
455
|
+
},
|
|
456
|
+
options: [
|
|
457
|
+
{
|
|
458
|
+
label: F(N.navigation),
|
|
459
|
+
tooltip: F(N.navigationTooltip),
|
|
460
|
+
value: "navigation"
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
label: F(N.timespan),
|
|
464
|
+
tooltip: F(N.timespanTooltip),
|
|
465
|
+
value: "timespan"
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
label: F(N.snapshot),
|
|
469
|
+
tooltip: F(N.snapshotTooltip),
|
|
470
|
+
value: "snapshot"
|
|
471
|
+
}
|
|
472
|
+
],
|
|
473
|
+
learnMore: "https://github.com/GoogleChrome/lighthouse/blob/HEAD/docs/user-flows.md"
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
setting: u.instance().createSetting("lighthouse.throttling", "simulate", d.SYNCED),
|
|
477
|
+
title: F(N.throttlingMethod),
|
|
478
|
+
learnMore: "https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#devtools-lighthouse-panel-throttling",
|
|
479
|
+
description: F(N.simulateASlowerPageLoadBasedOn),
|
|
480
|
+
setFlags: (e, t) => {
|
|
481
|
+
typeof t == "string" ? e.throttlingMethod = t : e.throttlingMethod = t ? "simulate" : "devtools";
|
|
482
|
+
},
|
|
483
|
+
options: [{
|
|
484
|
+
label: F(N.simulatedThrottling),
|
|
485
|
+
value: "simulate"
|
|
486
|
+
}, {
|
|
487
|
+
label: F(N.devtoolsThrottling),
|
|
488
|
+
value: "devtools"
|
|
489
|
+
}]
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
setting: u.instance().createSetting("lighthouse.clear-storage", !0, d.SYNCED),
|
|
493
|
+
title: F(N.clearStorage),
|
|
494
|
+
description: F(N.resetStorageLocalstorage),
|
|
495
|
+
setFlags: (e, t) => {
|
|
496
|
+
e.disableStorageReset = !t;
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
setting: u.instance().createSetting("lighthouse.enable-sampling", !1, d.SYNCED),
|
|
501
|
+
title: F(N.enableSampling),
|
|
502
|
+
description: F(N.enableJavaScriptSampling),
|
|
503
|
+
setFlags: (e, t) => {
|
|
504
|
+
t ? e.additionalTraceCategories = "disabled-by-default-v8.cpu_profiler" : e.additionalTraceCategories = "";
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
], Ke;
|
|
508
|
+
}
|
|
509
|
+
var R = /* @__PURE__ */ function(e) {
|
|
510
|
+
return e.PageAuditabilityChanged = "PageAuditabilityChanged", e.PageWarningsChanged = "PageWarningsChanged", e.AuditProgressChanged = "AuditProgressChanged", e;
|
|
511
|
+
}({}), qe = "/*\n * Copyright 2017 The Chromium Authors\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.lh-root {\n --report-menu-width: 0;\n\n user-select: text;\n}\n/* for View Trace button */\n\n.lh-audit-group {\n position: relative;\n}\n\nbutton.view-trace {\n margin: 10px;\n}\n\n/** `window.opener` is null for windows opened from DevTools. This breaks\n the LH viewer app, so disable this feature. */\n\n.lh-tools--viewer {\n display: none !important; /* stylelint-disable-line declaration-no-important */\n}\n\n.lighthouse-settings-pane {\n flex: none;\n background-color: var(--sys-color-cdt-base-container);\n border-bottom: 1px solid var(--sys-color-divider);\n}\n\n.lighthouse-settings-pane devtools-toolbar {\n flex: 1 1;\n flex-wrap: wrap;\n}\n\nselect.lighthouse-report {\n min-width: 140px;\n /* Up to 180px wide, but if window is very small ensure dropdown arrow is visible */\n max-width: min(180px, calc(100% - 30px));\n}\n\n.lighthouse-toolbar-container {\n display: flex;\n flex: none;\n}\n\n.lighthouse-toolbar-container > devtools-toolbar {\n background-color: var(--sys-color-cdt-base-container);\n border-bottom: 1px solid var(--sys-color-divider);\n}\n\n.lighthouse-toolbar-container > :first-child {\n flex: 1 1 auto;\n}\n\n.lh-devtools .lh-element-screenshot__overlay {\n position: absolute;\n}\n\n.lighthouse-results-container {\n position: relative;\n\n :focus-visible {\n outline: -webkit-focus-ring-color auto 1px;\n }\n\n .lh-tools__button {\n height: var(--sys-size-9);\n width: var(--sys-size-9);\n min-width: var(--sys-size-9);\n\n &:focus-visible {\n border-radius: var(--sys-shape-corner-full);\n outline: var(--sys-size-2) solid var(--sys-color-state-focus-ring);\n }\n\n &.lh-active + .lh-tools__dropdown {\n clip: rect(-8px, 204px, 270px, -10px); /* stylelint-disable-line property-no-deprecated */\n }\n }\n\n .lh-tools__dropdown {\n padding: var(--sys-size-5) 0;\n border-radius: var(--sys-shape-corner-small);\n box-shadow: var(--sys-elevation-level3);\n top: 24px;\n\n &:hover a:focus {\n background-color: transparent;\n }\n\n a {\n height: var(--sys-size-11);\n padding: 0 var(--sys-size-8);\n white-space: nowrap;\n align-items: center;\n\n &::before {\n content: none;\n }\n }\n }\n\n}\n", Je = /* @__PURE__ */ e({
|
|
512
|
+
CancelledError: () => Xe,
|
|
513
|
+
ProtocolService: () => Ze
|
|
514
|
+
}), Ye = 1, Xe = class extends Error {
|
|
515
|
+
constructor() {
|
|
516
|
+
super("Lighthouse run cancelled");
|
|
517
|
+
}
|
|
518
|
+
}, Ze = class {
|
|
519
|
+
mainSessionId;
|
|
520
|
+
rootTargetId;
|
|
521
|
+
rootTarget;
|
|
522
|
+
lighthouseWorkerPromise;
|
|
523
|
+
lighthouseMessageUpdateCallback;
|
|
524
|
+
removeDialogHandler;
|
|
525
|
+
configForTesting;
|
|
526
|
+
connection;
|
|
527
|
+
#e = /* @__PURE__ */ new Map();
|
|
528
|
+
async attach() {
|
|
529
|
+
await w.instance().suspendAllTargets();
|
|
530
|
+
let e = w.instance().primaryPageTarget();
|
|
531
|
+
if (!e) throw Error("Unable to find main target required for Lighthouse");
|
|
532
|
+
let t = w.instance().rootTarget();
|
|
533
|
+
if (!t) throw Error("Could not find the root target");
|
|
534
|
+
if (!e.model(fe)) throw Error("Unable to find child target manager required for Lighthouse");
|
|
535
|
+
let n = e.model(ie);
|
|
536
|
+
if (!n) throw Error("Unable to find resource tree model required for Lighthouse");
|
|
537
|
+
let r = t.model(fe);
|
|
538
|
+
if (!r) throw Error("Could not find the child target manager class for the root target");
|
|
539
|
+
let a = t.router()?.connection;
|
|
540
|
+
if (!a) throw Error("Expected root target to have a session router");
|
|
541
|
+
let o = await r.getParentTargetId(), { sessionId: s } = await t.targetAgent().invoke_attachToTarget({
|
|
542
|
+
targetId: o,
|
|
543
|
+
flatten: !0
|
|
544
|
+
});
|
|
545
|
+
this.connection = a, this.connection.observe(this);
|
|
546
|
+
let c = e.inspectedURL(), l = i.extractOrigin(c), u = (t) => {
|
|
547
|
+
let n = i.extractOrigin(t.data.url);
|
|
548
|
+
if (!l || n !== l) {
|
|
549
|
+
console.warn(`Lighthouse auto-accept for dialog on ${t.data.url} blocked as it was not from the original audit origin ${c}.`);
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
e.pageAgent().invoke_handleJavaScriptDialog({ accept: !0 });
|
|
553
|
+
};
|
|
554
|
+
n.addEventListener(re.JavaScriptDialogOpening, u), this.removeDialogHandler = () => n.removeEventListener(re.JavaScriptDialogOpening, u), this.rootTargetId = o, this.rootTarget = t, this.mainSessionId = s;
|
|
555
|
+
}
|
|
556
|
+
getLocales() {
|
|
557
|
+
return [a.instance().locale];
|
|
558
|
+
}
|
|
559
|
+
async startTimespan(e) {
|
|
560
|
+
let { inspectedURL: t, categoryIDs: n, flags: r } = e;
|
|
561
|
+
if (!this.mainSessionId || !this.rootTargetId) throw Error("Unable to get target info required for Lighthouse");
|
|
562
|
+
await this.sendWithResponse("startTimespan", {
|
|
563
|
+
url: t,
|
|
564
|
+
categoryIDs: n,
|
|
565
|
+
flags: r,
|
|
566
|
+
config: this.configForTesting,
|
|
567
|
+
locales: this.getLocales(),
|
|
568
|
+
mainSessionId: this.mainSessionId,
|
|
569
|
+
rootTargetId: this.rootTargetId
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
async collectLighthouseResults(e) {
|
|
573
|
+
let { inspectedURL: t, categoryIDs: n, flags: r } = e;
|
|
574
|
+
if (!this.mainSessionId || !this.rootTargetId) throw Error("Unable to get target info required for Lighthouse");
|
|
575
|
+
let i = r.mode;
|
|
576
|
+
return i === "timespan" && (i = "endTimespan"), await this.sendWithResponse(i, {
|
|
577
|
+
url: t,
|
|
578
|
+
categoryIDs: n,
|
|
579
|
+
flags: r,
|
|
580
|
+
config: this.configForTesting,
|
|
581
|
+
locales: this.getLocales(),
|
|
582
|
+
mainSessionId: this.mainSessionId,
|
|
583
|
+
rootTargetId: this.rootTargetId
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
async detach() {
|
|
587
|
+
for (let e of this.#e.values()) e(new Xe());
|
|
588
|
+
this.#e.clear();
|
|
589
|
+
let e = this.lighthouseWorkerPromise, t = this.rootTarget;
|
|
590
|
+
this.lighthouseWorkerPromise = void 0, this.rootTarget = void 0, this.connection?.unobserve(this), this.connection = void 0, e && (await e).terminate(), t && this.mainSessionId && await t.targetAgent().invoke_detachFromTarget({ sessionId: this.mainSessionId }), await w.instance().resumeAllTargets(), this.removeDialogHandler?.();
|
|
591
|
+
}
|
|
592
|
+
registerStatusCallback(e) {
|
|
593
|
+
this.lighthouseMessageUpdateCallback = e;
|
|
594
|
+
}
|
|
595
|
+
onEvent(e) {
|
|
596
|
+
this.dispatchProtocolMessage(e);
|
|
597
|
+
}
|
|
598
|
+
dispatchProtocolMessage(e) {
|
|
599
|
+
(e.sessionId || "method" in e && e.method?.startsWith("Target")) && this.send("dispatchProtocolMessage", { message: e });
|
|
600
|
+
}
|
|
601
|
+
onDisconnect() {}
|
|
602
|
+
initWorker() {
|
|
603
|
+
return this.lighthouseWorkerPromise = new Promise((e) => {
|
|
604
|
+
let t = new URL("../../entrypoints/lighthouse_worker/lighthouse_worker.js", new URL("panels/lighthouse/LighthouseProtocolService.js", typeof document < "u" ? document.baseURI : new URL("../../", self.location.href).href).href), n = new URL(self.location.href).searchParams.get("remoteBase");
|
|
605
|
+
n && t.searchParams.set("remoteBase", n);
|
|
606
|
+
let r = new Worker(t, { type: "module" });
|
|
607
|
+
r.addEventListener("message", (t) => {
|
|
608
|
+
if (t.data === "workerReady") {
|
|
609
|
+
e(r);
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
this.onWorkerMessage(t);
|
|
613
|
+
});
|
|
614
|
+
}), this.lighthouseWorkerPromise;
|
|
615
|
+
}
|
|
616
|
+
async ensureWorkerExists() {
|
|
617
|
+
let e;
|
|
618
|
+
return e = this.lighthouseWorkerPromise ? await this.lighthouseWorkerPromise : await this.initWorker(), e;
|
|
619
|
+
}
|
|
620
|
+
onWorkerMessage(e) {
|
|
621
|
+
let t = e.data;
|
|
622
|
+
t.action === "statusUpdate" ? this.lighthouseMessageUpdateCallback && t.args && "message" in t.args && this.lighthouseMessageUpdateCallback(t.args.message) : t.action === "sendProtocolMessage" && t.args && "message" in t.args && this.sendProtocolMessage(t.args.message);
|
|
623
|
+
}
|
|
624
|
+
sendProtocolMessage(e) {
|
|
625
|
+
let { id: t, method: n, params: r, sessionId: i } = JSON.parse(e);
|
|
626
|
+
this.connection?.send(n, r, i).then((e) => {
|
|
627
|
+
let n = "result" in e ? {
|
|
628
|
+
id: t,
|
|
629
|
+
sessionId: i,
|
|
630
|
+
result: e.result
|
|
631
|
+
} : {
|
|
632
|
+
id: t,
|
|
633
|
+
sessionId: i,
|
|
634
|
+
error: e.error
|
|
635
|
+
};
|
|
636
|
+
this.dispatchProtocolMessage(n);
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
async send(e, t = {}) {
|
|
640
|
+
let n = await this.ensureWorkerExists(), r = Ye++;
|
|
641
|
+
n.postMessage({
|
|
642
|
+
id: r,
|
|
643
|
+
action: e,
|
|
644
|
+
args: {
|
|
645
|
+
...t,
|
|
646
|
+
id: r
|
|
647
|
+
}
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
async sendWithResponse(e, t = {}) {
|
|
651
|
+
let n = await this.ensureWorkerExists(), r = Ye++, i = new Promise((e, t) => {
|
|
652
|
+
let i = (t) => {
|
|
653
|
+
let a = t.data;
|
|
654
|
+
a.id === r && (n.removeEventListener("message", i), this.#e.delete(r), e(a.result));
|
|
655
|
+
};
|
|
656
|
+
n.addEventListener("message", i), this.#e.set(r, (e) => {
|
|
657
|
+
n.removeEventListener("message", i), t(e);
|
|
658
|
+
});
|
|
659
|
+
});
|
|
660
|
+
return n.postMessage({
|
|
661
|
+
id: r,
|
|
662
|
+
action: e,
|
|
663
|
+
args: {
|
|
664
|
+
...t,
|
|
665
|
+
id: r
|
|
666
|
+
}
|
|
667
|
+
}), await i;
|
|
668
|
+
}
|
|
669
|
+
}, Qe = .8999999999999999, $e = .5, et = .49999999999999994;
|
|
670
|
+
function tt(e) {
|
|
671
|
+
let t = Math.sign(e);
|
|
672
|
+
e = Math.abs(e);
|
|
673
|
+
let n = 1 / (1 + .3275911 * e);
|
|
674
|
+
return t * (1 - n * (.254829592 + n * (-.284496736 + n * (1.421413741 + n * (-1.453152027 + n * 1.061405429)))) * Math.exp(-e * e));
|
|
675
|
+
}
|
|
676
|
+
function nt({ median: e, p10: t }, n) {
|
|
677
|
+
if (e <= 0) throw Error("median must be greater than zero");
|
|
678
|
+
if (t <= 0) throw Error("p10 must be greater than zero");
|
|
679
|
+
if (t >= e) throw Error("p10 must be less than the median");
|
|
680
|
+
if (n <= 0) return 1;
|
|
681
|
+
let r = Math.max(Number.MIN_VALUE, n / e), i = Math.log(r), a = Math.max(Number.MIN_VALUE, t / e), o = -Math.log(a), s = (1 - tt(i * .9061938024368232 / o)) / 2, c;
|
|
682
|
+
return c = n <= t ? Math.max(.9, Math.min(1, s)) : n <= e ? Math.max($e, Math.min(Qe, s)) : Math.max(0, Math.min(et, s)), c;
|
|
683
|
+
}
|
|
684
|
+
var z = "…", rt = "\xA0", it = .9, at = {
|
|
685
|
+
PASS: {
|
|
686
|
+
label: "pass",
|
|
687
|
+
minScore: it
|
|
688
|
+
},
|
|
689
|
+
AVERAGE: {
|
|
690
|
+
label: "average",
|
|
691
|
+
minScore: .5
|
|
692
|
+
},
|
|
693
|
+
FAIL: { label: "fail" },
|
|
694
|
+
ERROR: { label: "error" }
|
|
695
|
+
}, ot = [
|
|
696
|
+
"com",
|
|
697
|
+
"co",
|
|
698
|
+
"gov",
|
|
699
|
+
"edu",
|
|
700
|
+
"ac",
|
|
701
|
+
"org",
|
|
702
|
+
"go",
|
|
703
|
+
"gob",
|
|
704
|
+
"or",
|
|
705
|
+
"net",
|
|
706
|
+
"in",
|
|
707
|
+
"ne",
|
|
708
|
+
"nic",
|
|
709
|
+
"gouv",
|
|
710
|
+
"web",
|
|
711
|
+
"spb",
|
|
712
|
+
"blog",
|
|
713
|
+
"jus",
|
|
714
|
+
"kiev",
|
|
715
|
+
"mil",
|
|
716
|
+
"wi",
|
|
717
|
+
"qc",
|
|
718
|
+
"ca",
|
|
719
|
+
"bel",
|
|
720
|
+
"on"
|
|
721
|
+
], B = class e {
|
|
722
|
+
static get RATINGS() {
|
|
723
|
+
return at;
|
|
724
|
+
}
|
|
725
|
+
static get PASS_THRESHOLD() {
|
|
726
|
+
return it;
|
|
727
|
+
}
|
|
728
|
+
static get MS_DISPLAY_VALUE() {
|
|
729
|
+
return `%10d${rt}ms`;
|
|
730
|
+
}
|
|
731
|
+
static getFinalDisplayedUrl(e) {
|
|
732
|
+
if (e.finalDisplayedUrl) return e.finalDisplayedUrl;
|
|
733
|
+
if (e.finalUrl) return e.finalUrl;
|
|
734
|
+
throw Error("Could not determine final displayed URL");
|
|
735
|
+
}
|
|
736
|
+
static getMainDocumentUrl(e) {
|
|
737
|
+
return e.mainDocumentUrl || e.finalUrl;
|
|
738
|
+
}
|
|
739
|
+
static getFullPageScreenshot(e) {
|
|
740
|
+
return e.fullPageScreenshot ? e.fullPageScreenshot : e.audits["full-page-screenshot"]?.details;
|
|
741
|
+
}
|
|
742
|
+
static getEntityFromUrl(t, n) {
|
|
743
|
+
return n && n.find((e) => e.origins.find((e) => t.startsWith(e))) || e.getPseudoRootDomain(t);
|
|
744
|
+
}
|
|
745
|
+
static splitMarkdownCodeSpans(e) {
|
|
746
|
+
let t = [], n = e.split(/`(.*?)`/g);
|
|
747
|
+
for (let e = 0; e < n.length; e++) {
|
|
748
|
+
let r = n[e];
|
|
749
|
+
if (!r) continue;
|
|
750
|
+
let i = e % 2 != 0;
|
|
751
|
+
t.push({
|
|
752
|
+
isCode: i,
|
|
753
|
+
text: r
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
return t;
|
|
757
|
+
}
|
|
758
|
+
static splitMarkdownLink(e) {
|
|
759
|
+
let t = [], n = e.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);
|
|
760
|
+
for (; n.length;) {
|
|
761
|
+
let [e, r, i] = n.splice(0, 3);
|
|
762
|
+
e && t.push({
|
|
763
|
+
isLink: !1,
|
|
764
|
+
text: e
|
|
765
|
+
}), r && i && t.push({
|
|
766
|
+
isLink: !0,
|
|
767
|
+
text: r,
|
|
768
|
+
linkHref: i
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
return t;
|
|
772
|
+
}
|
|
773
|
+
static truncate(e, t, n = "…") {
|
|
774
|
+
if (e.length <= t) return e;
|
|
775
|
+
let r = new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(e)[Symbol.iterator](), i = 0;
|
|
776
|
+
for (let a = 0; a <= t - n.length; a++) {
|
|
777
|
+
let t = r.next();
|
|
778
|
+
if (t.done) return e;
|
|
779
|
+
i = t.value.index;
|
|
780
|
+
}
|
|
781
|
+
for (let t = 0; t < n.length; t++) if (r.next().done) return e;
|
|
782
|
+
return e.slice(0, i) + n;
|
|
783
|
+
}
|
|
784
|
+
static getURLDisplayName(e, t) {
|
|
785
|
+
t ||= {
|
|
786
|
+
numPathParts: void 0,
|
|
787
|
+
preserveQuery: void 0,
|
|
788
|
+
preserveHost: void 0
|
|
789
|
+
};
|
|
790
|
+
let n = t.numPathParts === void 0 ? 2 : t.numPathParts, r = t.preserveQuery === void 0 ? !0 : t.preserveQuery, i = t.preserveHost || !1, a;
|
|
791
|
+
if (e.protocol === "about:" || e.protocol === "data:") a = e.href;
|
|
792
|
+
else {
|
|
793
|
+
a = e.pathname;
|
|
794
|
+
let t = a.split("/").filter((e) => e.length);
|
|
795
|
+
n && t.length > n && (a = z + t.slice(-1 * n).join("/")), i && (a = `${e.host}/${a.replace(/^\//, "")}`), r && (a = `${a}${e.search}`);
|
|
796
|
+
}
|
|
797
|
+
if (e.protocol !== "data:" && (a = a.slice(0, 200), a = a.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g, `$1${z}`), a = a.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g, `$1${z}`), a = a.replace(/(\d{3})\d{6,}/g, `$1${z}`), a = a.replace(/\u2026+/g, z), a.length > 64 && a.includes("?") && (a = a.replace(/\?([^=]*)(=)?.*/, `?$1$2${z}`), a.length > 64 && (a = a.replace(/\?.*/, `?${z}`)))), a.length > 64) {
|
|
798
|
+
let e = a.lastIndexOf(".");
|
|
799
|
+
a = e >= 0 ? a.slice(0, 63 - (a.length - e)) + `${z}${a.slice(e)}` : a.slice(0, 63) + z;
|
|
800
|
+
}
|
|
801
|
+
return a;
|
|
802
|
+
}
|
|
803
|
+
static getChromeExtensionOrigin(e) {
|
|
804
|
+
let t = new URL(e);
|
|
805
|
+
return t.protocol + "//" + t.host;
|
|
806
|
+
}
|
|
807
|
+
static parseURL(t) {
|
|
808
|
+
let n = new URL(t);
|
|
809
|
+
return {
|
|
810
|
+
file: e.getURLDisplayName(n),
|
|
811
|
+
hostname: n.hostname,
|
|
812
|
+
origin: n.protocol === "chrome-extension:" ? e.getChromeExtensionOrigin(t) : n.origin
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
static createOrReturnURL(e) {
|
|
816
|
+
return e instanceof URL ? e : new URL(e);
|
|
817
|
+
}
|
|
818
|
+
static getPseudoTld(e) {
|
|
819
|
+
let t = e.split(".").slice(-2);
|
|
820
|
+
return ot.includes(t[0]) ? `.${t.join(".")}` : `.${t[t.length - 1]}`;
|
|
821
|
+
}
|
|
822
|
+
static getPseudoRootDomain(t) {
|
|
823
|
+
let n = e.createOrReturnURL(t).hostname, r = e.getPseudoTld(n).split(".");
|
|
824
|
+
return n.split(".").slice(-r.length).join(".");
|
|
825
|
+
}
|
|
826
|
+
static filterRelevantLines(e, t, n) {
|
|
827
|
+
if (t.length === 0) return e.slice(0, n * 2 + 1);
|
|
828
|
+
let r = /* @__PURE__ */ new Set();
|
|
829
|
+
return t = t.sort((e, t) => (e.lineNumber || 0) - (t.lineNumber || 0)), t.forEach(({ lineNumber: e }) => {
|
|
830
|
+
let t = e - n, i = e + n;
|
|
831
|
+
for (; t < 1;) t++, i++;
|
|
832
|
+
r.has(t - 3 - 1) && (t -= 3);
|
|
833
|
+
for (let e = t; e <= i; e++) {
|
|
834
|
+
let t = e;
|
|
835
|
+
r.add(t);
|
|
836
|
+
}
|
|
837
|
+
}), e.filter((e) => r.has(e.lineNumber));
|
|
838
|
+
}
|
|
839
|
+
static computeLogNormalScore(e, t) {
|
|
840
|
+
let n = nt(e, t);
|
|
841
|
+
return n > .9 && (n += .05 * (n - .9)), Math.floor(n * 100) / 100;
|
|
842
|
+
}
|
|
843
|
+
};
|
|
844
|
+
function st(e) {
|
|
845
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
846
|
+
n.append("\n .lh-3p-filter {\n color: var(--color-gray-600);\n float: right;\n padding: 6px var(--stackpack-padding-horizontal);\n }\n .lh-3p-filter-label, .lh-3p-filter-input {\n vertical-align: middle;\n user-select: none;\n }\n .lh-3p-filter-input:disabled + .lh-3p-ui-string {\n text-decoration: line-through;\n }\n "), t.append(n);
|
|
847
|
+
let r = e.createElement("div", "lh-3p-filter"), i = e.createElement("label", "lh-3p-filter-label"), a = e.createElement("input", "lh-3p-filter-input");
|
|
848
|
+
a.setAttribute("type", "checkbox"), a.setAttribute("checked", "");
|
|
849
|
+
let o = e.createElement("span", "lh-3p-ui-string");
|
|
850
|
+
o.append("Show 3rd party resources");
|
|
851
|
+
let s = e.createElement("span", "lh-3p-filter-count");
|
|
852
|
+
return i.append(" ", a, " ", o, " (", s, ") "), r.append(" ", i, " "), t.append(r), t;
|
|
853
|
+
}
|
|
854
|
+
function ct(e) {
|
|
855
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-audit"), r = e.createElement("details", "lh-expandable-details"), i = e.createElement("summary"), a = e.createElement("div", "lh-audit__header lh-expandable-details__summary"), o = e.createElement("span", "lh-audit__score-icon"), s = e.createElement("span", "lh-audit__title-and-text"), c = e.createElement("span", "lh-audit__title"), l = e.createElement("span", "lh-audit__display-text");
|
|
856
|
+
s.append(" ", c, " ", l, " ");
|
|
857
|
+
let u = e.createElement("div", "lh-chevron-container");
|
|
858
|
+
a.append(" ", o, " ", s, " ", u, " "), i.append(" ", a, " ");
|
|
859
|
+
let d = e.createElement("div", "lh-audit__description"), f = e.createElement("div", "lh-audit__stackpacks");
|
|
860
|
+
return r.append(" ", i, " ", d, " ", f, " "), n.append(" ", r, " "), t.append(n), t;
|
|
861
|
+
}
|
|
862
|
+
function lt(e) {
|
|
863
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-category-header"), r = e.createElement("div", "lh-score__gauge");
|
|
864
|
+
r.setAttribute("role", "heading"), r.setAttribute("aria-level", "2");
|
|
865
|
+
let i = e.createElement("div", "lh-category-header__description");
|
|
866
|
+
return n.append(" ", r, " ", i, " "), t.append(n), t;
|
|
867
|
+
}
|
|
868
|
+
function ut(e) {
|
|
869
|
+
let t = e.createFragment(), n = e.createElementNS("http://www.w3.org/2000/svg", "svg", "lh-chevron");
|
|
870
|
+
n.setAttribute("viewBox", "0 0 100 100");
|
|
871
|
+
let r = e.createElementNS("http://www.w3.org/2000/svg", "g", "lh-chevron__lines"), i = e.createElementNS("http://www.w3.org/2000/svg", "path", "lh-chevron__line lh-chevron__line-left");
|
|
872
|
+
i.setAttribute("d", "M10 50h40");
|
|
873
|
+
let a = e.createElementNS("http://www.w3.org/2000/svg", "path", "lh-chevron__line lh-chevron__line-right");
|
|
874
|
+
return a.setAttribute("d", "M90 50H50"), r.append(" ", i, " ", a, " "), n.append(" ", r, " "), t.append(n), t;
|
|
875
|
+
}
|
|
876
|
+
function dt(e) {
|
|
877
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-audit-group"), r = e.createElement("details", "lh-clump"), i = e.createElement("summary"), a = e.createElement("div", "lh-audit-group__summary"), o = e.createElement("div", "lh-audit-group__header"), s = e.createElement("span", "lh-audit-group__title"), c = e.createElement("span", "lh-audit-group__itemcount");
|
|
878
|
+
o.append(" ", s, " ", c, " ", " ", " ");
|
|
879
|
+
let l = e.createElement("div", "lh-clump-toggle"), u = e.createElement("span", "lh-clump-toggletext--show"), d = e.createElement("span", "lh-clump-toggletext--hide");
|
|
880
|
+
return l.append(" ", u, " ", d, " "), a.append(" ", o, " ", l, " "), i.append(" ", a, " "), r.append(" ", i, " "), n.append(" ", " ", r, " "), t.append(n), t;
|
|
881
|
+
}
|
|
882
|
+
function ft(e) {
|
|
883
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-crc-container"), r = e.createElement("style");
|
|
884
|
+
r.append("\n .lh-crc .lh-tree-marker {\n width: 12px;\n height: 26px;\n display: block;\n float: left;\n background-position: top left;\n }\n .lh-crc .lh-horiz-down {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"%23D8D8D8\" fill-rule=\"evenodd\"><path d=\"M16 12v2H-2v-2z\"/><path d=\"M9 12v14H7V12z\"/></g></svg>');\n }\n .lh-crc .lh-right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 12v2H0v-2z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .lh-up-right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v14H7zm2 12h7v2H9z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .lh-vert-right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v27H7zm2 12h7v2H9z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .lh-vert {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v26H7z\" fill=\"%23D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .lh-crc-tree {\n font-size: 14px;\n width: 100%;\n overflow-x: auto;\n }\n .lh-crc .lh-crc-node {\n height: 26px;\n line-height: 26px;\n white-space: nowrap;\n }\n .lh-crc .lh-crc-node__longest {\n color: var(--color-average-secondary);\n }\n .lh-crc .lh-crc-node__tree-value {\n margin-left: 10px;\n }\n .lh-crc .lh-crc-node__tree-value div {\n display: inline;\n }\n .lh-crc .lh-crc-node__chain-duration {\n font-weight: 700;\n }\n .lh-crc .lh-crc-initial-nav {\n color: #595959;\n font-style: italic;\n }\n .lh-crc__summary-value {\n margin-bottom: 10px;\n }\n ");
|
|
885
|
+
let i = e.createElement("div"), a = e.createElement("div", "lh-crc__summary-value"), o = e.createElement("span", "lh-crc__longest_duration_label"), s = e.createElement("b", "lh-crc__longest_duration");
|
|
886
|
+
a.append(" ", o, " ", s, " "), i.append(" ", a, " ");
|
|
887
|
+
let c = e.createElement("div", "lh-crc"), l = e.createElement("div", "lh-crc-initial-nav");
|
|
888
|
+
return c.append(" ", l, " ", " "), n.append(" ", r, " ", i, " ", c, " "), t.append(n), t;
|
|
889
|
+
}
|
|
890
|
+
function pt(e) {
|
|
891
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-crc-node"), r = e.createElement("span", "lh-crc-node__tree-marker"), i = e.createElement("span", "lh-crc-node__tree-value");
|
|
892
|
+
return n.append(" ", r, " ", i, " "), t.append(n), t;
|
|
893
|
+
}
|
|
894
|
+
function mt(e) {
|
|
895
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-element-screenshot"), r = e.createElement("div", "lh-element-screenshot__content"), i = e.createElement("div", "lh-element-screenshot__image"), a = e.createElement("div", "lh-element-screenshot__mask"), o = e.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
896
|
+
o.setAttribute("height", "0"), o.setAttribute("width", "0");
|
|
897
|
+
let s = e.createElementNS("http://www.w3.org/2000/svg", "defs"), c = e.createElementNS("http://www.w3.org/2000/svg", "clipPath");
|
|
898
|
+
c.setAttribute("clipPathUnits", "objectBoundingBox"), s.append(" ", c, " ", " "), o.append(" ", s, " "), a.append(" ", o, " ");
|
|
899
|
+
let l = e.createElement("div", "lh-element-screenshot__element-marker");
|
|
900
|
+
return i.append(" ", a, " ", l, " "), r.append(" ", i, " "), n.append(" ", r, " "), t.append(n), t;
|
|
901
|
+
}
|
|
902
|
+
function ht(e) {
|
|
903
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-exp-gauge-component"), r = e.createElement("div", "lh-exp-gauge__wrapper");
|
|
904
|
+
r.setAttribute("target", "_blank");
|
|
905
|
+
let i = e.createElement("div", "lh-exp-gauge__svg-wrapper"), a = e.createElementNS("http://www.w3.org/2000/svg", "svg", "lh-exp-gauge"), o = e.createElementNS("http://www.w3.org/2000/svg", "g", "lh-exp-gauge__inner"), s = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-exp-gauge__bg"), c = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-exp-gauge__base lh-exp-gauge--faded"), l = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-exp-gauge__arc"), u = e.createElementNS("http://www.w3.org/2000/svg", "text", "lh-exp-gauge__percentage");
|
|
906
|
+
o.append(" ", s, " ", c, " ", l, " ", u, " ");
|
|
907
|
+
let d = e.createElementNS("http://www.w3.org/2000/svg", "g", "lh-exp-gauge__outer"), f = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-cover");
|
|
908
|
+
d.append(" ", f, " ");
|
|
909
|
+
let p = e.createElementNS("http://www.w3.org/2000/svg", "text", "lh-exp-gauge__label");
|
|
910
|
+
return p.setAttribute("text-anchor", "middle"), p.setAttribute("x", "0"), p.setAttribute("y", "60"), a.append(" ", o, " ", d, " ", p, " "), i.append(" ", a, " "), r.append(" ", i, " "), n.append(" ", r, " "), t.append(n), t;
|
|
911
|
+
}
|
|
912
|
+
function gt(e) {
|
|
913
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
914
|
+
n.append("\n .lh-footer {\n padding: var(--footer-padding-vertical) calc(var(--default-padding) * 2);\n max-width: var(--report-content-max-width);\n margin: 0 auto;\n }\n .lh-footer .lh-generated {\n text-align: center;\n }\n "), t.append(n);
|
|
915
|
+
let r = e.createElement("footer", "lh-footer"), i = e.createElement("ul", "lh-meta__items");
|
|
916
|
+
i.append(" ");
|
|
917
|
+
let a = e.createElement("div", "lh-generated"), o = e.createElement("b");
|
|
918
|
+
o.append("Lighthouse");
|
|
919
|
+
let s = e.createElement("span", "lh-footer__version"), c = e.createElement("a", "lh-footer__version_issue");
|
|
920
|
+
return c.setAttribute("href", "https://github.com/GoogleChrome/Lighthouse/issues"), c.setAttribute("target", "_blank"), c.setAttribute("rel", "noopener"), c.append("File an issue"), a.append(" ", " Generated by ", o, " ", s, " | ", c, " "), r.append(" ", i, " ", a, " "), t.append(r), t;
|
|
921
|
+
}
|
|
922
|
+
function _t(e) {
|
|
923
|
+
let t = e.createFragment(), n = e.createElement("a", "lh-fraction__wrapper"), r = e.createElement("div", "lh-fraction__content-wrapper"), i = e.createElement("div", "lh-fraction__content"), a = e.createElement("div", "lh-fraction__background");
|
|
924
|
+
i.append(" ", a, " "), r.append(" ", i, " ");
|
|
925
|
+
let o = e.createElement("div", "lh-fraction__label");
|
|
926
|
+
return n.append(" ", r, " ", o, " "), t.append(n), t;
|
|
927
|
+
}
|
|
928
|
+
function vt(e) {
|
|
929
|
+
let t = e.createFragment(), n = e.createElement("a", "lh-gauge__wrapper"), r = e.createElement("div", "lh-gauge__svg-wrapper"), i = e.createElementNS("http://www.w3.org/2000/svg", "svg", "lh-gauge");
|
|
930
|
+
i.setAttribute("viewBox", "0 0 120 120");
|
|
931
|
+
let a = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-gauge-base");
|
|
932
|
+
a.setAttribute("r", "56"), a.setAttribute("cx", "60"), a.setAttribute("cy", "60"), a.setAttribute("stroke-width", "8");
|
|
933
|
+
let o = e.createElementNS("http://www.w3.org/2000/svg", "circle", "lh-gauge-arc");
|
|
934
|
+
o.setAttribute("r", "56"), o.setAttribute("cx", "60"), o.setAttribute("cy", "60"), o.setAttribute("stroke-width", "8"), i.append(" ", a, " ", o, " "), r.append(" ", i, " ");
|
|
935
|
+
let s = e.createElement("div", "lh-gauge__percentage"), c = e.createElement("div", "lh-gauge__label");
|
|
936
|
+
return n.append(" ", " ", r, " ", s, " ", " ", c, " "), t.append(n), t;
|
|
937
|
+
}
|
|
938
|
+
function yt(e) {
|
|
939
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
940
|
+
n.append("\n /* CSS Fireworks. Originally by Eddie Lin\n https://codepen.io/paulirish/pen/yEVMbP\n */\n .lh-pyro {\n display: none;\n z-index: 1;\n pointer-events: none;\n }\n .lh-score100 .lh-pyro {\n display: block;\n }\n .lh-score100 .lh-lighthouse stop:first-child {\n stop-color: hsla(200, 12%, 95%, 0);\n }\n .lh-score100 .lh-lighthouse stop:last-child {\n stop-color: hsla(65, 81%, 76%, 1);\n }\n\n .lh-pyro > .lh-pyro-before, .lh-pyro > .lh-pyro-after {\n position: absolute;\n width: 5px;\n height: 5px;\n border-radius: 2.5px;\n box-shadow: 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff, 0 0 #fff;\n animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;\n animation-delay: 1s, 1s, 1s;\n }\n\n .lh-pyro > .lh-pyro-after {\n animation-delay: 2.25s, 2.25s, 2.25s;\n animation-duration: 1.25s, 1.25s, 6.25s;\n }\n\n @keyframes bang {\n to {\n opacity: 1;\n box-shadow: -70px -115.67px #47ebbc, -28px -99.67px #eb47a4, 58px -31.67px #7eeb47, 13px -141.67px #eb47c5, -19px 6.33px #7347eb, -2px -74.67px #ebd247, 24px -151.67px #eb47e0, 57px -138.67px #b4eb47, -51px -104.67px #479eeb, 62px 8.33px #ebcf47, -93px 0.33px #d547eb, -16px -118.67px #47bfeb, 53px -84.67px #47eb83, 66px -57.67px #eb47bf, -93px -65.67px #91eb47, 30px -13.67px #86eb47, -2px -59.67px #83eb47, -44px 1.33px #eb47eb, 61px -58.67px #47eb73, 5px -22.67px #47e8eb, -66px -28.67px #ebe247, 42px -123.67px #eb5547, -75px 26.33px #7beb47, 15px -52.67px #a147eb, 36px -51.67px #eb8347, -38px -12.67px #eb5547, -46px -59.67px #47eb81, 78px -114.67px #eb47ba, 15px -156.67px #eb47bf, -36px 1.33px #eb4783, -72px -86.67px #eba147, 31px -46.67px #ebe247, -68px 29.33px #47e2eb, -55px 19.33px #ebe047, -56px 27.33px #4776eb, -13px -91.67px #eb5547, -47px -138.67px #47ebc7, -18px -96.67px #eb47ac, 11px -88.67px #4783eb, -67px -28.67px #47baeb, 53px 10.33px #ba47eb, 11px 19.33px #5247eb, -5px -11.67px #eb4791, -68px -4.67px #47eba7, 95px -37.67px #eb478b, -67px -162.67px #eb5d47, -54px -120.67px #eb6847, 49px -12.67px #ebe047, 88px 8.33px #47ebda, 97px 33.33px #eb8147, 6px -71.67px #ebbc47;\n }\n }\n @keyframes gravity {\n from {\n opacity: 1;\n }\n to {\n transform: translateY(80px);\n opacity: 0;\n }\n }\n @keyframes position {\n 0%, 19.9% {\n margin-top: 4%;\n margin-left: 47%;\n }\n 20%, 39.9% {\n margin-top: 7%;\n margin-left: 30%;\n }\n 40%, 59.9% {\n margin-top: 6%;\n margin-left: 70%;\n }\n 60%, 79.9% {\n margin-top: 3%;\n margin-left: 20%;\n }\n 80%, 99.9% {\n margin-top: 3%;\n margin-left: 80%;\n }\n }\n "), t.append(n);
|
|
941
|
+
let r = e.createElement("div", "lh-header-container"), i = e.createElement("div", "lh-scores-wrapper-placeholder");
|
|
942
|
+
return r.append(" ", i, " "), t.append(r), t;
|
|
943
|
+
}
|
|
944
|
+
function bt(e) {
|
|
945
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-metric"), r = e.createElement("div", "lh-metric__innerwrap"), i = e.createElement("div", "lh-metric__icon"), a = e.createElement("span", "lh-metric__title"), o = e.createElement("div", "lh-metric__value"), s = e.createElement("div", "lh-metric__description");
|
|
946
|
+
return r.append(" ", i, " ", a, " ", o, " ", s, " "), n.append(" ", r, " "), t.append(n), t;
|
|
947
|
+
}
|
|
948
|
+
function xt(e) {
|
|
949
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-scorescale"), r = e.createElement("span", "lh-scorescale-range lh-scorescale-range--fail");
|
|
950
|
+
r.append("0–49");
|
|
951
|
+
let i = e.createElement("span", "lh-scorescale-range lh-scorescale-range--average");
|
|
952
|
+
i.append("50–89");
|
|
953
|
+
let a = e.createElement("span", "lh-scorescale-range lh-scorescale-range--pass");
|
|
954
|
+
return a.append("90–100"), n.append(" ", r, " ", i, " ", a, " "), t.append(n), t;
|
|
955
|
+
}
|
|
956
|
+
function St(e) {
|
|
957
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
958
|
+
n.append("\n .lh-scores-container {\n display: flex;\n flex-direction: column;\n padding: var(--default-padding) 0;\n position: relative;\n width: 100%;\n }\n\n .lh-sticky-header {\n --gauge-circle-size: var(--gauge-circle-size-sm);\n --plugin-badge-size: 16px;\n --plugin-icon-size: 75%;\n --gauge-wrapper-width: 60px;\n --gauge-percentage-font-size: 13px;\n position: fixed;\n left: 0;\n right: 0;\n top: var(--topbar-height);\n font-weight: 500;\n display: none;\n justify-content: center;\n background-color: var(--sticky-header-background-color);\n border-bottom: 1px solid var(--color-gray-200);\n padding-top: var(--score-container-padding);\n padding-bottom: 4px;\n z-index: 2;\n pointer-events: none;\n }\n\n .lh-devtools .lh-sticky-header {\n /* The report within DevTools is placed in a container with overflow, which changes the placement of this header unless we change `position` to `sticky.` */\n position: sticky;\n }\n\n .lh-sticky-header--visible {\n display: grid;\n grid-auto-flow: column;\n pointer-events: auto;\n }\n\n /* Disable the gauge arc animation for the sticky header, so toggling display: none\n does not play the animation. */\n .lh-sticky-header .lh-gauge-arc {\n animation: none;\n }\n\n .lh-sticky-header .lh-gauge__label,\n .lh-sticky-header .lh-fraction__label {\n display: none;\n }\n\n .lh-highlighter {\n width: var(--gauge-wrapper-width);\n height: 1px;\n background-color: var(--highlighter-background-color);\n /* Position at bottom of first gauge in sticky header. */\n position: absolute;\n grid-column: 1;\n bottom: -1px;\n left: 0px;\n right: 0px;\n }\n "), t.append(n);
|
|
959
|
+
let r = e.createElement("div", "lh-scores-wrapper"), i = e.createElement("div", "lh-scores-container"), a = e.createElement("div", "lh-pyro"), o = e.createElement("div", "lh-pyro-before"), s = e.createElement("div", "lh-pyro-after");
|
|
960
|
+
return a.append(" ", o, " ", s, " "), i.append(" ", a, " "), r.append(" ", i, " "), t.append(r), t;
|
|
961
|
+
}
|
|
962
|
+
function Ct(e) {
|
|
963
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-snippet"), r = e.createElement("style");
|
|
964
|
+
return r.append("\n :root {\n --snippet-highlight-light: #fbf1f2;\n --snippet-highlight-dark: #ffd6d8;\n }\n\n .lh-snippet__header {\n position: relative;\n overflow: hidden;\n padding: 10px;\n border-bottom: none;\n color: var(--snippet-color);\n background-color: var(--snippet-background-color);\n border: 1px solid var(--report-border-color-secondary);\n }\n .lh-snippet__title {\n font-weight: bold;\n float: left;\n }\n .lh-snippet__node {\n float: left;\n margin-left: 4px;\n }\n .lh-snippet__toggle-expand {\n padding: 1px 7px;\n margin-top: -1px;\n margin-right: -7px;\n float: right;\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 14px;\n color: #0c50c7;\n }\n\n .lh-snippet__snippet {\n overflow: auto;\n border: 1px solid var(--report-border-color-secondary);\n }\n /* Container needed so that all children grow to the width of the scroll container */\n .lh-snippet__snippet-inner {\n display: inline-block;\n min-width: 100%;\n }\n\n .lh-snippet:not(.lh-snippet--expanded) .lh-snippet__show-if-expanded {\n display: none;\n }\n .lh-snippet.lh-snippet--expanded .lh-snippet__show-if-collapsed {\n display: none;\n }\n\n .lh-snippet__line {\n background: white;\n white-space: pre;\n display: flex;\n }\n .lh-snippet__line:not(.lh-snippet__line--message):first-child {\n padding-top: 4px;\n }\n .lh-snippet__line:not(.lh-snippet__line--message):last-child {\n padding-bottom: 4px;\n }\n .lh-snippet__line--content-highlighted {\n background: var(--snippet-highlight-dark);\n }\n .lh-snippet__line--message {\n background: var(--snippet-highlight-light);\n }\n .lh-snippet__line--message .lh-snippet__line-number {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n .lh-snippet__line--message code {\n padding: 10px;\n padding-left: 5px;\n color: var(--color-fail);\n font-family: var(--report-font-family);\n }\n .lh-snippet__line--message code {\n white-space: normal;\n }\n .lh-snippet__line-icon {\n padding-top: 10px;\n display: none;\n }\n .lh-snippet__line--message .lh-snippet__line-icon {\n display: block;\n }\n .lh-snippet__line-icon:before {\n content: \"\";\n display: inline-block;\n vertical-align: middle;\n margin-right: 4px;\n width: var(--score-icon-size);\n height: var(--score-icon-size);\n background-image: var(--fail-icon-url);\n }\n .lh-snippet__line-number {\n flex-shrink: 0;\n width: 40px;\n text-align: right;\n font-family: monospace;\n padding-right: 5px;\n margin-right: 5px;\n color: var(--color-gray-600);\n user-select: none;\n }\n "), n.append(" ", r, " "), t.append(n), t;
|
|
965
|
+
}
|
|
966
|
+
function wt(e) {
|
|
967
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-snippet__snippet"), r = e.createElement("div", "lh-snippet__snippet-inner");
|
|
968
|
+
return n.append(" ", r, " "), t.append(n), t;
|
|
969
|
+
}
|
|
970
|
+
function Tt(e) {
|
|
971
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-snippet__header"), r = e.createElement("div", "lh-snippet__title"), i = e.createElement("div", "lh-snippet__node"), a = e.createElement("button", "lh-snippet__toggle-expand"), o = e.createElement("span", "lh-snippet__btn-label-collapse lh-snippet__show-if-expanded"), s = e.createElement("span", "lh-snippet__btn-label-expand lh-snippet__show-if-collapsed");
|
|
972
|
+
return a.append(" ", o, " ", s, " "), n.append(" ", r, " ", i, " ", a, " "), t.append(n), t;
|
|
973
|
+
}
|
|
974
|
+
function Et(e) {
|
|
975
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-snippet__line"), r = e.createElement("div", "lh-snippet__line-number"), i = e.createElement("div", "lh-snippet__line-icon"), a = e.createElement("code");
|
|
976
|
+
return n.append(" ", r, " ", i, " ", a, " "), t.append(n), t;
|
|
977
|
+
}
|
|
978
|
+
function Dt(e) {
|
|
979
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
980
|
+
return n.append("/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/*\n Naming convention:\n\n If a variable is used for a specific component: --{component}-{property name}-{modifier}\n\n Both {component} and {property name} should be kebab-case. If the target is the entire page,\n use 'report' for the component. The property name should not be abbreviated. Use the\n property name the variable is intended for - if it's used for multiple, a common descriptor\n is fine (ex: 'size' for a variable applied to 'width' and 'height'). If a variable is shared\n across multiple components, either create more variables or just drop the \"{component}-\"\n part of the name. Append any modifiers at the end (ex: 'big', 'dark').\n\n For colors: --color-{hue}-{intensity}\n\n {intensity} is the Material Design tag - 700, A700, etc.\n*/\n.lh-vars {\n /* Palette using Material Design Colors\n * https://www.materialui.co/colors */\n --color-amber-50: #FFF8E1;\n --color-blue-200: #90CAF9;\n --color-blue-900: #0D47A1;\n --color-blue-A700: #2962FF;\n --color-blue-primary: #06f;\n --color-cyan-500: #00BCD4;\n --color-gray-100: #F5F5F5;\n --color-gray-300: #CFCFCF;\n --color-gray-200: #E0E0E0;\n --color-gray-400: #BDBDBD;\n --color-gray-50: #FAFAFA;\n --color-gray-500: #9E9E9E;\n --color-gray-600: #757575;\n --color-gray-700: #616161;\n --color-gray-800: #424242;\n --color-gray-900: #212121;\n --color-gray: #000000;\n --color-green-700: #080;\n --color-green: #0c6;\n --color-lime-400: #D3E156;\n --color-orange-50: #FFF3E0;\n --color-orange-700: #C33300;\n --color-orange: #fa3;\n --color-red-700: #c00;\n --color-red: #f33;\n --color-teal-600: #00897B;\n --color-white: #FFFFFF;\n\n /* Context-specific colors */\n --color-average-secondary: var(--color-orange-700);\n --color-average: var(--color-orange);\n --color-fail-secondary: var(--color-red-700);\n --color-fail: var(--color-red);\n --color-hover: var(--color-gray-50);\n --color-informative: var(--color-blue-900);\n --color-pass-secondary: var(--color-green-700);\n --color-pass: var(--color-green);\n --color-not-applicable: var(--color-gray-600);\n\n /* Component variables */\n --audit-description-padding-left: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right));\n --audit-explanation-line-height: 16px;\n --audit-group-margin-bottom: calc(var(--default-padding) * 6);\n --audit-group-padding-vertical: 8px;\n --audit-margin-horizontal: 5px;\n --audit-padding-vertical: 8px;\n --category-padding: calc(var(--default-padding) * 6) var(--edge-gap-padding) calc(var(--default-padding) * 4);\n --chevron-line-stroke: var(--color-gray-600);\n --chevron-size: 12px;\n --default-padding: 8px;\n --edge-gap-padding: calc(var(--default-padding) * 4);\n --env-item-background-color: var(--color-gray-100);\n --env-item-font-size: 28px;\n --env-item-line-height: 36px;\n --env-item-padding: 10px 0px;\n --env-name-min-width: 220px;\n --footer-padding-vertical: 16px;\n --gauge-circle-size-big: 96px;\n --gauge-circle-size: 48px;\n --gauge-circle-size-sm: 32px;\n --gauge-label-font-size-big: 18px;\n --gauge-label-font-size: var(--report-font-size-secondary);\n --gauge-label-line-height-big: 24px;\n --gauge-label-line-height: var(--report-line-height-secondary);\n --gauge-percentage-font-size-big: 38px;\n --gauge-percentage-font-size: var(--report-font-size-secondary);\n --gauge-wrapper-width: 120px;\n --header-line-height: 24px;\n --highlighter-background-color: var(--report-text-color);\n --icon-square-size: calc(var(--score-icon-size) * 0.88);\n --image-preview-size: 48px;\n --link-color: var(--color-blue-primary);\n --locale-selector-background-color: var(--color-white);\n --metric-toggle-lines-fill: #7F7F7F;\n --metric-value-font-size: calc(var(--report-font-size) * 1.8);\n --metrics-toggle-background-color: var(--color-gray-200);\n --plugin-badge-background-color: var(--color-white);\n --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);\n --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);\n --plugin-icon-size: 65%;\n --report-background-color: #fff;\n --report-border-color-secondary: #ebebeb;\n --report-font-family-monospace: monospace, 'Roboto Mono', 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console';\n --report-font-family: system-ui, Roboto, Helvetica, Arial, sans-serif;\n --report-font-size: 14px;\n --report-font-size-secondary: 12px;\n --report-icon-size: var(--score-icon-background-size);\n --report-line-height: 24px;\n --report-line-height-secondary: 20px;\n --report-monospace-font-size: calc(var(--report-font-size) * 0.85);\n --report-text-color-secondary: var(--color-gray-800);\n --report-text-color: var(--color-gray-900);\n --report-content-max-width: calc(60 * var(--report-font-size)); /* defaults to 840px */\n --report-content-min-width: 360px;\n --report-content-max-width-minus-edge-gap: calc(var(--report-content-max-width) - var(--edge-gap-padding) * 2);\n --score-container-padding: 8px;\n --score-icon-background-size: 24px;\n --score-icon-margin-left: 6px;\n --score-icon-margin-right: 14px;\n --score-icon-margin: 0 var(--score-icon-margin-right) 0 var(--score-icon-margin-left);\n --score-icon-size: 12px;\n --score-icon-size-big: 16px;\n --screenshot-overlay-background: rgba(0, 0, 0, 0.3);\n --section-padding-vertical: calc(var(--default-padding) * 6);\n --snippet-background-color: var(--color-gray-50);\n --snippet-color: #0938C2;\n --stackpack-padding-horizontal: 10px;\n --sticky-header-background-color: var(--report-background-color);\n --sticky-header-buffer: var(--topbar-height);\n --sticky-header-height: calc(var(--gauge-circle-size-sm) + var(--score-container-padding) * 2 + 1em);\n --table-group-header-background-color: #EEF1F4;\n --table-group-header-text-color: var(--color-gray-700);\n --table-higlight-background-color: #F5F7FA;\n --tools-icon-color: var(--color-gray-600);\n --topbar-background-color: var(--color-white);\n --topbar-height: 32px;\n --topbar-logo-size: 24px;\n --topbar-padding: 0 8px;\n --toplevel-warning-background-color: hsla(30, 100%, 75%, 10%);\n --toplevel-warning-message-text-color: var(--color-average-secondary);\n --toplevel-warning-padding: 18px;\n --toplevel-warning-text-color: var(--report-text-color);\n\n /* SVGs */\n --plugin-icon-url-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"%23FFFFFF\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z\"/></svg>');\n --plugin-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"%23757575\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z\"/></svg>');\n\n --pass-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>check</title><path fill=\"%23178239\" d=\"M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z\"/></svg>');\n --average-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>info</title><path fill=\"%23E67700\" d=\"M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm2 30h-4V22h4v12zm0-16h-4v-4h4v4z\"/></svg>');\n --fail-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><title>warn</title><path fill=\"%23C7221F\" d=\"M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z\"/></svg>');\n --error-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 3 15\"><title>error</title><path d=\"M0 15H 3V 12H 0V\" fill=\"%23FF4E42\"/><path d=\"M0 9H 3V 0H 0V\" fill=\"%23FF4E42\"/></svg>');\n\n --swap-locale-icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"%23000000\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z\"/></svg>');\n \n --baseline-high-icon-url: url(\"data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M420 30L390 60L480 150L390 240L330 180L300 210L390 300L540 150L420 30Z' fill='%23C4EED0'/> <path d='M150 0L30 120L60 150L150 60L210 120L240 90L150 0Z' fill='%23C4EED0'/> <path d='M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z' fill='%231EA446'/> </svg>\");\n --baseline-low-icon-url: url(\"data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M150 0L180 30L150 60L120 30L150 0Z' fill='%23A8C7FA'/> <path d='M210 60L240 90L210 120L180 90L210 60Z' fill='%23A8C7FA'/> <path d='M450 60L480 90L450 120L420 90L450 60Z' fill='%23A8C7FA'/> <path d='M510 120L540 150L510 180L480 150L510 120Z' fill='%23A8C7FA'/> <path d='M450 180L480 210L450 240L420 210L450 180Z' fill='%23A8C7FA'/> <path d='M390 240L420 270L390 300L360 270L390 240Z' fill='%23A8C7FA'/> <path d='M330 180L360 210L330 240L300 210L330 180Z' fill='%23A8C7FA'/> <path d='M90 60L120 90L90 120L60 90L90 60Z' fill='%23A8C7FA'/> <path d='M390 0L420 30L150 300L0 150L30 120L150 240L390 0Z' fill='%231B6EF3'/> </svg>\");\n --baseline-limited-icon-url: url(\"data:image/svg+xml;utf8,<svg width='18' height='10' viewBox='0 0 540 300' fill='none' xmlns='http://www.w3.org/2000/svg'> <path d='M150 0L240 90L210 120L120 30L150 0Z' fill='%23F09409'/> <path d='M420 30L540 150L420 270L390 240L480 150L390 60L420 30Z' fill='%23C6C6C6'/> <path d='M330 180L300 210L390 300L420 270L330 180Z' fill='%23F09409'/> <path d='M120 30L150 60L60 150L150 240L120 270L0 150L120 30Z' fill='%23C6C6C6'/> <path d='M390 0L420 30L150 300L120 270L390 0Z' fill='%23F09409'/> </svg>\");\n}\n\n@media not print {\n .lh-dark {\n /* Pallete */\n --color-gray-200: var(--color-gray-800);\n --color-gray-300: #616161;\n --color-gray-400: var(--color-gray-600);\n --color-gray-700: var(--color-gray-400);\n --color-gray-50: #757575;\n --color-gray-600: var(--color-gray-500);\n --color-green-700: var(--color-green);\n --color-orange-700: var(--color-orange);\n --color-red-700: var(--color-red);\n --color-teal-600: var(--color-cyan-500);\n\n /* Context-specific colors */\n --color-hover: rgba(0, 0, 0, 0.2);\n --color-informative: var(--color-blue-200);\n\n /* Component variables */\n --env-item-background-color: #393535;\n --link-color: var(--color-blue-200);\n --locale-selector-background-color: var(--color-gray-200);\n --plugin-badge-background-color: var(--color-gray-800);\n --report-background-color: var(--color-gray-900);\n --report-border-color-secondary: var(--color-gray-200);\n --report-text-color-secondary: var(--color-gray-400);\n --report-text-color: var(--color-gray-100);\n --snippet-color: var(--color-cyan-500);\n --topbar-background-color: var(--color-gray);\n --toplevel-warning-background-color: hsl(33deg 14% 18%);\n --toplevel-warning-message-text-color: var(--color-orange-700);\n --toplevel-warning-text-color: var(--color-gray-100);\n --table-group-header-background-color: rgba(186, 196, 206, 0.15);\n --table-group-header-text-color: var(--color-gray-100);\n --table-higlight-background-color: rgba(186, 196, 206, 0.09);\n\n /* SVGs */\n --plugin-icon-url: var(--plugin-icon-url-dark);\n }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media only screen and (max-width: 480px) {\n .lh-vars {\n --audit-group-margin-bottom: 20px;\n --edge-gap-padding: var(--default-padding);\n --env-name-min-width: 120px;\n --gauge-circle-size-big: 96px;\n --gauge-circle-size: 72px;\n --gauge-label-font-size-big: 22px;\n --gauge-label-font-size: 14px;\n --gauge-label-line-height-big: 26px;\n --gauge-label-line-height: 20px;\n --gauge-percentage-font-size-big: 34px;\n --gauge-percentage-font-size: 26px;\n --gauge-wrapper-width: 112px;\n --header-padding: 16px 0 16px 0;\n --image-preview-size: 24px;\n --plugin-icon-size: 75%;\n --report-font-size: 14px;\n --report-line-height: 20px;\n --score-icon-margin-left: 2px;\n --score-icon-size: 10px;\n --topbar-height: 28px;\n --topbar-logo-size: 20px;\n }\n}\n\n@container lh-container (max-width: 480px) {\n .lh-vars {\n --audit-group-margin-bottom: 20px;\n --edge-gap-padding: var(--default-padding);\n --env-name-min-width: 120px;\n --gauge-circle-size-big: 96px;\n --gauge-circle-size: 72px;\n --gauge-label-font-size-big: 22px;\n --gauge-label-font-size: 14px;\n --gauge-label-line-height-big: 26px;\n --gauge-label-line-height: 20px;\n --gauge-percentage-font-size-big: 34px;\n --gauge-percentage-font-size: 26px;\n --gauge-wrapper-width: 112px;\n --header-padding: 16px 0 16px 0;\n --image-preview-size: 24px;\n --plugin-icon-size: 75%;\n --report-font-size: 14px;\n --report-line-height: 20px;\n --score-icon-margin-left: 2px;\n --score-icon-size: 10px;\n --topbar-height: 28px;\n --topbar-logo-size: 20px;\n }\n}\n\n.lh-vars.lh-devtools {\n --audit-explanation-line-height: 14px;\n --audit-group-margin-bottom: 20px;\n --audit-group-padding-vertical: 12px;\n --audit-padding-vertical: 4px;\n --category-padding: 12px;\n --default-padding: 12px;\n --env-name-min-width: 120px;\n --footer-padding-vertical: 8px;\n --gauge-circle-size-big: 72px;\n --gauge-circle-size: 64px;\n --gauge-label-font-size-big: 22px;\n --gauge-label-font-size: 14px;\n --gauge-label-line-height-big: 26px;\n --gauge-label-line-height: 20px;\n --gauge-percentage-font-size-big: 34px;\n --gauge-percentage-font-size: 26px;\n --gauge-wrapper-width: 97px;\n --header-line-height: 20px;\n --header-padding: 16px 0 16px 0;\n --screenshot-overlay-background: transparent;\n --plugin-icon-size: 75%;\n --report-font-size: 12px;\n --report-line-height: 20px;\n --score-icon-margin-left: 2px;\n --score-icon-size: 10px;\n --section-padding-vertical: 8px;\n}\n\n.lh-devtools :focus-visible {\n outline: -webkit-focus-ring-color auto 1px;\n}\n\n.lh-container:has(.lh-sticky-header) {\n --sticky-header-buffer: calc(var(--topbar-height) + var(--sticky-header-height));\n}\n\n.lh-container:not(.lh-topbar + .lh-container) {\n --topbar-height: 0;\n --sticky-header-height: 0;\n --sticky-header-buffer: 0;\n}\n\n.lh-max-viewport {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n}\n\n.lh-devtools.lh-root {\n height: 100%;\n}\n.lh-devtools.lh-root img {\n /* Override devtools default 'min-width: 0' so svg without size in a flexbox isn't collapsed. */\n min-width: auto;\n}\n.lh-devtools .lh-container {\n overflow-y: scroll;\n height: calc(100% - var(--topbar-height));\n /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */\n --sticky-header-buffer: 0;\n}\n.lh-devtools .lh-container:has(.lh-sticky-header) {\n /** The .lh-container is the scroll parent in DevTools so we exclude the topbar from the sticky header buffer. */\n --sticky-header-buffer: var(--sticky-header-height);\n}\n@media print {\n .lh-devtools .lh-container {\n overflow: unset;\n }\n}\n.lh-devtools .lh-sticky-header {\n /* This is normally the height of the topbar, but we want it to stick to the top of our scroll container .lh-container` */\n top: 0;\n}\n.lh-devtools .lh-element-screenshot__overlay {\n position: absolute;\n}\n\n@keyframes fadeIn {\n 0% { opacity: 0;}\n 100% { opacity: 0.6;}\n}\n\n.lh-root *, .lh-root *::before, .lh-root *::after {\n box-sizing: border-box;\n}\n\n.lh-root {\n font-family: var(--report-font-family);\n font-size: var(--report-font-size);\n margin: 0;\n line-height: var(--report-line-height);\n background: var(--report-background-color);\n color: var(--report-text-color);\n}\n\n.lh-root [hidden] {\n display: none !important;\n}\n\n.lh-root pre {\n margin: 0;\n}\n\n.lh-root pre,\n.lh-root code {\n font-family: var(--report-font-family-monospace);\n}\n\n.lh-root details > summary {\n cursor: pointer;\n}\n\n.lh-hidden {\n display: none !important;\n}\n\n.lh-container {\n /*\n Text wrapping in the report is so much FUN!\n We have a `word-break: break-word;` globally here to prevent a few common scenarios, namely\n long non-breakable text (usually URLs) found in:\n 1. The footer\n 2. .lh-node (outerHTML)\n 3. .lh-code\n\n With that sorted, the next challenge is appropriate column sizing and text wrapping inside our\n .lh-details tables. Even more fun.\n * We don't want table headers (\"Est Savings (ms)\") to wrap or their column values, but\n we'd be happy for the URL column to wrap if the URLs are particularly long.\n * We want the narrow columns to remain narrow, providing the most column width for URL\n * We don't want the table to extend past 100% width.\n * Long URLs in the URL column can wrap. Util.getURLDisplayName maxes them out at 64 characters,\n but they do not get any overflow:ellipsis treatment.\n */\n word-break: break-word;\n\n container-name: lh-container;\n container-type: inline-size;\n}\n\n.lh-audit-group a,\n.lh-category-header__description a,\n.lh-audit__description a,\n.lh-warnings a,\n.lh-footer a,\n.lh-table-column--link a {\n color: var(--link-color);\n}\n\n.lh-audit__description, .lh-audit__stackpack, .lh-list-section__description {\n --inner-audit-padding-right: var(--stackpack-padding-horizontal);\n padding-left: var(--audit-description-padding-left);\n padding-right: var(--inner-audit-padding-right);\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n.lh-details {\n margin-top: var(--default-padding);\n margin-bottom: var(--default-padding);\n margin-left: var(--audit-description-padding-left);\n}\n\n.lh-audit__stackpack {\n display: flex;\n align-items: center;\n}\n\n.lh-audit__stackpack__img {\n max-width: 30px;\n margin-right: var(--default-padding)\n}\n\n/* Report header */\n\n.lh-report-icon {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n cursor: pointer;\n}\n.lh-report-icon[disabled] {\n opacity: 0.3;\n pointer-events: none;\n}\n\n.lh-report-icon::before {\n content: \"\";\n margin: 4px;\n background-repeat: no-repeat;\n width: var(--report-icon-size);\n height: var(--report-icon-size);\n opacity: 0.7;\n display: inline-block;\n vertical-align: middle;\n}\n.lh-report-icon:hover::before {\n opacity: 1;\n}\n.lh-dark .lh-report-icon::before {\n filter: invert(1);\n}\n.lh-report-icon--print::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"/><path fill=\"none\" d=\"M0 0h24v24H0z\"/></svg>');\n}\n.lh-report-icon--copy::before {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"/></svg>');\n}\n.lh-report-icon--open::before {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></svg>');\n}\n.lh-report-icon--download::before {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/></svg>');\n}\n.lh-report-icon--dark::before {\n background-image:url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 100 125\"><path d=\"M50 23.587c-16.27 0-22.799 12.574-22.799 21.417 0 12.917 10.117 22.451 12.436 32.471h20.726c2.32-10.02 12.436-19.554 12.436-32.471 0-8.843-6.528-21.417-22.799-21.417zM39.637 87.161c0 3.001 1.18 4.181 4.181 4.181h.426l.41 1.231C45.278 94.449 46.042 95 48.019 95h3.963c1.978 0 2.74-.551 3.365-2.427l.409-1.231h.427c3.002 0 4.18-1.18 4.18-4.181V80.91H39.637v6.251zM50 18.265c1.26 0 2.072-.814 2.072-2.073v-9.12C52.072 5.813 51.26 5 50 5c-1.259 0-2.072.813-2.072 2.073v9.12c0 1.259.813 2.072 2.072 2.072zM68.313 23.727c.994.774 2.135.634 2.91-.357l5.614-7.187c.776-.992.636-2.135-.356-2.909-.992-.776-2.135-.636-2.91.357l-5.613 7.186c-.778.993-.636 2.135.355 2.91zM91.157 36.373c-.306-1.222-1.291-1.815-2.513-1.51l-8.85 2.207c-1.222.305-1.814 1.29-1.51 2.512.305 1.223 1.291 1.814 2.513 1.51l8.849-2.206c1.223-.305 1.816-1.291 1.511-2.513zM86.757 60.48l-8.331-3.709c-1.15-.512-2.225-.099-2.736 1.052-.512 1.151-.1 2.224 1.051 2.737l8.33 3.707c1.15.514 2.225.101 2.736-1.05.513-1.149.1-2.223-1.05-2.737zM28.779 23.37c.775.992 1.917 1.131 2.909.357.992-.776 1.132-1.917.357-2.91l-5.615-7.186c-.775-.992-1.917-1.132-2.909-.357s-1.131 1.917-.356 2.909l5.614 7.187zM21.715 39.583c.305-1.223-.288-2.208-1.51-2.513l-8.849-2.207c-1.222-.303-2.208.289-2.513 1.511-.303 1.222.288 2.207 1.511 2.512l8.848 2.206c1.222.304 2.208-.287 2.513-1.509zM21.575 56.771l-8.331 3.711c-1.151.511-1.563 1.586-1.05 2.735.511 1.151 1.586 1.563 2.736 1.052l8.331-3.711c1.151-.511 1.563-1.586 1.05-2.735-.512-1.15-1.585-1.562-2.736-1.052z\"/></svg>');\n}\n.lh-report-icon--treemap::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"black\"><path d=\"M3 5v14h19V5H3zm2 2h15v4H5V7zm0 10v-4h4v4H5zm6 0v-4h9v4h-9z\"/></svg>');\n}\n\n.lh-report-icon--date::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 11h2v2H7v-2zm14-5v14a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h1V2h2v2h8V2h2v2h1a2 2 0 012 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></svg>');\n}\n.lh-report-icon--devices::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 6h18V4H4a2 2 0 00-2 2v11H0v3h14v-3H4V6zm19 2h-6a1 1 0 00-1 1v10c0 .6.5 1 1 1h6c.6 0 1-.5 1-1V9c0-.6-.5-1-1-1zm-1 9h-4v-7h4v7z\"/></svg>');\n}\n.lh-report-icon--world::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm7 6h-3c-.3-1.3-.8-2.5-1.4-3.6A8 8 0 0 1 18.9 8zm-7-4a14 14 0 0 1 2 4h-4a14 14 0 0 1 2-4zM4.3 14a8.2 8.2 0 0 1 0-4h3.3a16.5 16.5 0 0 0 0 4H4.3zm.8 2h3a14 14 0 0 0 1.3 3.6A8 8 0 0 1 5.1 16zm3-8H5a8 8 0 0 1 4.3-3.6L8 8zM12 20a14 14 0 0 1-2-4h4a14 14 0 0 1-2 4zm2.3-6H9.7a14.7 14.7 0 0 1 0-4h4.6a14.6 14.6 0 0 1 0 4zm.3 5.6c.6-1.2 1-2.4 1.4-3.6h3a8 8 0 0 1-4.4 3.6zm1.8-5.6a16.5 16.5 0 0 0 0-4h3.3a8.2 8.2 0 0 1 0 4h-3.3z\"/></svg>');\n}\n.lh-report-icon--stopwatch::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.1-6.6L20.5 6l-1.4-1.4L17.7 6A9 9 0 0 0 3 13a9 9 0 1 0 16-5.6zm-7 12.6a7 7 0 1 1 0-14 7 7 0 0 1 0 14z\"/></svg>');\n}\n.lh-report-icon--networkspeed::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.9 5c-.2 0-.3 0-.4.2v.2L10.1 17a2 2 0 0 0-.2 1 2 2 0 0 0 4 .4l2.4-12.9c0-.3-.2-.5-.5-.5zM1 9l2 2c2.9-2.9 6.8-4 10.5-3.6l1.2-2.7C10 3.8 4.7 5.3 1 9zm20 2 2-2a15.4 15.4 0 0 0-5.6-3.6L17 8.2c1.5.7 2.9 1.6 4.1 2.8zm-4 4 2-2a9.9 9.9 0 0 0-2.7-1.9l-.5 3 1.2.9zM5 13l2 2a7.1 7.1 0 0 1 4-2l1.3-2.9C9.7 10.1 7 11 5 13z\"/></svg>');\n}\n.lh-report-icon--samples-one::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"7\" cy=\"14\" r=\"3\"/><path d=\"M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></svg>');\n}\n.lh-report-icon--samples-many::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 18a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5.6 17.6a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/><circle cx=\"7\" cy=\"14\" r=\"3\"/><circle cx=\"11\" cy=\"6\" r=\"3\"/></svg>');\n}\n.lh-report-icon--chrome::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-50 -50 562 562\"><path d=\"M256 25.6v25.6a204 204 0 0 1 144.8 60 204 204 0 0 1 60 144.8 204 204 0 0 1-60 144.8 204 204 0 0 1-144.8 60 204 204 0 0 1-144.8-60 204 204 0 0 1-60-144.8 204 204 0 0 1 60-144.8 204 204 0 0 1 144.8-60V0a256 256 0 1 0 0 512 256 256 0 0 0 0-512v25.6z\"/><path d=\"M256 179.2v25.6a51.3 51.3 0 0 1 0 102.4 51.3 51.3 0 0 1 0-102.4v-51.2a102.3 102.3 0 1 0-.1 204.7 102.3 102.3 0 0 0 .1-204.7v25.6z\"/><path d=\"M256 204.8h217.6a25.6 25.6 0 0 0 0-51.2H256a25.6 25.6 0 0 0 0 51.2m44.3 76.8L191.5 470.1a25.6 25.6 0 1 0 44.4 25.6l108.8-188.5a25.6 25.6 0 1 0-44.4-25.6m-88.6 0L102.9 93.2a25.7 25.7 0 0 0-35-9.4 25.7 25.7 0 0 0-9.4 35l108.8 188.5a25.7 25.7 0 0 0 35 9.4 25.9 25.9 0 0 0 9.4-35.1\"/></svg>');\n}\n.lh-report-icon--external::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.15 11.9a1.01 1.01 0 0 1-.743-.307 1.01 1.01 0 0 1-.306-.743v-7.7c0-.292.102-.54.306-.744a1.01 1.01 0 0 1 .744-.306H7v1.05H3.15v7.7h7.7V7h1.05v3.85c0 .291-.103.54-.307.743a1.01 1.01 0 0 1-.743.307h-7.7Zm2.494-2.8-.743-.744 5.206-5.206H8.401V2.1h3.5v3.5h-1.05V3.893L5.644 9.1Z\"/></svg>');\n}\n.lh-report-icon--experiment::before {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M4.50002 17C3.86136 17 3.40302 16.7187 3.12502 16.156C2.84702 15.5933 2.90936 15.069 3.31202 14.583L7.50002 9.5V4.5H6.75002C6.54202 4.5 6.36502 4.427 6.21902 4.281C6.07302 4.135 6.00002 3.958 6.00002 3.75C6.00002 3.542 6.07302 3.365 6.21902 3.219C6.36502 3.073 6.54202 3 6.75002 3H13.25C13.458 3 13.635 3.073 13.781 3.219C13.927 3.365 14 3.542 14 3.75C14 3.958 13.927 4.135 13.781 4.281C13.635 4.427 13.458 4.5 13.25 4.5H12.5V9.5L16.688 14.583C17.0767 15.069 17.132 15.5933 16.854 16.156C16.5767 16.7187 16.1254 17 15.5 17H4.50002ZM4.50002 15.5H15.5L11 10V4.5H9.00002V10L4.50002 15.5Z\" fill=\"black\"/></svg>');\n}\n\n/** These are still icons, but w/o the auto-color invert / opacity / etc. that come with .lh-report-icon */\n\n.lh-report-plain-icon {\n display: flex;\n align-items: center;\n}\n.lh-report-plain-icon::before {\n content: \"\";\n background-repeat: no-repeat;\n width: var(--report-icon-size);\n height: var(--report-icon-size);\n display: inline-block;\n margin-right: 5px;\n}\n\n.lh-report-plain-icon--checklist-pass::before {\n --icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M8.938 13L13.896 8.062L12.833 7L8.938 10.875L7.167 9.125L6.104 10.188L8.938 13ZM10 18C8.90267 18 7.868 17.7917 6.896 17.375C5.924 16.9583 5.07333 16.3853 4.344 15.656C3.61467 14.9267 3.04167 14.076 2.625 13.104C2.20833 12.132 2 11.0973 2 10C2 8.88867 2.20833 7.85033 2.625 6.885C3.04167 5.92033 3.61467 5.07333 4.344 4.344C5.07333 3.61467 5.924 3.04167 6.896 2.625C7.868 2.20833 8.90267 2 10 2C11.1113 2 12.1497 2.20833 13.115 2.625C14.0797 3.04167 14.9267 3.61467 15.656 4.344C16.3853 5.07333 16.9583 5.92033 17.375 6.885C17.7917 7.85033 18 8.88867 18 10C18 11.0973 17.7917 12.132 17.375 13.104C16.9583 14.076 16.3853 14.9267 15.656 15.656C14.9267 16.3853 14.0797 16.9583 13.115 17.375C12.1497 17.7917 11.1113 18 10 18ZM10 16.5C11.8053 16.5 13.34 15.868 14.604 14.604C15.868 13.34 16.5 11.8053 16.5 10C16.5 8.19467 15.868 6.66 14.604 5.396C13.34 4.132 11.8053 3.5 10 3.5C8.19467 3.5 6.66 4.132 5.396 5.396C4.132 6.66 3.5 8.19467 3.5 10C3.5 11.8053 4.132 13.34 5.396 14.604C6.66 15.868 8.19467 16.5 10 16.5Z\" fill=\"black\"/></svg>');\n background-color: var(--color-pass);\n mask: var(--icon-url) center / contain no-repeat;\n}\n.lh-report-plain-icon--checklist-fail::before {\n --icon-url: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.5 10C17.5 14.1421 14.1421 17.5 10 17.5C5.85786 17.5 2.5 14.1421 2.5 10C2.5 5.85786 5.85786 2.5 10 2.5C14.1421 2.5 17.5 5.85786 17.5 10ZM16 10C16 13.3137 13.3137 16 10 16C8.6135 16 7.33683 15.5297 6.32083 14.7399L14.7399 6.32083C15.5297 7.33683 16 8.6135 16 10ZM5.26016 13.6793L13.6793 5.26016C12.6633 4.47033 11.3866 4 10 4C6.68629 4 4 6.68629 4 10C4 11.3866 4.47033 12.6633 5.26016 13.6793Z\" fill=\"black\"/></svg>');\n background-color: var(--color-fail);\n mask: var(--icon-url) center / contain no-repeat;\n}\n\n.lh-buttons {\n display: flex;\n flex-wrap: wrap;\n margin: var(--default-padding) 0;\n}\n.lh-button {\n height: 32px;\n border: 1px solid var(--report-border-color-secondary);\n border-radius: 3px;\n color: var(--link-color);\n background-color: var(--report-background-color);\n margin: 5px;\n}\n\n.lh-button:first-of-type {\n margin-left: 0;\n}\n\n/* Node */\n.lh-node {\n display: flow-root;\n}\n\n.lh-node__snippet {\n font-family: var(--report-font-family-monospace);\n color: var(--snippet-color);\n font-size: var(--report-monospace-font-size);\n line-height: 20px;\n}\n\n.lh-checklist {\n list-style: none;\n padding: 0;\n}\n\n.lh-checklist-item {\n margin: 10px 0 10px 0;\n}\n\n/* Baseline Status */\n.lh-baseline-status {\n display: flex;\n align-items: center;\n}\n.lh-baseline-status::before {\n content: \"\";\n display: inline-block;\n width: 18px;\n height: 10px;\n margin-right: 6px;\n background-repeat: no-repeat;\n background-size: contain;\n}\n.lh-baseline-status--high::before {\n background-image: var(--baseline-high-icon-url);\n}\n.lh-baseline-status--low::before {\n background-image: var(--baseline-low-icon-url);\n}\n.lh-baseline-status--limited::before {\n background-image: var(--baseline-limited-icon-url);\n}\n\n/* Score */\n\n.lh-audit__score-icon {\n width: var(--score-icon-size);\n height: var(--score-icon-size);\n margin: var(--score-icon-margin);\n}\n\n.lh-audit--pass .lh-audit__display-text {\n color: var(--color-pass-secondary);\n}\n.lh-audit--pass .lh-audit__score-icon,\n.lh-scorescale-range--pass::before {\n border-radius: 100%;\n background: var(--color-pass);\n}\n\n.lh-audit--average .lh-audit__display-text {\n color: var(--color-average-secondary);\n}\n.lh-audit--average .lh-audit__score-icon,\n.lh-scorescale-range--average::before {\n background: var(--color-average);\n width: var(--icon-square-size);\n height: var(--icon-square-size);\n}\n\n.lh-audit--fail .lh-audit__display-text {\n color: var(--color-fail-secondary);\n}\n.lh-audit--fail .lh-audit__score-icon,\n.lh-audit--error .lh-audit__score-icon,\n.lh-scorescale-range--fail::before {\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\n border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n\n.lh-audit--error .lh-audit__score-icon,\n.lh-metric--error .lh-metric__icon {\n background-image: var(--error-icon-url);\n background-repeat: no-repeat;\n background-position: center;\n border: none;\n}\n\n.lh-gauge__wrapper--fail .lh-gauge--error {\n background-image: var(--error-icon-url);\n background-repeat: no-repeat;\n background-position: center;\n transform: scale(0.5);\n top: var(--score-container-padding);\n}\n\n.lh-audit--manual .lh-audit__display-text,\n.lh-audit--notapplicable .lh-audit__display-text {\n color: var(--color-gray-600);\n}\n.lh-audit--manual .lh-audit__score-icon,\n.lh-audit--notapplicable .lh-audit__score-icon {\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\n border-radius: 100%;\n background: none;\n}\n\n.lh-audit--informative .lh-audit__display-text {\n color: var(--color-gray-600);\n}\n\n.lh-audit--informative .lh-audit__score-icon {\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-400);\n border-radius: 100%;\n}\n\n.lh-audit__description,\n.lh-audit__stackpack {\n color: var(--report-text-color-secondary);\n}\n.lh-audit__adorn {\n border: 1px solid var(--color-gray-500);\n border-radius: 3px;\n margin: 0 3px;\n padding: 0 2px;\n line-height: 1.1;\n display: inline-block;\n font-size: 90%;\n color: var(--report-text-color-secondary);\n}\n\n.lh-category-header__description {\n text-align: center;\n color: var(--color-gray-700);\n margin: 0px auto;\n max-width: 400px;\n}\n\n\n.lh-audit__display-text,\n.lh-chevron-container {\n margin: 0 var(--audit-margin-horizontal);\n}\n.lh-chevron-container {\n margin-right: 0;\n}\n\n.lh-audit__title-and-text {\n flex: 1;\n}\n\n.lh-audit__title-and-text code {\n color: var(--snippet-color);\n font-size: var(--report-monospace-font-size);\n}\n\n/* Prepend display text with em dash separator. */\n.lh-audit__display-text:not(:empty):before {\n content: '—';\n margin-right: var(--audit-margin-horizontal);\n}\n\n/* Expandable Details (Audit Groups, Audits) */\n.lh-audit__header {\n display: flex;\n align-items: center;\n padding: var(--default-padding);\n}\n\n\n.lh-metricfilter {\n display: grid;\n justify-content: end;\n align-items: center;\n grid-auto-flow: column;\n gap: 4px;\n color: var(--color-gray-700);\n}\n\n.lh-metricfilter__radio {\n /*\n * Instead of hiding, position offscreen so it's still accessible to screen readers\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1439785\n */\n position: fixed;\n left: -9999px;\n}\n.lh-metricfilter input[type='radio']:focus-visible + label {\n outline: -webkit-focus-ring-color auto 1px;\n}\n\n.lh-metricfilter__label {\n display: inline-flex;\n padding: 0 4px;\n height: 16px;\n text-decoration: underline;\n align-items: center;\n cursor: pointer;\n font-size: 90%;\n}\n\n.lh-metricfilter__label--active {\n background: var(--color-blue-primary);\n color: var(--color-white);\n border-radius: 3px;\n text-decoration: none;\n}\n/* Give the 'All' choice a more muted display */\n.lh-metricfilter__label--active[for=\"metric-All\"] {\n background-color: var(--color-blue-200) !important;\n color: black !important;\n}\n\n.lh-metricfilter__text {\n margin-right: 8px;\n}\n\n/* If audits are filtered, hide the itemcount for Passed Audits… */\n.lh-category--filtered .lh-audit-group .lh-audit-group__itemcount {\n display: none;\n}\n\n\n.lh-audit__header:hover {\n background-color: var(--color-hover);\n}\n\n/* We want to hide the browser's default arrow marker on summary elements. Admittedly, it's complicated. */\n.lh-root details > summary {\n /* Blink 89+ and Firefox will hide the arrow when display is changed from (new) default of `list-item` to block. https://chromestatus.com/feature/6730096436051968*/\n display: block;\n}\n/* Safari and Blink <=88 require using the -webkit-details-marker selector */\n.lh-root details > summary::-webkit-details-marker {\n display: none;\n}\n\n/* Perf Metric */\n\n.lh-metrics-container {\n display: grid;\n grid-auto-rows: 1fr;\n grid-template-columns: 1fr 1fr;\n grid-column-gap: var(--report-line-height);\n margin-bottom: var(--default-padding);\n}\n\n.lh-metric {\n border-top: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(-n+2) {\n border-bottom: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-metric__innerwrap {\n display: grid;\n /**\n * Icon -- Metric Name\n * -- Metric Value\n */\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 1fr;\n align-items: center;\n padding: var(--default-padding);\n}\n\n.lh-metric__details {\n order: -1;\n}\n\n.lh-metric__title {\n flex: 1;\n}\n\n.lh-calclink {\n padding-left: calc(1ex / 3);\n}\n\n.lh-metric__description {\n display: none;\n grid-column-start: 2;\n grid-column-end: 4;\n color: var(--report-text-color-secondary);\n}\n\n.lh-metric__value {\n font-size: var(--metric-value-font-size);\n margin: calc(var(--default-padding) / 2) 0;\n white-space: nowrap; /* No wrapping between metric value and the icon */\n grid-column-start: 2;\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n .lh-metrics-container {\n display: block;\n }\n\n .lh-metric {\n border-bottom: none !important;\n }\n .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\n border-bottom: 1px solid var(--report-border-color-secondary) !important;\n }\n\n /* Change the grid to 3 columns for narrow viewport. */\n .lh-metric__innerwrap {\n /**\n * Icon -- Metric Name -- Metric Value\n */\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\n }\n .lh-metric__value {\n justify-self: end;\n grid-column-start: unset;\n }\n}\n\n@container lh-container (max-width: 535px) {\n .lh-metrics-container {\n display: block;\n }\n\n .lh-metric {\n border-bottom: none !important;\n }\n .lh-category:not(.lh--hoisted-meta) .lh-metric:nth-last-child(1) {\n border-bottom: 1px solid var(--report-border-color-secondary) !important;\n }\n\n /* Change the grid to 3 columns for narrow viewport. */\n .lh-metric__innerwrap {\n /**\n * Icon -- Metric Name -- Metric Value\n */\n grid-template-columns: calc(var(--score-icon-size) + var(--score-icon-margin-left) + var(--score-icon-margin-right)) 2fr 1fr;\n }\n .lh-metric__value {\n justify-self: end;\n grid-column-start: unset;\n }\n}\n\n/* No-JS toggle switch */\n/* Keep this selector sync'd w/ `magicSelector` in report-ui-features-test.js */\n .lh-metrics-toggle__input:checked ~ .lh-metrics-container .lh-metric__description {\n display: block;\n}\n\n/* TODO get rid of the SVGS and clean up these some more */\n.lh-metrics-toggle__input {\n opacity: 0;\n position: absolute;\n right: 0;\n top: 0px;\n}\n\n.lh-metrics-toggle__input + div > label > .lh-metrics-toggle__labeltext--hide,\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--show {\n display: none;\n}\n.lh-metrics-toggle__input:checked + div > label > .lh-metrics-toggle__labeltext--hide {\n display: inline;\n}\n.lh-metrics-toggle__input:focus + div > label {\n outline: -webkit-focus-ring-color auto 3px;\n}\n\n.lh-metrics-toggle__label {\n cursor: pointer;\n font-size: var(--report-font-size-secondary);\n line-height: var(--report-line-height-secondary);\n color: var(--color-gray-700);\n}\n\n/* Pushes the metric description toggle button to the right. */\n.lh-audit-group--metrics .lh-audit-group__header {\n display: flex;\n justify-content: space-between;\n}\n\n.lh-metric__icon,\n.lh-scorescale-range::before {\n content: '';\n width: var(--score-icon-size);\n height: var(--score-icon-size);\n display: inline-block;\n margin: var(--score-icon-margin);\n}\n\n.lh-metric--pass .lh-metric__value {\n color: var(--color-pass-secondary);\n}\n.lh-metric--pass .lh-metric__icon {\n border-radius: 100%;\n background: var(--color-pass);\n}\n\n.lh-metric--average .lh-metric__value {\n color: var(--color-average-secondary);\n}\n.lh-metric--average .lh-metric__icon {\n background: var(--color-average);\n width: var(--icon-square-size);\n height: var(--icon-square-size);\n}\n\n.lh-metric--fail .lh-metric__value {\n color: var(--color-fail-secondary);\n}\n.lh-metric--fail .lh-metric__icon {\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\n border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n\n.lh-metric--error .lh-metric__value,\n.lh-metric--error .lh-metric__description {\n color: var(--color-fail-secondary);\n}\n\n/* Filmstrip */\n\n.lh-filmstrip-container {\n /* smaller gap between metrics and filmstrip */\n margin: -8px auto 0 auto;\n}\n\n.lh-filmstrip {\n display: flex;\n justify-content: space-between;\n justify-items: center;\n margin-bottom: var(--default-padding);\n width: 100%;\n}\n\n.lh-filmstrip__frame {\n overflow: hidden;\n line-height: 0;\n}\n\n.lh-filmstrip__thumbnail {\n border: 1px solid var(--report-border-color-secondary);\n max-height: 150px;\n max-width: 120px;\n}\n\n.lh-dark .lh-perf-toggle-text {\n color: rgba(30, 164, 70, 1);\n}\n\n.lh-perf-toggle-text a {\n color: var(--link-color);\n}\n\n/* Audit */\n\n.lh-audit {\n border-bottom: 1px solid var(--report-border-color-secondary);\n}\n\n/* Apply border-top to just the first audit. */\n.lh-audit {\n border-top: 1px solid var(--report-border-color-secondary);\n}\n.lh-audit ~ .lh-audit {\n border-top: none;\n}\n\n\n.lh-audit--error .lh-audit__display-text {\n color: var(--color-fail-secondary);\n}\n\n/* Audit Group */\n\n.lh-audit-group {\n margin-bottom: var(--audit-group-margin-bottom);\n position: relative;\n}\n.lh-audit-group--metrics {\n margin-bottom: calc(var(--audit-group-margin-bottom) / 2);\n}\n\n.lh-audit-group--metrics .lh-audit-group__summary {\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.lh-audit-group__summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.lh-audit-group__header .lh-chevron {\n margin-top: calc((var(--report-line-height) - 5px) / 2);\n}\n\n.lh-audit-group__header {\n letter-spacing: 0.8px;\n padding: var(--default-padding);\n padding-left: 0;\n}\n\n.lh-audit-group__header, .lh-audit-group__summary {\n font-size: var(--report-font-size-secondary);\n line-height: var(--report-line-height-secondary);\n color: var(--color-gray-700);\n}\n\n.lh-audit-group__title {\n text-transform: uppercase;\n font-weight: 500;\n}\n\n.lh-audit-group__itemcount {\n color: var(--color-gray-600);\n}\n\n.lh-audit-group__footer {\n color: var(--color-gray-600);\n display: block;\n margin-top: var(--default-padding);\n}\n\n.lh-details,\n.lh-category-header__description,\n.lh-audit-group__footer {\n font-size: var(--report-font-size-secondary);\n line-height: var(--report-line-height-secondary);\n}\n\n.lh-audit-explanation {\n margin: var(--audit-padding-vertical) 0 calc(var(--audit-padding-vertical) / 2) var(--audit-margin-horizontal);\n line-height: var(--audit-explanation-line-height);\n display: inline-block;\n}\n\n.lh-audit--fail .lh-audit-explanation {\n color: var(--color-fail-secondary);\n}\n\n/* Report */\n.lh-list {\n margin-right: calc(var(--default-padding) * 2);\n}\n.lh-list > :not(:last-child) {\n margin-bottom: calc(var(--default-padding) * 2);\n border-bottom: 1px solid #A8C7FA;\n}\n.lh-list-section {\n padding: calc(var(--default-padding) * 2) 0;\n}\n.lh-list-section__title {\n text-decoration: underline;\n}\n\n.lh-header-container {\n display: block;\n margin: 0 auto;\n position: relative;\n word-wrap: break-word;\n}\n\n.lh-header-container .lh-scores-wrapper {\n border-bottom: 1px solid var(--color-gray-200);\n}\n\n\n.lh-report {\n min-width: var(--report-content-min-width);\n}\n\n.lh-exception {\n font-size: large;\n}\n\n.lh-code {\n white-space: normal;\n margin-top: 0;\n font-size: var(--report-monospace-font-size);\n}\n\n.lh-warnings {\n --item-margin: calc(var(--report-line-height) / 6);\n color: var(--color-average-secondary);\n margin: var(--audit-padding-vertical) 0;\n padding: var(--default-padding)\n var(--default-padding)\n var(--default-padding)\n calc(var(--audit-description-padding-left));\n background-color: var(--toplevel-warning-background-color);\n}\n.lh-warnings span {\n font-weight: bold;\n}\n\n.lh-warnings--toplevel {\n --item-margin: calc(var(--header-line-height) / 4);\n color: var(--toplevel-warning-text-color);\n margin-left: auto;\n margin-right: auto;\n max-width: var(--report-content-max-width-minus-edge-gap);\n padding: var(--toplevel-warning-padding);\n border-radius: 8px;\n}\n\n.lh-warnings__msg {\n color: var(--toplevel-warning-message-text-color);\n margin: 0;\n}\n\n.lh-warnings ul {\n margin: 0;\n}\n.lh-warnings li {\n margin: var(--item-margin) 0;\n}\n.lh-warnings li:last-of-type {\n margin-bottom: 0;\n}\n\n.lh-scores-header {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n}\n.lh-scores-header__solo {\n padding: 0;\n border: 0;\n}\n\n/* Gauge */\n\n.lh-gauge__wrapper--pass {\n color: var(--color-pass-secondary);\n fill: var(--color-pass);\n stroke: var(--color-pass);\n}\n\n.lh-gauge__wrapper--average {\n color: var(--color-average-secondary);\n fill: var(--color-average);\n stroke: var(--color-average);\n}\n\n.lh-gauge__wrapper--fail {\n color: var(--color-fail-secondary);\n fill: var(--color-fail);\n stroke: var(--color-fail);\n}\n\n.lh-gauge__wrapper--not-applicable {\n color: var(--color-not-applicable);\n fill: var(--color-not-applicable);\n stroke: var(--color-not-applicable);\n}\n\n.lh-fraction__wrapper .lh-fraction__content::before {\n content: '';\n height: var(--score-icon-size);\n width: var(--score-icon-size);\n margin: var(--score-icon-margin);\n display: inline-block;\n}\n.lh-fraction__wrapper--pass .lh-fraction__content {\n color: var(--color-pass-secondary);\n}\n.lh-fraction__wrapper--pass .lh-fraction__background {\n background-color: var(--color-pass);\n}\n.lh-fraction__wrapper--pass .lh-fraction__content::before {\n background-color: var(--color-pass);\n border-radius: 50%;\n}\n.lh-fraction__wrapper--average .lh-fraction__content {\n color: var(--color-average-secondary);\n}\n.lh-fraction__wrapper--average .lh-fraction__background,\n.lh-fraction__wrapper--average .lh-fraction__content::before {\n background-color: var(--color-average);\n}\n.lh-fraction__wrapper--fail .lh-fraction__content {\n color: var(--color-fail);\n}\n.lh-fraction__wrapper--fail .lh-fraction__background {\n background-color: var(--color-fail);\n}\n.lh-fraction__wrapper--fail .lh-fraction__content::before {\n border-left: calc(var(--score-icon-size) / 2) solid transparent;\n border-right: calc(var(--score-icon-size) / 2) solid transparent;\n border-bottom: var(--score-icon-size) solid var(--color-fail);\n}\n.lh-fraction__wrapper--null .lh-fraction__content {\n color: var(--color-gray-700);\n}\n.lh-fraction__wrapper--null .lh-fraction__background {\n background-color: var(--color-gray-700);\n}\n.lh-fraction__wrapper--null .lh-fraction__content::before {\n border-radius: 50%;\n border: calc(0.2 * var(--score-icon-size)) solid var(--color-gray-700);\n}\n\n.lh-fraction__background {\n position: absolute;\n height: 100%;\n width: 100%;\n border-radius: calc(var(--gauge-circle-size) / 2);\n opacity: 0.1;\n z-index: -1;\n}\n\n.lh-fraction__content-wrapper {\n height: var(--gauge-circle-size);\n display: flex;\n align-items: center;\n}\n\n.lh-fraction__content {\n display: flex;\n position: relative;\n align-items: center;\n justify-content: center;\n font-size: calc(0.3 * var(--gauge-circle-size));\n line-height: calc(0.4 * var(--gauge-circle-size));\n width: max-content;\n min-width: calc(1.5 * var(--gauge-circle-size));\n padding: calc(0.1 * var(--gauge-circle-size)) calc(0.2 * var(--gauge-circle-size));\n --score-icon-size: calc(0.21 * var(--gauge-circle-size));\n --score-icon-margin: 0 calc(0.15 * var(--gauge-circle-size)) 0 0;\n}\n\n.lh-gauge {\n stroke-linecap: round;\n width: var(--gauge-circle-size);\n height: var(--gauge-circle-size);\n}\n\n.lh-category .lh-gauge {\n --gauge-circle-size: var(--gauge-circle-size-big);\n}\n\n.lh-gauge-base {\n opacity: 0.1;\n}\n\n.lh-gauge-arc {\n fill: none;\n transform-origin: 50% 50%;\n animation: load-gauge var(--transition-length) ease both;\n animation-delay: 250ms;\n}\n\n.lh-gauge__svg-wrapper {\n position: relative;\n height: var(--gauge-circle-size);\n}\n.lh-category .lh-gauge__svg-wrapper,\n.lh-category .lh-fraction__wrapper {\n --gauge-circle-size: var(--gauge-circle-size-big);\n}\n\n/* The plugin badge overlay */\n.lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {\n width: var(--plugin-badge-size);\n height: var(--plugin-badge-size);\n background-color: var(--plugin-badge-background-color);\n background-image: var(--plugin-icon-url);\n background-repeat: no-repeat;\n background-size: var(--plugin-icon-size);\n background-position: 58% 50%;\n content: \"\";\n position: absolute;\n right: -6px;\n bottom: 0px;\n display: block;\n z-index: 100;\n box-shadow: 0 0 4px rgba(0,0,0,.2);\n border-radius: 25%;\n}\n.lh-category .lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {\n width: var(--plugin-badge-size-big);\n height: var(--plugin-badge-size-big);\n}\n\n@keyframes load-gauge {\n from { stroke-dasharray: 0 352; }\n}\n\n.lh-gauge__percentage {\n width: 100%;\n height: var(--gauge-circle-size);\n line-height: var(--gauge-circle-size);\n position: absolute;\n font-family: var(--report-font-family-monospace);\n font-size: calc(var(--gauge-circle-size) * 0.34 + 1.3px);\n text-align: center;\n top: var(--score-container-padding);\n}\n\n.lh-category .lh-gauge__percentage {\n --gauge-circle-size: var(--gauge-circle-size-big);\n --gauge-percentage-font-size: var(--gauge-percentage-font-size-big);\n}\n\n.lh-gauge__wrapper,\n.lh-fraction__wrapper {\n position: relative;\n display: flex;\n align-items: center;\n flex-direction: column;\n text-decoration: none;\n padding: var(--score-container-padding);\n\n --transition-length: 1s;\n\n /* Contain the layout style paint & layers during animation*/\n contain: content;\n will-change: opacity; /* Only using for layer promotion */\n}\n\n.lh-gauge__label,\n.lh-fraction__label {\n font-size: var(--gauge-label-font-size);\n font-weight: 500;\n line-height: var(--gauge-label-line-height);\n margin-top: 10px;\n text-align: center;\n color: var(--report-text-color);\n word-break: keep-all;\n}\n\n/* TODO(#8185) use more BEM (.lh-gauge__label--big) instead of relying on descendant selector */\n.lh-category .lh-gauge__label,\n.lh-category .lh-fraction__label {\n --gauge-label-font-size: var(--gauge-label-font-size-big);\n --gauge-label-line-height: var(--gauge-label-line-height-big);\n margin-top: 14px;\n}\n\n.lh-scores-header .lh-gauge__wrapper,\n.lh-scores-header .lh-fraction__wrapper,\n.lh-sticky-header .lh-gauge__wrapper,\n.lh-sticky-header .lh-fraction__wrapper {\n width: var(--gauge-wrapper-width);\n}\n\n.lh-scorescale {\n display: inline-flex;\n\n gap: calc(var(--default-padding) * 4);\n margin: 16px auto 0 auto;\n font-size: var(--report-font-size-secondary);\n color: var(--color-gray-700);\n\n}\n\n.lh-scorescale-range {\n display: flex;\n align-items: center;\n font-family: var(--report-font-family-monospace);\n white-space: nowrap;\n}\n\n.lh-category-header__finalscreenshot .lh-scorescale {\n border: 0;\n display: flex;\n justify-content: center;\n}\n\n.lh-category-header__finalscreenshot .lh-scorescale-range {\n font-family: unset;\n font-size: 12px;\n}\n\n.lh-scorescale-wrap {\n display: contents;\n}\n\n/* Hide category score gauages if it's a single category report */\n.lh-header--solo-category .lh-scores-wrapper {\n display: none;\n}\n\n\n.lh-categories {\n width: 100%;\n}\n\n.lh-category {\n padding: var(--category-padding);\n max-width: var(--report-content-max-width);\n margin: 0 auto;\n\n scroll-margin-top: calc(var(--sticky-header-buffer) - 1em);\n}\n\n.lh-category-wrapper {\n border-bottom: 1px solid var(--color-gray-200);\n}\n.lh-category-wrapper:last-of-type {\n border-bottom: 0;\n}\n\n.lh-category-header {\n margin-bottom: var(--section-padding-vertical);\n}\n\n.lh-category-header .lh-score__gauge {\n max-width: 400px;\n width: auto;\n margin: 0px auto;\n}\n\n.lh-category-header__finalscreenshot {\n display: grid;\n grid-template: none / 1fr 1px 1fr;\n justify-items: center;\n align-items: center;\n gap: var(--report-line-height);\n min-height: 288px;\n margin-bottom: var(--default-padding);\n}\n\n.lh-final-ss-image {\n /* constrain the size of the image to not be too large */\n max-height: calc(var(--gauge-circle-size-big) * 2.8);\n max-width: calc(var(--gauge-circle-size-big) * 3.5);\n border: 1px solid var(--color-gray-200);\n padding: 4px;\n border-radius: 3px;\n display: block;\n}\n\n.lh-category-headercol--separator {\n background: var(--color-gray-200);\n width: 1px;\n height: var(--gauge-circle-size-big);\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 780px) {\n .lh-category-header__finalscreenshot {\n grid-template: 1fr 1fr / none\n }\n .lh-category-headercol--separator {\n display: none;\n }\n}\n\n@container lh-container (max-width: 780px) {\n .lh-category-header__finalscreenshot {\n grid-template: 1fr 1fr / none\n }\n .lh-category-headercol--separator {\n display: none;\n }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 964px) {\n .lh-report {\n margin-left: 0;\n width: 100%;\n }\n}\n\n/* 964 fits the min-width of the filmstrip */\n@container lh-container (max-width: 964px) {\n .lh-report {\n margin-left: 0;\n width: 100%;\n }\n}\n\n@media print {\n body {\n -webkit-print-color-adjust: exact; /* print background colors */\n }\n .lh-container {\n display: block;\n }\n .lh-report {\n margin-left: 0;\n padding-top: 0;\n }\n .lh-categories {\n margin-top: 0;\n }\n .lh-buttons, .lh-highlighter {\n /* hide stickyheader marker when printing. crbug.com/41486992 */\n display: none;\n }\n}\n\n.lh-table {\n position: relative;\n border-collapse: separate;\n border-spacing: 0;\n /* Can't assign padding to table, so shorten the width instead. */\n width: calc(100% - var(--audit-description-padding-left) - var(--stackpack-padding-horizontal));\n border: 1px solid var(--report-border-color-secondary);\n}\n\n.lh-table thead th {\n position: sticky;\n top: var(--sticky-header-buffer);\n z-index: 1;\n background-color: var(--report-background-color);\n border-bottom: 1px solid var(--report-border-color-secondary);\n font-weight: normal;\n color: var(--color-gray-600);\n /* See text-wrapping comment on .lh-container. */\n word-break: normal;\n}\n\n.lh-row--group {\n background-color: var(--table-group-header-background-color);\n}\n\n.lh-row--group td {\n font-weight: bold;\n font-size: 1.05em;\n color: var(--table-group-header-text-color);\n}\n\n.lh-row--group td:first-child {\n display: block;\n min-width: max-content;\n font-weight: normal;\n}\n\n.lh-row--group .lh-text {\n color: inherit;\n text-decoration: none;\n display: inline-block;\n}\n\n.lh-row--group a.lh-link:hover {\n text-decoration: underline;\n}\n\n.lh-row--group .lh-audit__adorn {\n text-transform: capitalize;\n font-weight: normal;\n padding: 2px 3px 1px 3px;\n}\n\n.lh-row--group .lh-audit__adorn1p {\n color: var(--link-color);\n border-color: var(--link-color);\n}\n\n.lh-row--group .lh-report-icon--external::before {\n content: \"\";\n background-repeat: no-repeat;\n width: 14px;\n height: 16px;\n opacity: 0.7;\n display: inline-block;\n vertical-align: middle;\n}\n\n.lh-row--group .lh-report-icon--external {\n visibility: hidden;\n}\n\n.lh-row--group:hover .lh-report-icon--external {\n visibility: visible;\n}\n\n.lh-dark .lh-report-icon--external::before {\n filter: invert(1);\n}\n\n/** Manages indentation of two-level and three-level nested adjacent rows */\n\n.lh-row--group ~ [data-entity]:not(.lh-row--group) td:first-child {\n padding-left: 20px;\n}\n\n.lh-row--group ~ [data-entity]:not(.lh-row--group) ~ .lh-sub-item-row td:first-child {\n margin-left: 20px;\n padding-left: 10px;\n border-left: 1px solid #A8C7FA;\n display: block;\n}\n\n.lh-row--even {\n background-color: var(--table-group-header-background-color);\n}\n.lh-row--hidden {\n display: none;\n}\n\n.lh-table th,\n.lh-table td {\n padding: var(--default-padding);\n}\n\n.lh-table tr {\n vertical-align: middle;\n}\n\n.lh-table tr:hover {\n background-color: var(--table-higlight-background-color);\n}\n\n/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */\n.lh-table-column--text,\n.lh-table-column--source-location,\n.lh-table-column--url,\n/* .lh-table-column--thumbnail, */\n/* .lh-table-column--empty,*/\n.lh-table-column--code,\n.lh-table-column--node {\n text-align: left;\n}\n\n.lh-table-column--code {\n min-width: 100px;\n}\n\n.lh-table-column--bytes,\n.lh-table-column--timespanMs,\n.lh-table-column--ms,\n.lh-table-column--numeric {\n text-align: right;\n word-break: normal;\n}\n\n\n\n.lh-table .lh-table-column--thumbnail {\n width: var(--image-preview-size);\n}\n\n.lh-table-column--url {\n min-width: 250px;\n}\n\n.lh-table-column--text {\n min-width: 80px;\n}\n\n/* Keep columns narrow if they follow the URL column */\n/* 12% was determined to be a decent narrow width, but wide enough for column headings */\n.lh-table-column--url + th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--ms,\n.lh-table-column--url + .lh-table-column--ms + th.lh-table-column--bytes,\n.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--timespanMs {\n width: 12%;\n}\n\n/** Tweak styling for tables in insight audits. */\n.lh-audit[id$=\"-insight\"] .lh-table {\n border: none;\n}\n\n.lh-audit[id$=\"-insight\"] .lh-table thead th {\n font-weight: bold;\n color: unset;\n}\n\n.lh-audit[id$=\"-insight\"] .lh-table th,\n.lh-audit[id$=\"-insight\"] .lh-table td {\n padding: calc(var(--default-padding) / 2);\n}\n\n.lh-audit[id$=\"-insight\"] .lh-table .lh-row--even,\n.lh-audit[id$=\"-insight\"] .lh-table tr:not(.lh-row--group):hover {\n background-color: unset;\n}\n\n.lh-text__url-host {\n display: inline;\n}\n\n.lh-text__url-host {\n margin-left: calc(var(--report-font-size) / 2);\n opacity: 0.6;\n font-size: 90%\n}\n\n.lh-thumbnail {\n object-fit: cover;\n width: var(--image-preview-size);\n height: var(--image-preview-size);\n display: block;\n}\n\n.lh-unknown pre {\n overflow: scroll;\n border: solid 1px var(--color-gray-200);\n}\n\n.lh-text__url > a {\n color: inherit;\n text-decoration: none;\n}\n\n.lh-text__url > a:hover {\n text-decoration: underline dotted #999;\n}\n\n.lh-sub-item-row {\n margin-left: 20px;\n margin-bottom: 0;\n color: var(--color-gray-700);\n}\n\n.lh-sub-item-row td {\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 20px;\n}\n\n.lh-sub-item-row .lh-element-screenshot {\n zoom: 0.6;\n}\n\n/* Chevron\n https://codepen.io/paulirish/pen/LmzEmK\n */\n.lh-chevron {\n --chevron-angle: 42deg;\n /* Edge doesn't support transform: rotate(calc(...)), so we define it here */\n --chevron-angle-right: -42deg;\n width: var(--chevron-size);\n height: var(--chevron-size);\n margin-top: calc((var(--report-line-height) - 12px) / 2);\n}\n\n.lh-chevron__lines {\n transition: transform 0.4s;\n transform: translateY(var(--report-line-height));\n}\n.lh-chevron__line {\n stroke: var(--chevron-line-stroke);\n stroke-width: var(--chevron-size);\n stroke-linecap: square;\n transform-origin: 50%;\n transform: rotate(var(--chevron-angle));\n transition: transform 300ms, stroke 300ms;\n}\n\n.lh-expandable-details .lh-chevron__line-right,\n.lh-expandable-details[open] .lh-chevron__line-left {\n transform: rotate(var(--chevron-angle-right));\n}\n\n.lh-expandable-details[open] .lh-chevron__line-right {\n transform: rotate(var(--chevron-angle));\n}\n\n\n.lh-expandable-details[open] .lh-chevron__lines {\n transform: translateY(calc(var(--chevron-size) * -1));\n}\n\n.lh-expandable-details[open] {\n animation: 300ms openDetails forwards;\n padding-bottom: var(--default-padding);\n}\n\n@keyframes openDetails {\n from {\n outline: 1px solid var(--report-background-color);\n }\n to {\n outline: 1px solid;\n box-shadow: 0 2px 4px rgba(0, 0, 0, .24);\n }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 780px) {\n /* no black outline if we're not confident the entire table can be displayed within bounds */\n .lh-expandable-details[open] {\n animation: none;\n }\n}\n\n@container lh-container (max-width: 780px) {\n /* no black outline if we're not confident the entire table can be displayed within bounds */\n .lh-expandable-details[open] {\n animation: none;\n }\n}\n\n.lh-expandable-details[open] summary, details.lh-clump > summary {\n border-bottom: 1px solid var(--report-border-color-secondary);\n}\ndetails.lh-clump[open] > summary {\n border-bottom-width: 0;\n}\n\n\n\ndetails .lh-clump-toggletext--hide,\ndetails[open] .lh-clump-toggletext--show { display: none; }\ndetails[open] .lh-clump-toggletext--hide { display: block;}\n\n\n/* Tooltip */\n.lh-tooltip-boundary {\n position: relative;\n}\n\n.lh-tooltip {\n position: absolute;\n display: none; /* Don't retain these layers when not needed */\n opacity: 0;\n background: #ffffff;\n white-space: pre-line; /* Render newlines in the text */\n min-width: 246px;\n max-width: 275px;\n padding: 15px;\n border-radius: 5px;\n text-align: initial;\n line-height: 1.4;\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n .lh-tooltip {\n min-width: 45cqi;\n padding: 3cqi;\n }\n}\n\n/* shrink tooltips to not be cutoff on left edge of narrow container\n 45vw is chosen to be ~= width of the left column of metrics\n*/\n@container lh-container (max-width: 535px) {\n .lh-tooltip {\n min-width: 45cqi;\n padding: 3cqi;\n }\n}\n\n.lh-tooltip-boundary:hover .lh-tooltip {\n display: block;\n animation: fadeInTooltip 250ms;\n animation-fill-mode: forwards;\n animation-delay: 850ms;\n bottom: 100%;\n z-index: 1;\n will-change: opacity;\n right: 0;\n pointer-events: none;\n}\n\n.lh-tooltip::before {\n content: \"\";\n border: solid transparent;\n border-bottom-color: #fff;\n border-width: 10px;\n position: absolute;\n bottom: -20px;\n right: 6px;\n transform: rotate(180deg);\n pointer-events: none;\n}\n\n@keyframes fadeInTooltip {\n 0% { opacity: 0; }\n 75% { opacity: 1; }\n 100% { opacity: 1; filter: drop-shadow(1px 0px 1px #aaa) drop-shadow(0px 2px 4px hsla(206, 6%, 25%, 0.15)); pointer-events: auto; }\n}\n\n/* Element screenshot */\n.lh-element-screenshot {\n float: left;\n margin-right: 20px;\n}\n.lh-element-screenshot__content {\n overflow: hidden;\n min-width: 110px;\n display: flex;\n justify-content: center;\n background-color: var(--report-background-color);\n}\n.lh-element-screenshot__image {\n position: relative;\n /* Set by ElementScreenshotRenderer.installFullPageScreenshotCssVariable */\n background-image: var(--element-screenshot-url);\n outline: 2px solid #777;\n background-color: white;\n background-repeat: no-repeat;\n}\n.lh-element-screenshot__mask {\n position: absolute;\n background: #555;\n opacity: 0.8;\n}\n.lh-element-screenshot__element-marker {\n position: absolute;\n outline: 2px solid var(--color-lime-400);\n}\n.lh-element-screenshot__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2000; /* .lh-topbar is 1000 */\n background: var(--screenshot-overlay-background);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: zoom-out;\n}\n\n.lh-element-screenshot__overlay .lh-element-screenshot {\n margin-right: 0; /* clearing margin used in thumbnail case */\n outline: 1px solid var(--color-gray-700);\n}\n\n.lh-screenshot-overlay--enabled .lh-element-screenshot {\n cursor: zoom-out;\n}\n.lh-screenshot-overlay--enabled .lh-node .lh-element-screenshot {\n cursor: zoom-in;\n}\n\n\n.lh-meta__items {\n --meta-icon-size: calc(var(--report-icon-size) * 0.667);\n padding: var(--default-padding);\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n background-color: var(--env-item-background-color);\n border-radius: 3px;\n margin: 0 0 var(--default-padding) 0;\n font-size: 12px;\n column-gap: var(--default-padding);\n color: var(--color-gray-700);\n}\n\n.lh-meta__item {\n display: block;\n list-style-type: none;\n position: relative;\n padding: 0 0 0 calc(var(--meta-icon-size) + var(--default-padding) * 2);\n cursor: unset; /* disable pointer cursor from report-icon */\n}\n\n.lh-meta__item.lh-tooltip-boundary {\n text-decoration: dotted underline var(--color-gray-500);\n cursor: help;\n}\n\n.lh-meta__item.lh-report-icon::before {\n position: absolute;\n left: var(--default-padding);\n width: var(--meta-icon-size);\n height: var(--meta-icon-size);\n}\n\n.lh-meta__item.lh-report-icon:hover::before {\n opacity: 0.7;\n}\n\n.lh-meta__item .lh-tooltip {\n color: var(--color-gray-800);\n}\n\n.lh-meta__item .lh-tooltip::before {\n right: auto; /* Set the tooltip arrow to the leftside */\n left: 6px;\n}\n\n.lh-meta__item:hover .lh-tooltip {\n right: auto;\n left: 6px;\n}\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 640px) {\n .lh-meta__items {\n grid-template-columns: 1fr 1fr;\n }\n}\n\n/* Change the grid for narrow container */\n@container lh-container (max-width: 640px) {\n .lh-meta__items {\n grid-template-columns: 1fr 1fr;\n }\n}\n\n/**\n* This media query is a temporary fallback for browsers that do not support `@container query`.\n* TODO: remove this media query when `@container query` is fully supported by browsers\n* See https://github.com/GoogleChrome/lighthouse/pull/16332\n*/\n@media screen and (max-width: 535px) {\n .lh-meta__items {\n display: block;\n }\n}\n\n@container lh-container (max-width: 535px) {\n .lh-meta__items {\n display: block;\n }\n}\n\n/* Explodey gauge */\n\n.lh-exp-gauge-component {\n margin-bottom: 10px;\n}\n\n.lh-exp-gauge-component circle {\n stroke: currentcolor;\n r: var(--radius);\n}\n\n.lh-exp-gauge-component text {\n font-size: calc(var(--radius) * 0.2);\n}\n\n.lh-exp-gauge-component .lh-exp-gauge {\n margin: 0 auto;\n width: 225px;\n stroke-width: var(--stroke-width);\n stroke-linecap: round;\n\n /* for better rendering perf */\n contain: strict;\n height: 225px;\n will-change: transform;\n}\n.lh-exp-gauge-component .lh-exp-gauge--faded {\n opacity: 0.1;\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper {\n font-family: var(--report-font-family-monospace);\n text-align: center;\n text-decoration: none;\n transition: .3s;\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass {\n color: var(--color-pass);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average {\n color: var(--color-average);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail {\n color: var(--color-fail);\n}\n.lh-exp-gauge-component .state--expanded {\n transition: color .3s;\n}\n.lh-exp-gauge-component .state--highlight {\n color: var(--color-highlight);\n}\n.lh-exp-gauge-component .lh-exp-gauge__svg-wrapper {\n display: flex;\n flex-direction: column-reverse;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__label {\n fill: var(--report-text-color);\n font-family: var(--report-font-family);\n font-size: 12px;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__cutout {\n opacity: .999;\n transition: opacity .3s;\n}\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__cutout {\n opacity: 0;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__inner {\n color: inherit;\n}\n.lh-exp-gauge-component .lh-exp-gauge__base {\n fill: currentcolor;\n}\n\n\n.lh-exp-gauge-component .lh-exp-gauge__arc {\n fill: none;\n transition: opacity .3s;\n}\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric {\n color: var(--metric-color);\n stroke-dashoffset: var(--metric-offset);\n opacity: 0.3;\n}\n.lh-exp-gauge-component .lh-exp-gauge-hovertarget {\n color: currentcolor;\n opacity: 0.001;\n stroke-linecap: butt;\n stroke-width: 24;\n /* hack. move the hover target out of the center. ideally i tweak the r instead but that rquires considerably more math. */\n transform: scale(1.15);\n}\n.lh-exp-gauge-component .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n opacity: 0;\n stroke-dasharray: 0 calc(var(--circle-meas) * var(--radius));\n transition: 0s .005s;\n}\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n opacity: .999;\n stroke-dasharray: var(--metric-array);\n transition: 0.3s; /* calc(.005s + var(--i)*.05s); entrace animation */\n}\n.lh-exp-gauge-component .state--expanded .lh-exp-gauge__inner .lh-exp-gauge__arc {\n opacity: 0;\n}\n\n\n.lh-exp-gauge-component .lh-exp-gauge__percentage {\n text-anchor: middle;\n dominant-baseline: middle;\n opacity: .999;\n font-size: calc(var(--radius) * 0.625);\n transition: opacity .3s ease-in;\n}\n.lh-exp-gauge-component .state--highlight .lh-exp-gauge__percentage {\n opacity: 0;\n}\n\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--fail .lh-exp-gauge__percentage {\n fill: var(--color-fail);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--average .lh-exp-gauge__percentage {\n fill: var(--color-average);\n}\n.lh-exp-gauge-component .lh-exp-gauge__wrapper--pass .lh-exp-gauge__percentage {\n fill: var(--color-pass);\n}\n\n.lh-exp-gauge-component .lh-cover {\n fill: none;\n opacity: .001;\n pointer-events: none;\n}\n.lh-exp-gauge-component .state--expanded .lh-cover {\n pointer-events: auto;\n}\n\n.lh-exp-gauge-component .metric {\n transform: scale(var(--scale-initial));\n opacity: 0;\n transition: transform .1s .2s ease-out, opacity .3s ease-out;\n pointer-events: none;\n}\n.lh-exp-gauge-component .metric text {\n pointer-events: none;\n}\n.lh-exp-gauge-component .metric__value {\n fill: currentcolor;\n opacity: 0;\n transition: opacity 0.2s;\n}\n.lh-exp-gauge-component .state--expanded .metric {\n transform: scale(1);\n opacity: .999;\n transition: transform .3s ease-out, opacity .3s ease-in, stroke-width .1s ease-out;\n transition-delay: calc(var(--i)*.05s);\n pointer-events: auto;\n}\n.lh-exp-gauge-component .state--highlight .metric {\n opacity: .3;\n}\n.lh-exp-gauge-component .state--highlight .metric--highlight {\n opacity: .999;\n stroke-width: calc(1.5*var(--stroke-width));\n}\n.lh-exp-gauge-component .state--highlight .metric--highlight .metric__value {\n opacity: 0.999;\n}\n\n\n/*\n the initial first load peek\n*/\n.lh-exp-gauge-component .lh-exp-gauge__bg { /* needed for the use zindex stacking w/ transparency */\n fill: var(--report-background-color);\n stroke: var(--report-background-color);\n}\n.lh-exp-gauge-component .state--peek .metric {\n transition-delay: 0ms;\n animation: peek var(--peek-dur) cubic-bezier(0.46, 0.03, 0.52, 0.96);\n animation-fill-mode: forwards;\n}\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__inner .lh-exp-gauge__arc {\n opacity: 1;\n}\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc.lh-exp-gauge--faded {\n opacity: 0.3; /* just a tad stronger cuz its fighting with a big solid arg */\n}\n/* do i need to set expanded and override this? */\n.lh-exp-gauge-component .state--peek .lh-exp-gauge__arc--metric.lh-exp-gauge--miniarc {\n transition: opacity 0.3s;\n}\n.lh-exp-gauge-component .state--peek {\n color: unset;\n}\n.lh-exp-gauge-component .state--peek .metric__label {\n display: none;\n}\n\n.lh-exp-gauge-component .metric__label {\n fill: var(--report-text-color);\n}\n\n@keyframes peek {\n /* biggest it should go is 0.92. smallest is 0.8 */\n 0% {\n transform: scale(0.8);\n opacity: 0.8;\n }\n\n 50% {\n transform: scale(0.92);\n opacity: 1;\n }\n\n 100% {\n transform: scale(0.8);\n opacity: 0.8;\n }\n}\n\n.lh-exp-gauge-component .wrapper {\n width: 620px;\n}\n\n/*# sourceURL=report-styles.css */\n"), t.append(n), t;
|
|
981
|
+
}
|
|
982
|
+
function Ot(e) {
|
|
983
|
+
let t = e.createFragment(), n = e.createElement("style");
|
|
984
|
+
n.append("\n .lh-topbar {\n position: sticky;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n height: var(--topbar-height);\n padding: var(--topbar-padding);\n font-size: var(--report-font-size-secondary);\n background-color: var(--topbar-background-color);\n border-bottom: 1px solid var(--color-gray-200);\n }\n\n .lh-topbar__logo {\n width: var(--topbar-logo-size);\n height: var(--topbar-logo-size);\n user-select: none;\n flex: none;\n }\n\n .lh-topbar__url {\n margin: var(--topbar-padding);\n text-decoration: none;\n color: var(--report-text-color);\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n .lh-tools {\n display: flex;\n align-items: center;\n margin-left: auto;\n will-change: transform;\n min-width: var(--report-icon-size);\n }\n .lh-tools__button {\n width: var(--report-icon-size);\n min-width: 24px;\n height: var(--report-icon-size);\n cursor: pointer;\n margin-right: 5px;\n /* This is actually a button element, but we want to style it like a transparent div. */\n display: flex;\n background: none;\n color: inherit;\n border: none;\n padding: 0;\n font: inherit;\n }\n .lh-tools__button svg {\n fill: var(--tools-icon-color);\n }\n .lh-dark .lh-tools__button svg {\n filter: invert(1);\n }\n .lh-tools__button.lh-active + .lh-tools__dropdown {\n opacity: 1;\n clip: rect(-1px, 194px, 270px, -3px);\n visibility: visible;\n }\n .lh-tools__dropdown {\n position: absolute;\n background-color: var(--report-background-color);\n border: 1px solid var(--report-border-color);\n border-radius: 3px;\n padding: calc(var(--default-padding) / 2) 0;\n cursor: pointer;\n top: 36px;\n right: 0;\n box-shadow: 1px 1px 3px #ccc;\n min-width: 125px;\n clip: rect(0, 164px, 0, 0);\n visibility: hidden;\n opacity: 0;\n transition: all 200ms cubic-bezier(0,0,0.2,1);\n }\n .lh-tools__dropdown a {\n color: currentColor;\n text-decoration: none;\n white-space: nowrap;\n padding: 0 6px;\n line-height: 2;\n }\n .lh-tools__dropdown a:hover,\n .lh-tools__dropdown a:focus {\n background-color: var(--color-gray-200);\n outline: none;\n }\n /* save-gist option hidden in report. */\n .lh-tools__dropdown a[data-action='save-gist'] {\n display: none;\n }\n\n .lh-locale-selector {\n width: 100%;\n color: var(--report-text-color);\n background-color: var(--locale-selector-background-color);\n padding: 2px;\n }\n .lh-tools-locale {\n display: flex;\n align-items: center;\n flex-direction: row-reverse;\n }\n .lh-tools-locale__selector-wrapper {\n transition: opacity 0.15s;\n opacity: 0;\n max-width: 200px;\n }\n .lh-button.lh-tool-locale__button {\n height: var(--topbar-height);\n color: var(--tools-icon-color);\n padding: calc(var(--default-padding) / 2);\n }\n .lh-tool-locale__button.lh-active + .lh-tools-locale__selector-wrapper {\n opacity: 1;\n clip: rect(-1px, 255px, 242px, -3px);\n visibility: visible;\n margin: 0 4px;\n }\n\n /**\n * This media query is a temporary fallback for browsers that do not support `@container query`.\n * TODO: remove this media query when `@container query` is fully supported by browsers\n * See https://github.com/GoogleChrome/lighthouse/pull/16332\n */\n @media screen and (max-width: 964px) {\n .lh-tools__dropdown {\n right: 0;\n left: initial;\n }\n }\n\n @container lh-container (max-width: 964px) {\n .lh-tools__dropdown {\n right: 0;\n left: initial;\n }\n }\n\n @media print {\n .lh-topbar {\n position: static;\n margin-left: 0;\n }\n\n .lh-tools__dropdown {\n display: none;\n }\n }\n "), t.append(n);
|
|
985
|
+
let r = e.createElement("div", "lh-topbar"), i = e.createElementNS("http://www.w3.org/2000/svg", "svg", "lh-topbar__logo");
|
|
986
|
+
i.setAttribute("role", "img"), i.setAttribute("title", "Lighthouse logo"), i.setAttribute("fill", "none"), i.setAttribute("xmlns", "http://www.w3.org/2000/svg"), i.setAttribute("viewBox", "0 0 48 48");
|
|
987
|
+
let a = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
988
|
+
a.setAttribute("d", "m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z"), a.setAttribute("fill", "#F63");
|
|
989
|
+
let o = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
990
|
+
o.setAttribute("d", "M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z"), o.setAttribute("fill", "#FFA385");
|
|
991
|
+
let s = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
992
|
+
s.setAttribute("fill", "#FF3"), s.setAttribute("d", "M20.5 10h7v7h-7z"), i.append(" ", a, " ", o, " ", s, " ");
|
|
993
|
+
let c = e.createElement("a", "lh-topbar__url");
|
|
994
|
+
c.setAttribute("href", ""), c.setAttribute("target", "_blank"), c.setAttribute("rel", "noopener");
|
|
995
|
+
let l = e.createElement("div", "lh-tools"), u = e.createElement("div", "lh-tools-locale lh-hidden"), d = e.createElement("button", "lh-button lh-tool-locale__button");
|
|
996
|
+
d.setAttribute("id", "lh-button__swap-locales"), d.setAttribute("title", "Show Language Picker"), d.setAttribute("aria-label", "Toggle language picker"), d.setAttribute("aria-haspopup", "menu"), d.setAttribute("aria-expanded", "false"), d.setAttribute("aria-controls", "lh-tools-locale__selector-wrapper");
|
|
997
|
+
let f = e.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
998
|
+
f.setAttribute("width", "20px"), f.setAttribute("height", "20px"), f.setAttribute("viewBox", "0 0 24 24"), f.setAttribute("fill", "currentColor");
|
|
999
|
+
let p = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1000
|
+
p.setAttribute("d", "M0 0h24v24H0V0z"), p.setAttribute("fill", "none");
|
|
1001
|
+
let m = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1002
|
+
m.setAttribute("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"), f.append(p, m), d.append(" ", f, " ");
|
|
1003
|
+
let h = e.createElement("div", "lh-tools-locale__selector-wrapper");
|
|
1004
|
+
h.setAttribute("id", "lh-tools-locale__selector-wrapper"), h.setAttribute("role", "menu"), h.setAttribute("aria-labelledby", "lh-button__swap-locales"), h.setAttribute("aria-hidden", "true"), h.append(" ", " "), u.append(" ", d, " ", h, " ");
|
|
1005
|
+
let g = e.createElement("button", "lh-tools__button");
|
|
1006
|
+
g.setAttribute("id", "lh-tools-button"), g.setAttribute("title", "Tools menu"), g.setAttribute("aria-label", "Toggle report tools menu"), g.setAttribute("aria-haspopup", "menu"), g.setAttribute("aria-expanded", "false"), g.setAttribute("aria-controls", "lh-tools-dropdown");
|
|
1007
|
+
let _ = e.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
1008
|
+
_.setAttribute("width", "100%"), _.setAttribute("height", "100%"), _.setAttribute("viewBox", "0 0 24 24");
|
|
1009
|
+
let v = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1010
|
+
v.setAttribute("d", "M0 0h24v24H0z"), v.setAttribute("fill", "none");
|
|
1011
|
+
let y = e.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1012
|
+
y.setAttribute("d", "M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"), _.append(" ", v, " ", y, " "), g.append(" ", _, " ");
|
|
1013
|
+
let b = e.createElement("div", "lh-tools__dropdown");
|
|
1014
|
+
b.setAttribute("id", "lh-tools-dropdown"), b.setAttribute("role", "menu"), b.setAttribute("aria-labelledby", "lh-tools-button");
|
|
1015
|
+
let x = e.createElement("a", "lh-report-icon lh-report-icon--print");
|
|
1016
|
+
x.setAttribute("role", "menuitem"), x.setAttribute("tabindex", "-1"), x.setAttribute("href", "#"), x.setAttribute("data-i18n", "dropdownPrintSummary"), x.setAttribute("data-action", "print-summary");
|
|
1017
|
+
let S = e.createElement("a", "lh-report-icon lh-report-icon--print");
|
|
1018
|
+
S.setAttribute("role", "menuitem"), S.setAttribute("tabindex", "-1"), S.setAttribute("href", "#"), S.setAttribute("data-i18n", "dropdownPrintExpanded"), S.setAttribute("data-action", "print-expanded");
|
|
1019
|
+
let C = e.createElement("a", "lh-report-icon lh-report-icon--copy");
|
|
1020
|
+
C.setAttribute("role", "menuitem"), C.setAttribute("tabindex", "-1"), C.setAttribute("href", "#"), C.setAttribute("data-i18n", "dropdownCopyJSON"), C.setAttribute("data-action", "copy");
|
|
1021
|
+
let w = e.createElement("a", "lh-report-icon lh-report-icon--download lh-hidden");
|
|
1022
|
+
w.setAttribute("role", "menuitem"), w.setAttribute("tabindex", "-1"), w.setAttribute("href", "#"), w.setAttribute("data-i18n", "dropdownSaveHTML"), w.setAttribute("data-action", "save-html");
|
|
1023
|
+
let T = e.createElement("a", "lh-report-icon lh-report-icon--download");
|
|
1024
|
+
T.setAttribute("role", "menuitem"), T.setAttribute("tabindex", "-1"), T.setAttribute("href", "#"), T.setAttribute("data-i18n", "dropdownSaveJSON"), T.setAttribute("data-action", "save-json");
|
|
1025
|
+
let E = e.createElement("a", "lh-report-icon lh-report-icon--open");
|
|
1026
|
+
E.setAttribute("role", "menuitem"), E.setAttribute("tabindex", "-1"), E.setAttribute("href", "#"), E.setAttribute("data-i18n", "dropdownViewer"), E.setAttribute("data-action", "open-viewer");
|
|
1027
|
+
let D = e.createElement("a", "lh-report-icon lh-report-icon--open");
|
|
1028
|
+
D.setAttribute("role", "menuitem"), D.setAttribute("tabindex", "-1"), D.setAttribute("href", "#"), D.setAttribute("data-i18n", "dropdownSaveGist"), D.setAttribute("data-action", "save-gist");
|
|
1029
|
+
let O = e.createElement("a", "lh-report-icon lh-report-icon--open lh-hidden");
|
|
1030
|
+
O.setAttribute("role", "menuitem"), O.setAttribute("tabindex", "-1"), O.setAttribute("href", "#"), O.setAttribute("data-i18n", "dropdownViewUnthrottledTrace"), O.setAttribute("data-action", "view-unthrottled-trace");
|
|
1031
|
+
let k = e.createElement("a", "lh-report-icon lh-report-icon--dark");
|
|
1032
|
+
return k.setAttribute("role", "menuitem"), k.setAttribute("tabindex", "-1"), k.setAttribute("href", "#"), k.setAttribute("data-i18n", "dropdownDarkTheme"), k.setAttribute("data-action", "toggle-dark"), b.append(" ", x, " ", S, " ", C, " ", " ", w, " ", T, " ", E, " ", D, " ", " ", O, " ", k, " "), l.append(" ", u, " ", g, " ", b, " "), r.append(" ", " ", i, " ", c, " ", l, " "), t.append(r), t;
|
|
1033
|
+
}
|
|
1034
|
+
function kt(e) {
|
|
1035
|
+
let t = e.createFragment(), n = e.createElement("div", "lh-warnings lh-warnings--toplevel"), r = e.createElement("p", "lh-warnings__msg"), i = e.createElement("ul");
|
|
1036
|
+
return n.append(" ", r, " ", i, " "), t.append(n), t;
|
|
1037
|
+
}
|
|
1038
|
+
function At(e, t) {
|
|
1039
|
+
switch (t) {
|
|
1040
|
+
case "3pFilter": return st(e);
|
|
1041
|
+
case "audit": return ct(e);
|
|
1042
|
+
case "categoryHeader": return lt(e);
|
|
1043
|
+
case "chevron": return ut(e);
|
|
1044
|
+
case "clump": return dt(e);
|
|
1045
|
+
case "crc": return ft(e);
|
|
1046
|
+
case "crcChain": return pt(e);
|
|
1047
|
+
case "elementScreenshot": return mt(e);
|
|
1048
|
+
case "explodeyGauge": return ht(e);
|
|
1049
|
+
case "footer": return gt(e);
|
|
1050
|
+
case "fraction": return _t(e);
|
|
1051
|
+
case "gauge": return vt(e);
|
|
1052
|
+
case "heading": return yt(e);
|
|
1053
|
+
case "metric": return bt(e);
|
|
1054
|
+
case "scorescale": return xt(e);
|
|
1055
|
+
case "scoresWrapper": return St(e);
|
|
1056
|
+
case "snippet": return Ct(e);
|
|
1057
|
+
case "snippetContent": return wt(e);
|
|
1058
|
+
case "snippetHeader": return Tt(e);
|
|
1059
|
+
case "snippetLine": return Et(e);
|
|
1060
|
+
case "styles": return Dt(e);
|
|
1061
|
+
case "topbar": return Ot(e);
|
|
1062
|
+
case "warningsToplevel": return kt(e);
|
|
1063
|
+
}
|
|
1064
|
+
throw Error("unexpected component: " + t);
|
|
1065
|
+
}
|
|
1066
|
+
var jt = class {
|
|
1067
|
+
constructor(e, t) {
|
|
1068
|
+
this._document = e, this._lighthouseChannel = "unknown", this._componentCache = /* @__PURE__ */ new Map(), this.rootEl = t;
|
|
1069
|
+
}
|
|
1070
|
+
createElement(e, t) {
|
|
1071
|
+
let n = this._document.createElement(e);
|
|
1072
|
+
if (t) for (let e of t.split(/\s+/)) e && n.classList.add(e);
|
|
1073
|
+
return n;
|
|
1074
|
+
}
|
|
1075
|
+
createElementNS(e, t, n) {
|
|
1076
|
+
let r = this._document.createElementNS(e, t);
|
|
1077
|
+
if (n) for (let e of n.split(/\s+/)) e && r.classList.add(e);
|
|
1078
|
+
return r;
|
|
1079
|
+
}
|
|
1080
|
+
createSVGElement(e, t) {
|
|
1081
|
+
return this._document.createElementNS("http://www.w3.org/2000/svg", e, t);
|
|
1082
|
+
}
|
|
1083
|
+
createFragment() {
|
|
1084
|
+
return this._document.createDocumentFragment();
|
|
1085
|
+
}
|
|
1086
|
+
createTextNode(e) {
|
|
1087
|
+
return this._document.createTextNode(e);
|
|
1088
|
+
}
|
|
1089
|
+
createChildOf(e, t, n) {
|
|
1090
|
+
let r = this.createElement(t, n);
|
|
1091
|
+
return e.append(r), r;
|
|
1092
|
+
}
|
|
1093
|
+
createComponent(e) {
|
|
1094
|
+
let t = this._componentCache.get(e);
|
|
1095
|
+
if (t) {
|
|
1096
|
+
let e = t.cloneNode(!0);
|
|
1097
|
+
return this.findAll("style", e).forEach((e) => e.remove()), e;
|
|
1098
|
+
}
|
|
1099
|
+
return t = At(this, e), this._componentCache.set(e, t), t.cloneNode(!0);
|
|
1100
|
+
}
|
|
1101
|
+
clearComponentCache() {
|
|
1102
|
+
this._componentCache.clear();
|
|
1103
|
+
}
|
|
1104
|
+
convertMarkdownLinkSnippets(e, t = {}) {
|
|
1105
|
+
let n = this.createElement("span");
|
|
1106
|
+
for (let r of B.splitMarkdownLink(e)) {
|
|
1107
|
+
let e = r.text.includes("`") ? this.convertMarkdownCodeSnippets(r.text) : r.text;
|
|
1108
|
+
if (!r.isLink) {
|
|
1109
|
+
n.append(e);
|
|
1110
|
+
continue;
|
|
1111
|
+
}
|
|
1112
|
+
let i = new URL(r.linkHref);
|
|
1113
|
+
([
|
|
1114
|
+
"https://developers.google.com",
|
|
1115
|
+
"https://web.dev",
|
|
1116
|
+
"https://developer.chrome.com"
|
|
1117
|
+
].includes(i.origin) || t.alwaysAppendUtmSource) && (i.searchParams.set("utm_source", "lighthouse"), i.searchParams.set("utm_medium", this._lighthouseChannel));
|
|
1118
|
+
let a = this.createElement("a");
|
|
1119
|
+
a.rel = "noopener", a.target = "_blank", a.append(e), this.safelySetHref(a, i.href), n.append(a);
|
|
1120
|
+
}
|
|
1121
|
+
return n;
|
|
1122
|
+
}
|
|
1123
|
+
safelySetHref(e, t) {
|
|
1124
|
+
if (t ||= "", t.startsWith("#")) {
|
|
1125
|
+
e.href = t;
|
|
1126
|
+
return;
|
|
1127
|
+
}
|
|
1128
|
+
let n = ["https:", "http:"], r;
|
|
1129
|
+
try {
|
|
1130
|
+
r = new URL(t);
|
|
1131
|
+
} catch {}
|
|
1132
|
+
r && n.includes(r.protocol) && (e.href = r.href);
|
|
1133
|
+
}
|
|
1134
|
+
safelySetBlobHref(e, t) {
|
|
1135
|
+
if (t.type !== "text/html" && t.type !== "application/json") throw Error("Unsupported blob type");
|
|
1136
|
+
e.href = URL.createObjectURL(t);
|
|
1137
|
+
}
|
|
1138
|
+
convertMarkdownCodeSnippets(e) {
|
|
1139
|
+
let t = this.createElement("span");
|
|
1140
|
+
for (let n of B.splitMarkdownCodeSpans(e)) if (n.isCode) {
|
|
1141
|
+
let e = this.createElement("code");
|
|
1142
|
+
e.textContent = n.text, t.append(e);
|
|
1143
|
+
} else t.append(this._document.createTextNode(n.text));
|
|
1144
|
+
return t;
|
|
1145
|
+
}
|
|
1146
|
+
setLighthouseChannel(e) {
|
|
1147
|
+
this._lighthouseChannel = e;
|
|
1148
|
+
}
|
|
1149
|
+
document() {
|
|
1150
|
+
return this._document;
|
|
1151
|
+
}
|
|
1152
|
+
isDevTools() {
|
|
1153
|
+
return !!this._document.querySelector(".lh-devtools");
|
|
1154
|
+
}
|
|
1155
|
+
find(e, t = this.rootEl ?? this._document) {
|
|
1156
|
+
let n = this.maybeFind(e, t);
|
|
1157
|
+
if (n === null) throw Error(`query ${e} not found`);
|
|
1158
|
+
return n;
|
|
1159
|
+
}
|
|
1160
|
+
maybeFind(e, t = this.rootEl ?? this._document) {
|
|
1161
|
+
return t.querySelector(e);
|
|
1162
|
+
}
|
|
1163
|
+
findAll(e, t) {
|
|
1164
|
+
return Array.from(t.querySelectorAll(e));
|
|
1165
|
+
}
|
|
1166
|
+
fireEventOn(e, t = this._document, n) {
|
|
1167
|
+
let r = new CustomEvent(e, n ? { detail: n } : void 0);
|
|
1168
|
+
t.dispatchEvent(r);
|
|
1169
|
+
}
|
|
1170
|
+
saveFile(e, t) {
|
|
1171
|
+
let n = this.createElement("a");
|
|
1172
|
+
n.download = t, this.safelySetBlobHref(n, e), this._document.body.append(n), n.click(), this._document.body.removeChild(n), setTimeout(() => URL.revokeObjectURL(n.href), 500);
|
|
1173
|
+
}
|
|
1174
|
+
}, Mt = 0, V = class e {
|
|
1175
|
+
static i18n = null;
|
|
1176
|
+
static strings = {};
|
|
1177
|
+
static reportJson = null;
|
|
1178
|
+
static apply(t) {
|
|
1179
|
+
e.strings = {
|
|
1180
|
+
...Ft,
|
|
1181
|
+
...t.providedStrings
|
|
1182
|
+
}, e.i18n = t.i18n, e.reportJson = t.reportJson;
|
|
1183
|
+
}
|
|
1184
|
+
static getUniqueSuffix() {
|
|
1185
|
+
return Mt++;
|
|
1186
|
+
}
|
|
1187
|
+
static resetUniqueSuffix() {
|
|
1188
|
+
Mt = 0;
|
|
1189
|
+
}
|
|
1190
|
+
}, Nt = "data:image/jpeg;base64,";
|
|
1191
|
+
function Pt(e) {
|
|
1192
|
+
e.configSettings.locale || (e.configSettings.locale = "en"), e.configSettings.formFactor || (e.configSettings.formFactor = e.configSettings.emulatedFormFactor), e.finalDisplayedUrl = B.getFinalDisplayedUrl(e), e.mainDocumentUrl = B.getMainDocumentUrl(e);
|
|
1193
|
+
for (let t of Object.values(e.audits)) if ((t.scoreDisplayMode === "not_applicable" || t.scoreDisplayMode === "not-applicable") && (t.scoreDisplayMode = "notApplicable"), t.scoreDisplayMode === "informative" && (t.score = 1), t.details) {
|
|
1194
|
+
if ((t.details.type === void 0 || t.details.type === "diagnostic") && (t.details.type = "debugdata"), t.details.type === "filmstrip") for (let e of t.details.items) e.data.startsWith(Nt) || (e.data = Nt + e.data);
|
|
1195
|
+
if (t.details.type === "table") for (let e of t.details.headings) {
|
|
1196
|
+
let { itemType: t, text: n } = e;
|
|
1197
|
+
t !== void 0 && (e.valueType = t, delete e.itemType), n !== void 0 && (e.label = n, delete e.text);
|
|
1198
|
+
let r = e.subItemsHeading?.itemType;
|
|
1199
|
+
e.subItemsHeading && r !== void 0 && (e.subItemsHeading.valueType = r, delete e.subItemsHeading.itemType);
|
|
1200
|
+
}
|
|
1201
|
+
if (t.id === "third-party-summary" && (t.details.type === "opportunity" || t.details.type === "table")) {
|
|
1202
|
+
let { headings: e, items: n } = t.details;
|
|
1203
|
+
if (e[0].valueType === "link") {
|
|
1204
|
+
e[0].valueType = "text";
|
|
1205
|
+
for (let e of n) typeof e.entity == "object" && e.entity.type === "link" && (e.entity = e.entity.text);
|
|
1206
|
+
t.details.isEntityGrouped = !0;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
let [t] = e.lighthouseVersion.split(".").map(Number), n = e.categories.performance;
|
|
1211
|
+
if (n) {
|
|
1212
|
+
if (t < 9) {
|
|
1213
|
+
e.categoryGroups ||= {}, e.categoryGroups.hidden = { title: "" };
|
|
1214
|
+
for (let e of n.auditRefs) e.group ? e.group === "load-opportunities" && (e.group = "diagnostics") : e.group = "hidden";
|
|
1215
|
+
} else if (t < 12) for (let e of n.auditRefs) e.group ||= "diagnostics";
|
|
1216
|
+
}
|
|
1217
|
+
if (t < 12 && n) {
|
|
1218
|
+
let t = /* @__PURE__ */ new Map();
|
|
1219
|
+
for (let e of n.auditRefs) {
|
|
1220
|
+
let n = e.relevantAudits;
|
|
1221
|
+
if (!(!n || !e.acronym)) for (let r of n) {
|
|
1222
|
+
let n = t.get(r) || [];
|
|
1223
|
+
n.push(e.acronym), t.set(r, n);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
for (let [n, r] of t) {
|
|
1227
|
+
if (!r.length) continue;
|
|
1228
|
+
let t = e.audits[n];
|
|
1229
|
+
if (t && !t.metricSavings) {
|
|
1230
|
+
t.metricSavings = {};
|
|
1231
|
+
for (let e of r) t.metricSavings[e] = 0;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
if (e.environment ||= {
|
|
1236
|
+
benchmarkIndex: 0,
|
|
1237
|
+
networkUserAgent: e.userAgent,
|
|
1238
|
+
hostUserAgent: e.userAgent
|
|
1239
|
+
}, e.configSettings.screenEmulation || (e.configSettings.screenEmulation = {
|
|
1240
|
+
width: -1,
|
|
1241
|
+
height: -1,
|
|
1242
|
+
deviceScaleFactor: -1,
|
|
1243
|
+
mobile: /mobile/i.test(e.environment.hostUserAgent),
|
|
1244
|
+
disabled: !1
|
|
1245
|
+
}), e.i18n ||= {}, e.audits["full-page-screenshot"]) {
|
|
1246
|
+
let t = e.audits["full-page-screenshot"].details;
|
|
1247
|
+
t ? e.fullPageScreenshot = {
|
|
1248
|
+
screenshot: t.screenshot,
|
|
1249
|
+
nodes: t.nodes
|
|
1250
|
+
} : e.fullPageScreenshot = null, delete e.audits["full-page-screenshot"];
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
var H = B.RATINGS, U = class e {
|
|
1254
|
+
static prepareReportResult(t) {
|
|
1255
|
+
let n = JSON.parse(JSON.stringify(t));
|
|
1256
|
+
Pt(n);
|
|
1257
|
+
for (let t of Object.values(n.audits)) t.details && (t.details.type === "opportunity" || t.details.type === "table") && !t.details.isEntityGrouped && n.entities && e.classifyEntities(n.entities, t.details);
|
|
1258
|
+
if (typeof n.categories != "object") throw Error("No categories provided.");
|
|
1259
|
+
let r = /* @__PURE__ */ new Map();
|
|
1260
|
+
for (let e of Object.values(n.categories)) e.auditRefs.forEach((e) => {
|
|
1261
|
+
e.acronym && r.set(e.acronym, e);
|
|
1262
|
+
}), e.auditRefs.forEach((e) => {
|
|
1263
|
+
e.result = n.audits[e.id];
|
|
1264
|
+
let t = Object.keys(e.result.metricSavings || {});
|
|
1265
|
+
if (t.length) {
|
|
1266
|
+
e.relevantMetrics = [];
|
|
1267
|
+
for (let n of t) {
|
|
1268
|
+
let t = r.get(n);
|
|
1269
|
+
t && e.relevantMetrics.push(t);
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
if (n.stackPacks) {
|
|
1273
|
+
let t = [e.id, ...e.result.replacesAudits ?? []];
|
|
1274
|
+
n.stackPacks.forEach((n) => {
|
|
1275
|
+
let r = t.find((e) => n.descriptions[e]);
|
|
1276
|
+
r && n.descriptions[r] && (e.stackPacks = e.stackPacks || [], e.stackPacks.push({
|
|
1277
|
+
title: n.title,
|
|
1278
|
+
iconDataURL: n.iconDataURL,
|
|
1279
|
+
description: n.descriptions[r]
|
|
1280
|
+
}));
|
|
1281
|
+
});
|
|
1282
|
+
}
|
|
1283
|
+
});
|
|
1284
|
+
return n;
|
|
1285
|
+
}
|
|
1286
|
+
static getUrlLocatorFn(e) {
|
|
1287
|
+
let t = e.find((e) => e.valueType === "url")?.key;
|
|
1288
|
+
if (t && typeof t == "string") return (e) => {
|
|
1289
|
+
let n = e[t];
|
|
1290
|
+
if (typeof n == "string") return n;
|
|
1291
|
+
};
|
|
1292
|
+
let n = e.find((e) => e.valueType === "source-location")?.key;
|
|
1293
|
+
if (n) return (e) => {
|
|
1294
|
+
let t = e[n];
|
|
1295
|
+
if (typeof t == "object" && t.type === "source-location") return t.url;
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1298
|
+
static classifyEntities(t, n) {
|
|
1299
|
+
let { items: r, headings: i } = n;
|
|
1300
|
+
if (!r.length || r.some((e) => e.entity)) return;
|
|
1301
|
+
let a = e.getUrlLocatorFn(i);
|
|
1302
|
+
if (a) for (let e of r) {
|
|
1303
|
+
let n = a(e);
|
|
1304
|
+
if (!n) continue;
|
|
1305
|
+
let r = "";
|
|
1306
|
+
try {
|
|
1307
|
+
r = B.parseURL(n).origin;
|
|
1308
|
+
} catch {}
|
|
1309
|
+
if (!r) continue;
|
|
1310
|
+
let i = t.find((e) => e.origins.includes(r));
|
|
1311
|
+
i && (e.entity = i.name);
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
static getTableItemSortComparator(e) {
|
|
1315
|
+
return (t, n) => {
|
|
1316
|
+
for (let r of e) {
|
|
1317
|
+
let e = t[r], i = n[r];
|
|
1318
|
+
if ((typeof e != typeof i || !["number", "string"].includes(typeof e)) && console.warn(`Warning: Attempting to sort unsupported value type: ${r}.`), typeof e == "number" && typeof i == "number" && e !== i) return i - e;
|
|
1319
|
+
if (typeof e == "string" && typeof i == "string" && e !== i) return e.localeCompare(i);
|
|
1320
|
+
}
|
|
1321
|
+
return 0;
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
static getEmulationDescriptions(e) {
|
|
1325
|
+
let t, n, r, i = e.throttling, a = V.i18n, o = V.strings;
|
|
1326
|
+
switch (e.throttlingMethod) {
|
|
1327
|
+
case "provided":
|
|
1328
|
+
r = n = t = o.throttlingProvided;
|
|
1329
|
+
break;
|
|
1330
|
+
case "devtools": {
|
|
1331
|
+
let { cpuSlowdownMultiplier: e, requestLatencyMs: s } = i;
|
|
1332
|
+
t = `${a.formatNumber(e)}x slowdown (DevTools)`, n = `${a.formatMilliseconds(s)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`, r = s === 150 * 3.75 && i.downloadThroughputKbps === 1.6 * 1024 * .9 && i.uploadThroughputKbps === 750 * .9 ? o.runtimeSlow4g : o.runtimeCustom;
|
|
1333
|
+
break;
|
|
1334
|
+
}
|
|
1335
|
+
case "simulate": {
|
|
1336
|
+
let { cpuSlowdownMultiplier: e, rttMs: s, throughputKbps: c } = i;
|
|
1337
|
+
t = `${a.formatNumber(e)}x slowdown (Simulated)`, n = `${a.formatMilliseconds(s)} TCP RTT, ${a.formatKbps(c)} throughput (Simulated)`, r = s === 150 && c === 1.6 * 1024 ? o.runtimeSlow4g : o.runtimeCustom;
|
|
1338
|
+
break;
|
|
1339
|
+
}
|
|
1340
|
+
default: r = t = n = o.runtimeUnknown;
|
|
1341
|
+
}
|
|
1342
|
+
let s = e.channel === "devtools" ? !1 : e.screenEmulation.disabled, c = e.channel === "devtools" ? e.formFactor === "mobile" : e.screenEmulation.mobile, l = o.runtimeMobileEmulation;
|
|
1343
|
+
s ? l = o.runtimeNoEmulation : c || (l = o.runtimeDesktopEmulation);
|
|
1344
|
+
let u = s ? void 0 : `${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`;
|
|
1345
|
+
return {
|
|
1346
|
+
deviceEmulation: l,
|
|
1347
|
+
screenEmulation: u,
|
|
1348
|
+
cpuThrottling: t,
|
|
1349
|
+
networkThrottling: n,
|
|
1350
|
+
summary: r
|
|
1351
|
+
};
|
|
1352
|
+
}
|
|
1353
|
+
static showAsPassed(e) {
|
|
1354
|
+
switch (e.scoreDisplayMode) {
|
|
1355
|
+
case "manual":
|
|
1356
|
+
case "notApplicable": return !0;
|
|
1357
|
+
case "error":
|
|
1358
|
+
case "informative": return !1;
|
|
1359
|
+
default: return Number(e.score) >= H.PASS.minScore;
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
static calculateRating(e, t) {
|
|
1363
|
+
if (t === "manual" || t === "notApplicable") return H.PASS.label;
|
|
1364
|
+
if (t === "error") return H.ERROR.label;
|
|
1365
|
+
if (e === null) return H.FAIL.label;
|
|
1366
|
+
let n = H.FAIL.label;
|
|
1367
|
+
return e >= H.PASS.minScore ? n = H.PASS.label : e >= H.AVERAGE.minScore && (n = H.AVERAGE.label), n;
|
|
1368
|
+
}
|
|
1369
|
+
static calculateCategoryFraction(t) {
|
|
1370
|
+
let n = 0, r = 0, i = 0, a = 0;
|
|
1371
|
+
for (let o of t.auditRefs) {
|
|
1372
|
+
let t = e.showAsPassed(o.result);
|
|
1373
|
+
if (!(o.group === "hidden" || o.result.scoreDisplayMode === "manual" || o.result.scoreDisplayMode === "notApplicable")) {
|
|
1374
|
+
if (o.result.scoreDisplayMode === "informative") {
|
|
1375
|
+
t || ++i;
|
|
1376
|
+
continue;
|
|
1377
|
+
}
|
|
1378
|
+
++n, a += o.weight, t && r++;
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
return {
|
|
1382
|
+
numPassed: r,
|
|
1383
|
+
numPassableAudits: n,
|
|
1384
|
+
numInformative: i,
|
|
1385
|
+
totalWeight: a
|
|
1386
|
+
};
|
|
1387
|
+
}
|
|
1388
|
+
static isPluginCategory(e) {
|
|
1389
|
+
return e.startsWith("lighthouse-plugin-");
|
|
1390
|
+
}
|
|
1391
|
+
static shouldDisplayAsFraction(e, t) {
|
|
1392
|
+
return e === "timespan" || e === "snapshot" || t?.categoryScoreDisplayMode === "fraction";
|
|
1393
|
+
}
|
|
1394
|
+
}, Ft = {
|
|
1395
|
+
varianceDisclaimer: "Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.",
|
|
1396
|
+
calculatorLink: "See calculator.",
|
|
1397
|
+
showRelevantAudits: "Show audits relevant to:",
|
|
1398
|
+
opportunityResourceColumnLabel: "Opportunity",
|
|
1399
|
+
opportunitySavingsColumnLabel: "Estimated Savings",
|
|
1400
|
+
errorMissingAuditInfo: "Report error: no audit information",
|
|
1401
|
+
errorLabel: "Error!",
|
|
1402
|
+
warningHeader: "Warnings: ",
|
|
1403
|
+
warningAuditsGroupTitle: "Passed audits but with warnings",
|
|
1404
|
+
passedAuditsGroupTitle: "Passed audits",
|
|
1405
|
+
notApplicableAuditsGroupTitle: "Not applicable",
|
|
1406
|
+
manualAuditsGroupTitle: "Additional items to manually check",
|
|
1407
|
+
toplevelWarningsMessage: "There were issues affecting this run of Lighthouse:",
|
|
1408
|
+
crcInitialNavigation: "Initial Navigation",
|
|
1409
|
+
crcLongestDurationLabel: "Maximum critical path latency:",
|
|
1410
|
+
snippetExpandButtonLabel: "Expand snippet",
|
|
1411
|
+
snippetCollapseButtonLabel: "Collapse snippet",
|
|
1412
|
+
lsPerformanceCategoryDescription: "[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.",
|
|
1413
|
+
labDataTitle: "Lab Data",
|
|
1414
|
+
thirdPartyResourcesLabel: "Show 3rd-party resources",
|
|
1415
|
+
viewTreemapLabel: "View Treemap",
|
|
1416
|
+
viewTraceLabel: "View Trace",
|
|
1417
|
+
dropdownPrintSummary: "Print Summary",
|
|
1418
|
+
dropdownPrintExpanded: "Print Expanded",
|
|
1419
|
+
dropdownCopyJSON: "Copy JSON",
|
|
1420
|
+
dropdownSaveHTML: "Save as HTML",
|
|
1421
|
+
dropdownSaveJSON: "Save as JSON",
|
|
1422
|
+
dropdownViewer: "Open in Viewer",
|
|
1423
|
+
dropdownSaveGist: "Save as Gist",
|
|
1424
|
+
dropdownDarkTheme: "Toggle Dark Theme",
|
|
1425
|
+
dropdownViewUnthrottledTrace: "View Unthrottled Trace",
|
|
1426
|
+
runtimeSettingsDevice: "Device",
|
|
1427
|
+
runtimeSettingsNetworkThrottling: "Network throttling",
|
|
1428
|
+
runtimeSettingsCPUThrottling: "CPU throttling",
|
|
1429
|
+
runtimeSettingsUANetwork: "User agent (network)",
|
|
1430
|
+
runtimeSettingsBenchmark: "Unthrottled CPU/Memory Power",
|
|
1431
|
+
runtimeSettingsAxeVersion: "Axe version",
|
|
1432
|
+
runtimeSettingsScreenEmulation: "Screen emulation",
|
|
1433
|
+
footerIssue: "File an issue",
|
|
1434
|
+
runtimeNoEmulation: "No emulation",
|
|
1435
|
+
runtimeMobileEmulation: "Emulated Moto G Power",
|
|
1436
|
+
runtimeDesktopEmulation: "Emulated Desktop",
|
|
1437
|
+
runtimeUnknown: "Unknown",
|
|
1438
|
+
runtimeSingleLoad: "Single page session",
|
|
1439
|
+
runtimeAnalysisWindow: "Initial page load",
|
|
1440
|
+
runtimeAnalysisWindowTimespan: "User interactions timespan",
|
|
1441
|
+
runtimeAnalysisWindowSnapshot: "Point-in-time snapshot",
|
|
1442
|
+
runtimeSingleLoadTooltip: "This data is taken from a single page session, as opposed to field data summarizing many sessions.",
|
|
1443
|
+
throttlingProvided: "Provided by environment",
|
|
1444
|
+
show: "Show",
|
|
1445
|
+
hide: "Hide",
|
|
1446
|
+
expandView: "Expand view",
|
|
1447
|
+
collapseView: "Collapse view",
|
|
1448
|
+
runtimeSlow4g: "Slow 4G throttling",
|
|
1449
|
+
runtimeCustom: "Custom throttling",
|
|
1450
|
+
firstPartyChipLabel: "1st party",
|
|
1451
|
+
openInANewTabTooltip: "Open in a new tab",
|
|
1452
|
+
unattributable: "Unattributable",
|
|
1453
|
+
unscoredLabel: "Unscored",
|
|
1454
|
+
unscoredTitle: "This audit does not contribute to the overall category score."
|
|
1455
|
+
}, It = class {
|
|
1456
|
+
constructor(e, t) {
|
|
1457
|
+
this.dom = e, this.detailsRenderer = t;
|
|
1458
|
+
}
|
|
1459
|
+
get _clumpTitles() {
|
|
1460
|
+
return {
|
|
1461
|
+
warning: V.strings.warningAuditsGroupTitle,
|
|
1462
|
+
manual: V.strings.manualAuditsGroupTitle,
|
|
1463
|
+
passed: V.strings.passedAuditsGroupTitle,
|
|
1464
|
+
notApplicable: V.strings.notApplicableAuditsGroupTitle
|
|
1465
|
+
};
|
|
1466
|
+
}
|
|
1467
|
+
renderAudit(e) {
|
|
1468
|
+
let t = V.strings, n = this.dom.createComponent("audit"), r = this.dom.find("div.lh-audit", n);
|
|
1469
|
+
r.id = e.result.id;
|
|
1470
|
+
let i = e.result.scoreDisplayMode;
|
|
1471
|
+
e.result.displayValue && (this.dom.find(".lh-audit__display-text", r).textContent = e.result.displayValue);
|
|
1472
|
+
let a = this.dom.find(".lh-audit__title", r);
|
|
1473
|
+
a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));
|
|
1474
|
+
let o = this.dom.find(".lh-audit__description", r);
|
|
1475
|
+
o.append(this.dom.convertMarkdownLinkSnippets(e.result.description));
|
|
1476
|
+
for (let t of e.relevantMetrics || []) {
|
|
1477
|
+
let e = this.dom.createChildOf(o, "span", "lh-audit__adorn");
|
|
1478
|
+
e.title = `Relevant to ${t.result.title}`, e.textContent = t.acronym || t.id;
|
|
1479
|
+
}
|
|
1480
|
+
if (e.weight === 0) {
|
|
1481
|
+
let e = this.dom.createChildOf(o, "span", "lh-audit__adorn");
|
|
1482
|
+
e.title = V.strings.unscoredTitle, e.textContent = V.strings.unscoredLabel;
|
|
1483
|
+
}
|
|
1484
|
+
e.stackPacks && e.stackPacks.forEach((e) => {
|
|
1485
|
+
let t = this.dom.createElement("img", "lh-audit__stackpack__img");
|
|
1486
|
+
t.src = e.iconDataURL, t.alt = e.title;
|
|
1487
|
+
let n = this.dom.convertMarkdownLinkSnippets(e.description, { alwaysAppendUtmSource: !0 }), i = this.dom.createElement("div", "lh-audit__stackpack");
|
|
1488
|
+
i.append(t, n), this.dom.find(".lh-audit__stackpacks", r).append(i);
|
|
1489
|
+
});
|
|
1490
|
+
let s = this.dom.find("details", r);
|
|
1491
|
+
if (e.result.details) {
|
|
1492
|
+
let t = this.detailsRenderer.render(e.result.details);
|
|
1493
|
+
t && (t.classList.add("lh-details"), s.append(t));
|
|
1494
|
+
}
|
|
1495
|
+
if (this.dom.find(".lh-chevron-container", r).append(this._createChevron()), this._setRatingClass(r, e.result.score, i), e.result.scoreDisplayMode === "error") {
|
|
1496
|
+
r.classList.add("lh-audit--error");
|
|
1497
|
+
let n = this.dom.find(".lh-audit__display-text", r);
|
|
1498
|
+
n.textContent = t.errorLabel, n.classList.add("lh-tooltip-boundary");
|
|
1499
|
+
let i = this.dom.createChildOf(n, "div", "lh-tooltip lh-tooltip--error");
|
|
1500
|
+
i.textContent = e.result.errorMessage || t.errorMissingAuditInfo;
|
|
1501
|
+
} else if (e.result.explanation) {
|
|
1502
|
+
let t = this.dom.createChildOf(a, "div", "lh-audit-explanation");
|
|
1503
|
+
t.textContent = e.result.explanation;
|
|
1504
|
+
}
|
|
1505
|
+
let c = e.result.warnings;
|
|
1506
|
+
if (!c || c.length === 0) return r;
|
|
1507
|
+
let l = this.dom.find("summary", s), u = this.dom.createChildOf(l, "div", "lh-warnings");
|
|
1508
|
+
if (this.dom.createChildOf(u, "span").textContent = t.warningHeader, c.length === 1) u.append(this.dom.createTextNode(c.join("")));
|
|
1509
|
+
else {
|
|
1510
|
+
let e = this.dom.createChildOf(u, "ul");
|
|
1511
|
+
for (let t of c) {
|
|
1512
|
+
let n = this.dom.createChildOf(e, "li");
|
|
1513
|
+
n.textContent = t;
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
return r;
|
|
1517
|
+
}
|
|
1518
|
+
injectFinalScreenshot(e, t, n) {
|
|
1519
|
+
let r = t["final-screenshot"];
|
|
1520
|
+
if (!r || r.scoreDisplayMode === "error" || !r.details || r.details.type !== "screenshot") return null;
|
|
1521
|
+
let i = this.dom.createElement("img", "lh-final-ss-image");
|
|
1522
|
+
i.src = r.details.data, i.alt = r.title;
|
|
1523
|
+
let a = this.dom.find(".lh-category .lh-category-header", e), o = this.dom.createElement("div", "lh-category-headercol"), s = this.dom.createElement("div", "lh-category-headercol lh-category-headercol--separator"), c = this.dom.createElement("div", "lh-category-headercol");
|
|
1524
|
+
o.append(...a.childNodes), o.append(n), c.append(i), a.append(o, s, c), a.classList.add("lh-category-header__finalscreenshot");
|
|
1525
|
+
}
|
|
1526
|
+
_createChevron() {
|
|
1527
|
+
let e = this.dom.createComponent("chevron");
|
|
1528
|
+
return this.dom.find("svg.lh-chevron", e);
|
|
1529
|
+
}
|
|
1530
|
+
_setRatingClass(e, t, n) {
|
|
1531
|
+
let r = U.calculateRating(t, n);
|
|
1532
|
+
return e.classList.add(`lh-audit--${n.toLowerCase()}`), n !== "informative" && e.classList.add(`lh-audit--${r}`), e;
|
|
1533
|
+
}
|
|
1534
|
+
renderCategoryHeader(e, t, n) {
|
|
1535
|
+
let r = this.dom.createComponent("categoryHeader"), i = this.dom.find(".lh-score__gauge", r), a = this.renderCategoryScore(e, t, n);
|
|
1536
|
+
if (i.append(a), e.description) {
|
|
1537
|
+
let t = this.dom.convertMarkdownLinkSnippets(e.description);
|
|
1538
|
+
this.dom.find(".lh-category-header__description", r).append(t);
|
|
1539
|
+
}
|
|
1540
|
+
return r;
|
|
1541
|
+
}
|
|
1542
|
+
renderAuditGroup(e) {
|
|
1543
|
+
let t = this.dom.createElement("div", "lh-audit-group"), n = this.dom.createElement("div", "lh-audit-group__header");
|
|
1544
|
+
this.dom.createChildOf(n, "span", "lh-audit-group__title").textContent = e.title, t.append(n);
|
|
1545
|
+
let r = null;
|
|
1546
|
+
return e.description && (r = this.dom.convertMarkdownLinkSnippets(e.description), r.classList.add("lh-audit-group__description", "lh-audit-group__footer"), t.append(r)), [t, r];
|
|
1547
|
+
}
|
|
1548
|
+
_renderGroupedAudits(e, t) {
|
|
1549
|
+
let n = /* @__PURE__ */ new Map(), r = "NotAGroup";
|
|
1550
|
+
n.set(r, []);
|
|
1551
|
+
for (let t of e) {
|
|
1552
|
+
let e = t.group || r, i = n.get(e) || [];
|
|
1553
|
+
i.push(t), n.set(e, i);
|
|
1554
|
+
}
|
|
1555
|
+
let i = [];
|
|
1556
|
+
for (let [e, a] of n) {
|
|
1557
|
+
if (e === r) {
|
|
1558
|
+
for (let e of a) i.push(this.renderAudit(e));
|
|
1559
|
+
continue;
|
|
1560
|
+
}
|
|
1561
|
+
let n = t[e], [o, s] = this.renderAuditGroup(n);
|
|
1562
|
+
for (let e of a) o.insertBefore(this.renderAudit(e), s);
|
|
1563
|
+
o.classList.add(`lh-audit-group--${e}`), i.push(o);
|
|
1564
|
+
}
|
|
1565
|
+
return i;
|
|
1566
|
+
}
|
|
1567
|
+
renderUnexpandableClump(e, t) {
|
|
1568
|
+
let n = this.dom.createElement("div");
|
|
1569
|
+
return this._renderGroupedAudits(e, t).forEach((e) => n.append(e)), n;
|
|
1570
|
+
}
|
|
1571
|
+
renderClump(e, { auditRefsOrEls: t, description: n, openByDefault: r }) {
|
|
1572
|
+
let i = this.dom.createComponent("clump"), a = this.dom.find(".lh-clump", i);
|
|
1573
|
+
r && a.setAttribute("open", "");
|
|
1574
|
+
let o = this.dom.find(".lh-audit-group__header", a), s = this._clumpTitles[e];
|
|
1575
|
+
this.dom.find(".lh-audit-group__title", o).textContent = s;
|
|
1576
|
+
let c = this.dom.find(".lh-audit-group__itemcount", a);
|
|
1577
|
+
c.textContent = `(${t.length})`;
|
|
1578
|
+
let l = t.map((e) => e instanceof HTMLElement ? e : this.renderAudit(e));
|
|
1579
|
+
a.append(...l);
|
|
1580
|
+
let u = this.dom.find(".lh-audit-group", i);
|
|
1581
|
+
if (n) {
|
|
1582
|
+
let e = this.dom.convertMarkdownLinkSnippets(n);
|
|
1583
|
+
e.classList.add("lh-audit-group__description", "lh-audit-group__footer"), u.append(e);
|
|
1584
|
+
}
|
|
1585
|
+
return this.dom.find(".lh-clump-toggletext--show", u).textContent = V.strings.show, this.dom.find(".lh-clump-toggletext--hide", u).textContent = V.strings.hide, a.classList.add(`lh-clump--${e.toLowerCase()}`), u;
|
|
1586
|
+
}
|
|
1587
|
+
renderCategoryScore(e, t, n) {
|
|
1588
|
+
let r;
|
|
1589
|
+
if (r = n && U.shouldDisplayAsFraction(n.gatherMode, e) ? this.renderCategoryFraction(e) : this.renderScoreGauge(e, t), n?.omitLabel && this.dom.find(".lh-gauge__label,.lh-fraction__label", r).remove(), n?.onPageAnchorRendered) {
|
|
1590
|
+
let e = this.dom.find("a", r);
|
|
1591
|
+
n.onPageAnchorRendered(e);
|
|
1592
|
+
}
|
|
1593
|
+
return r;
|
|
1594
|
+
}
|
|
1595
|
+
renderScoreGauge(e, t) {
|
|
1596
|
+
let n = this.dom.createComponent("gauge"), r = this.dom.find("a.lh-gauge__wrapper", n);
|
|
1597
|
+
U.isPluginCategory(e.id) && r.classList.add("lh-gauge__wrapper--plugin");
|
|
1598
|
+
let i = Number(e.score), a = this.dom.find(".lh-gauge", n), o = this.dom.find("circle.lh-gauge-arc", a);
|
|
1599
|
+
o && this._setGaugeArc(o, i);
|
|
1600
|
+
let s = Math.round(i * 100), c = this.dom.find("div.lh-gauge__percentage", n);
|
|
1601
|
+
return c.textContent = s.toString(), e.score === null && (c.classList.add("lh-gauge--error"), c.textContent = "", c.title = V.strings.errorLabel), e.auditRefs.length === 0 || this.hasApplicableAudits(e) ? r.classList.add(`lh-gauge__wrapper--${U.calculateRating(e.score)}`) : (r.classList.add("lh-gauge__wrapper--not-applicable"), c.textContent = "-", c.title = V.strings.notApplicableAuditsGroupTitle), this.dom.find(".lh-gauge__label", n).textContent = e.title, n;
|
|
1602
|
+
}
|
|
1603
|
+
renderCategoryFraction(e) {
|
|
1604
|
+
let t = this.dom.createComponent("fraction"), n = this.dom.find("a.lh-fraction__wrapper", t), { numPassed: r, numPassableAudits: i, totalWeight: a } = U.calculateCategoryFraction(e), o = r / i, s = this.dom.find(".lh-fraction__content", t), c = this.dom.createElement("span");
|
|
1605
|
+
c.textContent = `${r}/${i}`, s.append(c);
|
|
1606
|
+
let l = U.calculateRating(o);
|
|
1607
|
+
return a === 0 && (l = "null"), n.classList.add(`lh-fraction__wrapper--${l}`), this.dom.find(".lh-fraction__label", t).textContent = e.title, t;
|
|
1608
|
+
}
|
|
1609
|
+
hasApplicableAudits(e) {
|
|
1610
|
+
return e.auditRefs.some((e) => e.result.scoreDisplayMode !== "notApplicable");
|
|
1611
|
+
}
|
|
1612
|
+
_setGaugeArc(e, t) {
|
|
1613
|
+
let n = 2 * Math.PI * Number(e.getAttribute("r")), r = Number(e.getAttribute("stroke-width")), i = .25 * r / n;
|
|
1614
|
+
e.style.transform = `rotate(${-90 + i * 360}deg)`;
|
|
1615
|
+
let a = t * n - r / 2;
|
|
1616
|
+
t === 0 && (e.style.opacity = "0"), t === 1 && (a = n), e.style.strokeDasharray = `${Math.max(a, 0)} ${n}`;
|
|
1617
|
+
}
|
|
1618
|
+
_auditHasWarning(e) {
|
|
1619
|
+
return !!e.result.warnings?.length;
|
|
1620
|
+
}
|
|
1621
|
+
_getClumpIdForAuditRef(e) {
|
|
1622
|
+
let t = e.result.scoreDisplayMode;
|
|
1623
|
+
return t === "manual" || t === "notApplicable" ? t : U.showAsPassed(e.result) ? this._auditHasWarning(e) ? "warning" : "passed" : "failed";
|
|
1624
|
+
}
|
|
1625
|
+
render(e, t = {}, n) {
|
|
1626
|
+
let r = this.dom.createElement("div", "lh-category");
|
|
1627
|
+
r.id = e.id, r.append(this.renderCategoryHeader(e, t, n));
|
|
1628
|
+
let i = /* @__PURE__ */ new Map();
|
|
1629
|
+
i.set("failed", []), i.set("warning", []), i.set("manual", []), i.set("passed", []), i.set("notApplicable", []);
|
|
1630
|
+
for (let t of e.auditRefs) {
|
|
1631
|
+
if (t.group === "hidden") continue;
|
|
1632
|
+
let e = this._getClumpIdForAuditRef(t), n = i.get(e);
|
|
1633
|
+
n.push(t), i.set(e, n);
|
|
1634
|
+
}
|
|
1635
|
+
for (let e of i.values()) e.sort((e, t) => t.weight - e.weight);
|
|
1636
|
+
let a = i.get("failed")?.length;
|
|
1637
|
+
for (let [n, o] of i) {
|
|
1638
|
+
if (o.length === 0) continue;
|
|
1639
|
+
if (n === "failed") {
|
|
1640
|
+
let e = this.renderUnexpandableClump(o, t);
|
|
1641
|
+
e.classList.add("lh-clump--failed"), r.append(e);
|
|
1642
|
+
continue;
|
|
1643
|
+
}
|
|
1644
|
+
let i = n === "manual" ? e.manualDescription : void 0, s = n === "warning" || n === "manual" && a === 0, c = this.renderClump(n, {
|
|
1645
|
+
auditRefsOrEls: o,
|
|
1646
|
+
description: i,
|
|
1647
|
+
openByDefault: s
|
|
1648
|
+
});
|
|
1649
|
+
r.append(c);
|
|
1650
|
+
}
|
|
1651
|
+
return r;
|
|
1652
|
+
}
|
|
1653
|
+
}, Lt = class {
|
|
1654
|
+
static createSegment(e, t, n, r) {
|
|
1655
|
+
let i = e[t], a = Object.keys(e), o = a.indexOf(t) === a.length - 1, s = !!i.children && Object.keys(i.children).length > 0, c = Array.isArray(n) ? n.slice(0) : [];
|
|
1656
|
+
return typeof r < "u" && c.push(!r), {
|
|
1657
|
+
node: i,
|
|
1658
|
+
isLastChild: o,
|
|
1659
|
+
hasChildren: s,
|
|
1660
|
+
treeMarkers: c
|
|
1661
|
+
};
|
|
1662
|
+
}
|
|
1663
|
+
static createChainNode(e, t, n) {
|
|
1664
|
+
let r = e.createComponent("crcChain"), i, a, o, s, c;
|
|
1665
|
+
"request" in t.node ? (a = t.node.request.transferSize, o = t.node.request.url, i = (t.node.request.endTime - t.node.request.startTime) * 1e3, s = !1) : (a = t.node.transferSize, o = t.node.url, i = t.node.navStartToEndTime, s = !0, c = t.node.isLongest);
|
|
1666
|
+
let l = e.find(".lh-crc-node", r);
|
|
1667
|
+
l.setAttribute("title", o), c && l.classList.add("lh-crc-node__longest");
|
|
1668
|
+
let u = e.find(".lh-crc-node__tree-marker", r);
|
|
1669
|
+
t.treeMarkers.forEach((t) => {
|
|
1670
|
+
let n = t ? "lh-tree-marker lh-vert" : "lh-tree-marker";
|
|
1671
|
+
u.append(e.createElement("span", n), e.createElement("span", "lh-tree-marker"));
|
|
1672
|
+
});
|
|
1673
|
+
let d = t.isLastChild ? "lh-tree-marker lh-up-right" : "lh-tree-marker lh-vert-right", f = t.hasChildren ? "lh-tree-marker lh-horiz-down" : "lh-tree-marker lh-right";
|
|
1674
|
+
u.append(e.createElement("span", d), e.createElement("span", "lh-tree-marker lh-right"), e.createElement("span", f));
|
|
1675
|
+
let p = n.renderTextURL(o), m = e.find(".lh-crc-node__tree-value", r);
|
|
1676
|
+
if (m.append(p), !t.hasChildren || s) {
|
|
1677
|
+
let t = e.createElement("span", "lh-crc-node__chain-duration");
|
|
1678
|
+
t.textContent = " - " + V.i18n.formatMilliseconds(i) + ", ";
|
|
1679
|
+
let n = e.createElement("span", "lh-crc-node__chain-size");
|
|
1680
|
+
n.textContent = V.i18n.formatBytesToKiB(a, .01), m.append(t, n);
|
|
1681
|
+
}
|
|
1682
|
+
return r;
|
|
1683
|
+
}
|
|
1684
|
+
static buildTree(e, t, n, r) {
|
|
1685
|
+
if (n.append(W.createChainNode(e, t, r)), t.node.children) for (let i of Object.keys(t.node.children)) {
|
|
1686
|
+
let a = W.createSegment(t.node.children, i, t.treeMarkers, t.isLastChild);
|
|
1687
|
+
W.buildTree(e, a, n, r);
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
static render(e, t, n) {
|
|
1691
|
+
let r = e.createComponent("crc"), i = e.find(".lh-crc", r);
|
|
1692
|
+
e.find(".lh-crc-initial-nav", r).textContent = V.strings.crcInitialNavigation, e.find(".lh-crc__longest_duration_label", r).textContent = V.strings.crcLongestDurationLabel, e.find(".lh-crc__longest_duration", r).textContent = V.i18n.formatMilliseconds(t.longestChain.duration);
|
|
1693
|
+
let a = t.chains;
|
|
1694
|
+
for (let t of Object.keys(a)) {
|
|
1695
|
+
let r = W.createSegment(a, t);
|
|
1696
|
+
W.buildTree(e, r, i, n);
|
|
1697
|
+
}
|
|
1698
|
+
return e.find(".lh-crc-container", r);
|
|
1699
|
+
}
|
|
1700
|
+
}, W = Lt;
|
|
1701
|
+
function Rt(e, t) {
|
|
1702
|
+
return t.left <= e.width && 0 <= t.right && t.top <= e.height && 0 <= t.bottom;
|
|
1703
|
+
}
|
|
1704
|
+
function zt(e, t, n) {
|
|
1705
|
+
return e < t ? t : e > n ? n : e;
|
|
1706
|
+
}
|
|
1707
|
+
function Bt(e) {
|
|
1708
|
+
return {
|
|
1709
|
+
x: e.left + e.width / 2,
|
|
1710
|
+
y: e.top + e.height / 2
|
|
1711
|
+
};
|
|
1712
|
+
}
|
|
1713
|
+
var Vt = class e {
|
|
1714
|
+
static getScreenshotPositions(e, t, n) {
|
|
1715
|
+
let r = Bt(e), i = zt(r.x - t.width / 2, 0, n.width - t.width), a = zt(r.y - t.height / 2, 0, n.height - t.height);
|
|
1716
|
+
return {
|
|
1717
|
+
screenshot: {
|
|
1718
|
+
left: i,
|
|
1719
|
+
top: a
|
|
1720
|
+
},
|
|
1721
|
+
clip: {
|
|
1722
|
+
left: e.left - i,
|
|
1723
|
+
top: e.top - a
|
|
1724
|
+
}
|
|
1725
|
+
};
|
|
1726
|
+
}
|
|
1727
|
+
static renderClipPathInScreenshot(e, t, n, r, i) {
|
|
1728
|
+
let a = e.find("clipPath", t), o = `clip-${V.getUniqueSuffix()}`;
|
|
1729
|
+
a.id = o, t.style.clipPath = `url(#${o})`;
|
|
1730
|
+
let s = n.top / i.height, c = s + r.height / i.height, l = n.left / i.width, u = l + r.width / i.width, d = [
|
|
1731
|
+
`0,0 1,0 1,${s} 0,${s}`,
|
|
1732
|
+
`0,${c} 1,${c} 1,1 0,1`,
|
|
1733
|
+
`0,${s} ${l},${s} ${l},${c} 0,${c}`,
|
|
1734
|
+
`${u},${s} 1,${s} 1,${c} ${u},${c}`
|
|
1735
|
+
];
|
|
1736
|
+
for (let t of d) {
|
|
1737
|
+
let n = e.createElementNS("http://www.w3.org/2000/svg", "polygon");
|
|
1738
|
+
n.setAttribute("points", t), a.append(n);
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
static installFullPageScreenshot(e, t) {
|
|
1742
|
+
e.style.setProperty("--element-screenshot-url", `url('${t.data}')`);
|
|
1743
|
+
}
|
|
1744
|
+
static installOverlayFeature(t) {
|
|
1745
|
+
let { dom: n, rootEl: r, overlayContainerEl: i, fullPageScreenshot: a } = t, o = "lh-screenshot-overlay--enabled";
|
|
1746
|
+
r.classList.contains(o) || (r.classList.add(o), r.addEventListener("click", (t) => {
|
|
1747
|
+
let r = t.target;
|
|
1748
|
+
if (!r) return;
|
|
1749
|
+
let o = r.closest(".lh-node > .lh-element-screenshot");
|
|
1750
|
+
if (!o) return;
|
|
1751
|
+
let s = n.createElement("div", "lh-element-screenshot__overlay");
|
|
1752
|
+
i.append(s);
|
|
1753
|
+
let c = {
|
|
1754
|
+
width: s.clientWidth * .95,
|
|
1755
|
+
height: s.clientHeight * .8
|
|
1756
|
+
}, l = {
|
|
1757
|
+
width: Number(o.dataset.rectWidth),
|
|
1758
|
+
height: Number(o.dataset.rectHeight),
|
|
1759
|
+
left: Number(o.dataset.rectLeft),
|
|
1760
|
+
right: Number(o.dataset.rectLeft) + Number(o.dataset.rectWidth),
|
|
1761
|
+
top: Number(o.dataset.rectTop),
|
|
1762
|
+
bottom: Number(o.dataset.rectTop) + Number(o.dataset.rectHeight)
|
|
1763
|
+
}, u = e.render(n, a.screenshot, l, c);
|
|
1764
|
+
if (!u) {
|
|
1765
|
+
s.remove();
|
|
1766
|
+
return;
|
|
1767
|
+
}
|
|
1768
|
+
s.append(u), s.addEventListener("click", () => s.remove());
|
|
1769
|
+
}));
|
|
1770
|
+
}
|
|
1771
|
+
static _computeZoomFactor(e, t) {
|
|
1772
|
+
let n = {
|
|
1773
|
+
x: t.width / e.width,
|
|
1774
|
+
y: t.height / e.height
|
|
1775
|
+
}, r = .75 * Math.min(n.x, n.y);
|
|
1776
|
+
return Math.min(1, r);
|
|
1777
|
+
}
|
|
1778
|
+
static render(t, n, r, i) {
|
|
1779
|
+
if (!Rt(n, r)) return null;
|
|
1780
|
+
let a = t.createComponent("elementScreenshot"), o = t.find("div.lh-element-screenshot", a);
|
|
1781
|
+
o.dataset.rectWidth = r.width.toString(), o.dataset.rectHeight = r.height.toString(), o.dataset.rectLeft = r.left.toString(), o.dataset.rectTop = r.top.toString();
|
|
1782
|
+
let s = this._computeZoomFactor(r, i), c = {
|
|
1783
|
+
width: i.width / s,
|
|
1784
|
+
height: i.height / s
|
|
1785
|
+
};
|
|
1786
|
+
c.width = Math.min(n.width, c.width), c.height = Math.min(n.height, c.height);
|
|
1787
|
+
let l = {
|
|
1788
|
+
width: c.width * s,
|
|
1789
|
+
height: c.height * s
|
|
1790
|
+
}, u = e.getScreenshotPositions(r, c, {
|
|
1791
|
+
width: n.width,
|
|
1792
|
+
height: n.height
|
|
1793
|
+
}), d = t.find("div.lh-element-screenshot__image", o);
|
|
1794
|
+
d.style.width = l.width + "px", d.style.height = l.height + "px", d.style.backgroundPositionY = -(u.screenshot.top * s) + "px", d.style.backgroundPositionX = -(u.screenshot.left * s) + "px", d.style.backgroundSize = `${n.width * s}px ${n.height * s}px`;
|
|
1795
|
+
let f = t.find("div.lh-element-screenshot__element-marker", o);
|
|
1796
|
+
f.style.width = r.width * s + "px", f.style.height = r.height * s + "px", f.style.left = u.clip.left * s + "px", f.style.top = u.clip.top * s + "px";
|
|
1797
|
+
let p = t.find("div.lh-element-screenshot__mask", o);
|
|
1798
|
+
return p.style.width = l.width + "px", p.style.height = l.height + "px", e.renderClipPathInScreenshot(t, p, u.clip, r, c), o;
|
|
1799
|
+
}
|
|
1800
|
+
}, Ht = [
|
|
1801
|
+
"http://",
|
|
1802
|
+
"https://",
|
|
1803
|
+
"data:"
|
|
1804
|
+
], Ut = [
|
|
1805
|
+
"bytes",
|
|
1806
|
+
"numeric",
|
|
1807
|
+
"ms",
|
|
1808
|
+
"timespanMs"
|
|
1809
|
+
], Wt = class {
|
|
1810
|
+
constructor(e, t = {}) {
|
|
1811
|
+
this._dom = e, this._fullPageScreenshot = t.fullPageScreenshot, this._entities = t.entities;
|
|
1812
|
+
}
|
|
1813
|
+
render(e) {
|
|
1814
|
+
switch (e.type) {
|
|
1815
|
+
case "filmstrip": return this._renderFilmstrip(e);
|
|
1816
|
+
case "list": return this._renderList(e);
|
|
1817
|
+
case "checklist": return this._renderChecklist(e);
|
|
1818
|
+
case "table":
|
|
1819
|
+
case "opportunity": return this._renderTable(e);
|
|
1820
|
+
case "network-tree":
|
|
1821
|
+
case "criticalrequestchain": return Lt.render(this._dom, e, this);
|
|
1822
|
+
case "screenshot":
|
|
1823
|
+
case "debugdata":
|
|
1824
|
+
case "treemap-data": return null;
|
|
1825
|
+
default: return this._renderUnknown(e.type, e);
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
_renderBytes(e) {
|
|
1829
|
+
let t = V.i18n.formatBytesToKiB(e.value, e.granularity || .1), n = this._renderText(t);
|
|
1830
|
+
return n.title = V.i18n.formatBytes(e.value), n;
|
|
1831
|
+
}
|
|
1832
|
+
_renderMilliseconds(e) {
|
|
1833
|
+
let t;
|
|
1834
|
+
return t = e.displayUnit === "duration" ? V.i18n.formatDuration(e.value) : V.i18n.formatMilliseconds(e.value, e.granularity || 10), this._renderText(t);
|
|
1835
|
+
}
|
|
1836
|
+
renderTextURL(e) {
|
|
1837
|
+
let t = e, n, r, i;
|
|
1838
|
+
try {
|
|
1839
|
+
let e = B.parseURL(t);
|
|
1840
|
+
n = e.file === "/" ? e.origin : e.file, r = e.file === "/" || e.hostname === "" ? "" : `(${e.hostname})`, i = t;
|
|
1841
|
+
} catch {
|
|
1842
|
+
n = t;
|
|
1843
|
+
}
|
|
1844
|
+
let a = this._dom.createElement("div", "lh-text__url");
|
|
1845
|
+
if (a.append(this._renderLink({
|
|
1846
|
+
text: n,
|
|
1847
|
+
url: t
|
|
1848
|
+
})), r) {
|
|
1849
|
+
let e = this._renderText(r);
|
|
1850
|
+
e.classList.add("lh-text__url-host"), a.append(e);
|
|
1851
|
+
}
|
|
1852
|
+
return i && (a.title = t, a.dataset.url = t), a;
|
|
1853
|
+
}
|
|
1854
|
+
_renderLink(e) {
|
|
1855
|
+
let t = this._dom.createElement("a");
|
|
1856
|
+
if (this._dom.safelySetHref(t, e.url), !t.href) {
|
|
1857
|
+
let t = this._renderText(e.text);
|
|
1858
|
+
return t.classList.add("lh-link"), t;
|
|
1859
|
+
}
|
|
1860
|
+
return t.rel = "noopener", t.target = "_blank", t.textContent = e.text, t.classList.add("lh-link"), t;
|
|
1861
|
+
}
|
|
1862
|
+
_renderText(e) {
|
|
1863
|
+
let t = this._dom.createElement("div", "lh-text");
|
|
1864
|
+
return t.textContent = e, t;
|
|
1865
|
+
}
|
|
1866
|
+
_renderBaselineStatus(e) {
|
|
1867
|
+
let t = this._dom.createElement("div", "lh-baseline-status"), n = e.status;
|
|
1868
|
+
return t.classList.add(`lh-baseline-status--${n}`), t.textContent = String(e.displayString), t;
|
|
1869
|
+
}
|
|
1870
|
+
_renderNumeric(e) {
|
|
1871
|
+
let t = V.i18n.formatNumber(e.value, e.granularity || .1), n = this._dom.createElement("div", "lh-numeric");
|
|
1872
|
+
return n.textContent = t, n;
|
|
1873
|
+
}
|
|
1874
|
+
_renderThumbnail(e) {
|
|
1875
|
+
let t = this._dom.createElement("img", "lh-thumbnail"), n = e;
|
|
1876
|
+
return t.src = n, t.title = n, t.alt = "", t;
|
|
1877
|
+
}
|
|
1878
|
+
_renderUnknown(e, t) {
|
|
1879
|
+
console.error(`Unknown details type: ${e}`, t);
|
|
1880
|
+
let n = this._dom.createElement("details", "lh-unknown");
|
|
1881
|
+
return this._dom.createChildOf(n, "summary").textContent = `We don't know how to render audit details of type \`${e}\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`, this._dom.createChildOf(n, "pre").textContent = JSON.stringify(t, null, 2), n;
|
|
1882
|
+
}
|
|
1883
|
+
_renderTableValue(e, t) {
|
|
1884
|
+
if (e == null) return null;
|
|
1885
|
+
if (typeof e == "object") switch (e.type) {
|
|
1886
|
+
case "code": return this._renderCode(e.value);
|
|
1887
|
+
case "link": return this._renderLink(e);
|
|
1888
|
+
case "node": return this.renderNode(e);
|
|
1889
|
+
case "numeric": return this._renderNumeric(e);
|
|
1890
|
+
case "text": return this._renderText(e.value);
|
|
1891
|
+
case "source-location": return this.renderSourceLocation(e);
|
|
1892
|
+
case "url": return this.renderTextURL(e.value);
|
|
1893
|
+
case "baseline-status": return this._renderBaselineStatus(e);
|
|
1894
|
+
default: return this._renderUnknown(e.type, e);
|
|
1895
|
+
}
|
|
1896
|
+
switch (t.valueType) {
|
|
1897
|
+
case "bytes": {
|
|
1898
|
+
let n = Number(e);
|
|
1899
|
+
return this._renderBytes({
|
|
1900
|
+
value: n,
|
|
1901
|
+
granularity: t.granularity
|
|
1902
|
+
});
|
|
1903
|
+
}
|
|
1904
|
+
case "code": {
|
|
1905
|
+
let t = String(e);
|
|
1906
|
+
return this._renderCode(t);
|
|
1907
|
+
}
|
|
1908
|
+
case "ms": {
|
|
1909
|
+
let n = {
|
|
1910
|
+
value: Number(e),
|
|
1911
|
+
granularity: t.granularity,
|
|
1912
|
+
displayUnit: t.displayUnit
|
|
1913
|
+
};
|
|
1914
|
+
return this._renderMilliseconds(n);
|
|
1915
|
+
}
|
|
1916
|
+
case "numeric": {
|
|
1917
|
+
let n = Number(e);
|
|
1918
|
+
return this._renderNumeric({
|
|
1919
|
+
value: n,
|
|
1920
|
+
granularity: t.granularity
|
|
1921
|
+
});
|
|
1922
|
+
}
|
|
1923
|
+
case "text": {
|
|
1924
|
+
let t = String(e);
|
|
1925
|
+
return this._renderText(t);
|
|
1926
|
+
}
|
|
1927
|
+
case "thumbnail": {
|
|
1928
|
+
let t = String(e);
|
|
1929
|
+
return this._renderThumbnail(t);
|
|
1930
|
+
}
|
|
1931
|
+
case "timespanMs": {
|
|
1932
|
+
let t = Number(e);
|
|
1933
|
+
return this._renderMilliseconds({ value: t });
|
|
1934
|
+
}
|
|
1935
|
+
case "url": {
|
|
1936
|
+
let t = String(e);
|
|
1937
|
+
return Ht.some((e) => t.startsWith(e)) ? this.renderTextURL(t) : this._renderCode(t);
|
|
1938
|
+
}
|
|
1939
|
+
default: return this._renderUnknown(t.valueType, e);
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
_getDerivedSubItemsHeading(e) {
|
|
1943
|
+
return e.subItemsHeading ? {
|
|
1944
|
+
key: e.subItemsHeading.key || "",
|
|
1945
|
+
valueType: e.subItemsHeading.valueType || e.valueType,
|
|
1946
|
+
granularity: e.subItemsHeading.granularity || e.granularity,
|
|
1947
|
+
displayUnit: e.subItemsHeading.displayUnit || e.displayUnit,
|
|
1948
|
+
label: ""
|
|
1949
|
+
} : null;
|
|
1950
|
+
}
|
|
1951
|
+
_renderTableRow(e, t) {
|
|
1952
|
+
let n = this._dom.createElement("tr");
|
|
1953
|
+
for (let r of t) {
|
|
1954
|
+
if (!r || !r.key) {
|
|
1955
|
+
this._dom.createChildOf(n, "td", "lh-table-column--empty");
|
|
1956
|
+
continue;
|
|
1957
|
+
}
|
|
1958
|
+
let t = e[r.key], i;
|
|
1959
|
+
if (t != null && (i = this._renderTableValue(t, r)), i) {
|
|
1960
|
+
let e = `lh-table-column--${r.valueType}`;
|
|
1961
|
+
this._dom.createChildOf(n, "td", e).append(i);
|
|
1962
|
+
} else this._dom.createChildOf(n, "td", "lh-table-column--empty");
|
|
1963
|
+
}
|
|
1964
|
+
return n;
|
|
1965
|
+
}
|
|
1966
|
+
_renderTableRowsFromItem(e, t) {
|
|
1967
|
+
let n = this._dom.createFragment();
|
|
1968
|
+
if (n.append(this._renderTableRow(e, t)), !e.subItems) return n;
|
|
1969
|
+
let r = t.map(this._getDerivedSubItemsHeading);
|
|
1970
|
+
if (!r.some(Boolean)) return n;
|
|
1971
|
+
for (let t of e.subItems.items) {
|
|
1972
|
+
let e = this._renderTableRow(t, r);
|
|
1973
|
+
e.classList.add("lh-sub-item-row"), n.append(e);
|
|
1974
|
+
}
|
|
1975
|
+
return n;
|
|
1976
|
+
}
|
|
1977
|
+
_adornEntityGroupRow(e) {
|
|
1978
|
+
let t = e.dataset.entity;
|
|
1979
|
+
if (!t) return;
|
|
1980
|
+
let n = this._entities?.find((e) => e.name === t);
|
|
1981
|
+
if (!n) return;
|
|
1982
|
+
let r = this._dom.find("td", e);
|
|
1983
|
+
if (n.category) {
|
|
1984
|
+
let e = this._dom.createElement("span");
|
|
1985
|
+
e.classList.add("lh-audit__adorn"), e.textContent = n.category, r.append(" ", e);
|
|
1986
|
+
}
|
|
1987
|
+
if (n.isFirstParty) {
|
|
1988
|
+
let e = this._dom.createElement("span");
|
|
1989
|
+
e.classList.add("lh-audit__adorn", "lh-audit__adorn1p"), e.textContent = V.strings.firstPartyChipLabel, r.append(" ", e);
|
|
1990
|
+
}
|
|
1991
|
+
if (n.homepage) {
|
|
1992
|
+
let e = this._dom.createElement("a");
|
|
1993
|
+
e.href = n.homepage, e.target = "_blank", e.title = V.strings.openInANewTabTooltip, e.classList.add("lh-report-icon--external"), r.append(" ", e);
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
_renderEntityGroupRow(e, t) {
|
|
1997
|
+
let n = { ...t[0] };
|
|
1998
|
+
n.valueType = "text";
|
|
1999
|
+
let r = [n, ...t.slice(1)], i = this._dom.createFragment();
|
|
2000
|
+
return i.append(this._renderTableRow(e, r)), this._dom.find("tr", i).classList.add("lh-row--group"), i;
|
|
2001
|
+
}
|
|
2002
|
+
_getEntityGroupItems(e) {
|
|
2003
|
+
let { items: t, headings: n, sortedBy: r } = e;
|
|
2004
|
+
if (!t.length || e.isEntityGrouped || !t.some((e) => e.entity)) return [];
|
|
2005
|
+
let i = new Set(e.skipSumming || []), a = [];
|
|
2006
|
+
for (let e of n) !e.key || i.has(e.key) || Ut.includes(e.valueType) && a.push(e.key);
|
|
2007
|
+
let o = n[0].key;
|
|
2008
|
+
if (!o) return [];
|
|
2009
|
+
let s = /* @__PURE__ */ new Map();
|
|
2010
|
+
for (let e of t) {
|
|
2011
|
+
let t = typeof e.entity == "string" ? e.entity : void 0, n = s.get(t) || {
|
|
2012
|
+
[o]: t || V.strings.unattributable,
|
|
2013
|
+
entity: t
|
|
2014
|
+
};
|
|
2015
|
+
for (let t of a) n[t] = Number(n[t] || 0) + Number(e[t] || 0);
|
|
2016
|
+
s.set(t, n);
|
|
2017
|
+
}
|
|
2018
|
+
let c = [...s.values()];
|
|
2019
|
+
return r && c.sort(U.getTableItemSortComparator(r)), c;
|
|
2020
|
+
}
|
|
2021
|
+
_renderTable(e) {
|
|
2022
|
+
if (!e.items.length) return this._dom.createElement("span");
|
|
2023
|
+
let t = this._dom.createElement("table", "lh-table"), n = this._dom.createChildOf(t, "thead"), r = this._dom.createChildOf(n, "tr");
|
|
2024
|
+
for (let t of e.headings) {
|
|
2025
|
+
let e = `lh-table-column--${t.valueType || "text"}`, n = this._dom.createElement("div", "lh-text");
|
|
2026
|
+
n.textContent = t.label, this._dom.createChildOf(r, "th", e).append(n);
|
|
2027
|
+
}
|
|
2028
|
+
let i = this._getEntityGroupItems(e), a = this._dom.createChildOf(t, "tbody");
|
|
2029
|
+
if (i.length) for (let t of i) {
|
|
2030
|
+
let n = typeof t.entity == "string" ? t.entity : void 0, r = this._renderEntityGroupRow(t, e.headings);
|
|
2031
|
+
for (let t of e.items.filter((e) => e.entity === n)) r.append(this._renderTableRowsFromItem(t, e.headings));
|
|
2032
|
+
let i = this._dom.findAll("tr", r);
|
|
2033
|
+
n && i.length && (i.forEach((e) => e.dataset.entity = n), this._adornEntityGroupRow(i[0])), a.append(r);
|
|
2034
|
+
}
|
|
2035
|
+
else {
|
|
2036
|
+
let t = !0;
|
|
2037
|
+
for (let n of e.items) {
|
|
2038
|
+
let r = this._renderTableRowsFromItem(n, e.headings), i = this._dom.findAll("tr", r), o = i[0];
|
|
2039
|
+
if (typeof n.entity == "string" && (o.dataset.entity = n.entity), e.isEntityGrouped && n.entity) o.classList.add("lh-row--group"), this._adornEntityGroupRow(o);
|
|
2040
|
+
else for (let e of i) e.classList.add(t ? "lh-row--even" : "lh-row--odd");
|
|
2041
|
+
t = !t, a.append(r);
|
|
2042
|
+
}
|
|
2043
|
+
}
|
|
2044
|
+
return t;
|
|
2045
|
+
}
|
|
2046
|
+
_renderListValue(e) {
|
|
2047
|
+
return e.type === "node" ? this.renderNode(e) : e.type === "text" ? this._renderText(e.value) : this.render(e);
|
|
2048
|
+
}
|
|
2049
|
+
_renderList(e) {
|
|
2050
|
+
let t = this._dom.createElement("div", "lh-list");
|
|
2051
|
+
return e.items.forEach((e) => {
|
|
2052
|
+
if (e.type === "list-section") {
|
|
2053
|
+
let n = this._dom.createElement("div", "lh-list-section");
|
|
2054
|
+
e.title && this._dom.createChildOf(n, "div", "lh-list-section__title").append(this._dom.convertMarkdownLinkSnippets(e.title)), e.description && this._dom.createChildOf(n, "div", "lh-list-section__description").append(this._dom.convertMarkdownLinkSnippets(e.description));
|
|
2055
|
+
let r = this._renderListValue(e.value);
|
|
2056
|
+
r && n.append(r), t.append(n);
|
|
2057
|
+
return;
|
|
2058
|
+
}
|
|
2059
|
+
let n = this._renderListValue(e);
|
|
2060
|
+
n && t.append(n);
|
|
2061
|
+
}), t;
|
|
2062
|
+
}
|
|
2063
|
+
_renderChecklist(e) {
|
|
2064
|
+
let t = this._dom.createElement("ul", "lh-checklist");
|
|
2065
|
+
return Object.values(e.items).forEach((e) => {
|
|
2066
|
+
let n = this._dom.createChildOf(t, "li", "lh-checklist-item"), r = e.value ? "lh-report-plain-icon--checklist-pass" : "lh-report-plain-icon--checklist-fail";
|
|
2067
|
+
this._dom.createChildOf(n, "span", `lh-report-plain-icon ${r}`).textContent = e.label;
|
|
2068
|
+
}), t;
|
|
2069
|
+
}
|
|
2070
|
+
renderNode(e) {
|
|
2071
|
+
let t = this._dom.createElement("span", "lh-node");
|
|
2072
|
+
if (e.nodeLabel) {
|
|
2073
|
+
let n = this._dom.createElement("div");
|
|
2074
|
+
n.textContent = e.nodeLabel, t.append(n);
|
|
2075
|
+
}
|
|
2076
|
+
if (e.snippet) {
|
|
2077
|
+
let n = this._dom.createElement("div");
|
|
2078
|
+
n.classList.add("lh-node__snippet"), n.textContent = e.snippet, t.append(n);
|
|
2079
|
+
}
|
|
2080
|
+
if (e.selector && (t.title = e.selector), e.path && t.setAttribute("data-path", e.path), e.selector && t.setAttribute("data-selector", e.selector), e.snippet && t.setAttribute("data-snippet", e.snippet), !this._fullPageScreenshot) return t;
|
|
2081
|
+
let n = e.lhId && this._fullPageScreenshot.nodes[e.lhId];
|
|
2082
|
+
if (!n || n.width === 0 || n.height === 0) return t;
|
|
2083
|
+
let r = Vt.render(this._dom, this._fullPageScreenshot.screenshot, n, {
|
|
2084
|
+
width: 147,
|
|
2085
|
+
height: 100
|
|
2086
|
+
});
|
|
2087
|
+
return r && t.prepend(r), t;
|
|
2088
|
+
}
|
|
2089
|
+
renderSourceLocation(e) {
|
|
2090
|
+
if (!e.url) return null;
|
|
2091
|
+
let t = `${e.url}:${e.line + 1}:${e.column}`, n;
|
|
2092
|
+
e.original && (n = `${e.original.file || "<unmapped>"}:${e.original.line + 1}:${e.original.column}`);
|
|
2093
|
+
let r;
|
|
2094
|
+
if (e.urlProvider === "network" && n) r = this._renderLink({
|
|
2095
|
+
url: e.url,
|
|
2096
|
+
text: n
|
|
2097
|
+
}), r.title = `maps to generated location ${t}`;
|
|
2098
|
+
else if (e.urlProvider === "network" && !n) r = this.renderTextURL(e.url), this._dom.find(".lh-link", r).textContent += `:${e.line + 1}:${e.column}`;
|
|
2099
|
+
else if (e.urlProvider === "comment" && n) r = this._renderText(`${n} (from source map)`), r.title = `${t} (from sourceURL)`;
|
|
2100
|
+
else if (e.urlProvider === "comment" && !n) r = this._renderText(`${t} (from sourceURL)`);
|
|
2101
|
+
else return null;
|
|
2102
|
+
return r.classList.add("lh-source-location"), r.setAttribute("data-source-url", e.url), r.setAttribute("data-source-line", String(e.line)), r.setAttribute("data-source-column", String(e.column)), r;
|
|
2103
|
+
}
|
|
2104
|
+
_renderFilmstrip(e) {
|
|
2105
|
+
let t = this._dom.createElement("div", "lh-filmstrip");
|
|
2106
|
+
for (let n of e.items) {
|
|
2107
|
+
let e = this._dom.createChildOf(t, "div", "lh-filmstrip__frame"), r = this._dom.createChildOf(e, "img", "lh-filmstrip__thumbnail");
|
|
2108
|
+
r.src = n.data, r.alt = "Screenshot";
|
|
2109
|
+
}
|
|
2110
|
+
return t;
|
|
2111
|
+
}
|
|
2112
|
+
_renderCode(e) {
|
|
2113
|
+
let t = this._dom.createElement("pre", "lh-code");
|
|
2114
|
+
return t.textContent = e, t;
|
|
2115
|
+
}
|
|
2116
|
+
}, Gt = class {
|
|
2117
|
+
constructor(e) {
|
|
2118
|
+
e === "en-XA" && (e = "de"), this._locale = e, this._cachedNumberFormatters = /* @__PURE__ */ new Map();
|
|
2119
|
+
}
|
|
2120
|
+
_formatNumberWithGranularity(e, t, n = {}) {
|
|
2121
|
+
if (t !== void 0) {
|
|
2122
|
+
let r = -Math.log10(t);
|
|
2123
|
+
Number.isInteger(r) || (console.warn(`granularity of ${t} is invalid. Using 1 instead`), t = 1), t < 1 && (n = { ...n }, n.minimumFractionDigits = n.maximumFractionDigits = Math.ceil(r)), e = Math.round(e / t) * t, Object.is(e, -0) && (e = 0);
|
|
2124
|
+
} else Math.abs(e) < 5e-4 && (e = 0);
|
|
2125
|
+
let r, i = [
|
|
2126
|
+
n.minimumFractionDigits,
|
|
2127
|
+
n.maximumFractionDigits,
|
|
2128
|
+
n.style,
|
|
2129
|
+
n.unit,
|
|
2130
|
+
n.unitDisplay,
|
|
2131
|
+
this._locale
|
|
2132
|
+
].join("");
|
|
2133
|
+
return r = this._cachedNumberFormatters.get(i), r || (r = new Intl.NumberFormat(this._locale, n), this._cachedNumberFormatters.set(i, r)), r.format(e).replace(" ", "\xA0");
|
|
2134
|
+
}
|
|
2135
|
+
formatNumber(e, t) {
|
|
2136
|
+
return this._formatNumberWithGranularity(e, t);
|
|
2137
|
+
}
|
|
2138
|
+
formatInteger(e) {
|
|
2139
|
+
return this._formatNumberWithGranularity(e, 1);
|
|
2140
|
+
}
|
|
2141
|
+
formatPercent(e) {
|
|
2142
|
+
return new Intl.NumberFormat(this._locale, { style: "percent" }).format(e);
|
|
2143
|
+
}
|
|
2144
|
+
formatBytesToKiB(e, t = void 0) {
|
|
2145
|
+
return this._formatNumberWithGranularity(e / 1024, t) + "\xA0KiB";
|
|
2146
|
+
}
|
|
2147
|
+
formatBytesToMiB(e, t = void 0) {
|
|
2148
|
+
return this._formatNumberWithGranularity(e / 1048576, t) + "\xA0MiB";
|
|
2149
|
+
}
|
|
2150
|
+
formatBytes(e, t = 1) {
|
|
2151
|
+
return this._formatNumberWithGranularity(e, t, {
|
|
2152
|
+
style: "unit",
|
|
2153
|
+
unit: "byte",
|
|
2154
|
+
unitDisplay: "long"
|
|
2155
|
+
});
|
|
2156
|
+
}
|
|
2157
|
+
formatBytesWithBestUnit(e, t = .1) {
|
|
2158
|
+
return e >= 1048576 ? this.formatBytesToMiB(e, t) : e >= 1024 ? this.formatBytesToKiB(e, t) : this._formatNumberWithGranularity(e, t, {
|
|
2159
|
+
style: "unit",
|
|
2160
|
+
unit: "byte",
|
|
2161
|
+
unitDisplay: "narrow"
|
|
2162
|
+
});
|
|
2163
|
+
}
|
|
2164
|
+
formatKbps(e, t = void 0) {
|
|
2165
|
+
return this._formatNumberWithGranularity(e, t, {
|
|
2166
|
+
style: "unit",
|
|
2167
|
+
unit: "kilobit-per-second",
|
|
2168
|
+
unitDisplay: "short"
|
|
2169
|
+
});
|
|
2170
|
+
}
|
|
2171
|
+
formatMilliseconds(e, t = void 0) {
|
|
2172
|
+
return this._formatNumberWithGranularity(e, t, {
|
|
2173
|
+
style: "unit",
|
|
2174
|
+
unit: "millisecond",
|
|
2175
|
+
unitDisplay: "short"
|
|
2176
|
+
});
|
|
2177
|
+
}
|
|
2178
|
+
formatSeconds(e, t = void 0) {
|
|
2179
|
+
return this._formatNumberWithGranularity(e / 1e3, t, {
|
|
2180
|
+
style: "unit",
|
|
2181
|
+
unit: "second",
|
|
2182
|
+
unitDisplay: "narrow"
|
|
2183
|
+
});
|
|
2184
|
+
}
|
|
2185
|
+
formatDateTime(e) {
|
|
2186
|
+
let t = {
|
|
2187
|
+
month: "short",
|
|
2188
|
+
day: "numeric",
|
|
2189
|
+
year: "numeric",
|
|
2190
|
+
hour: "numeric",
|
|
2191
|
+
minute: "numeric",
|
|
2192
|
+
timeZoneName: "short"
|
|
2193
|
+
}, n;
|
|
2194
|
+
try {
|
|
2195
|
+
n = new Intl.DateTimeFormat(this._locale, t);
|
|
2196
|
+
} catch {
|
|
2197
|
+
t.timeZone = "UTC", n = new Intl.DateTimeFormat(this._locale, t);
|
|
2198
|
+
}
|
|
2199
|
+
return n.format(new Date(e));
|
|
2200
|
+
}
|
|
2201
|
+
formatDuration(e) {
|
|
2202
|
+
let t = e / 1e3;
|
|
2203
|
+
if (Math.round(t) === 0) return "None";
|
|
2204
|
+
let n = [], r = {
|
|
2205
|
+
day: 3600 * 24,
|
|
2206
|
+
hour: 3600,
|
|
2207
|
+
minute: 60,
|
|
2208
|
+
second: 1
|
|
2209
|
+
};
|
|
2210
|
+
return Object.keys(r).forEach((e) => {
|
|
2211
|
+
let i = r[e], a = Math.floor(t / i);
|
|
2212
|
+
if (a > 0) {
|
|
2213
|
+
t -= a * i;
|
|
2214
|
+
let r = this._formatNumberWithGranularity(a, 1, {
|
|
2215
|
+
style: "unit",
|
|
2216
|
+
unit: e,
|
|
2217
|
+
unitDisplay: "narrow"
|
|
2218
|
+
});
|
|
2219
|
+
n.push(r);
|
|
2220
|
+
}
|
|
2221
|
+
}), n.join(" ");
|
|
2222
|
+
}
|
|
2223
|
+
};
|
|
2224
|
+
function Kt(e) {
|
|
2225
|
+
let t = e.createComponent("explodeyGauge");
|
|
2226
|
+
return e.find(".lh-exp-gauge-component", t);
|
|
2227
|
+
}
|
|
2228
|
+
function qt(e, t, n) {
|
|
2229
|
+
let r = e.find("div.lh-exp-gauge__wrapper", t);
|
|
2230
|
+
r.className = "", r.classList.add("lh-exp-gauge__wrapper", `lh-exp-gauge__wrapper--${U.calculateRating(n.score)}`), Yt(e, r, n);
|
|
2231
|
+
}
|
|
2232
|
+
function Jt(e, t, n) {
|
|
2233
|
+
n ||= e / 32;
|
|
2234
|
+
let r = e / n, i = .5 * n, a = r + i + n, o = 2 * Math.PI * r, s = Math.acos(1 - .5 * (.5 * n / r) ** 2) * r, c = 2 * Math.PI * a, l = Math.acos(1 - .5 * (.5 * n / a) ** 2) * a;
|
|
2235
|
+
return {
|
|
2236
|
+
radiusInner: r,
|
|
2237
|
+
radiusOuter: a,
|
|
2238
|
+
circumferenceInner: o,
|
|
2239
|
+
circumferenceOuter: c,
|
|
2240
|
+
getArcLength: () => Math.max(0, Number(t * o)),
|
|
2241
|
+
getMetricArcLength: (e, t = !1) => {
|
|
2242
|
+
let n = t ? 0 : 2 * l;
|
|
2243
|
+
return Math.max(0, Number(e * c - i - n));
|
|
2244
|
+
},
|
|
2245
|
+
endDiffInner: s,
|
|
2246
|
+
endDiffOuter: l,
|
|
2247
|
+
strokeWidth: n,
|
|
2248
|
+
strokeGap: i
|
|
2249
|
+
};
|
|
2250
|
+
}
|
|
2251
|
+
function Yt(e, t, n) {
|
|
2252
|
+
let r = Number(n.score), { radiusInner: i, radiusOuter: a, circumferenceInner: o, circumferenceOuter: s, getArcLength: c, getMetricArcLength: l, endDiffInner: u, endDiffOuter: d, strokeWidth: f, strokeGap: p } = Jt(128, r), m = e.find("svg.lh-exp-gauge", t);
|
|
2253
|
+
e.find(".lh-exp-gauge__label", m).textContent = n.title, m.setAttribute("viewBox", [
|
|
2254
|
+
-64,
|
|
2255
|
+
-64 / 2,
|
|
2256
|
+
128,
|
|
2257
|
+
128 / 2
|
|
2258
|
+
].join(" ")), m.style.setProperty("--stroke-width", `${f}px`), m.style.setProperty("--circle-meas", (2 * Math.PI).toFixed(4));
|
|
2259
|
+
let h = e.find("g.lh-exp-gauge__outer", t), g = e.find("g.lh-exp-gauge__inner", t), _ = e.find("circle.lh-cover", h), v = e.find("circle.lh-exp-gauge__arc", g), y = e.find("text.lh-exp-gauge__percentage", g);
|
|
2260
|
+
h.style.setProperty("--scale-initial", String(i / a)), h.style.setProperty("--radius", `${a}px`), _.style.setProperty("--radius", `${.5 * (i + a)}px`), _.setAttribute("stroke-width", String(p)), m.style.setProperty("--radius", `${i}px`), v.setAttribute("stroke-dasharray", `${c()} ${(o - c()).toFixed(4)}`), v.setAttribute("stroke-dashoffset", String(.25 * o - u)), y.textContent = Math.round(r * 100).toString();
|
|
2261
|
+
let b = a + f, x = a - f, S = n.auditRefs.filter((e) => e.group === "metrics" && e.weight), C = S.reduce((e, t) => e += t.weight, 0), w = .25 * s - d - .5 * p, T = -.5 * Math.PI;
|
|
2262
|
+
h.querySelectorAll(".metric").forEach((e) => {
|
|
2263
|
+
S.map((e) => `metric--${e.id}`).find((t) => e.classList.contains(t)) || e.remove();
|
|
2264
|
+
}), S.forEach((t, n) => {
|
|
2265
|
+
let r = t.acronym ?? t.id, i = !h.querySelector(`.metric--${r}`), a = e.maybeFind(`g.metric--${r}`, h) || e.createSVGElement("g"), o = e.maybeFind(`.metric--${r} circle.lh-exp-gauge--faded`, h) || e.createSVGElement("circle"), c = e.maybeFind(`.metric--${r} circle.lh-exp-gauge--miniarc`, h) || e.createSVGElement("circle"), u = e.maybeFind(`.metric--${r} circle.lh-exp-gauge-hovertarget`, h) || e.createSVGElement("circle"), f = e.maybeFind(`.metric--${r} text.metric__label`, h) || e.createSVGElement("text"), p = e.maybeFind(`.metric--${r} text.metric__value`, h) || e.createSVGElement("text");
|
|
2266
|
+
a.classList.add("metric", `metric--${r}`), o.classList.add("lh-exp-gauge__arc", "lh-exp-gauge__arc--metric", "lh-exp-gauge--faded"), c.classList.add("lh-exp-gauge__arc", "lh-exp-gauge__arc--metric", "lh-exp-gauge--miniarc"), u.classList.add("lh-exp-gauge__arc", "lh-exp-gauge__arc--metric", "lh-exp-gauge-hovertarget");
|
|
2267
|
+
let m = t.weight / C, g = l(m), _ = t.result.score ? t.result.score * m : 0, v = l(_), y = m * s, S = l(m, !0), E = U.calculateRating(t.result.score, t.result.scoreDisplayMode);
|
|
2268
|
+
a.style.setProperty("--metric-rating", E), a.style.setProperty("--metric-color", `var(--color-${E})`), a.style.setProperty("--metric-offset", `${w}`), a.style.setProperty("--i", n.toString()), o.setAttribute("stroke-dasharray", `${g} ${s - g}`), c.style.setProperty("--metric-array", `${v} ${s - v}`), u.setAttribute("stroke-dasharray", `${S} ${s - S - d}`), f.classList.add("metric__label"), p.classList.add("metric__value"), f.textContent = r, p.textContent = `+${Math.round(_ * 100)}`;
|
|
2269
|
+
let D = T + m * Math.PI, O = Math.cos(D), k = Math.sin(D);
|
|
2270
|
+
switch (!0) {
|
|
2271
|
+
case O > 0:
|
|
2272
|
+
p.setAttribute("text-anchor", "end");
|
|
2273
|
+
break;
|
|
2274
|
+
case O < 0:
|
|
2275
|
+
f.setAttribute("text-anchor", "end");
|
|
2276
|
+
break;
|
|
2277
|
+
case O === 0:
|
|
2278
|
+
f.setAttribute("text-anchor", "middle"), p.setAttribute("text-anchor", "middle");
|
|
2279
|
+
break;
|
|
2280
|
+
}
|
|
2281
|
+
switch (!0) {
|
|
2282
|
+
case k > 0:
|
|
2283
|
+
f.setAttribute("dominant-baseline", "hanging");
|
|
2284
|
+
break;
|
|
2285
|
+
case k < 0:
|
|
2286
|
+
p.setAttribute("dominant-baseline", "hanging");
|
|
2287
|
+
break;
|
|
2288
|
+
case k === 0:
|
|
2289
|
+
f.setAttribute("dominant-baseline", "middle"), p.setAttribute("dominant-baseline", "middle");
|
|
2290
|
+
break;
|
|
2291
|
+
}
|
|
2292
|
+
f.setAttribute("x", (b * O).toFixed(2)), f.setAttribute("y", (b * k).toFixed(2)), p.setAttribute("x", (x * O).toFixed(2)), p.setAttribute("y", (x * k).toFixed(2)), i && (a.appendChild(o), a.appendChild(c), a.appendChild(u), a.appendChild(f), a.appendChild(p), h.appendChild(a)), w -= y, T += m * 2 * Math.PI;
|
|
2293
|
+
});
|
|
2294
|
+
let E = h.querySelector(".lh-exp-gauge-underhovertarget") || e.createSVGElement("circle");
|
|
2295
|
+
E.classList.add("lh-exp-gauge__arc", "lh-exp-gauge__arc--metric", "lh-exp-gauge-hovertarget", "lh-exp-gauge-underhovertarget");
|
|
2296
|
+
let D = l(1, !0);
|
|
2297
|
+
if (E.setAttribute("stroke-dasharray", `${D} ${s - D - d}`), E.isConnected || h.prepend(E), m.dataset.listenersSetup) return;
|
|
2298
|
+
m.dataset.listenersSetup = !0, O(m), m.addEventListener("pointerover", (n) => {
|
|
2299
|
+
if (n.target === m && m.classList.contains("state--expanded")) {
|
|
2300
|
+
m.classList.remove("state--expanded"), m.classList.contains("state--highlight") && (m.classList.remove("state--highlight"), e.find(".metric--highlight", m).classList.remove("metric--highlight"));
|
|
2301
|
+
return;
|
|
2302
|
+
}
|
|
2303
|
+
if (!(n.target instanceof Element)) return;
|
|
2304
|
+
let r = n.target.parentNode;
|
|
2305
|
+
if (r instanceof SVGElement) {
|
|
2306
|
+
if (r && r === g) {
|
|
2307
|
+
m.classList.contains("state--expanded") ? m.classList.contains("state--highlight") && (m.classList.remove("state--highlight"), e.find(".metric--highlight", m).classList.remove("metric--highlight")) : m.classList.add("state--expanded");
|
|
2308
|
+
return;
|
|
2309
|
+
}
|
|
2310
|
+
if (r && r.classList && r.classList.contains("metric")) {
|
|
2311
|
+
let n = r.style.getPropertyValue("--metric-rating");
|
|
2312
|
+
if (t.style.setProperty("--color-highlight", `var(--color-${n}-secondary)`), !m.classList.contains("state--highlight")) m.classList.add("state--highlight"), r.classList.add("metric--highlight");
|
|
2313
|
+
else {
|
|
2314
|
+
let t = e.find(".metric--highlight", m);
|
|
2315
|
+
r !== t && (t.classList.remove("metric--highlight"), r.classList.add("metric--highlight"));
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
}
|
|
2319
|
+
}), m.addEventListener("mouseleave", () => {
|
|
2320
|
+
m.classList.remove("state--highlight"), m.querySelector(".metric--highlight")?.classList.remove("metric--highlight");
|
|
2321
|
+
});
|
|
2322
|
+
async function O(t) {
|
|
2323
|
+
if (await new Promise((e) => setTimeout(e, 1e3)), t.classList.contains("state--expanded")) return;
|
|
2324
|
+
let n = e.find(".lh-exp-gauge__inner", t), r = `uniq-${Math.random()}`;
|
|
2325
|
+
n.setAttribute("id", r);
|
|
2326
|
+
let i = e.createSVGElement("use");
|
|
2327
|
+
i.setAttribute("href", `#${r}`), t.appendChild(i);
|
|
2328
|
+
let a = 2.5;
|
|
2329
|
+
t.style.setProperty("--peek-dur", `${a}s`), t.classList.add("state--peek", "state--expanded");
|
|
2330
|
+
let o = () => {
|
|
2331
|
+
t.classList.remove("state--peek", "state--expanded"), i.remove();
|
|
2332
|
+
}, s = setTimeout(() => {
|
|
2333
|
+
t.removeEventListener("mouseenter", c), o();
|
|
2334
|
+
}, a * 1e3 * 1.5);
|
|
2335
|
+
function c() {
|
|
2336
|
+
clearTimeout(s), o();
|
|
2337
|
+
}
|
|
2338
|
+
t.addEventListener("mouseenter", c, { once: !0 });
|
|
2339
|
+
}
|
|
2340
|
+
}
|
|
2341
|
+
var Xt = class extends It {
|
|
2342
|
+
_renderMetric(e) {
|
|
2343
|
+
let t = this.dom.createComponent("metric"), n = this.dom.find(".lh-metric", t);
|
|
2344
|
+
n.id = e.result.id;
|
|
2345
|
+
let r = U.calculateRating(e.result.score, e.result.scoreDisplayMode);
|
|
2346
|
+
n.classList.add(`lh-metric--${r}`);
|
|
2347
|
+
let i = this.dom.find(".lh-metric__title", t);
|
|
2348
|
+
i.textContent = e.result.title;
|
|
2349
|
+
let a = this.dom.find(".lh-metric__value", t);
|
|
2350
|
+
a.textContent = e.result.displayValue || "";
|
|
2351
|
+
let o = this.dom.find(".lh-metric__description", t);
|
|
2352
|
+
if (o.append(this.dom.convertMarkdownLinkSnippets(e.result.description)), e.result.scoreDisplayMode === "error") {
|
|
2353
|
+
o.textContent = "", a.textContent = "Error!";
|
|
2354
|
+
let t = this.dom.createChildOf(o, "span");
|
|
2355
|
+
t.textContent = e.result.errorMessage || "Report error: no metric information";
|
|
2356
|
+
} else e.result.scoreDisplayMode === "notApplicable" && (a.textContent = "--");
|
|
2357
|
+
return n;
|
|
2358
|
+
}
|
|
2359
|
+
_getScoringCalculatorHref(e) {
|
|
2360
|
+
let t = e.filter((e) => e.group === "metrics"), n = e.find((e) => e.id === "interactive"), r = e.find((e) => e.id === "first-cpu-idle"), i = e.find((e) => e.id === "first-meaningful-paint");
|
|
2361
|
+
n && t.push(n), r && t.push(r), i && typeof i.result.score == "number" && t.push(i);
|
|
2362
|
+
let a = (e) => Math.round(e * 100) / 100, o = [...t.map((e) => {
|
|
2363
|
+
let t;
|
|
2364
|
+
return typeof e.result.numericValue == "number" ? (t = e.id === "cumulative-layout-shift" ? a(e.result.numericValue) : Math.round(e.result.numericValue), t = t.toString()) : t = "null", [e.acronym || e.id, t];
|
|
2365
|
+
})];
|
|
2366
|
+
V.reportJson && (o.push(["device", V.reportJson.configSettings.formFactor]), o.push(["version", V.reportJson.lighthouseVersion]));
|
|
2367
|
+
let s = new URLSearchParams(o), c = new URL("https://googlechrome.github.io/lighthouse/scorecalc/");
|
|
2368
|
+
return c.hash = s.toString(), c.href;
|
|
2369
|
+
}
|
|
2370
|
+
overallImpact(e, t) {
|
|
2371
|
+
if (!e.result.metricSavings) return {
|
|
2372
|
+
overallImpact: 0,
|
|
2373
|
+
overallLinearImpact: 0
|
|
2374
|
+
};
|
|
2375
|
+
let n = 0, r = 0;
|
|
2376
|
+
for (let [i, a] of Object.entries(e.result.metricSavings)) {
|
|
2377
|
+
if (a === void 0) continue;
|
|
2378
|
+
let e = t.find((e) => e.acronym === i);
|
|
2379
|
+
if (!e || e.result.score === null) continue;
|
|
2380
|
+
let o = e.result.numericValue;
|
|
2381
|
+
if (!o) continue;
|
|
2382
|
+
let s = a / o * e.weight;
|
|
2383
|
+
r += s;
|
|
2384
|
+
let c = e.result.scoringOptions;
|
|
2385
|
+
if (!c) continue;
|
|
2386
|
+
let l = (B.computeLogNormalScore(c, o - a) - e.result.score) * e.weight;
|
|
2387
|
+
n += l;
|
|
2388
|
+
}
|
|
2389
|
+
return {
|
|
2390
|
+
overallImpact: n,
|
|
2391
|
+
overallLinearImpact: r
|
|
2392
|
+
};
|
|
2393
|
+
}
|
|
2394
|
+
render(e, t, n) {
|
|
2395
|
+
let r = V.strings, i = this.dom.createElement("div", "lh-category");
|
|
2396
|
+
i.id = e.id, i.append(this.renderCategoryHeader(e, t, n));
|
|
2397
|
+
let a = e.auditRefs.filter((e) => e.group === "metrics");
|
|
2398
|
+
if (a.length) {
|
|
2399
|
+
let [n, o] = this.renderAuditGroup(t.metrics), s = this.dom.createElement("input", "lh-metrics-toggle__input"), c = `lh-metrics-toggle${V.getUniqueSuffix()}`;
|
|
2400
|
+
s.setAttribute("aria-label", "Toggle the display of metric descriptions"), s.type = "checkbox", s.id = c, n.prepend(s);
|
|
2401
|
+
let l = this.dom.find(".lh-audit-group__header", n), u = this.dom.createChildOf(l, "label", "lh-metrics-toggle__label");
|
|
2402
|
+
u.htmlFor = c;
|
|
2403
|
+
let d = this.dom.createChildOf(u, "span", "lh-metrics-toggle__labeltext--show"), f = this.dom.createChildOf(u, "span", "lh-metrics-toggle__labeltext--hide");
|
|
2404
|
+
d.textContent = V.strings.expandView, f.textContent = V.strings.collapseView;
|
|
2405
|
+
let p = this.dom.createElement("div", "lh-metrics-container");
|
|
2406
|
+
if (n.insertBefore(p, o), a.forEach((e) => {
|
|
2407
|
+
p.append(this._renderMetric(e));
|
|
2408
|
+
}), i.querySelector(".lh-gauge__wrapper")) {
|
|
2409
|
+
let t = this.dom.find(".lh-category-header__description", i), n = this.dom.createChildOf(t, "div", "lh-metrics__disclaimer"), a = this.dom.convertMarkdownLinkSnippets(r.varianceDisclaimer);
|
|
2410
|
+
n.append(a);
|
|
2411
|
+
let o = this.dom.createChildOf(n, "a", "lh-calclink");
|
|
2412
|
+
o.target = "_blank", o.textContent = r.calculatorLink, this.dom.safelySetHref(o, this._getScoringCalculatorHref(e.auditRefs));
|
|
2413
|
+
}
|
|
2414
|
+
n.classList.add("lh-audit-group--metrics"), i.append(n);
|
|
2415
|
+
}
|
|
2416
|
+
let o = this.dom.createChildOf(i, "div", "lh-filmstrip-container"), s = e.auditRefs.find((e) => e.id === "screenshot-thumbnails")?.result;
|
|
2417
|
+
if (s?.details) {
|
|
2418
|
+
o.id = s.id;
|
|
2419
|
+
let e = this.detailsRenderer.render(s.details);
|
|
2420
|
+
e && o.append(e);
|
|
2421
|
+
}
|
|
2422
|
+
let c = this.renderFilterableSection(e, t, ["insights", "diagnostics"], a);
|
|
2423
|
+
if (c && (c.classList.add("lh-perf-audits"), i.append(c)), (!n || n?.gatherMode === "navigation") && e.score !== null) {
|
|
2424
|
+
let t = Kt(this.dom);
|
|
2425
|
+
qt(this.dom, t, e), this.dom.find(".lh-score__gauge", i).replaceWith(t);
|
|
2426
|
+
}
|
|
2427
|
+
return i;
|
|
2428
|
+
}
|
|
2429
|
+
renderFilterableSection(e, t, n, r) {
|
|
2430
|
+
if (n.some((e) => !t[e])) return null;
|
|
2431
|
+
let i = this.dom.createElement("div"), a = (e) => e.group ?? "", o = e.auditRefs.filter((e) => n.includes(a(e))).map((e) => {
|
|
2432
|
+
let { overallImpact: t, overallLinearImpact: n } = this.overallImpact(e, r), i = e.result.guidanceLevel || 1;
|
|
2433
|
+
return {
|
|
2434
|
+
auditRef: e,
|
|
2435
|
+
auditEl: this.renderAudit(e),
|
|
2436
|
+
overallImpact: t,
|
|
2437
|
+
overallLinearImpact: n,
|
|
2438
|
+
guidanceLevel: i
|
|
2439
|
+
};
|
|
2440
|
+
}), s = o.filter((e) => !U.showAsPassed(e.auditRef.result)), c = o.filter((e) => U.showAsPassed(e.auditRef.result)), l = {};
|
|
2441
|
+
for (let e of n) {
|
|
2442
|
+
let n = this.renderAuditGroup(t[e]);
|
|
2443
|
+
n[0].classList.add(`lh-audit-group--${e}`), l[e] = n;
|
|
2444
|
+
}
|
|
2445
|
+
function u(e) {
|
|
2446
|
+
for (let t of o) if (e === "All") t.auditEl.hidden = !1;
|
|
2447
|
+
else {
|
|
2448
|
+
let n = t.auditRef.result.metricSavings?.[e] === void 0;
|
|
2449
|
+
t.auditEl.hidden = n;
|
|
2450
|
+
}
|
|
2451
|
+
s.sort((t, n) => {
|
|
2452
|
+
let r = t.auditRef.result.score || 0, i = n.auditRef.result.score || 0;
|
|
2453
|
+
if (r !== i) return r - i;
|
|
2454
|
+
if (e !== "All") {
|
|
2455
|
+
let r = t.auditRef.result.metricSavings?.[e] ?? -1, i = n.auditRef.result.metricSavings?.[e] ?? -1;
|
|
2456
|
+
if (r !== i) return i - r;
|
|
2457
|
+
}
|
|
2458
|
+
return t.overallImpact === n.overallImpact ? t.overallImpact === 0 && n.overallImpact === 0 && t.overallLinearImpact !== n.overallLinearImpact ? n.overallLinearImpact * n.guidanceLevel - t.overallLinearImpact * t.guidanceLevel : n.guidanceLevel - t.guidanceLevel : n.overallImpact * n.guidanceLevel - t.overallImpact * t.guidanceLevel;
|
|
2459
|
+
});
|
|
2460
|
+
for (let e of s) {
|
|
2461
|
+
if (!e.auditRef.group) continue;
|
|
2462
|
+
let t = l[a(e.auditRef)];
|
|
2463
|
+
if (!t) continue;
|
|
2464
|
+
let [n, r] = t;
|
|
2465
|
+
n.insertBefore(e.auditEl, r);
|
|
2466
|
+
}
|
|
2467
|
+
}
|
|
2468
|
+
let d = /* @__PURE__ */ new Set();
|
|
2469
|
+
for (let e of s) {
|
|
2470
|
+
let t = e.auditRef.result.metricSavings || {};
|
|
2471
|
+
for (let [e, n] of Object.entries(t)) typeof n == "number" && d.add(e);
|
|
2472
|
+
}
|
|
2473
|
+
let f = r.filter((e) => e.acronym && d.has(e.acronym));
|
|
2474
|
+
f.length && this.renderMetricAuditFilter(f, i, u), u("All");
|
|
2475
|
+
for (let e of n) if (s.some((t) => a(t.auditRef) === e)) {
|
|
2476
|
+
let t = l[e];
|
|
2477
|
+
if (!t) continue;
|
|
2478
|
+
i.append(t[0]);
|
|
2479
|
+
}
|
|
2480
|
+
if (!c.length) return i;
|
|
2481
|
+
let p = {
|
|
2482
|
+
auditRefsOrEls: c.map((e) => e.auditEl),
|
|
2483
|
+
groupDefinitions: t
|
|
2484
|
+
}, m = this.renderClump("passed", p);
|
|
2485
|
+
return i.append(m), i;
|
|
2486
|
+
}
|
|
2487
|
+
renderMetricAuditFilter(e, t, n) {
|
|
2488
|
+
let r = this.dom.createElement("div", "lh-metricfilter"), i = this.dom.createChildOf(r, "span", "lh-metricfilter__text");
|
|
2489
|
+
i.textContent = V.strings.showRelevantAudits;
|
|
2490
|
+
let a = [{
|
|
2491
|
+
acronym: "All",
|
|
2492
|
+
id: "All"
|
|
2493
|
+
}, ...e], o = V.getUniqueSuffix();
|
|
2494
|
+
for (let e of a) {
|
|
2495
|
+
let i = `metric-${e.acronym}-${o}`, a = this.dom.createChildOf(r, "input", "lh-metricfilter__radio");
|
|
2496
|
+
a.type = "radio", a.name = `metricsfilter-${o}`, a.id = i;
|
|
2497
|
+
let s = this.dom.createChildOf(r, "label", "lh-metricfilter__label");
|
|
2498
|
+
s.htmlFor = i, s.title = "result" in e ? e.result.title : "", s.textContent = e.acronym || e.id, e.acronym === "All" && (a.checked = !0, s.classList.add("lh-metricfilter__label--active")), t.append(r), a.addEventListener("input", (r) => {
|
|
2499
|
+
for (let e of t.querySelectorAll("label.lh-metricfilter__label")) e.classList.toggle("lh-metricfilter__label--active", e.htmlFor === i);
|
|
2500
|
+
t.classList.toggle("lh-category--filtered", e.acronym !== "All"), n(e.acronym || "All");
|
|
2501
|
+
let a = t.querySelectorAll("div.lh-audit-group, details.lh-audit-group");
|
|
2502
|
+
for (let e of a) {
|
|
2503
|
+
e.hidden = !1;
|
|
2504
|
+
let t = Array.from(e.querySelectorAll("div.lh-audit"));
|
|
2505
|
+
e.hidden = !!t.length && t.every((e) => e.hidden);
|
|
2506
|
+
}
|
|
2507
|
+
});
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
}, Zt = class {
|
|
2511
|
+
constructor(e) {
|
|
2512
|
+
this._dom = e, this._opts = {};
|
|
2513
|
+
}
|
|
2514
|
+
renderReport(e, t, n) {
|
|
2515
|
+
if (!this._dom.rootEl && t) {
|
|
2516
|
+
console.warn("Please adopt the new report API in renderer/api.js.");
|
|
2517
|
+
let e = t.closest(".lh-root");
|
|
2518
|
+
e ? this._dom.rootEl = e : (t.classList.add("lh-root", "lh-vars"), this._dom.rootEl = t);
|
|
2519
|
+
} else this._dom.rootEl && t && (this._dom.rootEl = t);
|
|
2520
|
+
n && (this._opts = n), this._dom.setLighthouseChannel(e.configSettings.channel || "unknown");
|
|
2521
|
+
let r = U.prepareReportResult(e);
|
|
2522
|
+
return this._dom.rootEl.textContent = "", this._dom.rootEl.append(this._renderReport(r)), this._opts.occupyEntireViewport && this._dom.rootEl.classList.add("lh-max-viewport"), this._dom.rootEl;
|
|
2523
|
+
}
|
|
2524
|
+
_renderReportTopbar(e) {
|
|
2525
|
+
let t = this._dom.createComponent("topbar"), n = this._dom.find("a.lh-topbar__url", t);
|
|
2526
|
+
return n.textContent = e.finalDisplayedUrl, n.title = e.finalDisplayedUrl, this._dom.safelySetHref(n, e.finalDisplayedUrl), t;
|
|
2527
|
+
}
|
|
2528
|
+
_renderReportHeader() {
|
|
2529
|
+
let e = this._dom.createComponent("heading"), t = this._dom.createComponent("scoresWrapper");
|
|
2530
|
+
return this._dom.find(".lh-scores-wrapper-placeholder", e).replaceWith(t), e;
|
|
2531
|
+
}
|
|
2532
|
+
_renderReportFooter(e) {
|
|
2533
|
+
let t = this._dom.createComponent("footer");
|
|
2534
|
+
return this._renderMetaBlock(e, t), this._dom.find(".lh-footer__version_issue", t).textContent = V.strings.footerIssue, this._dom.find(".lh-footer__version", t).textContent = e.lighthouseVersion, t;
|
|
2535
|
+
}
|
|
2536
|
+
_renderMetaBlock(e, t) {
|
|
2537
|
+
let n = U.getEmulationDescriptions(e.configSettings || {}), r = e.userAgent.match(/(\w*Chrome\/[\d.]+)/), i = Array.isArray(r) ? r[1].replace("/", " ").replace("Chrome", "Chromium") : "Chromium", a = e.configSettings.channel, o = e.environment.benchmarkIndex.toFixed(0), s = e.environment.credits?.["axe-core"], c = [`${V.strings.runtimeSettingsBenchmark}: ${o}`, `${V.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];
|
|
2538
|
+
n.screenEmulation && c.push(`${V.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`), s && c.push(`${V.strings.runtimeSettingsAxeVersion}: ${s}`);
|
|
2539
|
+
let l = V.strings.runtimeAnalysisWindow;
|
|
2540
|
+
e.gatherMode === "timespan" ? l = V.strings.runtimeAnalysisWindowTimespan : e.gatherMode === "snapshot" && (l = V.strings.runtimeAnalysisWindowSnapshot);
|
|
2541
|
+
let u = [
|
|
2542
|
+
["date", `Captured at ${V.i18n.formatDateTime(e.fetchTime)}`],
|
|
2543
|
+
[
|
|
2544
|
+
"devices",
|
|
2545
|
+
`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,
|
|
2546
|
+
c.join("\n")
|
|
2547
|
+
],
|
|
2548
|
+
[
|
|
2549
|
+
"samples-one",
|
|
2550
|
+
V.strings.runtimeSingleLoad,
|
|
2551
|
+
V.strings.runtimeSingleLoadTooltip
|
|
2552
|
+
],
|
|
2553
|
+
["stopwatch", l],
|
|
2554
|
+
[
|
|
2555
|
+
"networkspeed",
|
|
2556
|
+
`${n.summary}`,
|
|
2557
|
+
`${V.strings.runtimeSettingsNetworkThrottling}: ${n.networkThrottling}`
|
|
2558
|
+
],
|
|
2559
|
+
[
|
|
2560
|
+
"chrome",
|
|
2561
|
+
`Using ${i}` + (a ? ` with ${a}` : ""),
|
|
2562
|
+
`${V.strings.runtimeSettingsUANetwork}: "${e.environment.networkUserAgent}"`
|
|
2563
|
+
]
|
|
2564
|
+
], d = this._dom.find(".lh-meta__items", t);
|
|
2565
|
+
for (let [e, t, n] of u) {
|
|
2566
|
+
let r = this._dom.createChildOf(d, "li", "lh-meta__item");
|
|
2567
|
+
if (r.textContent = t, n) {
|
|
2568
|
+
r.classList.add("lh-tooltip-boundary");
|
|
2569
|
+
let e = this._dom.createChildOf(r, "div", "lh-tooltip");
|
|
2570
|
+
e.textContent = n;
|
|
2571
|
+
}
|
|
2572
|
+
r.classList.add("lh-report-icon", `lh-report-icon--${e}`);
|
|
2573
|
+
}
|
|
2574
|
+
}
|
|
2575
|
+
_renderReportWarnings(e) {
|
|
2576
|
+
if (!e.runWarnings || e.runWarnings.length === 0) return this._dom.createElement("div");
|
|
2577
|
+
let t = this._dom.createComponent("warningsToplevel"), n = this._dom.find(".lh-warnings__msg", t);
|
|
2578
|
+
n.textContent = V.strings.toplevelWarningsMessage;
|
|
2579
|
+
let r = [];
|
|
2580
|
+
for (let t of e.runWarnings) {
|
|
2581
|
+
let e = this._dom.createElement("li");
|
|
2582
|
+
e.append(this._dom.convertMarkdownLinkSnippets(t)), r.push(e);
|
|
2583
|
+
}
|
|
2584
|
+
return this._dom.find("ul", t).append(...r), t;
|
|
2585
|
+
}
|
|
2586
|
+
_renderScoreGauges(e, t, n) {
|
|
2587
|
+
let r = [], i = [];
|
|
2588
|
+
for (let a of Object.values(e.categories)) {
|
|
2589
|
+
let o = (n[a.id] || t).renderCategoryScore(a, e.categoryGroups || {}, { gatherMode: e.gatherMode }), s = this._dom.find("a.lh-gauge__wrapper, a.lh-fraction__wrapper", o);
|
|
2590
|
+
s && (this._dom.safelySetHref(s, `#${a.id}`), s.addEventListener("click", (e) => {
|
|
2591
|
+
if (!s.matches("[href^=\"#\"]")) return;
|
|
2592
|
+
let t = s.getAttribute("href"), n = this._dom.rootEl;
|
|
2593
|
+
if (!t || !n) return;
|
|
2594
|
+
let r = this._dom.find(t, n);
|
|
2595
|
+
e.preventDefault(), r.scrollIntoView();
|
|
2596
|
+
}), this._opts.onPageAnchorRendered?.(s)), U.isPluginCategory(a.id) ? i.push(o) : r.push(o);
|
|
2597
|
+
}
|
|
2598
|
+
return [...r, ...i];
|
|
2599
|
+
}
|
|
2600
|
+
_renderReport(e) {
|
|
2601
|
+
V.apply({
|
|
2602
|
+
providedStrings: e.i18n.rendererFormattedStrings,
|
|
2603
|
+
i18n: new Gt(e.configSettings.locale),
|
|
2604
|
+
reportJson: e
|
|
2605
|
+
});
|
|
2606
|
+
let t = new Wt(this._dom, {
|
|
2607
|
+
fullPageScreenshot: e.fullPageScreenshot ?? void 0,
|
|
2608
|
+
entities: e.entities
|
|
2609
|
+
}), n = new It(this._dom, t), r = { performance: new Xt(this._dom, t) }, i = this._dom.createElement("div");
|
|
2610
|
+
i.append(this._renderReportHeader());
|
|
2611
|
+
let a = this._dom.createElement("div", "lh-container"), o = this._dom.createElement("div", "lh-report");
|
|
2612
|
+
o.append(this._renderReportWarnings(e));
|
|
2613
|
+
let s;
|
|
2614
|
+
Object.keys(e.categories).length === 1 ? i.classList.add("lh-header--solo-category") : s = this._dom.createElement("div", "lh-scores-header");
|
|
2615
|
+
let c = this._dom.createElement("div");
|
|
2616
|
+
if (c.classList.add("lh-scorescale-wrap"), c.append(this._dom.createComponent("scorescale")), s) {
|
|
2617
|
+
let t = this._dom.find(".lh-scores-container", i);
|
|
2618
|
+
s.append(...this._renderScoreGauges(e, n, r)), t.append(s, c);
|
|
2619
|
+
let o = this._dom.createElement("div", "lh-sticky-header");
|
|
2620
|
+
o.append(...this._renderScoreGauges(e, n, r)), a.append(o);
|
|
2621
|
+
}
|
|
2622
|
+
let l = this._dom.createElement("div", "lh-categories");
|
|
2623
|
+
o.append(l);
|
|
2624
|
+
let u = { gatherMode: e.gatherMode };
|
|
2625
|
+
for (let t of Object.values(e.categories)) {
|
|
2626
|
+
let i = r[t.id] || n;
|
|
2627
|
+
i.dom.createChildOf(l, "div", "lh-category-wrapper").append(i.render(t, e.categoryGroups, u));
|
|
2628
|
+
}
|
|
2629
|
+
n.injectFinalScreenshot(l, e.audits, c);
|
|
2630
|
+
let d = this._dom.createFragment();
|
|
2631
|
+
return this._opts.omitGlobalStyles || d.append(this._dom.createComponent("styles")), this._opts.omitTopbar || d.append(this._renderReportTopbar(e)), d.append(a), o.append(this._renderReportFooter(e)), a.append(i, o), e.fullPageScreenshot && Vt.installFullPageScreenshot(this._dom.rootEl, e.fullPageScreenshot.screenshot), d;
|
|
2632
|
+
}
|
|
2633
|
+
};
|
|
2634
|
+
function Qt(e, t) {
|
|
2635
|
+
let n = e.rootEl;
|
|
2636
|
+
typeof t > "u" ? n.classList.toggle("lh-dark") : n.classList.toggle("lh-dark", t);
|
|
2637
|
+
}
|
|
2638
|
+
var $t = typeof btoa < "u" ? btoa : (e) => Buffer.from(e).toString("base64"), en = typeof atob < "u" ? atob : (e) => Buffer.from(e, "base64").toString();
|
|
2639
|
+
async function tn(e, t) {
|
|
2640
|
+
let n = new TextEncoder().encode(e);
|
|
2641
|
+
if (t.gzip) if (typeof CompressionStream < "u") {
|
|
2642
|
+
let e = new CompressionStream("gzip"), t = e.writable.getWriter();
|
|
2643
|
+
t.write(n), t.close();
|
|
2644
|
+
let r = await new Response(e.readable).arrayBuffer();
|
|
2645
|
+
n = new Uint8Array(r);
|
|
2646
|
+
} else n = window.pako.gzip(e);
|
|
2647
|
+
let r = "", i = 5e3;
|
|
2648
|
+
for (let e = 0; e < n.length; e += i) r += String.fromCharCode(...n.subarray(e, e + i));
|
|
2649
|
+
return $t(r);
|
|
2650
|
+
}
|
|
2651
|
+
function nn(e, t) {
|
|
2652
|
+
let n = en(e), r = Uint8Array.from(n, (e) => e.charCodeAt(0));
|
|
2653
|
+
return t.gzip ? window.pako.ungzip(r, { to: "string" }) : new TextDecoder().decode(r);
|
|
2654
|
+
}
|
|
2655
|
+
var rn = {
|
|
2656
|
+
toBase64: tn,
|
|
2657
|
+
fromBase64: nn
|
|
2658
|
+
};
|
|
2659
|
+
function an() {
|
|
2660
|
+
let e = window.location.host.endsWith(".vercel.app"), t = new URLSearchParams(window.location.search).has("dev");
|
|
2661
|
+
return e ? `https://${window.location.host}/gh-pages` : t ? "http://localhost:7333" : "https://googlechrome.github.io/lighthouse";
|
|
2662
|
+
}
|
|
2663
|
+
function on(e) {
|
|
2664
|
+
let t = e.generatedTime, n = e.fetchTime || t;
|
|
2665
|
+
return `${e.lighthouseVersion}-${e.finalDisplayedUrl}-${n}`;
|
|
2666
|
+
}
|
|
2667
|
+
function sn(e, t, n) {
|
|
2668
|
+
let r = new URL(t).origin;
|
|
2669
|
+
window.addEventListener("message", function t(n) {
|
|
2670
|
+
n.origin === r && i && n.data.opened && (i.postMessage(e, r), window.removeEventListener("message", t));
|
|
2671
|
+
});
|
|
2672
|
+
let i = window.open(t, n);
|
|
2673
|
+
}
|
|
2674
|
+
async function cn(e, t, n) {
|
|
2675
|
+
let r = new URL(t), i = !!window.CompressionStream;
|
|
2676
|
+
r.hash = await rn.toBase64(JSON.stringify(e), { gzip: i }), i && r.searchParams.set("gzip", "1"), window.open(r.toString(), n);
|
|
2677
|
+
}
|
|
2678
|
+
async function ln(e) {
|
|
2679
|
+
let t = "viewer-" + on(e), n = an() + "/viewer/";
|
|
2680
|
+
await cn({ lhr: e }, n, t);
|
|
2681
|
+
}
|
|
2682
|
+
async function un(e) {
|
|
2683
|
+
let t = "viewer-" + on(e), n = an() + "/viewer/";
|
|
2684
|
+
sn({ lhr: e }, n, t);
|
|
2685
|
+
}
|
|
2686
|
+
function dn(e) {
|
|
2687
|
+
if (!e.audits["script-treemap-data"].details) throw Error("no script treemap data found");
|
|
2688
|
+
cn({ lhr: {
|
|
2689
|
+
mainDocumentUrl: e.mainDocumentUrl,
|
|
2690
|
+
finalUrl: e.finalUrl,
|
|
2691
|
+
finalDisplayedUrl: e.finalDisplayedUrl,
|
|
2692
|
+
audits: { "script-treemap-data": e.audits["script-treemap-data"] },
|
|
2693
|
+
configSettings: { locale: e.configSettings.locale }
|
|
2694
|
+
} }, an() + "/treemap/", "treemap-" + on(e));
|
|
2695
|
+
}
|
|
2696
|
+
var fn = class {
|
|
2697
|
+
constructor(e) {
|
|
2698
|
+
this._dom = e, this._toggleEl, this._menuEl, this.onDocumentKeyDown = this.onDocumentKeyDown.bind(this), this.onToggleClick = this.onToggleClick.bind(this), this.onToggleKeydown = this.onToggleKeydown.bind(this), this.onMenuFocusOut = this.onMenuFocusOut.bind(this), this.onMenuKeydown = this.onMenuKeydown.bind(this), this._getNextMenuItem = this._getNextMenuItem.bind(this), this._getNextSelectableNode = this._getNextSelectableNode.bind(this), this._getPreviousMenuItem = this._getPreviousMenuItem.bind(this);
|
|
2699
|
+
}
|
|
2700
|
+
setup(e) {
|
|
2701
|
+
this._toggleEl = this._dom.find(".lh-topbar button.lh-tools__button", this._dom.rootEl), this._toggleEl.addEventListener("click", this.onToggleClick), this._toggleEl.addEventListener("keydown", this.onToggleKeydown), this._menuEl = this._dom.find(".lh-topbar div.lh-tools__dropdown", this._dom.rootEl), this._menuEl.addEventListener("keydown", this.onMenuKeydown), this._menuEl.addEventListener("click", e);
|
|
2702
|
+
}
|
|
2703
|
+
close() {
|
|
2704
|
+
this._toggleEl.classList.remove("lh-active"), this._toggleEl.setAttribute("aria-expanded", "false"), this._menuEl.contains(this._dom.document().activeElement) && this._toggleEl.focus(), this._menuEl.removeEventListener("focusout", this.onMenuFocusOut), this._dom.document().removeEventListener("keydown", this.onDocumentKeyDown);
|
|
2705
|
+
}
|
|
2706
|
+
open(e) {
|
|
2707
|
+
this._toggleEl.classList.contains("lh-active") ? e.focus() : this._menuEl.addEventListener("transitionend", () => {
|
|
2708
|
+
e.focus();
|
|
2709
|
+
}, { once: !0 }), this._toggleEl.classList.add("lh-active"), this._toggleEl.setAttribute("aria-expanded", "true"), this._menuEl.addEventListener("focusout", this.onMenuFocusOut), this._dom.document().addEventListener("keydown", this.onDocumentKeyDown);
|
|
2710
|
+
}
|
|
2711
|
+
onToggleClick(e) {
|
|
2712
|
+
e.preventDefault(), e.stopImmediatePropagation(), this._toggleEl.classList.contains("lh-active") ? this.close() : this.open(this._getNextMenuItem());
|
|
2713
|
+
}
|
|
2714
|
+
onToggleKeydown(e) {
|
|
2715
|
+
switch (e.code) {
|
|
2716
|
+
case "ArrowUp":
|
|
2717
|
+
e.preventDefault(), this.open(this._getPreviousMenuItem());
|
|
2718
|
+
break;
|
|
2719
|
+
case "ArrowDown":
|
|
2720
|
+
case "Enter":
|
|
2721
|
+
case " ":
|
|
2722
|
+
e.preventDefault(), this.open(this._getNextMenuItem());
|
|
2723
|
+
break;
|
|
2724
|
+
default:
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
onMenuKeydown(e) {
|
|
2728
|
+
let t = e.target;
|
|
2729
|
+
switch (e.code) {
|
|
2730
|
+
case "ArrowUp":
|
|
2731
|
+
e.preventDefault(), this._getPreviousMenuItem(t).focus();
|
|
2732
|
+
break;
|
|
2733
|
+
case "ArrowDown":
|
|
2734
|
+
e.preventDefault(), this._getNextMenuItem(t).focus();
|
|
2735
|
+
break;
|
|
2736
|
+
case "Home":
|
|
2737
|
+
e.preventDefault(), this._getNextMenuItem().focus();
|
|
2738
|
+
break;
|
|
2739
|
+
case "End":
|
|
2740
|
+
e.preventDefault(), this._getPreviousMenuItem().focus();
|
|
2741
|
+
break;
|
|
2742
|
+
default:
|
|
2743
|
+
}
|
|
2744
|
+
}
|
|
2745
|
+
onDocumentKeyDown(e) {
|
|
2746
|
+
e.keyCode === 27 && this.close();
|
|
2747
|
+
}
|
|
2748
|
+
onMenuFocusOut(e) {
|
|
2749
|
+
let t = e.relatedTarget;
|
|
2750
|
+
this._menuEl.contains(t) || this.close();
|
|
2751
|
+
}
|
|
2752
|
+
_getNextSelectableNode(e, t) {
|
|
2753
|
+
let n = e.filter((e) => e instanceof HTMLElement).filter((e) => !(e.hasAttribute("disabled") || window.getComputedStyle(e).display === "none")), r = t ? n.indexOf(t) + 1 : 0;
|
|
2754
|
+
return r >= n.length && (r = 0), n[r];
|
|
2755
|
+
}
|
|
2756
|
+
_getNextMenuItem(e) {
|
|
2757
|
+
let t = Array.from(this._menuEl.childNodes);
|
|
2758
|
+
return this._getNextSelectableNode(t, e);
|
|
2759
|
+
}
|
|
2760
|
+
_getPreviousMenuItem(e) {
|
|
2761
|
+
let t = Array.from(this._menuEl.childNodes).reverse();
|
|
2762
|
+
return this._getNextSelectableNode(t, e);
|
|
2763
|
+
}
|
|
2764
|
+
}, pn = class {
|
|
2765
|
+
constructor(e, t) {
|
|
2766
|
+
this.lhr, this._reportUIFeatures = e, this._dom = t, this._dropDownMenu = new fn(this._dom), this._copyAttempt = !1, this.topbarEl, this.categoriesEl, this.stickyHeaderEl, this.highlightEl, this.onDropDownMenuClick = this.onDropDownMenuClick.bind(this), this.onKeyUp = this.onKeyUp.bind(this), this.onCopy = this.onCopy.bind(this), this.collapseAllDetails = this.collapseAllDetails.bind(this);
|
|
2767
|
+
}
|
|
2768
|
+
enable(e) {
|
|
2769
|
+
this.lhr = e, this._dom.rootEl.addEventListener("keyup", this.onKeyUp), this._dom.document().addEventListener("copy", this.onCopy), this._dropDownMenu.setup(this.onDropDownMenuClick), this._setUpCollapseDetailsAfterPrinting(), this._dom.find(".lh-topbar__logo", this._dom.rootEl).addEventListener("click", () => Qt(this._dom)), this._setupStickyHeader();
|
|
2770
|
+
}
|
|
2771
|
+
onDropDownMenuClick(e) {
|
|
2772
|
+
e.preventDefault();
|
|
2773
|
+
let t = e.target;
|
|
2774
|
+
if (!(!t || !t.hasAttribute("data-action"))) {
|
|
2775
|
+
switch (t.getAttribute("data-action")) {
|
|
2776
|
+
case "copy":
|
|
2777
|
+
this.onCopyButtonClick();
|
|
2778
|
+
break;
|
|
2779
|
+
case "print-summary":
|
|
2780
|
+
this.collapseAllDetails(), this._print();
|
|
2781
|
+
break;
|
|
2782
|
+
case "print-expanded":
|
|
2783
|
+
this.expandAllDetails(), this._print();
|
|
2784
|
+
break;
|
|
2785
|
+
case "save-json": {
|
|
2786
|
+
let e = JSON.stringify(this.lhr, null, 2);
|
|
2787
|
+
this._reportUIFeatures._saveFile(new Blob([e], { type: "application/json" }));
|
|
2788
|
+
break;
|
|
2789
|
+
}
|
|
2790
|
+
case "save-html": {
|
|
2791
|
+
let e = this._reportUIFeatures.getReportHtml();
|
|
2792
|
+
try {
|
|
2793
|
+
this._reportUIFeatures._saveFile(new Blob([e], { type: "text/html" }));
|
|
2794
|
+
} catch (e) {
|
|
2795
|
+
this._dom.fireEventOn("lh-log", this._dom.document(), {
|
|
2796
|
+
cmd: "error",
|
|
2797
|
+
msg: "Could not export as HTML. " + e.message
|
|
2798
|
+
});
|
|
2799
|
+
}
|
|
2800
|
+
break;
|
|
2801
|
+
}
|
|
2802
|
+
case "open-viewer":
|
|
2803
|
+
this._dom.isDevTools() ? ln(this.lhr) : un(this.lhr);
|
|
2804
|
+
break;
|
|
2805
|
+
case "save-gist":
|
|
2806
|
+
this._reportUIFeatures.saveAsGist();
|
|
2807
|
+
break;
|
|
2808
|
+
case "toggle-dark":
|
|
2809
|
+
Qt(this._dom);
|
|
2810
|
+
break;
|
|
2811
|
+
case "view-unthrottled-trace": this._reportUIFeatures._opts.onViewTrace?.();
|
|
2812
|
+
}
|
|
2813
|
+
this._dropDownMenu.close();
|
|
2814
|
+
}
|
|
2815
|
+
}
|
|
2816
|
+
onCopy(e) {
|
|
2817
|
+
this._copyAttempt && e.clipboardData && (e.preventDefault(), e.clipboardData.setData("text/plain", JSON.stringify(this.lhr, null, 2)), this._dom.fireEventOn("lh-log", this._dom.document(), {
|
|
2818
|
+
cmd: "log",
|
|
2819
|
+
msg: "Report JSON copied to clipboard"
|
|
2820
|
+
})), this._copyAttempt = !1;
|
|
2821
|
+
}
|
|
2822
|
+
onCopyButtonClick() {
|
|
2823
|
+
this._dom.fireEventOn("lh-analytics", this._dom.document(), { name: "copy" });
|
|
2824
|
+
try {
|
|
2825
|
+
this._dom.document().queryCommandSupported("copy") && (this._copyAttempt = !0, this._dom.document().execCommand("copy") || (this._copyAttempt = !1, this._dom.fireEventOn("lh-log", this._dom.document(), {
|
|
2826
|
+
cmd: "warn",
|
|
2827
|
+
msg: "Your browser does not support copy to clipboard."
|
|
2828
|
+
})));
|
|
2829
|
+
} catch (e) {
|
|
2830
|
+
this._copyAttempt = !1, this._dom.fireEventOn("lh-log", this._dom.document(), {
|
|
2831
|
+
cmd: "log",
|
|
2832
|
+
msg: e.message
|
|
2833
|
+
});
|
|
2834
|
+
}
|
|
2835
|
+
}
|
|
2836
|
+
onKeyUp(e) {
|
|
2837
|
+
(e.ctrlKey || e.metaKey) && e.keyCode === 80 && this._dropDownMenu.close();
|
|
2838
|
+
}
|
|
2839
|
+
expandAllDetails() {
|
|
2840
|
+
this._dom.findAll(".lh-categories details", this._dom.rootEl).map((e) => e.open = !0);
|
|
2841
|
+
}
|
|
2842
|
+
collapseAllDetails() {
|
|
2843
|
+
this._dom.findAll(".lh-categories details", this._dom.rootEl).map((e) => e.open = !1);
|
|
2844
|
+
}
|
|
2845
|
+
_print() {
|
|
2846
|
+
this._reportUIFeatures._opts.onPrintOverride ? this._reportUIFeatures._opts.onPrintOverride(this._dom.rootEl) : self.print();
|
|
2847
|
+
}
|
|
2848
|
+
resetUIState() {
|
|
2849
|
+
this._dropDownMenu.close();
|
|
2850
|
+
}
|
|
2851
|
+
_getScrollParent(e) {
|
|
2852
|
+
let { overflowY: t } = window.getComputedStyle(e);
|
|
2853
|
+
return t !== "visible" && t !== "hidden" ? e : e.parentElement ? this._getScrollParent(e.parentElement) : document;
|
|
2854
|
+
}
|
|
2855
|
+
_setUpCollapseDetailsAfterPrinting() {
|
|
2856
|
+
"onbeforeprint" in self ? self.addEventListener("afterprint", this.collapseAllDetails) : self.matchMedia("print").addListener((e) => {
|
|
2857
|
+
e.matches ? this.expandAllDetails() : this.collapseAllDetails();
|
|
2858
|
+
});
|
|
2859
|
+
}
|
|
2860
|
+
_setupStickyHeader() {
|
|
2861
|
+
this.topbarEl = this._dom.find("div.lh-topbar", this._dom.rootEl), this.categoriesEl = this._dom.find("div.lh-categories", this._dom.rootEl), requestAnimationFrame(() => requestAnimationFrame(() => {
|
|
2862
|
+
try {
|
|
2863
|
+
this.stickyHeaderEl = this._dom.find("div.lh-sticky-header", this._dom.rootEl);
|
|
2864
|
+
} catch {
|
|
2865
|
+
return;
|
|
2866
|
+
}
|
|
2867
|
+
this.highlightEl = this._dom.createChildOf(this.stickyHeaderEl, "div", "lh-highlighter");
|
|
2868
|
+
let e = this._getScrollParent(this._dom.find(".lh-container", this._dom.rootEl));
|
|
2869
|
+
e.addEventListener("scroll", () => this._updateStickyHeader());
|
|
2870
|
+
let t = e instanceof window.Document ? document.documentElement : e;
|
|
2871
|
+
new window.ResizeObserver(() => this._updateStickyHeader()).observe(t);
|
|
2872
|
+
}));
|
|
2873
|
+
}
|
|
2874
|
+
_updateStickyHeader() {
|
|
2875
|
+
if (!this.stickyHeaderEl) return;
|
|
2876
|
+
let e = this.topbarEl.getBoundingClientRect().bottom >= this.categoriesEl.getBoundingClientRect().top, t = Array.from(this._dom.rootEl.querySelectorAll(".lh-category")).filter((e) => e.getBoundingClientRect().top - window.innerHeight / 2 < 0), n = t.length > 0 ? t.length - 1 : 0, r = this.stickyHeaderEl.querySelectorAll(".lh-gauge__wrapper, .lh-fraction__wrapper"), i = r[n], a = r[0].getBoundingClientRect().left, o = i.getBoundingClientRect().left - a;
|
|
2877
|
+
this.highlightEl.style.transform = `translate(${o}px)`, this.stickyHeaderEl.classList.toggle("lh-sticky-header--visible", e);
|
|
2878
|
+
}
|
|
2879
|
+
};
|
|
2880
|
+
function mn(e, t) {
|
|
2881
|
+
let n = t ? new Date(t) : /* @__PURE__ */ new Date(), r = n.toLocaleTimeString("en-US", { hour12: !1 }), i = n.toLocaleDateString("en-US", {
|
|
2882
|
+
year: "numeric",
|
|
2883
|
+
month: "2-digit",
|
|
2884
|
+
day: "2-digit"
|
|
2885
|
+
}).split("/");
|
|
2886
|
+
return i.unshift(i.pop()), `${e}_${i.join("-")}_${r}`.replace(/[/?<>\\:*|"]/g, "-");
|
|
2887
|
+
}
|
|
2888
|
+
function hn(e) {
|
|
2889
|
+
let t = new URL(e.finalDisplayedUrl).hostname;
|
|
2890
|
+
return mn(t, e.fetchTime);
|
|
2891
|
+
}
|
|
2892
|
+
function gn(e) {
|
|
2893
|
+
return Array.from(e.tBodies[0].rows);
|
|
2894
|
+
}
|
|
2895
|
+
var _n = class {
|
|
2896
|
+
constructor(e, t = {}) {
|
|
2897
|
+
this.json, this._dom = e, this._opts = t, this._topbar = t.omitTopbar ? null : new pn(this, e), this.onMediaQueryChange = this.onMediaQueryChange.bind(this);
|
|
2898
|
+
}
|
|
2899
|
+
initFeatures(e) {
|
|
2900
|
+
this.json = e, this._fullPageScreenshot = B.getFullPageScreenshot(e), this._topbar && (this._topbar.enable(e), this._topbar.resetUIState()), this._setupMediaQueryListeners(), this._setupThirdPartyFilter(), this._setupElementScreenshotOverlay(this._dom.rootEl);
|
|
2901
|
+
let t = this._dom.isDevTools() || this._opts.disableDarkMode || this._opts.disableAutoDarkModeAndFireworks;
|
|
2902
|
+
!t && window.matchMedia("(prefers-color-scheme: dark)").matches && Qt(this._dom, !0);
|
|
2903
|
+
let n = [
|
|
2904
|
+
"performance",
|
|
2905
|
+
"accessibility",
|
|
2906
|
+
"best-practices",
|
|
2907
|
+
"seo"
|
|
2908
|
+
].every((t) => {
|
|
2909
|
+
let n = e.categories[t];
|
|
2910
|
+
return n && n.score === 1;
|
|
2911
|
+
}), r = this._opts.disableFireworks || this._opts.disableAutoDarkModeAndFireworks;
|
|
2912
|
+
if (n && !r && (this._enableFireworks(), t || Qt(this._dom, !0)), e.categories.performance && e.categories.performance.auditRefs.some((t) => !!(t.group === "metrics" && e.audits[t.id].errorMessage))) {
|
|
2913
|
+
let e = this._dom.find("input.lh-metrics-toggle__input", this._dom.rootEl);
|
|
2914
|
+
e.checked = !0;
|
|
2915
|
+
}
|
|
2916
|
+
this.json.audits["script-treemap-data"] && this.json.audits["script-treemap-data"].details && this.addButton({
|
|
2917
|
+
text: V.strings.viewTreemapLabel,
|
|
2918
|
+
icon: "treemap",
|
|
2919
|
+
onClick: () => dn(this.json)
|
|
2920
|
+
}), this._opts.onViewTrace && (e.configSettings.throttlingMethod === "simulate" ? this._dom.find("a[data-action=\"view-unthrottled-trace\"]", this._dom.rootEl).classList.remove("lh-hidden") : this.addButton({
|
|
2921
|
+
text: V.strings.viewTraceLabel,
|
|
2922
|
+
onClick: () => this._opts.onViewTrace?.()
|
|
2923
|
+
})), this._opts.getStandaloneReportHTML && this._dom.find("a[data-action=\"save-html\"]", this._dom.rootEl).classList.remove("lh-hidden");
|
|
2924
|
+
for (let e of this._dom.findAll("[data-i18n]", this._dom.rootEl)) {
|
|
2925
|
+
let t = e.getAttribute("data-i18n");
|
|
2926
|
+
e.textContent = V.strings[t];
|
|
2927
|
+
}
|
|
2928
|
+
}
|
|
2929
|
+
addButton(e) {
|
|
2930
|
+
let t = this._dom.rootEl.querySelector(".lh-audit-group--metrics");
|
|
2931
|
+
if (!t) return;
|
|
2932
|
+
let n = t.querySelector(".lh-buttons");
|
|
2933
|
+
n ||= this._dom.createChildOf(t, "div", "lh-buttons");
|
|
2934
|
+
let r = ["lh-button"];
|
|
2935
|
+
e.icon && (r.push("lh-report-icon"), r.push(`lh-report-icon--${e.icon}`));
|
|
2936
|
+
let i = this._dom.createChildOf(n, "button", r.join(" "));
|
|
2937
|
+
return i.textContent = e.text, i.addEventListener("click", e.onClick), i;
|
|
2938
|
+
}
|
|
2939
|
+
resetUIState() {
|
|
2940
|
+
this._topbar && this._topbar.resetUIState();
|
|
2941
|
+
}
|
|
2942
|
+
getReportHtml() {
|
|
2943
|
+
if (!this._opts.getStandaloneReportHTML) throw Error("`getStandaloneReportHTML` is not set");
|
|
2944
|
+
return this.resetUIState(), this._opts.getStandaloneReportHTML();
|
|
2945
|
+
}
|
|
2946
|
+
saveAsGist() {
|
|
2947
|
+
throw Error("Cannot save as gist from base report");
|
|
2948
|
+
}
|
|
2949
|
+
_enableFireworks() {
|
|
2950
|
+
this._dom.find(".lh-scores-container", this._dom.rootEl).classList.add("lh-score100");
|
|
2951
|
+
}
|
|
2952
|
+
_setupMediaQueryListeners() {
|
|
2953
|
+
let e = self.matchMedia("(max-width: 500px)");
|
|
2954
|
+
e.addListener(this.onMediaQueryChange), this.onMediaQueryChange(e);
|
|
2955
|
+
}
|
|
2956
|
+
_resetUIState() {
|
|
2957
|
+
this._topbar && this._topbar.resetUIState();
|
|
2958
|
+
}
|
|
2959
|
+
onMediaQueryChange(e) {
|
|
2960
|
+
this._dom.rootEl.classList.toggle("lh-narrow", e.matches);
|
|
2961
|
+
}
|
|
2962
|
+
_setupThirdPartyFilter() {
|
|
2963
|
+
let e = [
|
|
2964
|
+
"uses-rel-preconnect",
|
|
2965
|
+
"third-party-facades",
|
|
2966
|
+
"network-dependency-tree-insight"
|
|
2967
|
+
], t = ["legacy-javascript", "legacy-javascript-insight"];
|
|
2968
|
+
Array.from(this._dom.rootEl.querySelectorAll("table.lh-table")).filter((e) => e.querySelector("td.lh-table-column--url, td.lh-table-column--source-location")).filter((t) => {
|
|
2969
|
+
let n = t.closest(".lh-audit");
|
|
2970
|
+
if (!n) throw Error(".lh-table not within audit");
|
|
2971
|
+
return !e.includes(n.id);
|
|
2972
|
+
}).forEach((e) => {
|
|
2973
|
+
let n = gn(e), r = n.filter((e) => !e.classList.contains("lh-sub-item-row")), i = this._getThirdPartyRows(r, B.getFinalDisplayedUrl(this.json)), a = n.some((e) => e.classList.contains("lh-row--even")), o = this._dom.createComponent("3pFilter"), s = this._dom.find("input", o);
|
|
2974
|
+
s.addEventListener("change", (e) => {
|
|
2975
|
+
let t = e.target instanceof HTMLInputElement && !e.target.checked, n = !0, o = r[0];
|
|
2976
|
+
for (; o;) {
|
|
2977
|
+
let e = t && i.includes(o);
|
|
2978
|
+
do
|
|
2979
|
+
o.classList.toggle("lh-row--hidden", e), a && (o.classList.toggle("lh-row--even", !e && n), o.classList.toggle("lh-row--odd", !e && !n)), o = o.nextElementSibling;
|
|
2980
|
+
while (o && o.classList.contains("lh-sub-item-row"));
|
|
2981
|
+
e || (n = !n);
|
|
2982
|
+
}
|
|
2983
|
+
});
|
|
2984
|
+
let c = i.filter((e) => !e.classList.contains("lh-row--group")).length;
|
|
2985
|
+
this._dom.find(".lh-3p-filter-count", o).textContent = `${c}`, this._dom.find(".lh-3p-ui-string", o).textContent = V.strings.thirdPartyResourcesLabel;
|
|
2986
|
+
let l = i.length === r.length, u = !i.length;
|
|
2987
|
+
if ((l || u) && (this._dom.find("div.lh-3p-filter", o).hidden = !0), !e.parentNode) return;
|
|
2988
|
+
e.parentNode.insertBefore(o, e);
|
|
2989
|
+
let d = e.closest(".lh-audit");
|
|
2990
|
+
if (!d) throw Error(".lh-table not within audit");
|
|
2991
|
+
t.includes(d.id) && !l && s.click();
|
|
2992
|
+
});
|
|
2993
|
+
}
|
|
2994
|
+
_setupElementScreenshotOverlay(e) {
|
|
2995
|
+
this._fullPageScreenshot && Vt.installOverlayFeature({
|
|
2996
|
+
dom: this._dom,
|
|
2997
|
+
rootEl: e,
|
|
2998
|
+
overlayContainerEl: e,
|
|
2999
|
+
fullPageScreenshot: this._fullPageScreenshot
|
|
3000
|
+
});
|
|
3001
|
+
}
|
|
3002
|
+
_getThirdPartyRows(e, t) {
|
|
3003
|
+
let n = B.getEntityFromUrl(t, this.json.entities), r = this.json.entities?.find((e) => e.isFirstParty === !0)?.name, i = [];
|
|
3004
|
+
for (let t of e) {
|
|
3005
|
+
if (r) {
|
|
3006
|
+
if (!t.dataset.entity || t.dataset.entity === r) continue;
|
|
3007
|
+
} else {
|
|
3008
|
+
let e = t.querySelector("div.lh-text__url");
|
|
3009
|
+
if (!e) continue;
|
|
3010
|
+
let r = e.dataset.url;
|
|
3011
|
+
if (!r || B.getEntityFromUrl(r, this.json.entities) === n) continue;
|
|
3012
|
+
}
|
|
3013
|
+
i.push(t);
|
|
3014
|
+
}
|
|
3015
|
+
return i;
|
|
3016
|
+
}
|
|
3017
|
+
_saveFile(e) {
|
|
3018
|
+
let t = e.type.match("json") ? ".json" : ".html", n = hn({
|
|
3019
|
+
finalDisplayedUrl: B.getFinalDisplayedUrl(this.json),
|
|
3020
|
+
fetchTime: this.json.fetchTime
|
|
3021
|
+
}) + t;
|
|
3022
|
+
this._opts.onSaveFileOverride ? this._opts.onSaveFileOverride(e, n) : this._dom.saveFile(e, n);
|
|
3023
|
+
}
|
|
3024
|
+
};
|
|
3025
|
+
function vn(e, t = {}) {
|
|
3026
|
+
let n = document.createElement("article");
|
|
3027
|
+
n.classList.add("lh-root", "lh-vars");
|
|
3028
|
+
let r = new jt(n.ownerDocument, n);
|
|
3029
|
+
return new Zt(r).renderReport(e, n, t), new _n(r, t).initFeatures(e), n;
|
|
3030
|
+
}
|
|
3031
|
+
//#endregion
|
|
3032
|
+
//#region node_modules/.pnpm/chrome-devtools-frontend@1.0.1638082/node_modules/chrome-devtools-frontend/front_end/panels/lighthouse/LighthouseReportRenderer.ts
|
|
3033
|
+
var yn = /* @__PURE__ */ e({ LighthouseReportRenderer: () => xn }), bn = 40, xn = class e {
|
|
3034
|
+
static renderLighthouseReport(t, r, a) {
|
|
3035
|
+
let o;
|
|
3036
|
+
r && (o = async () => {
|
|
3037
|
+
j.actionTaken(ve.LighthouseViewTrace), c(new he(r.Trace.traceEvents));
|
|
3038
|
+
});
|
|
3039
|
+
async function l(e) {
|
|
3040
|
+
let r = `${new i(t.finalUrl || t.finalDisplayedUrl).domain().replace(/[^a-z0-9.-]+/gi, "_")}-${n(new Date(t.fetchTime))}${e.type.match("json") ? ".json" : ".html"}`, a = await e.arrayBuffer().then(s);
|
|
3041
|
+
await je.instance().save(r, new Ae(a, !0, e.type), !0), je.instance().close(r);
|
|
3042
|
+
}
|
|
3043
|
+
async function u(t) {
|
|
3044
|
+
let n = t.cloneNode(!0), r = window.open("", "_blank", "channelmode=1,status=1,resizable=1");
|
|
3045
|
+
r && (r.document.body.replaceWith(n), await e.linkifyNodeDetails(n), a?.beforePrint?.(), r.focus(), r.print(), r.close(), a?.afterPrint?.());
|
|
3046
|
+
}
|
|
3047
|
+
function d() {
|
|
3048
|
+
return Lighthouse.ReportGenerator.ReportGenerator.generateReportHtml(t);
|
|
3049
|
+
}
|
|
3050
|
+
let f = vn(t, {
|
|
3051
|
+
disableDarkMode: !0,
|
|
3052
|
+
onViewTrace: o,
|
|
3053
|
+
onSaveFileOverride: l,
|
|
3054
|
+
onPrintOverride: u,
|
|
3055
|
+
getStandaloneReportHTML: d
|
|
3056
|
+
});
|
|
3057
|
+
f.classList.add("lh-devtools");
|
|
3058
|
+
let p = () => {
|
|
3059
|
+
f.classList.toggle("lh-dark", Le.instance().themeName() === "dark");
|
|
3060
|
+
};
|
|
3061
|
+
return Le.instance().addEventListener(Re.eventName, p), p(), f._lighthouseResultForTesting = t, f._lighthouseArtifactsForTesting = r, e.installVisualLogging(f), e.waitForMainTargetLoad().then(() => {
|
|
3062
|
+
e.linkifyNodeDetails(f), e.linkifySourceLocationDetails(f);
|
|
3063
|
+
}), f;
|
|
3064
|
+
}
|
|
3065
|
+
static renderLighthouseScores(t) {
|
|
3066
|
+
let n = e.renderLighthouseReport(t), r = n.querySelector(".lh-container"), i = n.querySelector(".lh-scores-header");
|
|
3067
|
+
return !i || !r ? null : (r.replaceChildren(i), n.querySelector(".lh-topbar")?.remove(), n);
|
|
3068
|
+
}
|
|
3069
|
+
static async waitForMainTargetLoad() {
|
|
3070
|
+
let e = w.instance().primaryPageTarget();
|
|
3071
|
+
if (!e) return;
|
|
3072
|
+
let t = e.model(ie);
|
|
3073
|
+
t && await t.once(re.Load);
|
|
3074
|
+
}
|
|
3075
|
+
static async linkifyNodeDetails(e) {
|
|
3076
|
+
let t = w.instance().primaryPageTarget();
|
|
3077
|
+
if (!t) return;
|
|
3078
|
+
let n = t.model(Ce);
|
|
3079
|
+
if (n) for (let t of e.getElementsByClassName("lh-node")) {
|
|
3080
|
+
let e = t, r = e.dataset;
|
|
3081
|
+
if (!r.path) continue;
|
|
3082
|
+
let i = await n.pushNodeByPathToFrontend(r.path);
|
|
3083
|
+
if (!i) continue;
|
|
3084
|
+
let a = n.nodeForId(i);
|
|
3085
|
+
if (!a) continue;
|
|
3086
|
+
let o = Ne.instance().linkify(a, {
|
|
3087
|
+
tooltip: r.snippet,
|
|
3088
|
+
preventKeyboardFocus: void 0
|
|
3089
|
+
});
|
|
3090
|
+
te.install(e, "");
|
|
3091
|
+
let s = e.querySelector(".lh-element-screenshot");
|
|
3092
|
+
e.textContent = "", y(D`${s ?? se}${o}`, e);
|
|
3093
|
+
}
|
|
3094
|
+
}
|
|
3095
|
+
static async linkifySourceLocationDetails(e) {
|
|
3096
|
+
for (let t of e.getElementsByClassName("lh-source-location")) {
|
|
3097
|
+
let e = t, n = e.dataset;
|
|
3098
|
+
if (!n.sourceUrl || !n.sourceLine || !n.sourceColumn) continue;
|
|
3099
|
+
let r = n.sourceUrl, i = Number(n.sourceLine), a = Number(n.sourceColumn), o = Me.linkifyURL(r, {
|
|
3100
|
+
lineNumber: i,
|
|
3101
|
+
columnNumber: a,
|
|
3102
|
+
showColumnNumber: !1,
|
|
3103
|
+
inlineFrameIndex: 0,
|
|
3104
|
+
maxLength: bn
|
|
3105
|
+
});
|
|
3106
|
+
te.install(e, ""), e.textContent = "", e.appendChild(o);
|
|
3107
|
+
}
|
|
3108
|
+
}
|
|
3109
|
+
static installVisualLogging(e) {
|
|
3110
|
+
for (let t of e.getElementsByClassName("lh-audit")) {
|
|
3111
|
+
let e = t.querySelector("summary");
|
|
3112
|
+
if (!e) continue;
|
|
3113
|
+
let n = t.id;
|
|
3114
|
+
if (!n) continue;
|
|
3115
|
+
t.setAttribute("jslog", `${C(`lighthouse.audit.${n}`).track({ resize: !0 })}`);
|
|
3116
|
+
let r;
|
|
3117
|
+
for (let e of t.classList) switch (e) {
|
|
3118
|
+
case "lh-audit--pass":
|
|
3119
|
+
r = "pass";
|
|
3120
|
+
break;
|
|
3121
|
+
case "lh-audit--average":
|
|
3122
|
+
r = "average";
|
|
3123
|
+
break;
|
|
3124
|
+
case "lh-audit--fail":
|
|
3125
|
+
r = "fail";
|
|
3126
|
+
break;
|
|
3127
|
+
case "lh-audit--informative":
|
|
3128
|
+
r = "informative";
|
|
3129
|
+
break;
|
|
3130
|
+
}
|
|
3131
|
+
r && e.setAttribute("jslog", `${T(`lighthouse.audit-summary.${r}`).track({ click: !0 })}`);
|
|
3132
|
+
}
|
|
3133
|
+
}
|
|
3134
|
+
}, Sn = /* @__PURE__ */ e({
|
|
3135
|
+
Item: () => Dn,
|
|
3136
|
+
ReportSelector: () => En
|
|
3137
|
+
}), Cn = {
|
|
3138
|
+
reports: "Reports",
|
|
3139
|
+
newReport: "(new report)"
|
|
3140
|
+
}, wn = p("panels/lighthouse/LighthouseReportSelector.ts", Cn), Tn = l.bind(void 0, wn), En = class {
|
|
3141
|
+
renderNewLighthouseView;
|
|
3142
|
+
newLighthouseItem;
|
|
3143
|
+
#e;
|
|
3144
|
+
itemByOptionElement;
|
|
3145
|
+
constructor(e) {
|
|
3146
|
+
this.renderNewLighthouseView = e, this.newLighthouseItem = document.createElement("option"), this.#e = new O(this.handleChange.bind(this), Tn(Cn.reports), "lighthouse-report"), this.itemByOptionElement = /* @__PURE__ */ new Map(), this.setEmptyState();
|
|
3147
|
+
}
|
|
3148
|
+
setEmptyState() {
|
|
3149
|
+
this.#e.removeOptions(), this.#e.setEnabled(!1), this.newLighthouseItem = document.createElement("option"), this.newLighthouseItem.label = Tn(Cn.newReport), this.#e.addOption(this.newLighthouseItem), this.#e.select(this.newLighthouseItem);
|
|
3150
|
+
}
|
|
3151
|
+
handleChange(e) {
|
|
3152
|
+
let t = this.selectedItem();
|
|
3153
|
+
t ? t.select() : this.renderNewLighthouseView();
|
|
3154
|
+
}
|
|
3155
|
+
selectedItem() {
|
|
3156
|
+
let e = this.#e.selectedOption();
|
|
3157
|
+
return this.itemByOptionElement.get(e);
|
|
3158
|
+
}
|
|
3159
|
+
hasItems() {
|
|
3160
|
+
return this.itemByOptionElement.size > 0;
|
|
3161
|
+
}
|
|
3162
|
+
comboBox() {
|
|
3163
|
+
return this.#e;
|
|
3164
|
+
}
|
|
3165
|
+
prepend(e) {
|
|
3166
|
+
let t = e.optionElement(), n = this.#e.element;
|
|
3167
|
+
this.itemByOptionElement.set(t, e), n.insertBefore(t, n.firstElementChild), this.#e.setEnabled(!0), this.#e.select(t), e.select();
|
|
3168
|
+
}
|
|
3169
|
+
clearAll() {
|
|
3170
|
+
for (let e of this.#e.options()) e !== this.newLighthouseItem && (this.itemByOptionElement.get(e)?.delete(), this.itemByOptionElement.delete(e));
|
|
3171
|
+
this.setEmptyState();
|
|
3172
|
+
}
|
|
3173
|
+
selectNewReport() {
|
|
3174
|
+
this.#e.select(this.newLighthouseItem);
|
|
3175
|
+
}
|
|
3176
|
+
selectReport(e) {
|
|
3177
|
+
for (let [t, n] of this.itemByOptionElement) if (n.report === e) {
|
|
3178
|
+
this.#e.select(t), n.select();
|
|
3179
|
+
return;
|
|
3180
|
+
}
|
|
3181
|
+
}
|
|
3182
|
+
}, Dn = class {
|
|
3183
|
+
renderReport;
|
|
3184
|
+
showLandingCallback;
|
|
3185
|
+
element;
|
|
3186
|
+
report;
|
|
3187
|
+
constructor(e, t, n) {
|
|
3188
|
+
this.report = e, this.renderReport = t, this.showLandingCallback = n;
|
|
3189
|
+
let r = new i(e.finalDisplayedUrl || e.finalUrl || ""), a = e.fetchTime;
|
|
3190
|
+
this.element = document.createElement("option"), this.element.label = `${new Date(a).toLocaleTimeString()} - ${r.domain()}`;
|
|
3191
|
+
}
|
|
3192
|
+
select() {
|
|
3193
|
+
this.renderReport();
|
|
3194
|
+
}
|
|
3195
|
+
optionElement() {
|
|
3196
|
+
return this.element;
|
|
3197
|
+
}
|
|
3198
|
+
delete() {
|
|
3199
|
+
this.element && this.element.remove(), this.showLandingCallback();
|
|
3200
|
+
}
|
|
3201
|
+
}, On = "/*\n * Copyright 2018 The Chromium Authors\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n/* <3 */\n\n.lighthouse-start-view {\n line-height: 18px;\n padding: 24px;\n overflow: auto;\n height: 100%;\n /* for buttons */\n --legacy-accent-color: #0535c1;\n --legacy-accent-color-hover: #17b;\n --font-size: 14px;\n --report-font-family: roboto, helvetica, arial, sans-serif;\n}\n\n.lighthouse-start-view header {\n display: flex;\n font-size: 18px;\n flex-direction: row;\n align-items: center;\n column-gap: 16px;\n margin-bottom: 16px;\n}\n\n.lighthouse-start-view .lighthouse-title {\n margin: 0;\n font-size: inherit;\n font-weight: normal;\n}\n\n.lighthouse-logo {\n width: 75px;\n height: 75px;\n flex-shrink: 0;\n background-repeat: no-repeat;\n background-size: contain;\n /* stylelint-disable-next-line custom-property-pattern */\n background-image: var(--image-file-lighthouse_logo);\n}\n\n.lighthouse-start-view .lighthouse-logo {\n width: 45px;\n height: 45px;\n}\n\n.lighthouse-form-section {\n padding: 8px;\n flex: 1 1;\n}\n\n.lighthouse-form-categories-fieldset {\n border: none;\n margin: 0;\n padding: 8px;\n}\n\n.lighthouse-form-section-label {\n margin: 7px 0;\n font-weight: 500;\n}\n\n.lighthouse-form-section-label i span {\n position: relative;\n top: -2px;\n}\n\n.lighthouse-form-section-label span.largeicon-checkmark {\n top: -4px;\n}\n\n.lighthouse-form-section-label .lighthouse-learn-more {\n margin: 20px;\n}\n\n.lighthouse-radio {\n display: flex;\n align-items: center;\n}\n\n.lighthouse-radio-text {\n margin-left: 3px;\n}\n\n.lighthouse-start-button-container {\n align-items: center;\n}\n\n.lighthouse-start-view header.hbox .lighthouse-start-button-container {\n margin-left: auto;\n}\n\n.lighthouse-start-view header.vbox .lighthouse-title {\n text-align: center;\n}\n\n.lighthouse-start-button-container button {\n margin: 16px auto;\n font-family: var(--report-font-family);\n font-weight: 500;\n font-size: var(--font-size);\n}\n\n.lighthouse-start-button-container button:disabled {\n cursor: not-allowed;\n}\n\n.lighthouse-launcher-row,\n.lighthouse-radio {\n &:last-of-type {\n margin-bottom: 0;\n }\n\n &:not(:has(devtools-checkbox)) {\n margin-bottom: 6px;\n }\n}\n\n.lighthouse-launcher-row .dimmed {\n padding-left: 22px;\n}\n\n.lighthouse-help-text {\n text-align: center;\n color: #f00; /* stylelint-disable-line plugin/use_theme_colors */\n /* See: crbug.com/1152736 for color variable migration. */\n font-weight: bold;\n padding-left: 10px;\n}\n\n.lighthouse-warning-text {\n text-align: left;\n color: #ff8c00; /* stylelint-disable-line plugin/use_theme_colors */\n /* See: crbug.com/1152736 for color variable migration. */\n font-weight: bold;\n padding-left: 10px;\n padding-top: 10px;\n}\n\n.lighthouse-warning-text::before {\n content: \"⚠\";\n margin-right: 10px;\n}\n\n.lighthouse-options {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: auto auto;\n}\n\n.lighthouse-options.narrow {\n grid-template-columns: 1fr;\n grid-template-rows: auto auto auto;\n}\n\n.lighthouse-options.wide {\n grid-template-columns: 1fr 1fr 1fr;\n grid-template-rows: auto;\n}\n", kn = /* @__PURE__ */ e({ RadioSetting: () => jn }), { ifDefined: An } = ae, jn = class {
|
|
3202
|
+
setting;
|
|
3203
|
+
options;
|
|
3204
|
+
element;
|
|
3205
|
+
radioElements;
|
|
3206
|
+
ignoreChangeEvents;
|
|
3207
|
+
selectedIndex;
|
|
3208
|
+
constructor(e, t, n) {
|
|
3209
|
+
this.setting = t, this.options = e, this.element = document.createElement("div"), ee(this.element, n), Ee(this.element), this.radioElements = [], y(D`
|
|
3210
|
+
${this.options.map((e) => {
|
|
3211
|
+
let r = e.tooltip?.() || n;
|
|
3212
|
+
return D`
|
|
3213
|
+
<label class="lighthouse-radio">
|
|
3214
|
+
<input
|
|
3215
|
+
type="radio"
|
|
3216
|
+
value=${e.value}
|
|
3217
|
+
name=${t.name}
|
|
3218
|
+
@change=${this.valueChanged.bind(this)}
|
|
3219
|
+
title=${An(n ? r : void 0)}
|
|
3220
|
+
${A((e) => {
|
|
3221
|
+
this.radioElements.push(e);
|
|
3222
|
+
})}
|
|
3223
|
+
/>
|
|
3224
|
+
<span
|
|
3225
|
+
class="lighthouse-radio-text"
|
|
3226
|
+
title=${An(n ? r : void 0)}
|
|
3227
|
+
>${e.label()}</span
|
|
3228
|
+
>
|
|
3229
|
+
</label>
|
|
3230
|
+
`;
|
|
3231
|
+
})}
|
|
3232
|
+
`, this.element), this.ignoreChangeEvents = !1, this.selectedIndex = -1, t.addChangeListener(this.settingChanged, this), this.settingChanged();
|
|
3233
|
+
}
|
|
3234
|
+
updateUI() {
|
|
3235
|
+
this.ignoreChangeEvents = !0, this.radioElements[this.selectedIndex] && (this.radioElements[this.selectedIndex].checked = !0), this.ignoreChangeEvents = !1;
|
|
3236
|
+
}
|
|
3237
|
+
settingChanged() {
|
|
3238
|
+
let e = this.setting.get();
|
|
3239
|
+
this.selectedIndex = this.options.findIndex((t) => t.value === e), this.updateUI();
|
|
3240
|
+
}
|
|
3241
|
+
valueChanged(e) {
|
|
3242
|
+
if (this.ignoreChangeEvents) return;
|
|
3243
|
+
let t = this.radioElements.find((e) => e.checked);
|
|
3244
|
+
t && this.setting.set(t.value);
|
|
3245
|
+
}
|
|
3246
|
+
}, Mn = /* @__PURE__ */ e({ StartView: () => Fn }), G = {
|
|
3247
|
+
generateLighthouseReport: "Generate a Lighthouse report",
|
|
3248
|
+
mode: "Mode",
|
|
3249
|
+
categories: "Categories",
|
|
3250
|
+
analyzeNavigation: "Analyze page load",
|
|
3251
|
+
analyzeSnapshot: "Analyze page state",
|
|
3252
|
+
startTimespan: "Start timespan",
|
|
3253
|
+
learnMore: "Learn more",
|
|
3254
|
+
device: "Device"
|
|
3255
|
+
}, Nn = p("panels/lighthouse/LighthouseStartView.ts", G), K = l.bind(void 0, Nn), Pn = (e, t, n) => {
|
|
3256
|
+
y(D`
|
|
3257
|
+
<form class="lighthouse-start-view">
|
|
3258
|
+
<header class="hbox">
|
|
3259
|
+
<div class="lighthouse-logo"></div>
|
|
3260
|
+
<h1 class="lighthouse-title">
|
|
3261
|
+
${K(G.generateLighthouseReport)}
|
|
3262
|
+
</h1>
|
|
3263
|
+
<div class="lighthouse-start-button-container"></div>
|
|
3264
|
+
</header>
|
|
3265
|
+
<div
|
|
3266
|
+
${A((e) => {
|
|
3267
|
+
t.helpText = e;
|
|
3268
|
+
})}
|
|
3269
|
+
class="lighthouse-help-text hidden"
|
|
3270
|
+
></div>
|
|
3271
|
+
<div class="lighthouse-options hbox">
|
|
3272
|
+
<div class="lighthouse-form-section">
|
|
3273
|
+
<div
|
|
3274
|
+
class="lighthouse-form-elements"
|
|
3275
|
+
${A((e) => {
|
|
3276
|
+
t.modeFormElements = e;
|
|
3277
|
+
})}
|
|
3278
|
+
></div>
|
|
3279
|
+
</div>
|
|
3280
|
+
<div class="lighthouse-form-section">
|
|
3281
|
+
<div
|
|
3282
|
+
class="lighthouse-form-elements"
|
|
3283
|
+
${A((e) => {
|
|
3284
|
+
t.deviceTypeFormElements = e;
|
|
3285
|
+
})}
|
|
3286
|
+
></div>
|
|
3287
|
+
</div>
|
|
3288
|
+
<div class="lighthouse-form-categories">
|
|
3289
|
+
<fieldset class="lighthouse-form-section lighthouse-form-categories-fieldset">
|
|
3290
|
+
<legend class="lighthouse-form-section-label">
|
|
3291
|
+
${K(G.categories)}
|
|
3292
|
+
</legend>
|
|
3293
|
+
<div
|
|
3294
|
+
class="lighthouse-form-elements"
|
|
3295
|
+
${A((e) => {
|
|
3296
|
+
t.categoriesFormElements = e;
|
|
3297
|
+
})}
|
|
3298
|
+
></div>
|
|
3299
|
+
</fieldset>
|
|
3300
|
+
</div>
|
|
3301
|
+
</div>
|
|
3302
|
+
<div
|
|
3303
|
+
${A((e) => {
|
|
3304
|
+
t.warningText = e;
|
|
3305
|
+
})}
|
|
3306
|
+
class="lighthouse-warning-text hidden"
|
|
3307
|
+
></div>
|
|
3308
|
+
</form>
|
|
3309
|
+
`, n);
|
|
3310
|
+
}, Fn = class extends be {
|
|
3311
|
+
controller;
|
|
3312
|
+
panel;
|
|
3313
|
+
#e;
|
|
3314
|
+
startButton;
|
|
3315
|
+
helpText;
|
|
3316
|
+
warningText;
|
|
3317
|
+
checkboxes = [];
|
|
3318
|
+
changeFormMode;
|
|
3319
|
+
constructor(e, t) {
|
|
3320
|
+
super({ useShadowDom: !0 }), this.registerRequiredCSS(On), this.controller = e, this.panel = t, this.#e = document.createElement("devtools-toolbar"), this.#e.classList.add("lighthouse-settings-toolbar"), this.render();
|
|
3321
|
+
}
|
|
3322
|
+
populateRuntimeSettingAsRadio(e, t, n) {
|
|
3323
|
+
let r = L().find((t) => t.setting.name === e);
|
|
3324
|
+
if (!r?.options) throw Error(`${e} is not a setting with options`);
|
|
3325
|
+
let i = document.createElement("div");
|
|
3326
|
+
if (i.classList.add("lighthouse-form-section-label"), i.textContent = t, r.learnMore) {
|
|
3327
|
+
let e = _e.create(r.learnMore, K(G.learnMore), "lighthouse-learn-more", "learn-more");
|
|
3328
|
+
i.append(e);
|
|
3329
|
+
}
|
|
3330
|
+
n.appendChild(i);
|
|
3331
|
+
let a = new jn(r.options, r.setting, r.description());
|
|
3332
|
+
n.appendChild(a.element), v(a.element, t);
|
|
3333
|
+
}
|
|
3334
|
+
populateRuntimeSettingAsToolbarCheckbox(e, t) {
|
|
3335
|
+
let n = L().find((t) => t.setting.name === e);
|
|
3336
|
+
if (!n?.title) throw Error(`${e} is not a setting with a title`);
|
|
3337
|
+
n.setting.setTitle(n.title());
|
|
3338
|
+
let r = new Se(n.setting, n.description());
|
|
3339
|
+
if (t.appendToolbarItem(r), n.learnMore) {
|
|
3340
|
+
let e = _e.create(n.learnMore, K(G.learnMore), "lighthouse-learn-more", "learn-more");
|
|
3341
|
+
e.style.margin = "5px", r.element.appendChild(e);
|
|
3342
|
+
}
|
|
3343
|
+
}
|
|
3344
|
+
populateRuntimeSettingAsToolbarDropdown(e, t) {
|
|
3345
|
+
let n = L().find((t) => t.setting.name === e);
|
|
3346
|
+
if (!n?.title) throw Error(`${e} is not a setting with a title`);
|
|
3347
|
+
let r = n.options?.map((e) => ({
|
|
3348
|
+
label: e.label(),
|
|
3349
|
+
value: e.value
|
|
3350
|
+
})) || [];
|
|
3351
|
+
n.setting.setTitle(n.title());
|
|
3352
|
+
let i = new ue(r, n.setting, n.title());
|
|
3353
|
+
if (i.setTitle(n.description()), t.appendToolbarItem(i), n.learnMore) {
|
|
3354
|
+
let e = _e.create(n.learnMore, K(G.learnMore), "lighthouse-learn-more", "learn-more");
|
|
3355
|
+
e.style.marginLeft = "5px", e.style.display = "inline-flex", e.style.height = "revert", t.appendToolbarItem(new we(e));
|
|
3356
|
+
}
|
|
3357
|
+
}
|
|
3358
|
+
populateFormControls(e, t, n) {
|
|
3359
|
+
this.populateRuntimeSettingAsRadio("lighthouse.device-type", K(G.device), e), this.checkboxes = [];
|
|
3360
|
+
for (let e of I()) {
|
|
3361
|
+
e.setting.setTitle(e.title());
|
|
3362
|
+
let r = new Se(e.setting, e.description());
|
|
3363
|
+
t.createChild("div", "vbox lighthouse-launcher-row").appendChild(r.element), r.element.setAttribute("data-lh-category", e.configID), this.checkboxes.push({
|
|
3364
|
+
preset: e,
|
|
3365
|
+
checkbox: r
|
|
3366
|
+
}), n && !e.supportedModes.includes(n) && (r.setEnabled(!1), r.setIndeterminate(!0));
|
|
3367
|
+
}
|
|
3368
|
+
}
|
|
3369
|
+
render() {
|
|
3370
|
+
this.populateRuntimeSettingAsToolbarCheckbox("lighthouse.clear-storage", this.#e), this.populateRuntimeSettingAsToolbarCheckbox("lighthouse.enable-sampling", this.#e), this.populateRuntimeSettingAsToolbarDropdown("lighthouse.throttling", this.#e);
|
|
3371
|
+
let { mode: e } = this.controller.getFlags(), t = {
|
|
3372
|
+
helpText: void 0,
|
|
3373
|
+
warningText: void 0,
|
|
3374
|
+
modeFormElements: void 0,
|
|
3375
|
+
deviceTypeFormElements: void 0,
|
|
3376
|
+
categoriesFormElements: void 0
|
|
3377
|
+
};
|
|
3378
|
+
Pn({}, t, this.contentElement), this.helpText = t.helpText, this.warningText = t.warningText;
|
|
3379
|
+
let n = t.modeFormElements, r = t.deviceTypeFormElements, i = t.categoriesFormElements;
|
|
3380
|
+
if (!n || !r || !i) throw Error("Required elements not found in template");
|
|
3381
|
+
this.populateRuntimeSettingAsRadio("lighthouse.mode", K(G.mode), n), this.populateFormControls(r, i, e), this.refresh();
|
|
3382
|
+
}
|
|
3383
|
+
populateStartButton(e) {
|
|
3384
|
+
let t, n;
|
|
3385
|
+
e === "timespan" ? (t = K(G.startTimespan), n = () => {
|
|
3386
|
+
this.panel.handleTimespanStart();
|
|
3387
|
+
}) : e === "snapshot" ? (t = K(G.analyzeSnapshot), n = () => {
|
|
3388
|
+
this.panel.handleCompleteRun();
|
|
3389
|
+
}) : (t = K(G.analyzeNavigation), n = () => {
|
|
3390
|
+
this.panel.handleCompleteRun();
|
|
3391
|
+
});
|
|
3392
|
+
let r = this.contentElement.querySelector(".lighthouse-start-button-container");
|
|
3393
|
+
r && (r.textContent = "", this.startButton = ce(t, n, {
|
|
3394
|
+
variant: m.PRIMARY,
|
|
3395
|
+
jslogContext: "lighthouse.start"
|
|
3396
|
+
}), r.append(this.startButton));
|
|
3397
|
+
}
|
|
3398
|
+
refresh() {
|
|
3399
|
+
let { mode: e } = this.controller.getFlags();
|
|
3400
|
+
this.populateStartButton(e);
|
|
3401
|
+
for (let { checkbox: t, preset: n } of this.checkboxes) n.supportedModes.includes(e) ? (t.setEnabled(!0), t.setIndeterminate(!1)) : (t.setEnabled(!1), t.setIndeterminate(!0));
|
|
3402
|
+
this.onResize();
|
|
3403
|
+
}
|
|
3404
|
+
onResize() {
|
|
3405
|
+
let e = this.contentElement.offsetWidth < 500, t = this.contentElement.offsetWidth > 800, n = this.contentElement.querySelector(".lighthouse-start-view header"), r = this.contentElement.querySelector(".lighthouse-options");
|
|
3406
|
+
n && (n.classList.toggle("hbox", !e), n.classList.toggle("vbox", e)), r && (r.classList.toggle("wide", t), r.classList.toggle("narrow", e));
|
|
3407
|
+
}
|
|
3408
|
+
focusStartButton() {
|
|
3409
|
+
this.startButton.focus();
|
|
3410
|
+
}
|
|
3411
|
+
setStartButtonEnabled(e) {
|
|
3412
|
+
this.helpText && this.helpText.classList.toggle("hidden", e), this.startButton && (this.startButton.disabled = !e);
|
|
3413
|
+
}
|
|
3414
|
+
setUnauditableExplanation(e) {
|
|
3415
|
+
this.helpText && (this.helpText.textContent = e);
|
|
3416
|
+
}
|
|
3417
|
+
setWarningText(e) {
|
|
3418
|
+
this.warningText && (this.warningText.textContent = e, this.warningText.classList.toggle("hidden", !e));
|
|
3419
|
+
}
|
|
3420
|
+
wasShown() {
|
|
3421
|
+
super.wasShown(), this.controller.recomputePageAuditability();
|
|
3422
|
+
}
|
|
3423
|
+
settingsToolbar() {
|
|
3424
|
+
return this.#e;
|
|
3425
|
+
}
|
|
3426
|
+
}, In = "/*\n * Copyright 2017 The Chromium Authors\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.lighthouse-view {\n flex: auto;\n align-items: start;\n width: 100%;\n max-width: var(--sys-size-34);\n\n .header {\n font: var(--sys-typescale-body2-medium);\n padding-top: var(--sys-size-3);\n margin: var(--sys-size-5) var(--sys-size-5) var(--sys-size-5) var(--sys-size-8);\n flex: none;\n }\n\n .lighthouse-dialog-text {\n margin: 0 var(--sys-size-8);\n }\n}\n\n.lighthouse-view button {\n z-index: 10;\n margin-left: auto;\n margin-right: 0;\n}\n\n.lighthouse-status {\n width: calc(100% - 2*var(--sys-size-8));\n flex: auto;\n color: var(\n --sys-color-on-surface);\n margin: 0 var(\n --sys-size-8);\n}\n\n.lighthouse-status-text {\n text-align: center;\n min-height: var(--sys-size-16);\n display: flex;\n justify-content: center;\n flex-direction: column;\n}\n\n.lighthouse-status-text code {\n user-select: text;\n text-align: left;\n white-space: pre-wrap;\n overflow: auto;\n}\n\n.lighthouse-progress-wrapper {\n height: var(--sys-size-2);\n background-color: var(--sys-color-neutral-outline);\n position: relative;\n margin: var(--sys-size-5) 0;\n}\n\n.lighthouse-progress-bar {\n width: 0%;\n height: 100%;\n background: var(--sys-color-primary-bright);\n position: absolute;\n transform-origin: left;\n animation-fill-mode: forwards;\n animation-timing-function: ease-out;\n\n --progress-bar-loading-duration: 45s;\n --progress-bar-gathering-duration: 12s;\n --progress-bar-gathering-percent: 70%;\n --progress-bar-auditing-duration: 5s;\n --progress-bar-auditing-percent: 95%;\n}\n\n.lighthouse-progress-bar.errored {\n width: 100%;\n background: var(--sys-color-error);\n}\n\n.lighthouse-progress-bar.loading {\n animation-duration: var(--progress-bar-loading-duration);\n animation-name: progressBarLoading;\n}\n\n@keyframes progressBarLoading {\n 0% { width: 0%; }\n 100% { width: var(--progress-bar-gathering-percent); }\n}\n\n.lighthouse-progress-bar.gathering {\n animation-duration: var(--progress-bar-gathering-duration);\n animation-name: progressBarGathering;\n}\n\n@keyframes progressBarGathering {\n 0% { width: var(--progress-bar-gathering-percent); }\n 100% { width: var(--progress-bar-auditing-percent); }\n}\n\n.lighthouse-progress-bar.auditing {\n animation-duration: var(--progress-bar-auditing-duration);\n animation-name: progressBarAuditing;\n}\n\n@keyframes progressBarAuditing {\n 0% { width: var(--progress-bar-auditing-percent); }\n 100% { width: 99%; }\n}\n\n.lighthouse-report-error {\n display: block;\n margin-top: 5px;\n}\n\n.lighthouse-action-buttons {\n justify-content: space-between;\n align-self: end;\n width: calc(100% - 2*var(--sys-size-8));\n margin: var(--sys-size-6) var(--sys-size-8) var(--sys-size-8) var(--sys-size-8);\n}\n", Ln = /* @__PURE__ */ e({
|
|
3427
|
+
DEFAULT_VIEW: () => Bn,
|
|
3428
|
+
StatusPhases: () => Gn,
|
|
3429
|
+
StatusView: () => Vn,
|
|
3430
|
+
fastFactRotationInterval: () => Hn,
|
|
3431
|
+
minimumTextVisibilityDuration: () => Un
|
|
3432
|
+
}), { html: Rn } = E, q = {
|
|
3433
|
+
cancel: "Cancel",
|
|
3434
|
+
loading: "Loading…",
|
|
3435
|
+
auditingS: "Auditing {PH1}",
|
|
3436
|
+
auditingYourWebPage: "Auditing your web page",
|
|
3437
|
+
aiAuditingS: "AI assistance is auditing {PH1}",
|
|
3438
|
+
aiAuditingYourWebPage: "AI assistance is auditing your web page",
|
|
3439
|
+
cancelling: "Cancelling…",
|
|
3440
|
+
lighthouseIsWarmingUp: "`Lighthouse` is warming up…",
|
|
3441
|
+
lighthouseIsLoadingYourPage: "`Lighthouse` is loading your page",
|
|
3442
|
+
fastFactMessageWithPlaceholder: "💡 {PH1}",
|
|
3443
|
+
ahSorryWeRanIntoAnError: "Ah, sorry! We ran into an error.",
|
|
3444
|
+
tryToNavigateToTheUrlInAFresh: "Try to navigate to the URL in a fresh `Chrome` profile without any other tabs or extensions open and try again.",
|
|
3445
|
+
ifThisIssueIsReproduciblePlease: "If this issue is reproducible, please report it at the `Lighthouse` `GitHub` repo.",
|
|
3446
|
+
lighthouseIsLoadingThePage: "Lighthouse is loading the page.",
|
|
3447
|
+
lighthouseIsGatheringInformation: "`Lighthouse` is gathering information about the page to compute your score.",
|
|
3448
|
+
almostThereLighthouseIsNow: "Almost there! `Lighthouse` is now generating your report.",
|
|
3449
|
+
lighthouseIsLoadingYourPageWith: "`Lighthouse` is loading your page with throttling to measure performance on a mobile device on 3G.",
|
|
3450
|
+
lighthouseIsLoadingYourPageWithThrottling: "`Lighthouse` is loading your page with throttling to measure performance on a slow desktop on 3G.",
|
|
3451
|
+
lighthouseIsLoadingYourPageWithMobile: "`Lighthouse` is loading your page with mobile emulation.",
|
|
3452
|
+
mbTakesAMinimumOfSecondsTo: "1MB takes a minimum of 5 seconds to download on a typical 3G connection [Source: `WebPageTest` and `DevTools` 3G definition].",
|
|
3453
|
+
rebuildingPinterestPagesFor: "Rebuilding Pinterest pages for performance increased conversion rates by 15% [Source: `WPO Stats`]",
|
|
3454
|
+
byReducingTheResponseSizeOfJson: "By reducing the response size of JSON needed for displaying comments, Instagram saw increased impressions [Source: `WPO Stats`]",
|
|
3455
|
+
walmartSawAIncreaseInRevenueFor: "Walmart saw a 1% increase in revenue for every 100ms improvement in page load [Source: `WPO Stats`]",
|
|
3456
|
+
ifASiteTakesSecondToBecome: "If a site takes >1 second to become interactive, users lose attention, and their perception of completing the page task is broken [Source: `Google Developers Blog`]",
|
|
3457
|
+
OfGlobalMobileUsersInWereOnGOrG: "75% of global mobile users in 2016 were on 2G or 3G [Source: `GSMA Mobile`]",
|
|
3458
|
+
theAverageUserDeviceCostsLess: "The average user device costs less than 200 USD. [Source: `International Data Corporation`]",
|
|
3459
|
+
SecondsIsTheAverageTimeAMobile: "19 seconds is the average time a mobile web page takes to load on a 3G connection [Source: `Google DoubleClick blog`]",
|
|
3460
|
+
OfMobilePagesTakeNearlySeconds: "70% of mobile pages take nearly 7 seconds for the visual content above the fold to display on the screen. [Source: `Think with Google`]",
|
|
3461
|
+
asPageLoadTimeIncreasesFromOne: "As page load time increases from one second to seven seconds, the probability of a mobile site visitor bouncing increases 113%. [Source: `Think with Google`]",
|
|
3462
|
+
asTheNumberOfElementsOnAPage: "As the number of elements on a page increases from 400 to 6,000, the probability of conversion drops 95%. [Source: `Think with Google`]",
|
|
3463
|
+
lighthouseOnlySimulatesMobile: "`Lighthouse` only simulates mobile performance; to measure performance on a real device, try WebPageTest.org [Source: `Lighthouse` team]"
|
|
3464
|
+
}, zn = p("panels/lighthouse/LighthouseStatusView.ts", q), J = l.bind(void 0, zn), Y = f.bind(void 0, zn), Bn = (e, t, n) => {
|
|
3465
|
+
let { statusHeader: r, statusText: i, progressBarClass: a, progressBarValue: o, progressBarTotal: s, cancelButtonVisible: c, onCancel: l, bugReport: u } = e;
|
|
3466
|
+
y(Rn`
|
|
3467
|
+
<div class="lighthouse-view vbox">
|
|
3468
|
+
<span class="header">${r}</span>
|
|
3469
|
+
<div class="lighthouse-status vbox">
|
|
3470
|
+
<div class="lighthouse-progress-wrapper">
|
|
3471
|
+
<div
|
|
3472
|
+
class="lighthouse-progress-bar ${a}"
|
|
3473
|
+
role="progressbar"
|
|
3474
|
+
aria-valuemin="0"
|
|
3475
|
+
aria-valuemax=${s}
|
|
3476
|
+
aria-valuenow=${o}
|
|
3477
|
+
aria-valuetext=${i}
|
|
3478
|
+
></div>
|
|
3479
|
+
</div>
|
|
3480
|
+
<div class="lighthouse-status-text" role="status">
|
|
3481
|
+
${u ? Rn`
|
|
3482
|
+
<p>${J(q.ahSorryWeRanIntoAnError)}</p>
|
|
3483
|
+
${u.knownBugPattern ? Rn`
|
|
3484
|
+
<p>${J(q.tryToNavigateToTheUrlInAFresh)}</p>
|
|
3485
|
+
` : ((e, t) => {
|
|
3486
|
+
let n = navigator.userAgent.match(/Chrome\/(\S+)/) || ["", "Unknown"], r = `
|
|
3487
|
+
${e.friendlyMessage || e.message}
|
|
3488
|
+
\`\`\`
|
|
3489
|
+
Channel: DevTools
|
|
3490
|
+
Initial URL: ${t}
|
|
3491
|
+
Chrome Version: ${n[1]}
|
|
3492
|
+
Stack Trace: ${e.stack}
|
|
3493
|
+
\`\`\`
|
|
3494
|
+
`;
|
|
3495
|
+
return Rn`
|
|
3496
|
+
<p>${J(q.ifThisIssueIsReproduciblePlease)}</p>
|
|
3497
|
+
<code class="monospace">${r.trim()}</code>
|
|
3498
|
+
`;
|
|
3499
|
+
})(u.error, u.auditURL)}
|
|
3500
|
+
` : i}
|
|
3501
|
+
</div>
|
|
3502
|
+
</div>
|
|
3503
|
+
<div class="lighthouse-action-buttons">
|
|
3504
|
+
<devtools-button
|
|
3505
|
+
.variant=${m.TONAL}
|
|
3506
|
+
.jslogContext=${"lighthouse.cancel"}
|
|
3507
|
+
@click=${l}
|
|
3508
|
+
style=${S({ visibility: c ? "visible" : "hidden" })}
|
|
3509
|
+
>${J(q.cancel)}</devtools-button>
|
|
3510
|
+
</div>
|
|
3511
|
+
</div>
|
|
3512
|
+
`, n);
|
|
3513
|
+
}, Vn = class {
|
|
3514
|
+
panel;
|
|
3515
|
+
inspectedURL;
|
|
3516
|
+
textChangedAt;
|
|
3517
|
+
fastFactsQueued;
|
|
3518
|
+
currentPhase;
|
|
3519
|
+
scheduledFastFactTimeout;
|
|
3520
|
+
dialogRoot = null;
|
|
3521
|
+
dialog;
|
|
3522
|
+
statusHeader;
|
|
3523
|
+
statusText;
|
|
3524
|
+
progressBarClass;
|
|
3525
|
+
progressBarValue;
|
|
3526
|
+
cancelButtonVisible;
|
|
3527
|
+
isAIControlled;
|
|
3528
|
+
bugReport;
|
|
3529
|
+
constructor(e) {
|
|
3530
|
+
this.panel = e, this.inspectedURL = "", this.textChangedAt = 0, this.fastFactsQueued = qn.map((e) => e()), this.currentPhase = null, this.scheduledFastFactTimeout = null, this.dialog = new b(), this.dialog.setDimmed(!0), this.dialog.setCloseOnEscape(!1), this.dialog.setOutsideClickCallback((e) => e.consume(!0)), this.statusHeader = "", this.statusText = "", this.progressBarClass = "", this.progressBarValue = 0, this.cancelButtonVisible = !0, this.isAIControlled = !1, this.bugReport = null, this.render();
|
|
3531
|
+
}
|
|
3532
|
+
render() {
|
|
3533
|
+
this.dialogRoot || (this.dialogRoot = Oe(this.dialog.contentElement, { cssFile: In }), this.dialog.setSizeBehavior(x.SET_EXACT_WIDTH_MAX_HEIGHT), this.dialog.setMaxContentSize(new De(500, 400))), Bn({
|
|
3534
|
+
statusHeader: this.statusHeader,
|
|
3535
|
+
statusText: this.statusText,
|
|
3536
|
+
progressBarClass: this.progressBarClass,
|
|
3537
|
+
progressBarValue: this.progressBarValue,
|
|
3538
|
+
progressBarTotal: Gn.length - 1,
|
|
3539
|
+
cancelButtonVisible: this.cancelButtonVisible,
|
|
3540
|
+
onCancel: this.cancel.bind(this),
|
|
3541
|
+
bugReport: this.bugReport || void 0
|
|
3542
|
+
}, {}, this.dialogRoot);
|
|
3543
|
+
}
|
|
3544
|
+
reset() {
|
|
3545
|
+
this.resetProgressBarClasses(), clearTimeout(this.scheduledFastFactTimeout), this.textChangedAt = 0, this.fastFactsQueued = qn.map((e) => e()), this.currentPhase = null, this.scheduledFastFactTimeout = null, this.bugReport = null, this.statusText = "", this.progressBarValue = 0, this.cancelButtonVisible = !0;
|
|
3546
|
+
}
|
|
3547
|
+
show(e) {
|
|
3548
|
+
this.reset(), this.updateStatus(J(q.loading));
|
|
3549
|
+
let t = this.getStatusHeader();
|
|
3550
|
+
this.renderStatusHeader(t), this.dialog.show(e), this.render();
|
|
3551
|
+
}
|
|
3552
|
+
getStatusHeader() {
|
|
3553
|
+
let e = i.fromString(this.inspectedURL)?.host;
|
|
3554
|
+
return this.isAIControlled ? e ? J(q.aiAuditingS, { PH1: e }) : J(q.aiAuditingYourWebPage) : e ? J(q.auditingS, { PH1: e }) : J(q.auditingYourWebPage);
|
|
3555
|
+
}
|
|
3556
|
+
renderStatusHeader(e) {
|
|
3557
|
+
this.statusHeader = `${e}…`, this.render();
|
|
3558
|
+
}
|
|
3559
|
+
hide() {
|
|
3560
|
+
this.dialog.isShowing() && this.dialog.hide();
|
|
3561
|
+
}
|
|
3562
|
+
setAIControlled(e) {
|
|
3563
|
+
this.isAIControlled = e;
|
|
3564
|
+
}
|
|
3565
|
+
setInspectedURL(e = "") {
|
|
3566
|
+
this.inspectedURL = e;
|
|
3567
|
+
}
|
|
3568
|
+
updateStatus(e) {
|
|
3569
|
+
if (!e) return;
|
|
3570
|
+
if (e.startsWith("Cancel")) {
|
|
3571
|
+
this.commitTextChange(J(q.cancelling)), clearTimeout(this.scheduledFastFactTimeout);
|
|
3572
|
+
return;
|
|
3573
|
+
}
|
|
3574
|
+
let t = this.getPhaseForMessage(e);
|
|
3575
|
+
if (!t && !this.currentPhase) this.commitTextChange(J(q.lighthouseIsWarmingUp)), clearTimeout(this.scheduledFastFactTimeout);
|
|
3576
|
+
else if (t) {
|
|
3577
|
+
this.currentPhase = t;
|
|
3578
|
+
let e = this.getMessageForPhase(t);
|
|
3579
|
+
this.commitTextChange(e), this.scheduleFastFactCheck(), this.resetProgressBarClasses(), this.progressBarClass = t.progressBarClass, this.progressBarValue = Gn.indexOf(t), this.render();
|
|
3580
|
+
}
|
|
3581
|
+
}
|
|
3582
|
+
cancel() {
|
|
3583
|
+
this.panel.handleRunCancel();
|
|
3584
|
+
}
|
|
3585
|
+
getMessageForPhase(e) {
|
|
3586
|
+
if (e.message()) return e.message();
|
|
3587
|
+
let t = L().find((e) => e.setting.name === "lighthouse.device-type"), n = L().find((e) => e.setting.name === "lighthouse.throttling"), r = t ? t.setting.get() : "", i = n ? n.setting.get() : "", a = Kn.find((e) => e.deviceType === r && e.throttling === i);
|
|
3588
|
+
return a ? a.message() : J(q.lighthouseIsLoadingYourPage);
|
|
3589
|
+
}
|
|
3590
|
+
getPhaseForMessage(e) {
|
|
3591
|
+
return Gn.find((t) => t.statusMessageRegex.test(e)) || null;
|
|
3592
|
+
}
|
|
3593
|
+
resetProgressBarClasses() {
|
|
3594
|
+
this.progressBarClass = "", this.render();
|
|
3595
|
+
}
|
|
3596
|
+
scheduleFastFactCheck() {
|
|
3597
|
+
!this.currentPhase || this.scheduledFastFactTimeout || (this.scheduledFastFactTimeout = window.setTimeout(() => {
|
|
3598
|
+
this.updateFastFactIfNecessary(), this.scheduledFastFactTimeout = null, this.scheduleFastFactCheck();
|
|
3599
|
+
}, 100));
|
|
3600
|
+
}
|
|
3601
|
+
updateFastFactIfNecessary() {
|
|
3602
|
+
if (performance.now() - this.textChangedAt < 6e3 || !this.fastFactsQueued.length) return;
|
|
3603
|
+
let e = Math.floor(Math.random() * this.fastFactsQueued.length);
|
|
3604
|
+
this.commitTextChange(J(q.fastFactMessageWithPlaceholder, { PH1: this.fastFactsQueued[e] })), this.fastFactsQueued.splice(e, 1);
|
|
3605
|
+
}
|
|
3606
|
+
commitTextChange(e) {
|
|
3607
|
+
this.textChangedAt = performance.now(), this.statusText = e, this.render();
|
|
3608
|
+
}
|
|
3609
|
+
renderBugReport(e) {
|
|
3610
|
+
console.error(e), this.scheduledFastFactTimeout && window.clearTimeout(this.scheduledFastFactTimeout), this.resetProgressBarClasses(), this.progressBarClass = "errored", this.statusText = "", this.bugReport = {
|
|
3611
|
+
error: e,
|
|
3612
|
+
auditURL: this.inspectedURL,
|
|
3613
|
+
knownBugPattern: Wn.some((t) => t.test(e.message))
|
|
3614
|
+
}, this.render();
|
|
3615
|
+
}
|
|
3616
|
+
renderText(e, t) {
|
|
3617
|
+
this.statusHeader = `${e}…`, this.commitTextChange(t);
|
|
3618
|
+
}
|
|
3619
|
+
toggleCancelButton(e) {
|
|
3620
|
+
this.cancelButtonVisible = e, this.render();
|
|
3621
|
+
}
|
|
3622
|
+
}, Hn = 6e3, Un = 3e3, Wn = [
|
|
3623
|
+
/PARSING_PROBLEM/,
|
|
3624
|
+
/DOCUMENT_REQUEST/,
|
|
3625
|
+
/READ_FAILED/,
|
|
3626
|
+
/TRACING_ALREADY_STARTED/,
|
|
3627
|
+
/^You must provide a url to the runner/,
|
|
3628
|
+
/^You probably have multiple tabs open/
|
|
3629
|
+
], Gn = [
|
|
3630
|
+
{
|
|
3631
|
+
id: "loading",
|
|
3632
|
+
progressBarClass: "loading",
|
|
3633
|
+
message: Y(q.lighthouseIsLoadingThePage),
|
|
3634
|
+
statusMessageRegex: /^(Navigating to)/
|
|
3635
|
+
},
|
|
3636
|
+
{
|
|
3637
|
+
id: "gathering",
|
|
3638
|
+
progressBarClass: "gathering",
|
|
3639
|
+
message: Y(q.lighthouseIsGatheringInformation),
|
|
3640
|
+
statusMessageRegex: /(Gather|artifact)/i
|
|
3641
|
+
},
|
|
3642
|
+
{
|
|
3643
|
+
id: "auditing",
|
|
3644
|
+
progressBarClass: "auditing",
|
|
3645
|
+
message: Y(q.almostThereLighthouseIsNow),
|
|
3646
|
+
statusMessageRegex: /^Audit/
|
|
3647
|
+
}
|
|
3648
|
+
], Kn = [
|
|
3649
|
+
{
|
|
3650
|
+
deviceType: "mobile",
|
|
3651
|
+
throttling: "on",
|
|
3652
|
+
message: Y(q.lighthouseIsLoadingYourPageWith)
|
|
3653
|
+
},
|
|
3654
|
+
{
|
|
3655
|
+
deviceType: "desktop",
|
|
3656
|
+
throttling: "on",
|
|
3657
|
+
message: Y(q.lighthouseIsLoadingYourPageWithThrottling)
|
|
3658
|
+
},
|
|
3659
|
+
{
|
|
3660
|
+
deviceType: "mobile",
|
|
3661
|
+
throttling: "off",
|
|
3662
|
+
message: Y(q.lighthouseIsLoadingYourPageWithMobile)
|
|
3663
|
+
},
|
|
3664
|
+
{
|
|
3665
|
+
deviceType: "desktop",
|
|
3666
|
+
throttling: "off",
|
|
3667
|
+
message: Y(q.lighthouseIsLoadingThePage)
|
|
3668
|
+
}
|
|
3669
|
+
], qn = [
|
|
3670
|
+
Y(q.mbTakesAMinimumOfSecondsTo),
|
|
3671
|
+
Y(q.rebuildingPinterestPagesFor),
|
|
3672
|
+
Y(q.byReducingTheResponseSizeOfJson),
|
|
3673
|
+
Y(q.walmartSawAIncreaseInRevenueFor),
|
|
3674
|
+
Y(q.ifASiteTakesSecondToBecome),
|
|
3675
|
+
Y(q.OfGlobalMobileUsersInWereOnGOrG),
|
|
3676
|
+
Y(q.theAverageUserDeviceCostsLess),
|
|
3677
|
+
Y(q.SecondsIsTheAverageTimeAMobile),
|
|
3678
|
+
Y(q.OfMobilePagesTakeNearlySeconds),
|
|
3679
|
+
Y(q.asPageLoadTimeIncreasesFromOne),
|
|
3680
|
+
Y(q.asTheNumberOfElementsOnAPage),
|
|
3681
|
+
Y(q.OfMobilePagesTakeNearlySeconds),
|
|
3682
|
+
Y(q.lighthouseOnlySimulatesMobile)
|
|
3683
|
+
], Jn = /* @__PURE__ */ e({ TimespanView: () => Qn }), X = {
|
|
3684
|
+
timespanStarting: "Timespan starting…",
|
|
3685
|
+
timespanStarted: "Timespan started",
|
|
3686
|
+
interactWithPage: "Interact with the page.",
|
|
3687
|
+
endTimespan: "End timespan",
|
|
3688
|
+
cancel: "Cancel"
|
|
3689
|
+
}, Yn = p("panels/lighthouse/LighthouseTimespanView.ts", X), Xn = l.bind(void 0, Yn), Zn = (e, t, n) => {
|
|
3690
|
+
y(D`
|
|
3691
|
+
<div class="lighthouse-view vbox">
|
|
3692
|
+
<span
|
|
3693
|
+
${A((e) => {
|
|
3694
|
+
t.statusHeader = e;
|
|
3695
|
+
})}
|
|
3696
|
+
class="header"
|
|
3697
|
+
></span>
|
|
3698
|
+
<span
|
|
3699
|
+
${A((e) => {
|
|
3700
|
+
t.contentContainer = e;
|
|
3701
|
+
})}
|
|
3702
|
+
class="lighthouse-dialog-text"
|
|
3703
|
+
></span>
|
|
3704
|
+
<div class="lighthouse-action-buttons hbox">
|
|
3705
|
+
${e.cancelButton} ${e.endButton}
|
|
3706
|
+
</div>
|
|
3707
|
+
</div>
|
|
3708
|
+
`, n);
|
|
3709
|
+
}, Qn = class extends b {
|
|
3710
|
+
panel;
|
|
3711
|
+
statusHeader;
|
|
3712
|
+
contentContainer;
|
|
3713
|
+
endButton;
|
|
3714
|
+
constructor(e) {
|
|
3715
|
+
super(), this.panel = e, this.statusHeader = null, this.contentContainer = null, this.endButton = null, this.setDimmed(!0), this.setCloseOnEscape(!1), this.setOutsideClickCallback((e) => e.consume(!0)), this.render();
|
|
3716
|
+
}
|
|
3717
|
+
show(e) {
|
|
3718
|
+
this.reset(), super.show(e);
|
|
3719
|
+
}
|
|
3720
|
+
reset() {
|
|
3721
|
+
this.statusHeader && this.contentContainer && this.endButton && (this.statusHeader.textContent = Xn(X.timespanStarting), this.contentContainer.textContent = "", this.endButton.disabled = !0);
|
|
3722
|
+
}
|
|
3723
|
+
ready() {
|
|
3724
|
+
this.statusHeader && this.contentContainer && this.endButton && (this.statusHeader.textContent = Xn(X.timespanStarted), this.contentContainer.textContent = Xn(X.interactWithPage), this.endButton.disabled = !1, this.endButton.focus());
|
|
3725
|
+
}
|
|
3726
|
+
render() {
|
|
3727
|
+
let e = Oe(this.contentElement, { cssFile: In });
|
|
3728
|
+
this.endButton = ce(Xn(X.endTimespan), this.endTimespan.bind(this), {
|
|
3729
|
+
variant: m.PRIMARY,
|
|
3730
|
+
jslogContext: "lighthouse.end-time-span",
|
|
3731
|
+
className: "end-timespan"
|
|
3732
|
+
});
|
|
3733
|
+
let t = ce(Xn(X.cancel), this.cancel.bind(this), {
|
|
3734
|
+
className: "cancel",
|
|
3735
|
+
jslogContext: "lighthouse.cancel"
|
|
3736
|
+
}), n = {
|
|
3737
|
+
statusHeader: void 0,
|
|
3738
|
+
contentContainer: void 0
|
|
3739
|
+
};
|
|
3740
|
+
Zn({
|
|
3741
|
+
cancelButton: t,
|
|
3742
|
+
endButton: this.endButton
|
|
3743
|
+
}, n, e), this.statusHeader = n.statusHeader ?? null, this.contentContainer = n.contentContainer ?? null, this.setSizeBehavior(x.SET_EXACT_WIDTH_MAX_HEIGHT), this.setMaxContentSize(new De(500, 400)), this.reset();
|
|
3744
|
+
}
|
|
3745
|
+
async endTimespan() {
|
|
3746
|
+
await this.panel.handleTimespanEnd();
|
|
3747
|
+
}
|
|
3748
|
+
async cancel() {
|
|
3749
|
+
await this.panel.handleRunCancel();
|
|
3750
|
+
}
|
|
3751
|
+
}, $n = /* @__PURE__ */ e({
|
|
3752
|
+
ActiveLighthouseReport: () => $,
|
|
3753
|
+
LighthousePanel: () => nr,
|
|
3754
|
+
ReportRevealer: () => rr
|
|
3755
|
+
}), Z = {
|
|
3756
|
+
dropLighthouseJsonHere: "Drop `Lighthouse` JSON here",
|
|
3757
|
+
performAnAudit: "Perform an audit…",
|
|
3758
|
+
clearAll: "Clear all",
|
|
3759
|
+
lighthouseSettings: "`Lighthouse` settings",
|
|
3760
|
+
printing: "Printing",
|
|
3761
|
+
thePrintPopupWindowIsOpenPlease: "The print popup window is open. Please close it to continue.",
|
|
3762
|
+
cancelling: "Cancelling"
|
|
3763
|
+
}, er = p("panels/lighthouse/LighthousePanel.ts", Z), Q = l.bind(void 0, er), tr, $ = class {
|
|
3764
|
+
report;
|
|
3765
|
+
constructor(e) {
|
|
3766
|
+
this.report = e;
|
|
3767
|
+
}
|
|
3768
|
+
}, nr = class e extends k {
|
|
3769
|
+
controller;
|
|
3770
|
+
startView;
|
|
3771
|
+
statusView;
|
|
3772
|
+
timespanView;
|
|
3773
|
+
warningText;
|
|
3774
|
+
unauditableExplanation;
|
|
3775
|
+
cachedRenderedReports;
|
|
3776
|
+
auditResultsElement;
|
|
3777
|
+
clearButton;
|
|
3778
|
+
newButton;
|
|
3779
|
+
reportSelector;
|
|
3780
|
+
settingsPane;
|
|
3781
|
+
rightToolbar;
|
|
3782
|
+
showSettingsPaneSetting;
|
|
3783
|
+
constructor(e) {
|
|
3784
|
+
super("lighthouse"), this.registerRequiredCSS(qe), this.controller = e, this.startView = new Fn(this.controller, this), this.timespanView = new Qn(this), this.statusView = new Vn(this), this.warningText = null, this.unauditableExplanation = null, this.cachedRenderedReports = /* @__PURE__ */ new Map(), new _(this.contentElement, [ne.File], Q(Z.dropLighthouseJsonHere), this.handleDrop.bind(this)), this.controller.addEventListener(R.PageAuditabilityChanged, this.refreshStartAuditUI.bind(this)), this.controller.addEventListener(R.PageWarningsChanged, this.refreshWarningsUI.bind(this)), this.controller.addEventListener(R.AuditProgressChanged, this.refreshStatusUI.bind(this)), this.renderToolbar(), this.auditResultsElement = this.contentElement.createChild("div", "lighthouse-results-container"), this.auditResultsElement.addEventListener("keydown", this.onKeyDown.bind(this)), this.renderStartView(), this.controller.recomputePageAuditability(), de.instance().setFlavor($, null);
|
|
3785
|
+
}
|
|
3786
|
+
static instance(t) {
|
|
3787
|
+
if (!tr || t?.forceNew) {
|
|
3788
|
+
let n = t?.protocolService ?? new Ze();
|
|
3789
|
+
tr = new e(t?.controller ?? new Ue(n));
|
|
3790
|
+
}
|
|
3791
|
+
return tr;
|
|
3792
|
+
}
|
|
3793
|
+
static getEvents() {
|
|
3794
|
+
return R;
|
|
3795
|
+
}
|
|
3796
|
+
async handleTimespanStart() {
|
|
3797
|
+
try {
|
|
3798
|
+
this.timespanView.show(this.contentElement), await this.controller.startLighthouse(), this.timespanView.ready();
|
|
3799
|
+
} catch (e) {
|
|
3800
|
+
this.handleError(e);
|
|
3801
|
+
}
|
|
3802
|
+
}
|
|
3803
|
+
async handleTimespanEnd() {
|
|
3804
|
+
try {
|
|
3805
|
+
this.timespanView.hide(), this.renderStatusView();
|
|
3806
|
+
let { lhr: e, artifacts: t } = await this.controller.collectLighthouseResults();
|
|
3807
|
+
this.buildReportUI(e, t);
|
|
3808
|
+
} catch (e) {
|
|
3809
|
+
this.handleError(e);
|
|
3810
|
+
}
|
|
3811
|
+
}
|
|
3812
|
+
async handleCompleteRun(e) {
|
|
3813
|
+
try {
|
|
3814
|
+
await this.controller.startLighthouse(e), this.renderStatusView();
|
|
3815
|
+
let { lhr: t, artifacts: n } = await this.controller.collectLighthouseResults();
|
|
3816
|
+
return this.buildReportUI(t, n), { report: t };
|
|
3817
|
+
} catch (e) {
|
|
3818
|
+
return this.handleError(e), de.instance().setFlavor($, null), { report: null };
|
|
3819
|
+
}
|
|
3820
|
+
}
|
|
3821
|
+
async handleRunCancel() {
|
|
3822
|
+
this.statusView.updateStatus(Q(Z.cancelling)), this.timespanView.hide(), await this.controller.cancelLighthouse(), this.renderStartView();
|
|
3823
|
+
}
|
|
3824
|
+
handleError(e) {
|
|
3825
|
+
e instanceof Xe || e instanceof Error && this.statusView.renderBugReport(e);
|
|
3826
|
+
}
|
|
3827
|
+
refreshWarningsUI(e) {
|
|
3828
|
+
this.controller.getCurrentRun() || (this.warningText = e.data.warning, this.startView.setWarningText(e.data.warning));
|
|
3829
|
+
}
|
|
3830
|
+
refreshStartAuditUI(e) {
|
|
3831
|
+
this.controller.getCurrentRun() || (this.startView.refresh(), this.unauditableExplanation = e.data.helpText, this.startView.setUnauditableExplanation(e.data.helpText), this.startView.setStartButtonEnabled(!e.data.helpText));
|
|
3832
|
+
}
|
|
3833
|
+
refreshStatusUI(e) {
|
|
3834
|
+
this.statusView.updateStatus(e.data.message);
|
|
3835
|
+
}
|
|
3836
|
+
refreshToolbarUI() {
|
|
3837
|
+
this.clearButton.setEnabled(this.reportSelector.hasItems());
|
|
3838
|
+
}
|
|
3839
|
+
clearAll() {
|
|
3840
|
+
this.reportSelector.clearAll(), this.renderStartView(), this.refreshToolbarUI();
|
|
3841
|
+
}
|
|
3842
|
+
renderToolbar() {
|
|
3843
|
+
let e = this.element.createChild("div", "lighthouse-toolbar-container");
|
|
3844
|
+
e.setAttribute("jslog", `${ye()}`), e.role = "toolbar";
|
|
3845
|
+
let t = e.createChild("devtools-toolbar");
|
|
3846
|
+
t.role = "presentation", this.newButton = new oe(Q(Z.performAnAudit), "plus"), t.appendToolbarItem(this.newButton), this.newButton.addEventListener(oe.Events.CLICK, this.renderStartView.bind(this)), t.appendSeparator(), this.reportSelector = new En(() => this.renderStartView()), t.appendToolbarItem(this.reportSelector.comboBox()), this.clearButton = new oe(Q(Z.clearAll), "clear"), t.appendToolbarItem(this.clearButton), this.clearButton.addEventListener(oe.Events.CLICK, this.clearAll.bind(this)), this.settingsPane = new h(), this.settingsPane.show(this.contentElement), this.settingsPane.element.classList.add("lighthouse-settings-pane"), this.settingsPane.element.appendChild(this.startView.settingsToolbar()), this.showSettingsPaneSetting = u.instance().createSetting("lighthouse-show-settings-toolbar", !1, d.SYNCED), this.rightToolbar = e.createChild("devtools-toolbar"), this.rightToolbar.role = "presentation", this.rightToolbar.appendSeparator(), this.rightToolbar.appendToolbarItem(new ge(this.showSettingsPaneSetting, "gear", Q(Z.lighthouseSettings), "gear-filled")), this.showSettingsPaneSetting.addChangeListener(this.updateSettingsPaneVisibility.bind(this)), this.updateSettingsPaneVisibility(), this.refreshToolbarUI();
|
|
3847
|
+
}
|
|
3848
|
+
updateSettingsPaneVisibility() {
|
|
3849
|
+
this.settingsPane.element.classList.toggle("hidden", !this.showSettingsPaneSetting.get());
|
|
3850
|
+
}
|
|
3851
|
+
toggleSettingsDisplay(e) {
|
|
3852
|
+
this.rightToolbar.classList.toggle("hidden", !e), this.settingsPane.element.classList.toggle("hidden", !e), this.updateSettingsPaneVisibility();
|
|
3853
|
+
}
|
|
3854
|
+
renderStartView() {
|
|
3855
|
+
this.auditResultsElement.removeChildren(), this.statusView.hide(), this.reportSelector.selectNewReport(), de.instance().setFlavor($, null), this.contentElement.classList.toggle("in-progress", !1), this.startView.show(this.contentElement), this.toggleSettingsDisplay(!0), this.startView.setUnauditableExplanation(this.unauditableExplanation), this.startView.setStartButtonEnabled(!this.unauditableExplanation), this.unauditableExplanation || this.startView.focusStartButton(), this.startView.setWarningText(this.warningText), this.newButton.setEnabled(!1), this.refreshToolbarUI(), this.setDefaultFocusedChild(this.startView);
|
|
3856
|
+
}
|
|
3857
|
+
renderStatusView() {
|
|
3858
|
+
let e = this.controller.getCurrentRun();
|
|
3859
|
+
this.contentElement.classList.toggle("in-progress", !0), this.statusView.setInspectedURL(e?.inspectedURL), this.statusView.setAIControlled(!!e?.isAIControlled), this.statusView.show(this.contentElement);
|
|
3860
|
+
}
|
|
3861
|
+
beforePrint() {
|
|
3862
|
+
this.statusView.show(this.contentElement), this.statusView.toggleCancelButton(!1), this.statusView.renderText(Q(Z.printing), Q(Z.thePrintPopupWindowIsOpenPlease));
|
|
3863
|
+
}
|
|
3864
|
+
afterPrint() {
|
|
3865
|
+
this.statusView.hide(), this.statusView.toggleCancelButton(!0);
|
|
3866
|
+
}
|
|
3867
|
+
renderReport(e, t) {
|
|
3868
|
+
this.toggleSettingsDisplay(!1), this.contentElement.classList.toggle("in-progress", !1), this.startView.hideWidget(), this.statusView.hide(), this.auditResultsElement.removeChildren(), this.newButton.setEnabled(!0), this.refreshToolbarUI(), de.instance().setFlavor($, new $(e));
|
|
3869
|
+
let n = this.cachedRenderedReports.get(e);
|
|
3870
|
+
if (n) {
|
|
3871
|
+
this.auditResultsElement.appendChild(n);
|
|
3872
|
+
return;
|
|
3873
|
+
}
|
|
3874
|
+
let r = xn.renderLighthouseReport(e, t, {
|
|
3875
|
+
beforePrint: this.beforePrint.bind(this),
|
|
3876
|
+
afterPrint: this.afterPrint.bind(this)
|
|
3877
|
+
});
|
|
3878
|
+
this.cachedRenderedReports.set(e, r);
|
|
3879
|
+
}
|
|
3880
|
+
buildReportUI(e, t) {
|
|
3881
|
+
if (e === null) return;
|
|
3882
|
+
let n = new Dn(e, () => this.renderReport(e, t), this.renderStartView.bind(this));
|
|
3883
|
+
this.reportSelector.prepend(n), this.refreshToolbarUI(), this.renderReport(e), this.auditResultsElement.querySelector(".lh-topbar__url")?.focus();
|
|
3884
|
+
}
|
|
3885
|
+
handleDrop(e) {
|
|
3886
|
+
let t = e.items;
|
|
3887
|
+
if (t.length && t[0].kind === "file") {
|
|
3888
|
+
let e = t[0].getAsFile();
|
|
3889
|
+
if (!e) return;
|
|
3890
|
+
let n = new FileReader();
|
|
3891
|
+
n.onload = () => this.loadedFromFile(n.result), n.readAsText(e);
|
|
3892
|
+
}
|
|
3893
|
+
}
|
|
3894
|
+
loadedFromFile(e) {
|
|
3895
|
+
let t = JSON.parse(e);
|
|
3896
|
+
t.lighthouseVersion && this.buildReportUI(t);
|
|
3897
|
+
}
|
|
3898
|
+
elementsToRestoreScrollPositionsFor() {
|
|
3899
|
+
let e = super.elementsToRestoreScrollPositionsFor(), t = this.auditResultsElement.querySelector(".lh-container");
|
|
3900
|
+
return t && e.push(t), e;
|
|
3901
|
+
}
|
|
3902
|
+
onKeyDown(e) {
|
|
3903
|
+
e.key === "Escape" && this.auditResultsElement.querySelector(".lh-tools__button.lh-active") && (e.handled = !0);
|
|
3904
|
+
}
|
|
3905
|
+
selectReport(e) {
|
|
3906
|
+
this.reportSelector.selectReport(e);
|
|
3907
|
+
}
|
|
3908
|
+
static async executeLighthouseRecording(t) {
|
|
3909
|
+
let n = e.instance();
|
|
3910
|
+
await me.instance().showView("lighthouse");
|
|
3911
|
+
let { report: r } = await n.handleCompleteRun(t);
|
|
3912
|
+
return r;
|
|
3913
|
+
}
|
|
3914
|
+
}, rr = class {
|
|
3915
|
+
async reveal(e) {
|
|
3916
|
+
await me.instance().showView("lighthouse"), nr.instance().selectReport(e.report);
|
|
3917
|
+
}
|
|
3918
|
+
};
|
|
3919
|
+
//#endregion
|
|
3920
|
+
export { Ln as a, Sn as c, Je as d, Be as f, Jn as i, xn as l, nr as n, Mn as o, $n as r, kn as s, $ as t, yn as u };
|