chrome-devtools-frontend 1.0.1037221 → 1.0.1039140
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/config/gni/devtools_grd_files.gni +9 -2
- package/front_end/core/common/ParsedURL.ts +1 -1
- package/front_end/core/i18n/locales/en-US.json +2 -2
- package/front_end/core/i18n/locales/en-XL.json +2 -2
- package/front_end/core/sdk/ResourceTreeModel.ts +12 -8
- package/front_end/panels/sources/NavigatorView.ts +9 -0
- package/front_end/services/puppeteer/PuppeteerConnection.ts +1 -1
- package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +244 -244
- package/front_end/third_party/lighthouse/locales/en-US.json +2 -2
- package/front_end/third_party/lighthouse/locales/en-XL.json +2 -2
- package/front_end/third_party/puppeteer/package/README.md +20 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.js +4 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.d.ts +19 -6
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.js +23 -10
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.js +35 -20
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.d.ts +9 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.js +19 -7
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.d.ts +5 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.js +6 -5
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.d.ts +168 -131
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.js +208 -206
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.d.ts +74 -75
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.js +82 -97
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.d.ts +16 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.js +17 -9
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.d.ts +634 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.js +713 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.d.ts +9 -679
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.js +77 -803
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.d.ts +11 -10
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.js +11 -10
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.d.ts +34 -13
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.js +35 -14
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/{DOMWorld.d.ts → IsolatedWorld.d.ts} +58 -13
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/IsolatedWorld.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/{DOMWorld.js → IsolatedWorld.js} +124 -151
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/IsolatedWorld.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.d.ts +40 -58
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.js +53 -76
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.js +23 -6
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkEventManager.js +17 -17
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.js +8 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.d.ts +395 -296
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.js +398 -313
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.d.ts +14 -7
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.js +14 -7
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.d.ts +38 -17
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.js +49 -31
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.js +7 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.d.ts +8 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.js +8 -4
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.d.ts +1 -34
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.js +5 -53
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +6 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.d.ts +28 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.js +148 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.js +18 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +3 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.js +4 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PipeTransport.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PipeTransport.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.d.ts +3 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.d.ts +3 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.d.ts +25 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.js +78 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.d.ts +17 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.js +22 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/{common → util}/assert.d.ts +0 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/assert.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/{common → util}/assert.js +0 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/assert.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.js +19 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.js +4 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.js +10 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.d.ts +19 -6
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.js +23 -10
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.js +36 -21
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.d.ts +9 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.js +19 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.d.ts +5 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.js +6 -5
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.d.ts +168 -131
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.js +208 -206
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.d.ts +74 -75
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.js +83 -98
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.d.ts +16 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.js +17 -9
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.d.ts +634 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.js +709 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.d.ts +9 -679
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.js +72 -797
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.d.ts +11 -10
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.js +11 -10
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.d.ts +34 -13
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.js +35 -14
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/{DOMWorld.d.ts → IsolatedWorld.d.ts} +58 -13
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/IsolatedWorld.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/{DOMWorld.js → IsolatedWorld.js} +123 -150
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/IsolatedWorld.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.d.ts +40 -58
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.js +54 -77
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +2 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.js +24 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkEventManager.js +17 -17
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.js +8 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.d.ts +395 -296
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.js +398 -313
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.d.ts +14 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.js +14 -7
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.d.ts +38 -17
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.js +49 -31
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.js +7 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.d.ts +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.d.ts +8 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.js +8 -4
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.d.ts +1 -34
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.js +3 -48
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +3 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +3 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.d.ts +28 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.js +142 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.js +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.d.ts +3 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.js +4 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PipeTransport.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PipeTransport.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.d.ts +3 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.js +3 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.d.ts +3 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.js +3 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.d.ts +25 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.js +73 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.d.ts +17 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.js +17 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/{common → util}/assert.d.ts +0 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/assert.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/{common → util}/assert.js +0 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/assert.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.d.ts +2 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.d.ts.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.js +15 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.js.map +1 -0
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +1069 -878
- package/front_end/third_party/puppeteer/package/package.json +32 -28
- package/front_end/third_party/puppeteer/package/typescript-if-required.js +1 -1
- package/front_end/third_party/puppeteer/puppeteer.ts +1 -1
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryHighlightChipList.ts +16 -6
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryInspector.ts +28 -4
- package/front_end/ui/components/linear_memory_inspector/LinearMemoryViewer.ts +15 -0
- package/front_end/ui/components/linear_memory_inspector/linearMemoryHighlightChipList.css +27 -12
- package/front_end/ui/components/linear_memory_inspector/linearMemoryViewer.css +19 -4
- package/package.json +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DOMWorld.d.ts.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DOMWorld.js.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/assert.d.ts.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/assert.js.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DOMWorld.d.ts.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DOMWorld.js.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/assert.d.ts.map +0 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/assert.js.map +0 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* Lighthouse v9.6.
|
2
|
+
* Lighthouse v9.6.6 86ee553a3dfe0f6f49f55f87837953f848a2a33c (Aug 16 2022)
|
3
3
|
*
|
4
4
|
* Automated auditing, performance metrics, and best practices for the web.
|
5
5
|
*
|
@@ -98,16 +98,16 @@ for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};return function(e,t){fun
|
|
98
98
|
return t?Cn({},e||{},t||{},Object.keys(e).reduce((function(r,a){return r[a]=Cn({},e[a],t[a]||{}),r}),{})):e}(e[a],t[a]),r}),Cn({},e)):e}var In=function(e){function FormatError(t,r){var a=e.call(this,t)||this;return a.variableId=r,a}return Dn(FormatError,e),FormatError}(Error);function createDefaultFormatters(){return{getNumberFormat:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.NumberFormat).bind.apply(e,[void 0].concat(t)))},getDateTimeFormat:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.DateTimeFormat).bind.apply(e,[void 0].concat(t)))},getPluralRules:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.PluralRules).bind.apply(e,[void 0].concat(t)))}}}var Nn=function(){function IntlMessageFormat(e,t,r,a){var n=this;if(void 0===t&&(t=IntlMessageFormat.defaultLocale),this.format=function(e){try{return formatPatterns(n.pattern,e)}catch(e){
|
99
99
|
throw e.variableId?new Error("The intl string context variable '"+e.variableId+"' was not provided to the string '"+n.message+"'"):e}},"string"==typeof e){if(!IntlMessageFormat.__parse)throw new TypeError("IntlMessageFormat.__parse must be set to process `message` of type `string`");this.ast=IntlMessageFormat.__parse(e)}else this.ast=e;if(this.message=e,!this.ast||"messageFormatPattern"!==this.ast.type)throw new TypeError("A message must be provided as a String or AST.");var i=mergeConfigs(IntlMessageFormat.formats,r);this.locale=resolveLocale(t||[]);var o=a&&a.formatters||createDefaultFormatters();this.pattern=new En(t,i,o).compile(this.ast)}return IntlMessageFormat.prototype.resolvedOptions=function(){return{locale:this.locale}},IntlMessageFormat.prototype.getAst=function(){return this.ast},IntlMessageFormat.defaultLocale="en",IntlMessageFormat.__parse=void 0,IntlMessageFormat.formats={number:{currency:{style:"currency"},percent:{style:"percent"}},date:{short:{month:"numeric",
|
100
100
|
day:"numeric",year:"2-digit"},medium:{month:"short",day:"numeric",year:"numeric"},long:{month:"long",day:"numeric",year:"numeric"},full:{weekday:"long",month:"long",day:"numeric",year:"numeric"}},time:{short:{hour:"numeric",minute:"numeric"},medium:{hour:"numeric",minute:"numeric",second:"numeric"},long:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"},full:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"}}},IntlMessageFormat}();Nn.__parse=Sn.parse;var Ln=getAugmentedNamespace(Object.freeze({__proto__:null,default:Nn,createDefaultFormatters,IntlMessageFormat:Nn}));var Mn={isObjectOfUnknownValues:function isObjectOfUnknownValues$1(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)},isObjectOrArrayOfUnknownValues:function isObjectOrArrayOfUnknownValues$1(e){return"object"==typeof e&&null!==e}},Pn=getAugmentedNamespace(Object.freeze({__proto__:null,default:{}}))
|
101
|
-
;const On=Ln,{isObjectOfUnknownValues:Fn,isObjectOrArrayOfUnknownValues:Un}=Mn,jn=Pn.default||Pn,Bn="en-US",$n=["ar-XB.json","ar.json","bg.json","ca.json","cs.json","da.json","de.json","el.json","en-GB.json","en-US.json","en-XA.json","en-XL.json","es-419.json","es.json","fi.json","fil.json","fr.json","he.json","hi.json","hr.json","hu.json","id.json","it.json","ja.json","ko.json","lt.json","lv.json","nl.json","no.json","pl.json","pt-PT.json","pt.json","ro.json","ru.json","sk.json","sl.json","sr-Latn.json","sr.json","sv.json","ta.json","te.json","th.json","tr.json","uk.json","vi.json","zh-HK.json","zh-TW.json","zh.json"].filter((e=>e.endsWith(".json")&&!e.endsWith(".ctc.json"))).map((e=>e.replace(".json",""))).sort(),qn=/ | [^\s]+$/,zn={number:{bytes:{maximumFractionDigits:0},milliseconds:{maximumFractionDigits:0},seconds:{minimumFractionDigits:1,maximumFractionDigits:1},extendedPercent:{maximumFractionDigits:2,style:"percent"}}}
|
102
|
-
for(const r of e)if("argumentElement"===r.type&&(t.set(r.id,r),r.format&&"pluralFormat"===r.format.type))for(const e of r.format.options)collectAllCustomElementsFromICU(e.value.elements,t);return t}function formatMessage$1(e,t={},r){const a="en-XA"===r||"en-XL"===r?"de-DE":r,n=new(On.IntlMessageFormat||On)(e,a,zn),i=function _preformatValues(e,t,r){const a=[...collectAllCustomElementsFromICU(e.getAst().elements).values()],n={};for(const{id:e,format:i}of a){if(e&&e in t==0)throw new Error(`ICU Message "${r}" contains a value reference ("${e}") that wasn't provided`);const a=t[e];if(i&&"numberFormat"===i.type){if("number"!=typeof a)throw new Error(`ICU Message "${r}" contains a numeric reference ("${e}") but provided value was not a number`);"milliseconds"===i.style?n[e]=10*Math.round(a/10):"seconds"===i.style&&"timeInMs"===e?n[e]=Math.round(a/100)/10:"bytes"===i.style?n[e]=a/1024:n[e]=a}else n[e]=a}
|
103
|
-
if("errorCode"!==e)throw new Error(`Provided value "${e}" does not match any placeholder in ICU message "${r}"`);n.errorCode=t.errorCode}return n}(n,t,e);return n.format(i)}function isIcuMessage$2(e){if(!Fn(e))return!1;const{i18nId:t,values:r,formattedDefault:a}=e;if("string"!=typeof t)return!1;if("string"!=typeof a)return!1;if(void 0!==r){if(!Fn(r))return!1;for(const e of Object.values(r))if("string"!=typeof e&&"number"!=typeof e)return!1}return qn.test(t)}function getFormatted(e,t){if(isIcuMessage$2(e))return function _localizeIcuMessage(e,t){const r=_getLocaleMessages(t)[e.i18nId];return r?formatMessage$1(r.message,e.values,t):e.formattedDefault}(e,t);if("string"==typeof e)return e;throw new Error("Attempted to format invalid icuMessage type")}function _formatPathAsString(e){let t="";for(const r of e)if(/^[a-z]+$/i.test(r))t.length&&(t+="."),t+=r;else{if(/]|"|'|\s/.test(r))throw new Error(`Cannot handle "${r}" in i18n`);t+=`[${r}]`}
|
104
|
-
const t=jn[e];if(!t){if(e===Bn)return{};throw new Error(`Unsupported locale '${e}'`)}return t}function getIcuMessageIdParts(e){if(!qn.test(e))throw Error(`"${e}" does not appear to be a valid ICU message id`);const[t,r]=e.split(" | ");return{filename:t,key:r}}var Vn={DEFAULT_LOCALE:Bn,_formatPathAsString,collectAllCustomElementsFromICU,isIcuMessage:isIcuMessage$2,getFormatted,getRendererFormattedStrings:function getRendererFormattedStrings(e){const t=_getLocaleMessages(e),r=Object.keys(t).filter((e=>e.startsWith("report/"))),a={};for(const e of r){const{filename:r,key:n}=getIcuMessageIdParts(e);if(!r.endsWith("util.js"))throw new Error(`Unexpected message: ${e}`);a[n]=t[e].message}return a},replaceIcuMessages:function replaceIcuMessages(e,t){const r={};return function replaceInObject(e,r,a=[]){if(Un(e))for(const[n,i]of Object.entries(e)){const o=a.concat([n]);if(isIcuMessage$2(i)){
|
105
|
-
path:c}:c),e[n]=a,r[i.i18nId]=s}else replaceInObject(i,r,o)}}(e,r),r},hasLocale:function hasLocale(e){if(e===Bn)return!0;const t=Intl.NumberFormat.supportedLocalesOf([e]).length>0,r=Boolean(jn[e]);return t&&r},registerLocaleData:function registerLocaleData(e,t){jn[e]=t},formatMessage:formatMessage$1,getIcuMessageIdParts,getAvailableLocales:function getAvailableLocales$1(){return[...new Set([...Object.keys(jn),Bn])].sort()},getCanonicalLocales:function getCanonicalLocales(){return $n}};const Wn=globalThis.URL;var Gn=getAugmentedNamespace(Object.freeze({__proto__:null,URL:Wn}));const Hn=wn,Yn=bn,Kn=Gn;var Jn={LH_ROOT:"",readJson(e,t){const r=t?Yn.dirname(Kn.fileURLToPath(t.url)):"";return e=Yn.resolve(r,e),JSON.parse(Hn.readFileSync(e,"utf-8"))}};const Xn=bn,Zn=function lookupClosestLocale(e,t){if("string"==typeof e&&t[e])return e
|
106
|
-
},{getAvailableLocales:Qn}=Vn,ei=on.default,{LH_ROOT:ti}=Jn,{isIcuMessage:ri,formatMessage:ai,DEFAULT_LOCALE:ni}=Vn,ii={ms:"{timeInMs, number, milliseconds} ms",seconds:"{timeInMs, number, seconds} s",displayValueByteSavings:"Potential savings of {wastedBytes, number, bytes} KiB",displayValueMsSavings:"Potential savings of {wastedMs, number, milliseconds} ms",displayValueElementsFound:"{nodeCount, plural, =1 {1 element found} other {# elements found}}",columnURL:"URL",columnSize:"Size",columnResourceSize:"Resource Size",columnTransferSize:"Transfer Size",columnCacheTTL:"Cache TTL",columnWastedBytes:"Potential Savings",columnWastedMs:"Potential Savings",columnBlockingTime:"Main-Thread Blocking Time",columnTimeSpent:"Time Spent",columnLocation:"Location",columnResourceType:"Resource Type",columnRequests:"Requests",columnName:"Name",columnSource:"Source",
|
107
|
-
columnFailingElem:"Failing Elements",columnDescription:"Description",totalResourceType:"Total",documentResourceType:"Document",scriptResourceType:"Script",stylesheetResourceType:"Stylesheet",imageResourceType:"Image",mediaResourceType:"Media",fontResourceType:"Font",otherResourceType:"Other",thirdPartyResourceType:"Third-party",otherResourcesLabel:"Other resources",firstContentfulPaintMetric:"First Contentful Paint",interactiveMetric:"Time to Interactive",firstMeaningfulPaintMetric:"First Meaningful Paint",totalBlockingTimeMetric:"Total Blocking Time",maxPotentialFIDMetric:"Max Potential First Input Delay",speedIndexMetric:"Speed Index",largestContentfulPaintMetric:"Largest Contentful Paint",cumulativeLayoutShiftMetric:"Cumulative Layout Shift",interactionToNextPaint:"Interaction to Next Paint",itemSeverityLow:"Low",itemSeverityMedium:"Medium",itemSeverityHigh:"High"}
|
108
|
-
;if(!i)throw new Error(`Could not locate: ${a}`);const o=i in t?e:"lighthouse-core/lib/i18n/i18n.js";return{i18nId:`${Xn.relative(ti,o).replace(/\\/g,"/")} | ${i}`,values:n,formattedDefault:ai(a,n,ni)}}}var oi={UIStrings:ii,lookupLocale:function lookupLocale(e,t){if("object"!=typeof Intl)throw new Error("Lighthouse must be run in Node with `Intl` support. See https://nodejs.org/api/intl.html for help");const r=Intl.getCanonicalLocales(e),a=Intl.NumberFormat.supportedLocalesOf(r),n=t||Qn(),i=Object.fromEntries(n.map((e=>[e,{}]))),o=Zn(a,i);return o||(0===Intl.NumberFormat.supportedLocalesOf("es").length&&ei.warn("i18n","Requested locale not available in this version of node. The `full-icu` npm module can provide additional locales. For help, see https://github.com/GoogleChrome/lighthouse/blob/master/readme.md#how-do-i-get-localized-lighthouse-results-via-the-cli"),
|
109
|
-
isStringOrIcuMessage:function isStringOrIcuMessage(e){return"string"==typeof e||ri(e)},createMessageInstanceIdFn:createIcuMessageFn};const si=on.default,ci=mn,li=hn,ui={warningSlowHostCpu:"The tested device appears to have a slower CPU than Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#cpu-throttling)."},di=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/environment.js",ui);function getSlowHostCpuWarning(e){const{settings:t,baseArtifacts:r}=e,{throttling:a,throttlingMethod:n}=t,i=ci.defaultSettings.throttling;if("cli"!==t.channel)return;const o="simulate"===n||"devtools"===n,s=a.cpuSlowdownMultiplier===i.cpuSlowdownMultiplier;return!o||!s||r.BenchmarkIndex>1e3?void 0:di(ui.warningSlowHostCpu)}
|
110
|
-
id:"lh:gather:getVersion"};si.time(t,"verbose");const r=await e.sendCommand("Browser.getVersion"),a=r.product.match(/\/(\d+)/),n=a?parseInt(a[1]):0;return si.timeEnd(t),Object.assign(r,{milestone:n})},getBenchmarkIndex:async function getBenchmarkIndex$2(e){const t={msg:"Benchmarking machine",id:"lh:gather:getBenchmarkIndex"};si.time(t);const r=await e.evaluate(li.computeBenchmarkIndex,{args:[]});return si.timeEnd(t),r},getSlowHostCpuWarning,getEnvironmentWarnings:function getEnvironmentWarnings$2(e){return[getSlowHostCpuWarning(e)].filter((e=>!!e))}};
|
101
|
+
;const On=Ln,{isObjectOfUnknownValues:Fn,isObjectOrArrayOfUnknownValues:Un}=Mn,jn=Pn.default||Pn,Bn="en-US",$n=["ar-XB.json","ar.json","bg.json","ca.json","cs.json","da.json","de.json","el.json","en-GB.json","en-US.ctc.json","en-US.json","en-XA.json","en-XL.ctc.json","en-XL.json","es-419.json","es.json","fi.json","fil.json","fr.json","he.json","hi.json","hr.json","hu.json","id.json","it.json","ja.json","ko.json","lt.json","lv.json","nl.json","no.json","pl.json","pt-PT.json","pt.json","ro.json","ru.json","sk.json","sl.json","sr-Latn.json","sr.json","sv.json","ta.json","te.json","th.json","tr.json","uk.json","vi.json","zh-HK.json","zh-TW.json","zh.json"].filter((e=>e.endsWith(".json")&&!e.endsWith(".ctc.json"))).map((e=>e.replace(".json",""))).sort(),qn=/ | [^\s]+$/,zn={number:{bytes:{maximumFractionDigits:0},milliseconds:{maximumFractionDigits:0},seconds:{minimumFractionDigits:1,maximumFractionDigits:1},extendedPercent:{maximumFractionDigits:2,style:"percent"}}}
|
102
|
+
;function collectAllCustomElementsFromICU(e,t=new Map){for(const r of e)if("argumentElement"===r.type&&(t.set(r.id,r),r.format&&"pluralFormat"===r.format.type))for(const e of r.format.options)collectAllCustomElementsFromICU(e.value.elements,t);return t}function formatMessage$1(e,t={},r){const a="en-XA"===r||"en-XL"===r?"de-DE":r,n=new(On.IntlMessageFormat||On)(e,a,zn),i=function _preformatValues(e,t,r){const a=[...collectAllCustomElementsFromICU(e.getAst().elements).values()],n={};for(const{id:e,format:i}of a){if(e&&e in t==0)throw new Error(`ICU Message "${r}" contains a value reference ("${e}") that wasn't provided`);const a=t[e];if(i&&"numberFormat"===i.type){if("number"!=typeof a)throw new Error(`ICU Message "${r}" contains a numeric reference ("${e}") but provided value was not a number`);"milliseconds"===i.style?n[e]=10*Math.round(a/10):"seconds"===i.style&&"timeInMs"===e?n[e]=Math.round(a/100)/10:"bytes"===i.style?n[e]=a/1024:n[e]=a}else n[e]=a}
|
103
|
+
for(const e of Object.keys(t))if(!(e in n)){if("errorCode"!==e)throw new Error(`Provided value "${e}" does not match any placeholder in ICU message "${r}"`);n.errorCode=t.errorCode}return n}(n,t,e);return n.format(i)}function isIcuMessage$2(e){if(!Fn(e))return!1;const{i18nId:t,values:r,formattedDefault:a}=e;if("string"!=typeof t)return!1;if("string"!=typeof a)return!1;if(void 0!==r){if(!Fn(r))return!1;for(const e of Object.values(r))if("string"!=typeof e&&"number"!=typeof e)return!1}return qn.test(t)}function getFormatted(e,t){if(isIcuMessage$2(e))return function _localizeIcuMessage(e,t){const r=_getLocaleMessages(t)[e.i18nId];return r?formatMessage$1(r.message,e.values,t):e.formattedDefault}(e,t);if("string"==typeof e)return e;throw new Error("Attempted to format invalid icuMessage type")}function _formatPathAsString(e){let t="";for(const r of e)if(/^[a-z]+$/i.test(r))t.length&&(t+="."),t+=r;else{if(/]|"|'|\s/.test(r))throw new Error(`Cannot handle "${r}" in i18n`);t+=`[${r}]`}
|
104
|
+
return t}function _getLocaleMessages(e){const t=jn[e];if(!t){if(e===Bn)return{};throw new Error(`Unsupported locale '${e}'`)}return t}function getIcuMessageIdParts(e){if(!qn.test(e))throw Error(`"${e}" does not appear to be a valid ICU message id`);const[t,r]=e.split(" | ");return{filename:t,key:r}}var Vn={DEFAULT_LOCALE:Bn,_formatPathAsString,collectAllCustomElementsFromICU,isIcuMessage:isIcuMessage$2,getFormatted,getRendererFormattedStrings:function getRendererFormattedStrings(e){const t=_getLocaleMessages(e),r=Object.keys(t).filter((e=>e.startsWith("report/"))),a={};for(const e of r){const{filename:r,key:n}=getIcuMessageIdParts(e);if(!r.endsWith("util.js"))throw new Error(`Unexpected message: ${e}`);a[n]=t[e].message}return a},replaceIcuMessages:function replaceIcuMessages(e,t){const r={};return function replaceInObject(e,r,a=[]){if(Un(e))for(const[n,i]of Object.entries(e)){const o=a.concat([n]);if(isIcuMessage$2(i)){
|
105
|
+
const a=getFormatted(i,t),s=r[i.i18nId]||[],c=_formatPathAsString(o);s.push(i.values?{values:i.values,path:c}:c),e[n]=a,r[i.i18nId]=s}else replaceInObject(i,r,o)}}(e,r),r},hasLocale:function hasLocale(e){if(e===Bn)return!0;const t=Intl.NumberFormat.supportedLocalesOf([e]).length>0,r=Boolean(jn[e]);return t&&r},registerLocaleData:function registerLocaleData(e,t){jn[e]=t},formatMessage:formatMessage$1,getIcuMessageIdParts,getAvailableLocales:function getAvailableLocales$1(){return[...new Set([...Object.keys(jn),Bn])].sort()},getCanonicalLocales:function getCanonicalLocales(){return $n}};const Wn=globalThis.URL;var Gn=getAugmentedNamespace(Object.freeze({__proto__:null,URL:Wn}));const Hn=wn,Yn=bn,Kn=Gn;var Jn={LH_ROOT:"",readJson(e,t){const r=t?Yn.dirname(Kn.fileURLToPath(t.url)):"";return e=Yn.resolve(r,e),JSON.parse(Hn.readFileSync(e,"utf-8"))}};const Xn=bn,Zn=function lookupClosestLocale(e,t){if("string"==typeof e&&t[e])return e
|
106
|
+
;for(var r=[].concat(e||[]),a=0,n=r.length;a<n;++a)for(var i=r[a].split("-");i.length;){var o=i.join("-");if(t[o])return o;i.pop()}},{getAvailableLocales:Qn}=Vn,ei=on.default,{LH_ROOT:ti}=Jn,{isIcuMessage:ri,formatMessage:ai,DEFAULT_LOCALE:ni}=Vn,ii={ms:"{timeInMs, number, milliseconds} ms",seconds:"{timeInMs, number, seconds} s",displayValueByteSavings:"Potential savings of {wastedBytes, number, bytes} KiB",displayValueMsSavings:"Potential savings of {wastedMs, number, milliseconds} ms",displayValueElementsFound:"{nodeCount, plural, =1 {1 element found} other {# elements found}}",columnURL:"URL",columnSize:"Size",columnResourceSize:"Resource Size",columnTransferSize:"Transfer Size",columnCacheTTL:"Cache TTL",columnWastedBytes:"Potential Savings",columnWastedMs:"Potential Savings",columnBlockingTime:"Main-Thread Blocking Time",columnTimeSpent:"Time Spent",columnLocation:"Location",columnResourceType:"Resource Type",columnRequests:"Requests",columnName:"Name",columnSource:"Source",
|
107
|
+
columnOverBudget:"Over Budget",columnElement:"Element",columnStartTime:"Start Time",columnDuration:"Duration",columnFailingElem:"Failing Elements",columnDescription:"Description",totalResourceType:"Total",documentResourceType:"Document",scriptResourceType:"Script",stylesheetResourceType:"Stylesheet",imageResourceType:"Image",mediaResourceType:"Media",fontResourceType:"Font",otherResourceType:"Other",thirdPartyResourceType:"Third-party",otherResourcesLabel:"Other resources",firstContentfulPaintMetric:"First Contentful Paint",interactiveMetric:"Time to Interactive",firstMeaningfulPaintMetric:"First Meaningful Paint",totalBlockingTimeMetric:"Total Blocking Time",maxPotentialFIDMetric:"Max Potential First Input Delay",speedIndexMetric:"Speed Index",largestContentfulPaintMetric:"Largest Contentful Paint",cumulativeLayoutShiftMetric:"Cumulative Layout Shift",interactionToNextPaint:"Interaction to Next Paint",itemSeverityLow:"Low",itemSeverityMedium:"Medium",itemSeverityHigh:"High"}
|
108
|
+
;function createIcuMessageFn(e,t){const r={...ii,...t};return(a,n)=>{const i=Object.keys(r).find((e=>r[e]===a));if(!i)throw new Error(`Could not locate: ${a}`);const o=i in t?e:"lighthouse-core/lib/i18n/i18n.js";return{i18nId:`${Xn.relative(ti,o).replace(/\\/g,"/")} | ${i}`,values:n,formattedDefault:ai(a,n,ni)}}}var oi={UIStrings:ii,lookupLocale:function lookupLocale(e,t){if("object"!=typeof Intl)throw new Error("Lighthouse must be run in Node with `Intl` support. See https://nodejs.org/api/intl.html for help");const r=Intl.getCanonicalLocales(e),a=Intl.NumberFormat.supportedLocalesOf(r),n=t||Qn(),i=Object.fromEntries(n.map((e=>[e,{}]))),o=Zn(a,i);return o||(0===Intl.NumberFormat.supportedLocalesOf("es").length&&ei.warn("i18n","Requested locale not available in this version of node. The `full-icu` npm module can provide additional locales. For help, see https://github.com/GoogleChrome/lighthouse/blob/master/readme.md#how-do-i-get-localized-lighthouse-results-via-the-cli"),
|
109
|
+
ei.warn("i18n",`locale(s) '${e}' not available. Falling back to default '${ni}'`)),o||ni},createIcuMessageFn,isStringOrIcuMessage:function isStringOrIcuMessage(e){return"string"==typeof e||ri(e)},createMessageInstanceIdFn:createIcuMessageFn};const si=on.default,ci=mn,li=hn,ui={warningSlowHostCpu:"The tested device appears to have a slower CPU than Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#cpu-throttling)."},di=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/environment.js",ui);function getSlowHostCpuWarning(e){const{settings:t,baseArtifacts:r}=e,{throttling:a,throttlingMethod:n}=t,i=ci.defaultSettings.throttling;if("cli"!==t.channel)return;const o="simulate"===n||"devtools"===n,s=a.cpuSlowdownMultiplier===i.cpuSlowdownMultiplier;return!o||!s||r.BenchmarkIndex>1e3?void 0:di(ui.warningSlowHostCpu)}
|
110
|
+
var mi={UIStrings:ui,getBrowserVersion:async function getBrowserVersion$3(e){const t={msg:"Getting browser version",id:"lh:gather:getVersion"};si.time(t,"verbose");const r=await e.sendCommand("Browser.getVersion"),a=r.product.match(/\/(\d+)/),n=a?parseInt(a[1]):0;return si.timeEnd(t),Object.assign(r,{milestone:n})},getBenchmarkIndex:async function getBenchmarkIndex$2(e){const t={msg:"Benchmarking machine",id:"lh:gather:getBenchmarkIndex"};si.time(t);const r=await e.evaluate(li.computeBenchmarkIndex,{args:[]});return si.timeEnd(t),r},getSlowHostCpuWarning,getEnvironmentWarnings:function getEnvironmentWarnings$2(e){return[getSlowHostCpuWarning(e)].filter((e=>!!e))}};
|
111
111
|
/**
|
112
112
|
* @license Copyright 2020 Google Inc. All Rights Reserved.
|
113
113
|
* 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
|
@@ -138,7 +138,7 @@ opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Esti
|
|
138
138
|
viewTraceLabel:"View Trace",viewOriginalTraceLabel:"View Original 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",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G4",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page load",runtimeAnalysisWindow:"Initial page load",runtimeSingleLoadTooltip:"This data is taken from a single page load, as opposed to field data summarizing many sessions.",
|
139
139
|
throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expandView:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling"};Util$3.UIStrings=Ii;var Ni={Util:Util$3,UIStrings:Ii};const{Util:Li}=Ni,Mi=vi.exports,Pi=["https:","http:","chrome:","chrome-extension:"],Oi=["data","https","wss","blob","chrome","chrome-extension","about","filesystem"],Fi=["localhost","127.0.0.1"],Ui=["blob","data","intent","file","filesystem"];function rewriteChromeInternalUrl(e){return e&&e.startsWith("chrome://")?(e.endsWith("/")&&(e=e.replace(/\/$/,"")),e.replace(/^chrome:\/\/chrome\//,"chrome://")):e}class URLShim extends URL{static isValid(e){try{return new URL(e),!0}catch(e){return!1}}static hostsMatch(e,t){try{return new URL(e).host===new URL(t).host}catch(e){return!1}}static originsMatch(e,t){try{return new URL(e).origin===new URL(t).origin}catch(e){return!1}}static getOrigin(e){try{const t=new URL(e);return t.host&&t.origin||null
|
140
140
|
}catch(e){return null}}static rootDomainsMatch(e,t){let r,a;try{r=Li.createOrReturnURL(e),a=Li.createOrReturnURL(t)}catch(e){return!1}if(!r.hostname||!a.hostname)return!1;return Li.getRootDomain(r)===Li.getRootDomain(a)}static getURLDisplayName(e,t){return Li.getURLDisplayName(new URL(e),t)}static elideDataURI(e){try{return"data:"===new URL(e).protocol?e.slice(0,100):e}catch(t){return e}}static equalWithExcludedFragments(e,t){[e,t]=[e,t].map(rewriteChromeInternalUrl);try{const r=new URL(e);r.hash="";const a=new URL(t);return a.hash="",r.href===a.href}catch(e){return!1}}static isProtocolAllowed(e){try{const t=new URL(e);return Pi.includes(t.protocol)}catch(e){return!1}}static isLikeLocalhost(e){return Fi.includes(e)||e.endsWith(".localhost")}static isSecureScheme(e){return Oi.includes(e)}static isNonNetworkProtocol(e){const t=e.includes(":")?e.slice(0,e.indexOf(":")):e;return Ui.includes(t)}static guessMimeType(e){let t;try{t=new URL(e)}catch{return}if("data:"===t.protocol){
|
141
|
-
const e=t.pathname.match(
|
141
|
+
const e=t.pathname.match(/^(image\/(png|jpeg|svg\+xml|webp|gif|avif))[;,]/);if(!e)return;return e[1]}const r=t.pathname.toLowerCase().match(/\.(png|jpeg|jpg|svg|webp|gif|avif)$/);if(!r)return;const a=r[1];return"svg"===a?"image/svg+xml":"jpg"===a?"image/jpeg":`image/${a}`}static normalizeUrl(e){if(e&&this.isValid(e)&&this.isProtocolAllowed(e))return new URL(e).href;throw new Mi(Mi.errors.INVALID_URL)}}URLShim.URL=URL,URLShim.INVALID_URL_DEBUG_STRING="Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.";var ji=URLShim;const Bi=ji,$i="X-TCPMs",qi="X-SSLMs",zi="X-RequestMs",Vi="X-ResponseMs",Wi="X-TotalMs",Gi="X-TotalFetchedSize",Hi="X-ProtocolIsH2",Yi={XHR:"XHR",Fetch:"Fetch",EventSource:"EventSource",Script:"Script",Stylesheet:"Stylesheet",Image:"Image",Media:"Media",Font:"Font",Document:"Document",TextTrack:"TextTrack",WebSocket:"WebSocket",Other:"Other",Manifest:"Manifest",
|
142
142
|
SignedExchange:"SignedExchange",Ping:"Ping",Preflight:"Preflight",CSPViolationReport:"CSPViolationReport"};class NetworkRequest$p{constructor(){this.requestId="",this.connectionId="0",this.connectionReused=!1,this.url="",this.protocol="",this.isSecure=!1,this.isValid=!1,this.parsedURL={scheme:""},this.documentURL="",this.startTime=-1,this.endTime=-1,this.responseReceivedTime=-1,this.transferSize=0,this.resourceSize=0,this.fromDiskCache=!1,this.fromMemoryCache=!1,this.fromPrefetchCache=!1,this.lrStatistics=void 0,this.finished=!1,this.requestMethod="",this.statusCode=-1,this.redirectSource=void 0,this.redirectDestination=void 0,this.redirects=void 0,this.failed=!1,this.localizedFailDescription="",this.initiator={type:"other"},this.timing=void 0,this.resourceType=void 0,this.mimeType="",this.priority="Low",this.initiatorRequest=void 0,this.responseHeaders=[],this.responseHeadersText="",this.fetchedViaServiceWorker=!1,this.frameId="",this.sessionId=void 0,this.isLinkPreload=!1}
|
143
143
|
hasErrorStatusCode(){return this.statusCode>=400}setInitiatorRequest(e){this.initiatorRequest=e}onRequestWillBeSent(e){let t;this.requestId=e.requestId;try{t=new Bi(e.request.url)}catch(e){return}this.url=e.request.url,this.documentURL=e.documentURL,this.parsedURL={scheme:t.protocol.split(":")[0],host:t.hostname,securityOrigin:t.origin},this.isSecure=Bi.isSecureScheme(this.parsedURL.scheme),this.startTime=e.timestamp,this.requestMethod=e.request.method,this.initiator=e.initiator,this.resourceType=e.type&&Yi[e.type],this.priority=e.request.initialPriority,this.frameId=e.frameId,this.isLinkPreload="preload"===e.initiator.type||!!e.request.isLinkPreload,this.isValid=!0}onRequestServedFromCache(){this.fromMemoryCache=!0}onResponseReceived(e){this._onResponse(e.response,e.timestamp,e.type),this._updateProtocolForLightrider(),this.frameId=e.frameId}onDataReceived(e){this.resourceSize+=e.dataLength,-1!==e.encodedDataLength&&(this.transferSize+=e.encodedDataLength)}onLoadingFinished(e){
|
144
144
|
this.finished||(this.finished=!0,this.endTime=e.timestamp,e.encodedDataLength>=0&&(this.transferSize=e.encodedDataLength),this._updateResponseReceivedTimeIfNecessary(),this._updateTransferSizeForLightrider(),this._updateTimingsForLightrider())}onLoadingFailed(e){this.finished||(this.finished=!0,this.endTime=e.timestamp,this.failed=!0,this.resourceType=e.type&&Yi[e.type],this.localizedFailDescription=e.errorText,this._updateResponseReceivedTimeIfNecessary(),this._updateTransferSizeForLightrider(),this._updateTimingsForLightrider())}onResourceChangedPriority(e){this.priority=e.newPriority}onRedirectResponse(e){if(!e.redirectResponse)throw new Error("Missing redirectResponse data");this._onResponse(e.redirectResponse,e.timestamp,e.type),this.resourceType=void 0,this.finished=!0,this.endTime=e.timestamp,this._updateResponseReceivedTimeIfNecessary()}setSession(e){this.sessionId=e}_onResponse(e,t,r){this.url=e.url,this.connectionId=String(e.connectionId),
|
@@ -178,7 +178,7 @@ if(!Number.isFinite(r.receiveHeadersEnd)||r.receiveHeadersEnd<0)return;if(!Numbe
|
|
178
178
|
static estimateRTTByOrigin(e,t){const{forceCoarseEstimates:r=!1,coarseEstimateMultiplier:a=.3,useDownloadEstimates:n=!0,useSendStartEstimates:i=!0,useHeadersEndEstimates:o=!0}=t||{};let s=NetworkAnalyzer$b._estimateRTTByOriginViaTCPTiming(e);if(!s.size||r){s=new Map;const t=NetworkAnalyzer$b._estimateRTTByOriginViaDownloadTiming(e),r=NetworkAnalyzer$b._estimateRTTByOriginViaSendStartTiming(e),c=NetworkAnalyzer$b._estimateRTTByOriginViaHeadersEndTiming(e);for(const[e,r]of t.entries())n&&s.set(e,r);for(const[e,t]of r.entries()){if(!i)continue;const r=s.get(e)||[];s.set(e,r.concat(t))}for(const[e,t]of c.entries()){if(!o)continue;const r=s.get(e)||[];s.set(e,r.concat(t))}for(const e of s.values())e.forEach(((t,r)=>e[r]=t*a))}if(!s.size)throw new Error("No timing information available");return NetworkAnalyzer$b.summarize(s)}static estimateServerResponseTimeByOrigin(e,t){let r=(t||{}).rttByOrigin;if(!r){r=new Map;const a=NetworkAnalyzer$b.estimateRTTByOrigin(e,t)
|
179
179
|
;for(const[e,t]of a.entries())r.set(e,t.min)}const a=NetworkAnalyzer$b._estimateResponseTimeByOrigin(e,r);return NetworkAnalyzer$b.summarize(a)}static estimateThroughput(e){let t=0;const r=e.reduce(((e,r)=>("data"===r.parsedURL?.scheme||r.failed||!r.finished||r.statusCode>300||!r.transferSize||(t+=r.transferSize,e.push({time:r.responseReceivedTime,isStart:!0}),e.push({time:r.endTime,isStart:!1})),e)),[]).sort(((e,t)=>e.time-t.time));if(!r.length)return 1/0;let a=0,n=0,i=0;return r.forEach((e=>{e.isStart?(0===a&&(n=e.time),a++):(a--,0===a&&(i+=e.time-n))})),8*t/i}static findMainDocument(e,t){const r=NetworkAnalyzer$b.findOptionalMainDocument(e,t);if(!r)throw new Error("Unable to identify the main resource");return r}static findOptionalMainDocument(e,t){if(t){const r=e.find((e=>t.startsWith(e.url)&&Po.equalWithExcludedFragments(e.url,t)));if(r)return r}const r=e.filter((e=>e.resourceType===Mo.TYPES.Document));if(r.length)return r.reduce(((e,t)=>t.startTime<e.startTime?t:e))}
|
180
180
|
static resolveRedirects(e){for(;e.redirectDestination;)e=e.redirectDestination;return e}}var Fo=NetworkAnalyzer$b;const Uo=vi.exports,jo=Fo;function getNetworkError(e){if(!e)return new Uo(Uo.errors.NO_DOCUMENT_REQUEST);if(e.failed){const t=e.localizedFailDescription;return"net::ERR_NAME_NOT_RESOLVED"===t||"net::ERR_NAME_RESOLUTION_FAILED"===t||t.startsWith("net::ERR_DNS_")?new Uo(Uo.errors.DNS_FAILURE):new Uo(Uo.errors.FAILED_DOCUMENT_REQUEST,{errorDetails:t})}return e.hasErrorStatusCode()?new Uo(Uo.errors.ERRORED_DOCUMENT_REQUEST,{statusCode:`${e.statusCode}`}):void 0}function getInterstitialError(e,t){if(!e)return;return t.find((e=>e.documentURL.startsWith("chrome-error://")))&&e.failed?e.localizedFailDescription.startsWith("net::ERR_CERT")?new Uo(Uo.errors.INSECURE_DOCUMENT_REQUEST,{securityMessages:e.localizedFailDescription}):new Uo(Uo.errors.CHROME_INTERSTITIAL_ERROR):void 0}function getNonHtmlError(e){if(e)return"text/html"!==e.mimeType?new Uo(Uo.errors.NOT_HTML,{
|
181
|
-
mimeType:e.mimeType}):void 0}var Bo={getNetworkError,getInterstitialError,getPageLoadError:function getPageLoadError$2(e,t){const{url:r,loadFailureMode:a,networkRecords:n}=t;let i,o;try{i=jo.findMainDocument(n,r)}catch(e){}i&&(o=jo.resolveRedirects(i));const s=getNetworkError(i),c=getInterstitialError(i,n),l=getNonHtmlError(o);if("ignore"!==a)return c||(s||(l||e))},getNonHtmlError};var $o=getAugmentedNamespace(Object.freeze({__proto__:null,version:"9.6.
|
181
|
+
mimeType:e.mimeType}):void 0}var Bo={getNetworkError,getInterstitialError,getPageLoadError:function getPageLoadError$2(e,t){const{url:r,loadFailureMode:a,networkRecords:n}=t;let i,o;try{i=jo.findMainDocument(n,r)}catch(e){}i&&(o=jo.resolveRedirects(i));const s=getNetworkError(i),c=getInterstitialError(i,n),l=getNonHtmlError(o);if("ignore"!==a)return c||(s||(l||e))},getNonHtmlError};var $o=getAugmentedNamespace(Object.freeze({__proto__:null,version:"9.6.6"}));const{version:qo}=$o,zo={latency:0,downloadThroughput:0,uploadThroughput:0,offline:!1},Vo={rate:1};function parseUseragentIntoMetadata(e,t){const r=e.match(/Chrome\/([\d.]+)/)?.[1]||"99.0.1234.0",[a]=r.split(".",1),n="mobile"===t;return{brands:[{brand:"Chromium",version:a},{brand:"Google Chrome",version:a},{brand:"Lighthouse",version:qo}],fullVersion:r,...n?{platform:"Android",platformVersion:"6.0",architecture:"",model:"Moto G4"}:{platform:"macOS",platformVersion:"10.15.7",architecture:"x86",model:""},mobile:n}}
|
182
182
|
function enableNetworkThrottling(e,t){const r={offline:!1,latency:t.requestLatencyMs||0,downloadThroughput:t.downloadThroughputKbps||0,uploadThroughput:t.uploadThroughputKbps||0};return r.downloadThroughput=Math.floor(1024*r.downloadThroughput/8),r.uploadThroughput=Math.floor(1024*r.uploadThroughput/8),e.sendCommand("Network.emulateNetworkConditions",r)}function clearNetworkThrottling(e){return e.sendCommand("Network.emulateNetworkConditions",zo)}function enableCPUThrottling(e,t){const r=t.cpuSlowdownMultiplier;return e.sendCommand("Emulation.setCPUThrottlingRate",{rate:r})}function clearCPUThrottling(e){return e.sendCommand("Emulation.setCPUThrottlingRate",Vo)}var Wo={emulate:async function emulate(e,t){if(!1!==t.emulatedUserAgent){const r=t.emulatedUserAgent;await e.sendCommand("Network.setUserAgentOverride",{userAgent:r,userAgentMetadata:parseUseragentIntoMetadata(r,t.formFactor)})}if(!0!==t.screenEmulation.disabled){
|
183
183
|
const{width:r,height:a,deviceScaleFactor:n,mobile:i}=t.screenEmulation,o={width:r,height:a,deviceScaleFactor:n,mobile:i};await e.sendCommand("Emulation.setDeviceMetricsOverride",o),await e.sendCommand("Emulation.setTouchEmulationEnabled",{enabled:o.mobile})}},throttle:async function throttle(e,t){if("devtools"!==t.throttlingMethod)return clearNetworkThrottling(e);await Promise.all([enableNetworkThrottling(e,t.throttling),enableCPUThrottling(e,t.throttling)])},clearThrottling:async function clearThrottling(e){await Promise.all([clearNetworkThrottling(e),clearCPUThrottling(e)])},enableNetworkThrottling,clearNetworkThrottling,enableCPUThrottling,clearCPUThrottling};const Go=on.default,Ho={
|
184
184
|
warningData:"{locationCount, plural,\n =1 {There may be stored data affecting loading performance in this location: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}\n other {There may be stored data affecting loading performance in these locations: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}\n }"},Yo=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/storage.js",Ho);var Ko={clearDataForOrigin:async function clearDataForOrigin(e,t){const r={msg:"Cleaning origin data",id:"lh:storage:clearDataForOrigin"};Go.time(r);const a=new URL(t).origin,n=["file_systems","shader_cache","service_workers","cache_storage"].join(",");e.setNextProtocolTimeout(5e3);try{await e.sendCommand("Storage.clearDataForOrigin",{origin:a,storageTypes:n})}catch(e){if("PROTOCOL_TIMEOUT"!==e.code)throw e;Go.warn("Driver","clearDataForOrigin timed out")}finally{Go.timeEnd(r)}},
|
@@ -250,7 +250,7 @@ icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18
|
|
250
250
|
"uses-long-cache-ttl":'Set the "Browser and proxy cache maximum age" in the "Administration » Configuration » Development" page. Read about [Drupal cache and optimizing for performance](https://www.drupal.org/docs/7/managing-site-performance-and-scalability/caching-to-improve-performance/caching-overview#s-drupal-performance-resources).',"uses-optimized-images":"Consider using [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=im_vid_3%3A123&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=optimize+images&solrsort=iss_project_release_usage+desc&op=Search) that automatically optimizes and reduces the size of images uploaded through the site while retaining quality. Also, ensure you are using the native [Responsive Image Styles](https://www.drupal.org/docs/8/mobile-guide/responsive-images-in-drupal-8) provided from Drupal (available in Drupal 8 and above) for all images rendered on the site.",
|
251
251
|
"uses-responsive-images":"Ensure that you are using the native [Responsive Image Styles](https://www.drupal.org/docs/8/mobile-guide/responsive-images-in-drupal-8) provided from Drupal (available in Drupal 8 and above). Use the Responsive Image Styles when rendering image fields through view modes, views, or images uploaded through the WYSIWYG editor.","server-response-time":"Themes, modules, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization module, and/or upgrading your server. Your hosting servers should make use of PHP opcode caching, memory-caching to reduce database query times such as Redis or Memcached, as well as optimized application logic to prepare pages faster.",
|
252
252
|
"uses-rel-preconnect":"Preconnect or dns-prefetch resource hints can be added by installing and configuring [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=dns-prefetch&solrsort=iss_project_release_usage+desc&op=Search) that provides facilities for user agent resource hints.","font-display":"Specify `@font-display` when defining custom fonts in your theme."}},{id:"ezoic",title:"Ezoic",
|
253
|
-
icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 82 82"><path d="M81.37 48.117C85.301 25.821 70.413 4.56 48.117.63 25.821-3.3 4.56 11.586.63 33.883-3.3 56.178 11.586 77.44 33.883 81.37 56.18 85.301 77.44 70.412 81.37 48.117Zm-8.935-14.17c2.77 12.357-1.942 25.721-12.96 33.436-14.57 10.203-34.656 6.662-44.859-7.909a32.434 32.434 0 0 1-2.869-4.98l28.7-20.097a6.53 6.53 0 1 0-3.744-5.347L9.564 48.054c-2.768-12.359 1.943-25.724 12.96-33.439 14.572-10.203 34.656-6.662 44.86 7.91a32.349 32.349 0 0 1 2.868 4.98L41.554 47.6A6.53 6.53 0 1 0 45.3 52.95l27.136-19.003Z" fill="
|
253
|
+
icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 82 82"><path d="M81.37 48.117C85.301 25.821 70.413 4.56 48.117.63 25.821-3.3 4.56 11.586.63 33.883-3.3 56.178 11.586 77.44 33.883 81.37 56.18 85.301 77.44 70.412 81.37 48.117Zm-8.935-14.17c2.77 12.357-1.942 25.721-12.96 33.436-14.57 10.203-34.656 6.662-44.859-7.909a32.434 32.434 0 0 1-2.869-4.98l28.7-20.097a6.53 6.53 0 1 0-3.744-5.347L9.564 48.054c-2.768-12.359 1.943-25.724 12.96-33.439 14.572-10.203 34.656-6.662 44.86 7.91a32.349 32.349 0 0 1 2.868 4.98L41.554 47.6A6.53 6.53 0 1 0 45.3 52.95l27.136-19.003Z" fill="%235FA624" fill-rule="evenodd"/></svg>',UIStrings:{"unused-css-rules":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Remove Unused CSS` to help with this issue. It will identify the CSS classes that are actually used on each page of your site, and remove any others to keep the file size small.",
|
254
254
|
"modern-image-formats":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Next-Gen Formats` to convert images to WebP.","offscreen-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Lazy Load Images` to defer loading off-screen images until they are needed.","render-blocking-resources":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Critical CSS` and `Script Delay` to defer non-critical JS/CSS.","unminified-css":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Minify CSS` to automatically minify your CSS to reduce network payload sizes.","unminified-javascript":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Minify Javascript` to automatically minify your JS to reduce network payload sizes.","uses-long-cache-ttl":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Efficient Static Cache Policy` to set recommended values in the caching header for static assests.",
|
255
255
|
"uses-optimized-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Next-Gen Formats` to convert images to WebP.","uses-responsive-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Resize Images` to resize images to a device appropriate size, reducing network payload sizes.","server-response-time":"Use [Ezoic Cloud Caching](https://pubdash.ezoic.com/speed/caching) to cache your content across our world wide network, improving time to first byte.","uses-rel-preconnect":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Pre-Connect Origins` to automatically add `preconnect` resource hints to establish early connections to important third-party origins.","uses-rel-preload":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Preload Fonts` and `Preload Background Images` to add `preload` links to prioritize fetching resources that are currently requested later in page load.",
|
256
256
|
"font-display":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Optimize Fonts` to automatically leverage the `font-display` CSS feature to ensure text is user-visible while webfonts are loading."}},{id:"joomla",title:"Joomla",
|
@@ -276,10 +276,10 @@ icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 31
|
|
276
276
|
"uses-text-compression":"Enable text compression in the web server configuration.","uses-responsive-images":"Upload images directly in the media manager to ensure the required image sizes are available. Consider using the [resize filter](https://octobercms.com/docs/markup/filter-resize) or an [image resizing plugin](https://octobercms.com/plugins?search=image) to ensure the optimal image sizes are used.","server-response-time":"Themes, plugins and server specifications all contribute to the server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin and/or upgrade the server. October CMS also allows developers to use [`Queues`](https://octobercms.com/docs/services/queues) to defer the processing of a time consuming task, such as sending an e-mail. This drastically speeds up web requests."}},{id:"react",title:"React",
|
277
277
|
icon:'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"%3E %3Cg fill="%2361DAFB"%3E%3Cpath d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/%3E %3Ccircle cx="420.9" cy="296.5" r="45.7"/%3E %3Cpath d="M520.5 78.1z"/%3E%3C/g%3E%3C/svg%3E',
|
278
278
|
UIStrings:{"unminified-css":"If your build system minifies CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unminified-javascript":"If your build system minifies JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unused-javascript":"If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://www.smooth-code.com/open-source/loadable-components/docs/getting-started/).",
|
279
|
-
"server-response-time":"If you are server-side rendering any React components, consider using `
|
279
|
+
"server-response-time":"If you are server-side rendering any React components, consider using `renderToPipeableStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#renderToPipeableStream).",redirects:"If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).","user-timings":"Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)",
|
280
280
|
"dom-size":'Consider using a "windowing" library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unnecessary re-renders using [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [`PureComponent`](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [`React.memo`](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the `Effect` hook to improve runtime performance.'}},{id:"wordpress",title:"WordPress",
|
281
281
|
icon:'data:image/svg+xml,%3Csvg viewBox="0 0 122.5 122.5" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="%232f3439"%3E%3Cpath d="M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z"/%3E%3Cpath d="M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z"/%3E%3Cpath d="M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z"/%3E%3C/g%3E%3C/svg%3E',UIStrings:{
|
282
|
-
"unused-css-rules":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.","modern-image-formats":"Consider using
|
282
|
+
"unused-css-rules":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.","modern-image-formats":"Consider using the [Performance Lab](https://wordpress.org/plugins/performance-lab/) plugin to automatically convert your uploaded JPEG images into WebP, wherever supported.",
|
283
283
|
"offscreen-images":"Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).","total-byte-weight":"Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.","render-blocking-resources":"There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.",
|
284
284
|
"unminified-css":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.","unminified-javascript":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.","efficient-animated-content":"Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.",
|
285
285
|
"unused-javascript":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.","uses-long-cache-ttl":"Read about [Browser Caching in WordPress](https://wordpress.org/support/article/optimization/#browser-caching).","uses-optimized-images":"Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.","uses-text-compression":"You can enable text compression in your web server configuration.",
|
@@ -560,9 +560,9 @@ parent:void 0,children:[],attributableURLs:[],group:Sv.other,selfTime:NaN}}stati
|
|
560
560
|
;for(let t=0;t<e.length;t++){let i=e[t];if("XHRReadyStateChange"===i.event.name){const e=i.event.args.data,t=e?.url;e&&t&&1===e.readyState&&r.xhrs.set(t,i)}for(;a&&Number.isFinite(a.endTime)&&a.endTime<=i.startTime;)MainThreadTasks$9._assignAllTimersUntilTs(a,a.endTime,r,n),a=a.parent;if(a){if(i.endTime>a.endTime){const e=i.endTime-a.endTime;if(e<1e3)a.endTime=i.endTime,a.duration+=e;else if(i.unbounded)i.endTime=a.endTime,i.duration=i.endTime-i.startTime;else{if(!(i.startTime-a.startTime<1e3)||a.children.length){const t=new Error("Fatal trace logic error - child cannot end after parent");throw t.timeDelta=e,t.nextTaskEvent=i.event,t.nextTaskEndEvent=i.endEvent,t.nextTaskEndTime=i.endTime,t.currentTaskEvent=a.event,t.currentTaskEndEvent=a.endEvent,t.currentTaskEndTime=a.endTime,t}{const e=i,t=a,r=a.parent;if(r){const a=r.children.length-1;if(r.children[a]!==t)throw new Error("Fatal trace logic error - impossible children");r.children.pop(),r.children.push(e)}e.parent=r,
|
561
561
|
e.startTime=t.startTime,e.duration=e.endTime-e.startTime,a=e,i=t}}}i.parent=a,a.children.push(i),MainThreadTasks$9._assignAllTimersUntilTs(a,i.startTime,r,n)}a=i}a&&MainThreadTasks$9._assignAllTimersUntilTs(a,a.endTime,r,n)}static _createTasksFromEvents(e,t,r){const a=[],n=[],i=[];for(const t of e)"X"!==t.ph&&"B"!==t.ph||a.push(t),"E"===t.ph&&n.push(t),"TimerInstall"===t.name&&i.push(t);const o=MainThreadTasks$9._createTasksFromStartAndEndEvents(a,n,r).sort(((e,t)=>e.startTime-t.startTime||t.duration-e.duration));return MainThreadTasks$9._createTaskRelationships(o,i,t),o.sort(((e,t)=>e.startTime-t.startTime||t.duration-e.duration))}static _computeRecursiveSelfTime(e,t){if(t&&e.endTime>t.endTime)throw new Error("Fatal trace logic error - child cannot end after parent");const r=e.children.map((t=>MainThreadTasks$9._computeRecursiveSelfTime(t,e))).reduce(((e,t)=>e+t),0);return e.selfTime=e.duration-r,e.duration}static _computeRecursiveAttributableURLs(e,t,r,a){const n=e.event.args,i={
|
562
562
|
...n.beginData||{},...n.data||{}},o=i.frame||"";let s=a.frameURLsById.get(o);const c=(i.stackTrace||[]).map((e=>e.url)),l=c[0];o&&s&&s.startsWith("about:")&&l&&(a.frameURLsById.set(o,l),s=l);let u=[];switch(e.event.name){case"v8.compile":case"EvaluateScript":case"FunctionCall":u=[i.url,s];break;case"v8.compileModule":u=[e.event.args.fileName];break;case"TimerFire":{const t=e.event.args.data.timerId,r=a.timers.get(t);if(!r)break;u=r.attributableURLs;break}case"ParseHTML":u=[i.url,s];break;case"ParseAuthorStyleSheet":u=[i.styleSheetUrl,s];break;case"UpdateLayoutTree":case"Layout":case"Paint":if(s){u=[s];break}if(r.length)break;u=a.lastTaskURLs;break;case"XHRReadyStateChange":case"XHRLoad":{const e=i.url,t=i.readyState;if(!e||"number"==typeof t&&4!==t)break;const r=a.xhrs.get(e);if(!r)break;u=r.attributableURLs;break}default:u=[]}const d=Array.from(t);for(const e of[...u,...c])e&&(r.includes(e)||r.push(e),d[d.length-1]!==e&&d.push(e));e.attributableURLs=d,
|
563
|
-
e.children.forEach((e=>MainThreadTasks$9._computeRecursiveAttributableURLs(e,d,r,a))),d.length||e.parent||!r.length||MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,r)}static _setRecursiveEmptyAttributableURLs(e,t){e.attributableURLs.length||(e.attributableURLs=t.slice(),e.children.forEach((e=>MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,t))))}static _computeRecursiveTaskGroup(e,t){const r=Tv[e.event.name];e.group=r||t||Sv.other,e.children.forEach((t=>MainThreadTasks$9._computeRecursiveTaskGroup(t,e.group)))}static getMainThreadTasks(e,t,r){const
|
564
|
-
|
565
|
-
},l=Math.floor(e/s),u=Math.floor(a/s),d=Math.floor((l+u)/2);for(let e=l;e<=u;e++)t[e]="█";for(let e=0;e<o.length;e++)t[d]=o}u.push(t.join(""))}u.push("");for(const{id:e,task:t}of c.values())u.push(`${e} = ${o(t)}`);return u.join("\n")}}var Ev=MainThreadTasks$9;const xv=Ao,_v=Ev,Av=Yp;var Rv=xv(class MainThreadTasks$8{static async compute_(e,t){const{mainThreadEvents:r,frames:a,timestamps:n}=await Av.request(e,t);return _v.getMainThreadTasks(r,a,n.traceEnd)}},null);const kv=Ki,Dv=new Set(["CpuProfiler::StartProfiling"]),Cv=new Set(["V8.GCCompactor","MajorGC","MinorGC"]);function getJavaScriptURLs$2(e){const t=new Set;for(const r of e)r.resourceType===kv.TYPES.Script&&t.add(r.url);return t}function getAttributableURLForTask$2(e,t){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0];let n=r||a;return n&&"about:blank"!==n||(n=Dv.has(e.event.name)?"Browser":Cv.has(e.event.name)?"Browser GC":"Unattributable"),n}var Iv={getJavaScriptURLs:getJavaScriptURLs$2,
|
563
|
+
e.children.forEach((e=>MainThreadTasks$9._computeRecursiveAttributableURLs(e,d,r,a))),d.length||e.parent||!r.length||MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,r)}static _setRecursiveEmptyAttributableURLs(e,t){e.attributableURLs.length||(e.attributableURLs=t.slice(),e.children.forEach((e=>MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,t))))}static _computeRecursiveTaskGroup(e,t){const r=Tv[e.event.name];e.group=r||t||Sv.other,e.children.forEach((t=>MainThreadTasks$9._computeRecursiveTaskGroup(t,e.group)))}static getMainThreadTasks(e,t,r,a){const n=new Map,i=new Map,o=new Map;t.forEach((({id:e,url:t})=>o.set(e,t)));const s={timers:n,xhrs:i,frameURLsById:o,lastTaskURLs:[]},c=MainThreadTasks$9._createTasksFromEvents(e,s,r);for(const e of c)e.parent||(MainThreadTasks$9._computeRecursiveSelfTime(e,void 0),MainThreadTasks$9._computeRecursiveAttributableURLs(e,[],[],s),MainThreadTasks$9._computeRecursiveTaskGroup(e),s.lastTaskURLs=e.attributableURLs)
|
564
|
+
;const l=a??c[0].startTime;for(const e of c)if(e.startTime=(e.startTime-l)/1e3,e.endTime=(e.endTime-l)/1e3,e.duration/=1e3,e.selfTime/=1e3,!Number.isFinite(e.selfTime))throw new Error("Invalid task timing data");return c}static printTaskTreeToDebugString(e,t={}){const r=Math.max(...e.map((e=>e.endTime)),0),{printWidth:a=100,startTime:n=0,endTime:i=r,taskLabelFn:o=(e=>e.event.name)}=t;function computeTaskDepth(e){let t=0;for(;e.parent;e=e.parent)t++;return t}const s=(i-n)/a,c=new Map,l=new Map;for(const t of e){if(t.startTime>i||t.endTime<n)continue;const e=computeTaskDepth(t),r=l.get(e)||[];r.push(t),l.set(e,r);const a=String.fromCharCode(65+c.size%26);c.set(t,{id:a,task:t})}const u=[`Trace Duration: ${r.toFixed(0)}ms`,`Range: [${n}, ${i}]`,`█ = ${s.toFixed(2)}ms`,""],d=Array.from(l.entries()).sort(((e,t)=>e[0]-t[0]));for(const[,e]of d){const t=Array.from({length:a}).map((()=>" "));for(const r of e){const e=Math.max(r.startTime,n),a=Math.min(r.endTime,i),{id:o}=c.get(r)||{id:"?"
|
565
|
+
},l=Math.floor(e/s),u=Math.floor(a/s),d=Math.floor((l+u)/2);for(let e=l;e<=u;e++)t[e]="█";for(let e=0;e<o.length;e++)t[d]=o}u.push(t.join(""))}u.push("");for(const{id:e,task:t}of c.values())u.push(`${e} = ${o(t)}`);return u.join("\n")}}var Ev=MainThreadTasks$9;const xv=Ao,_v=Ev,Av=Yp;var Rv=xv(class MainThreadTasks$8{static async compute_(e,t){const{mainThreadEvents:r,frames:a,timestamps:n}=await Av.request(e,t);return _v.getMainThreadTasks(r,a,n.traceEnd,n.timeOrigin)}},null);const kv=Ki,Dv=new Set(["CpuProfiler::StartProfiling"]),Cv=new Set(["V8.GCCompactor","MajorGC","MinorGC"]);function getJavaScriptURLs$2(e){const t=new Set;for(const r of e)r.resourceType===kv.TYPES.Script&&t.add(r.url);return t}function getAttributableURLForTask$2(e,t){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0];let n=r||a;return n&&"about:blank"!==n||(n=Dv.has(e.event.name)?"Browser":Cv.has(e.event.name)?"Browser GC":"Unattributable"),n}var Iv={getJavaScriptURLs:getJavaScriptURLs$2,
|
566
566
|
getAttributableURLForTask:getAttributableURLForTask$2,getExecutionTimingsByURL:function getExecutionTimingsByURL$2(e,t){const r=getJavaScriptURLs$2(t),a=new Map;for(const t of e){const e=getAttributableURLForTask$2(t,r),n=a.get(e)||{},i=n[t.group.id]||0;n[t.group.id]=i+t.selfTime,a.set(e,n)}return a}};const Nv=kc,{taskGroups:Lv}=wv,Mv=oi,Pv=Lo,Ov=Rv,{getExecutionTimingsByURL:Fv}=Iv,Uv={title:"JavaScript execution time",failureTitle:"Reduce JavaScript execution time",description:"Consider reducing the time spent parsing, compiling, and executing JS. You may find delivering smaller JS payloads helps with this. [Learn more](https://web.dev/bootup-time/).",columnTotal:"Total CPU Time",columnScriptEval:"Script Evaluation",columnScriptParse:"Script Parse",chromeExtensionsWarning:"Chrome extensions negatively affected this page's load performance. Try auditing the page in incognito mode or from a Chrome profile without extensions."
|
567
567
|
},jv=Mv.createMessageInstanceIdFn("lighthouse-core/audits/bootup-time.js",Uv);class BootupTime extends Nv{static get meta(){return{id:"bootup-time",title:jv(Uv.title),failureTitle:jv(Uv.failureTitle),description:jv(Uv.description),scoreDisplayMode:Nv.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","devtoolsLogs"]}}static get defaultOptions(){return{p10:1282,median:3500,thresholdInMs:50}}static async audit(e,t){const r=t.settings||{},a=e.traces[BootupTime.DEFAULT_PASS],n=e.devtoolsLogs[BootupTime.DEFAULT_PASS],i=await Pv.request(n,t),o=await Ov.request(a,t),s="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,c=Fv(o,i);let l=!1,u=0;const d=Array.from(c).map((([e,r])=>{let a=0;for(const[e,t]of Object.entries(r))r[e]=t*s,a+=t*s;const n=r[Lv.scriptEvaluation.id]||0,i=r[Lv.scriptParseCompile.id]||0;return a>=t.options.thresholdInMs&&(u+=n+i),l=l||e.startsWith("chrome-extension:")&&n>100,{url:e,total:a,scripting:n,scriptParseCompile:i}
|
568
568
|
})).filter((e=>e.total>=t.options.thresholdInMs)).sort(((e,t)=>t.total-e.total));let m;l&&(m=[jv(Uv.chromeExtensionsWarning)]);const p={wastedMs:u},h=[{key:"url",itemType:"url",text:jv(Mv.UIStrings.columnURL)},{key:"total",granularity:1,itemType:"ms",text:jv(Uv.columnTotal)},{key:"scripting",granularity:1,itemType:"ms",text:jv(Uv.columnScriptEval)},{key:"scriptParseCompile",granularity:1,itemType:"ms",text:jv(Uv.columnScriptParse)}],f=BootupTime.makeTableDetails(h,d,p);return{score:Nv.computeLogNormalScore({p10:t.options.p10,median:t.options.median},u),numericValue:u,numericUnit:"millisecond",displayValue:u>0?jv(Mv.UIStrings.seconds,{timeInMs:u}):"",details:f,runWarnings:m}}}yv.exports=BootupTime,yv.exports.UIStrings=Uv;var Bv={exports:{}};const $v=Zc,qv=Ki;class NetworkNode$1 extends $v{constructor(e){super(e.requestId),this._record=e}get type(){return $v.TYPES.NETWORK}get startTime(){return 1e3*this._record.startTime*1e3}get endTime(){return 1e3*this._record.endTime*1e3}get record(){
|
@@ -756,7 +756,7 @@ node:wT.makeNodeItem(e.node),url:o,totalBytes:c,wastedBytes:l,wastedPercent:100*
|
|
756
756
|
;const RT=kc,kT=fT.exports,DT=ji,CT=oi,IT={title:"Images were appropriate for their displayed size",failureTitle:"Images were larger than their displayed size",columnDisplayedDimensions:"Displayed dimensions",columnActualDimensions:"Actual dimensions"},NT=CT.createMessageInstanceIdFn("lighthouse-core/audits/byte-efficiency/uses-responsive-images-snapshot.js",IT);gT.exports=class UsesResponsiveImagesSnapshot extends RT{static get meta(){return{id:"uses-responsive-images-snapshot",title:NT(IT.title),failureTitle:NT(IT.failureTitle),description:kT.str_(kT.UIStrings.description),supportedModes:["snapshot"],requiredArtifacts:["ImageElements","ViewportDimensions"]}}static async audit(e){let t=1;const r=[];for(const a of e.ImageElements){if(!a.naturalDimensions)continue;const n=a.naturalDimensions,i=kT.getDisplayedDimensions({...a,naturalWidth:n.width,naturalHeight:n.height},e.ViewportDimensions),o=n.width*n.height,s=i.width*i.height;o<=s||(o-s>1365&&(t=0),r.push({
|
757
757
|
node:RT.makeNodeItem(a.node),url:DT.elideDataURI(a.src),displayedDimensions:`${i.width}x${i.height}`,actualDimensions:`${n.width}x${n.height}`}))}const a=[{key:"node",itemType:"node",text:""},{key:"url",itemType:"url",text:NT(CT.UIStrings.columnURL)},{key:"displayedDimensions",itemType:"text",text:NT(IT.columnDisplayedDimensions)},{key:"actualDimensions",itemType:"text",text:NT(IT.columnActualDimensions)}];return{score:t,details:RT.makeTableDetails(a,r)}}},gT.exports.UIStrings=IT;var LT={exports:{}};const MT=Ib,PT=ji,OT=oi,FT={title:"Enable text compression",description:"Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more](https://web.dev/uses-text-compression/)."},UT=OT.createMessageInstanceIdFn("lighthouse-core/audits/byte-efficiency/uses-text-compression.js",FT);LT.exports=class ResponsesAreCompressed extends MT{static get meta(){return{id:"uses-text-compression",title:UT(FT.title),
|
758
758
|
description:UT(FT.description),scoreDisplayMode:MT.SCORING_MODES.NUMERIC,requiredArtifacts:["ResponseCompression","GatherContext","devtoolsLogs","traces"]}}static audit_(e){const t=e.ResponseCompression,r=[];t.forEach((e=>{if(!e.gzipSize||e.gzipSize<0)return;const t=e.resourceSize,a=e.gzipSize,n=t-a;if(1-a/t<.1||n<1400||e.transferSize<a)return;const i=PT.elideDataURI(e.url);r.find((t=>t.url===i&&t.totalBytes===e.resourceSize))||r.push({url:i,totalBytes:t,wastedBytes:n})}));const a=[{key:"url",valueType:"url",label:UT(OT.UIStrings.columnURL)},{key:"totalBytes",valueType:"bytes",label:UT(OT.UIStrings.columnTransferSize)},{key:"wastedBytes",valueType:"bytes",label:UT(OT.UIStrings.columnWastedBytes)}];return{items:r,headings:a}}},LT.exports.UIStrings=FT;var jT={exports:{}};const BT=kc,$T={title:"Content is sized correctly for the viewport",failureTitle:"Content is not sized correctly for the viewport",
|
759
|
-
description:"If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://web.dev/content-width/).",explanation:"The viewport size of {innerWidth}px does not match the window size of {outerWidth}px."},qT=oi.createMessageInstanceIdFn("lighthouse-core/audits/content-width.js",$T);jT.exports=class ContentWidth extends BT{static get meta(){return{id:"content-width",title:qT($T.title),failureTitle:qT($T.failureTitle),description:qT($T.description),requiredArtifacts:["ViewportDimensions"]}}static audit(e,t){const r=e.ViewportDimensions.innerWidth===e.ViewportDimensions.outerWidth;if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};let a;return r||(a=qT($T.explanation,{innerWidth:e.ViewportDimensions.innerWidth,outerWidth:e.ViewportDimensions.outerWidth})),{score:Number(r),explanation:a}}},jT.exports.UIStrings=$T;var zT={exports:{}};const VT=Ao,WT=Fo,GT=Lo;var HT=VT(class MainResource$
|
759
|
+
description:"If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://web.dev/content-width/).",explanation:"The viewport size of {innerWidth}px does not match the window size of {outerWidth}px."},qT=oi.createMessageInstanceIdFn("lighthouse-core/audits/content-width.js",$T);jT.exports=class ContentWidth extends BT{static get meta(){return{id:"content-width",title:qT($T.title),failureTitle:qT($T.failureTitle),description:qT($T.description),requiredArtifacts:["ViewportDimensions"]}}static audit(e,t){const r=e.ViewportDimensions.innerWidth===e.ViewportDimensions.outerWidth;if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};let a;return r||(a=qT($T.explanation,{innerWidth:e.ViewportDimensions.innerWidth,outerWidth:e.ViewportDimensions.outerWidth})),{score:Number(r),explanation:a}}},jT.exports.UIStrings=$T;var zT={exports:{}};const VT=Ao,WT=Fo,GT=Lo;var HT=VT(class MainResource$h{
|
760
760
|
static async compute_(e,t){const r=e.URL.finalUrl,a=await GT.request(e.devtoolsLog,t),n=WT.findMainDocument(a,r);if(!n)throw new Error("Unable to identify the main resource");return n}},["URL","devtoolsLog"]);const YT=Ao,KT=Ki,JT=HT,XT=eb;class CriticalRequestChains$2{static isCritical(e,t){if(!t)throw new Error("mainResource not provided");if(e.requestId===t.requestId)return!0;if(e.isLinkPreload)return!1;for(;e.redirectDestination;)e=e.redirectDestination;const r=e.resourceType===KT.TYPES.Document&&e.frameId!==t.frameId;return!([KT.TYPES.Image,KT.TYPES.XHR,KT.TYPES.Fetch,KT.TYPES.EventSource].includes(e.resourceType||"Other")||r||e.mimeType&&e.mimeType.startsWith("image/"))&&(!!e.initiatorRequest&&["VeryHigh","High","Medium"].includes(e.priority))}static extractChainsFromGraph(e,t){const r={};const a=new Set;return t.traverse(((t,n)=>{if(a.add(t),"network"!==t.type)return;if(!CriticalRequestChains$2.isCritical(t.record,e))return
|
761
761
|
;const i=n.filter((e=>"network"===e.type)).reverse().map((e=>e.record));i.some((t=>!CriticalRequestChains$2.isCritical(t,e)))||function addChain(e){let t=r;for(const r of e)t[r.requestId]||(t[r.requestId]={request:r,children:{}}),t=t[r.requestId].children}(i)}),(function getNextNodes(e){return e.getDependents().filter((e=>e.getDependencies().every((e=>a.has(e)))))})),r}static async compute_(e,t){const r=await JT.request({URL:e.URL,devtoolsLog:e.devtoolsLog},t),a=await XT.request({trace:e.trace,devtoolsLog:e.devtoolsLog},t);return CriticalRequestChains$2.extractChainsFromGraph(r,a)}}var ZT=YT(CriticalRequestChains$2,["URL","devtoolsLog","trace"]);const QT=kc,eE=ZT,tE={title:"Avoid chaining critical requests",
|
762
762
|
description:"The Critical Request Chains below show you what resources are loaded with a high priority. Consider reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load. [Learn more](https://web.dev/critical-request-chains/).",displayValue:"{itemCount, plural,\n =1 {1 chain found}\n other {# chains found}\n }"},rE=oi.createMessageInstanceIdFn("lighthouse-core/audits/critical-request-chains.js",tE);class CriticalRequestChains$1 extends QT{static get meta(){return{id:"critical-request-chains",title:rE(tE.title),description:rE(tE.description),scoreDisplayMode:QT.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL"]}}static _traverse(e,t){!function walk(e,r,a,n=0){const i=Object.keys(e);0!==i.length&&i.forEach((i=>{const o=e[i];a||(a=o.request.startTime),t({depth:r,id:i,node:o,chainDuration:1e3*(o.request.endTime-a),
|
@@ -766,22 +766,22 @@ return e instanceof Finding&&(e.type===this.type&&e.description===this.descripti
|
|
766
766
|
e[e.NONCE_LENGTH=307]="NONCE_LENGTH",e[e.IP_SOURCE=308]="IP_SOURCE",e[e.DEPRECATED_DIRECTIVE=309]="DEPRECATED_DIRECTIVE",e[e.SRC_HTTP=310]="SRC_HTTP",e[e.STRICT_DYNAMIC=400]="STRICT_DYNAMIC",e[e.STRICT_DYNAMIC_NOT_STANDALONE=401]="STRICT_DYNAMIC_NOT_STANDALONE",e[e.NONCE_HASH=402]="NONCE_HASH",e[e.UNSAFE_INLINE_FALLBACK=403]="UNSAFE_INLINE_FALLBACK",e[e.ALLOWLIST_FALLBACK=404]="ALLOWLIST_FALLBACK",e[e.IGNORED=405]="IGNORED",e[e.REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS=500]="REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS",e[e.REPORTING_DESTINATION_MISSING=600]="REPORTING_DESTINATION_MISSING",e[e.REPORT_TO_ONLY=601]="REPORT_TO_ONLY"}(e.Type||(e.Type={}))}(sE),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CspError=e.isHash=e.HASH_PATTERN=e.STRICT_HASH_PATTERN=e.isNonce=e.NONCE_PATTERN=e.STRICT_NONCE_PATTERN=e.isUrlScheme=e.isKeyword=e.isDirective=e.Version=e.FETCH_DIRECTIVES=e.Directive=e.TrustedTypesSink=e.Keyword=e.Csp=void 0;const t=sE;class Csp{constructor(){this.directives={}}clone(){
|
767
767
|
const e=new Csp;for(const[t,r]of Object.entries(this.directives))r&&(e.directives[t]=[...r]);return e}convertToString(){let e="";for(const[t,r]of Object.entries(this.directives)){if(e+=t,void 0!==r)for(let t,a=0;t=r[a];a++)e+=" ",e+=t;e+="; "}return e}getEffectiveCsp(e,i){const o=i||[],s=this.clone(),c=s.getEffectiveDirective(a.SCRIPT_SRC),l=this.directives[c]||[],u=s.directives[c];if(u&&(s.policyHasScriptNonces()||s.policyHasScriptHashes()))if(e>=n.CSP2)l.includes(r.UNSAFE_INLINE)&&(arrayRemove(u,r.UNSAFE_INLINE),o.push(new t.Finding(t.Type.IGNORED,"unsafe-inline is ignored if a nonce or a hash is present. (CSP2 and above)",t.Severity.NONE,c,r.UNSAFE_INLINE)));else for(const e of l)(e.startsWith("'nonce-")||e.startsWith("'sha"))&&arrayRemove(u,e);if(u&&this.policyHasStrictDynamic())if(e>=n.CSP3)for(const e of l)e.startsWith("'")&&e!==r.SELF&&e!==r.UNSAFE_INLINE||(arrayRemove(u,e),
|
768
768
|
o.push(new t.Finding(t.Type.IGNORED,"Because of strict-dynamic this entry is ignored in CSP3 and above",t.Severity.NONE,c,e)));else arrayRemove(u,r.STRICT_DYNAMIC);return e<n.CSP3&&(delete s.directives[a.REPORT_TO],delete s.directives[a.WORKER_SRC],delete s.directives[a.MANIFEST_SRC],delete s.directives[a.TRUSTED_TYPES],delete s.directives[a.REQUIRE_TRUSTED_TYPES_FOR]),s}getEffectiveDirective(t){return!(t in this.directives)&&e.FETCH_DIRECTIVES.includes(t)?a.DEFAULT_SRC:t}getEffectiveDirectives(e){return[...new Set(e.map((e=>this.getEffectiveDirective(e))))]}policyHasScriptNonces(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).some((e=>isNonce(e)))}policyHasScriptHashes(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).some((e=>isHash(e)))}policyHasStrictDynamic(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).includes(r.STRICT_DYNAMIC)}}var r,a,n;function isNonce(t,r){
|
769
|
-
return(r?e.STRICT_NONCE_PATTERN:e.NONCE_PATTERN).test(t)}function isHash(t,r){return(r?e.STRICT_HASH_PATTERN:e.HASH_PATTERN).test(t)}e.Csp=Csp,function(e){e.SELF="'self'",e.NONE="'none'",e.UNSAFE_INLINE="'unsafe-inline'",e.UNSAFE_EVAL="'unsafe-eval'",e.WASM_EVAL="'wasm-eval'",e.WASM_UNSAFE_EVAL="'wasm-unsafe-eval'",e.STRICT_DYNAMIC="'strict-dynamic'",e.UNSAFE_HASHED_ATTRIBUTES="'unsafe-hashed-attributes'",e.UNSAFE_HASHES="'unsafe-hashes'",e.REPORT_SAMPLE="'report-sample'"}(r=e.Keyword||(e.Keyword={})),(e.TrustedTypesSink||(e.TrustedTypesSink={})).SCRIPT="'script'",function(e){e.CHILD_SRC="child-src",e.CONNECT_SRC="connect-src",e.DEFAULT_SRC="default-src",e.FONT_SRC="font-src",e.FRAME_SRC="frame-src",e.IMG_SRC="img-src",e.MEDIA_SRC="media-src",e.OBJECT_SRC="object-src",e.SCRIPT_SRC="script-src",e.SCRIPT_SRC_ATTR="script-src-attr",e.SCRIPT_SRC_ELEM="script-src-elem",e.STYLE_SRC="style-src",e.STYLE_SRC_ATTR="style-src-attr",
|
770
|
-
e.MANIFEST_SRC="manifest-src",e.WORKER_SRC="worker-src",e.BASE_URI="base-uri",e.PLUGIN_TYPES="plugin-types",e.SANDBOX="sandbox",e.DISOWN_OPENER="disown-opener",e.FORM_ACTION="form-action",e.FRAME_ANCESTORS="frame-ancestors",e.REPORT_TO="report-to",e.REPORT_URI="report-uri",e.BLOCK_ALL_MIXED_CONTENT="block-all-mixed-content",e.UPGRADE_INSECURE_REQUESTS="upgrade-insecure-requests",e.REFLECTED_XSS="reflected-xss",e.REFERRER="referrer",e.REQUIRE_SRI_FOR="require-sri-for",e.TRUSTED_TYPES="trusted-types",e.REQUIRE_TRUSTED_TYPES_FOR="require-trusted-types-for"}(a=e.Directive||(e.Directive={})),e.FETCH_DIRECTIVES=[a.CHILD_SRC,a.CONNECT_SRC,a.DEFAULT_SRC,a.FONT_SRC,a.FRAME_SRC,a.IMG_SRC,a.MANIFEST_SRC,a.MEDIA_SRC,a.OBJECT_SRC,a.SCRIPT_SRC,a.SCRIPT_SRC_ATTR,a.SCRIPT_SRC_ELEM,a.STYLE_SRC,a.STYLE_SRC_ATTR,a.STYLE_SRC_ELEM,a.WORKER_SRC],function(e){e[e.CSP1=1]="CSP1",e[e.CSP2=2]="CSP2",
|
771
|
-
return Object.values(a).includes(e)},e.isKeyword=function isKeyword(e){return Object.values(r).includes(e)},e.isUrlScheme=function isUrlScheme(e){return new RegExp("^[a-zA-Z][+a-zA-Z0-9.-]*:$").test(e)},e.STRICT_NONCE_PATTERN=new RegExp("^'nonce-[a-zA-Z0-9+/_-]+[=]{0,2}'$"),e.NONCE_PATTERN=new RegExp("^'nonce-(.+)'$"),e.isNonce=isNonce,e.STRICT_HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-[a-zA-Z0-9+/]+[=]{0,2}'$"),e.HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-(.+)'$"),e.isHash=isHash;class CspError extends Error{constructor(e){super(e)}}function arrayRemove(e,t){if(e.includes(t)){const r=e.findIndex((e=>t===e));e.splice(r,1)}}e.CspError=CspError}(oE);var cE=globalThis&&globalThis.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]
|
772
|
-
enumerable:!0,value:t})}:function(e,t){e.default=t}),uE=globalThis&&globalThis.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&cE(t,e,r);return lE(t,e),t};Object.defineProperty(iE,"__esModule",{value:!0}),iE.checkInvalidKeyword=iE.checkMissingSemicolon=iE.checkUnknownDirective=void 0;const dE=uE(oE),mE=oE,pE=sE;iE.checkUnknownDirective=function checkUnknownDirective(e){const t=[];for(const r of Object.keys(e.directives))dE.isDirective(r)||(r.endsWith(":")?t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,"CSP directives don't end with a colon.",pE.Severity.SYNTAX,r)):t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,'Directive "'+r+'" is not a known CSP directive.',pE.Severity.SYNTAX,r)));return t},iE.checkMissingSemicolon=function checkMissingSemicolon(e){const t=[]
|
769
|
+
return(r?e.STRICT_NONCE_PATTERN:e.NONCE_PATTERN).test(t)}function isHash(t,r){return(r?e.STRICT_HASH_PATTERN:e.HASH_PATTERN).test(t)}e.Csp=Csp,function(e){e.SELF="'self'",e.NONE="'none'",e.UNSAFE_INLINE="'unsafe-inline'",e.UNSAFE_EVAL="'unsafe-eval'",e.WASM_EVAL="'wasm-eval'",e.WASM_UNSAFE_EVAL="'wasm-unsafe-eval'",e.STRICT_DYNAMIC="'strict-dynamic'",e.UNSAFE_HASHED_ATTRIBUTES="'unsafe-hashed-attributes'",e.UNSAFE_HASHES="'unsafe-hashes'",e.REPORT_SAMPLE="'report-sample'",e.BLOCK="'block'",e.ALLOW="'allow'"}(r=e.Keyword||(e.Keyword={})),(e.TrustedTypesSink||(e.TrustedTypesSink={})).SCRIPT="'script'",function(e){e.CHILD_SRC="child-src",e.CONNECT_SRC="connect-src",e.DEFAULT_SRC="default-src",e.FONT_SRC="font-src",e.FRAME_SRC="frame-src",e.IMG_SRC="img-src",e.MEDIA_SRC="media-src",e.OBJECT_SRC="object-src",e.SCRIPT_SRC="script-src",e.SCRIPT_SRC_ATTR="script-src-attr",e.SCRIPT_SRC_ELEM="script-src-elem",e.STYLE_SRC="style-src",e.STYLE_SRC_ATTR="style-src-attr",
|
770
|
+
e.STYLE_SRC_ELEM="style-src-elem",e.PREFETCH_SRC="prefetch-src",e.MANIFEST_SRC="manifest-src",e.WORKER_SRC="worker-src",e.BASE_URI="base-uri",e.PLUGIN_TYPES="plugin-types",e.SANDBOX="sandbox",e.DISOWN_OPENER="disown-opener",e.FORM_ACTION="form-action",e.FRAME_ANCESTORS="frame-ancestors",e.NAVIGATE_TO="navigate-to",e.REPORT_TO="report-to",e.REPORT_URI="report-uri",e.BLOCK_ALL_MIXED_CONTENT="block-all-mixed-content",e.UPGRADE_INSECURE_REQUESTS="upgrade-insecure-requests",e.REFLECTED_XSS="reflected-xss",e.REFERRER="referrer",e.REQUIRE_SRI_FOR="require-sri-for",e.TRUSTED_TYPES="trusted-types",e.REQUIRE_TRUSTED_TYPES_FOR="require-trusted-types-for",e.WEBRTC="webrtc"}(a=e.Directive||(e.Directive={})),e.FETCH_DIRECTIVES=[a.CHILD_SRC,a.CONNECT_SRC,a.DEFAULT_SRC,a.FONT_SRC,a.FRAME_SRC,a.IMG_SRC,a.MANIFEST_SRC,a.MEDIA_SRC,a.OBJECT_SRC,a.SCRIPT_SRC,a.SCRIPT_SRC_ATTR,a.SCRIPT_SRC_ELEM,a.STYLE_SRC,a.STYLE_SRC_ATTR,a.STYLE_SRC_ELEM,a.WORKER_SRC],function(e){e[e.CSP1=1]="CSP1",e[e.CSP2=2]="CSP2",
|
771
|
+
e[e.CSP3=3]="CSP3"}(n=e.Version||(e.Version={})),e.isDirective=function isDirective(e){return Object.values(a).includes(e)},e.isKeyword=function isKeyword(e){return Object.values(r).includes(e)},e.isUrlScheme=function isUrlScheme(e){return new RegExp("^[a-zA-Z][+a-zA-Z0-9.-]*:$").test(e)},e.STRICT_NONCE_PATTERN=new RegExp("^'nonce-[a-zA-Z0-9+/_-]+[=]{0,2}'$"),e.NONCE_PATTERN=new RegExp("^'nonce-(.+)'$"),e.isNonce=isNonce,e.STRICT_HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-[a-zA-Z0-9+/]+[=]{0,2}'$"),e.HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-(.+)'$"),e.isHash=isHash;class CspError extends Error{constructor(e){super(e)}}function arrayRemove(e,t){if(e.includes(t)){const r=e.findIndex((e=>t===e));e.splice(r,1)}}e.CspError=CspError}(oE);var cE=globalThis&&globalThis.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]
|
772
|
+
}),lE=globalThis&&globalThis.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),uE=globalThis&&globalThis.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&cE(t,e,r);return lE(t,e),t};Object.defineProperty(iE,"__esModule",{value:!0}),iE.checkInvalidKeyword=iE.checkMissingSemicolon=iE.checkUnknownDirective=void 0;const dE=uE(oE),mE=oE,pE=sE;iE.checkUnknownDirective=function checkUnknownDirective(e){const t=[];for(const r of Object.keys(e.directives))dE.isDirective(r)||(r.endsWith(":")?t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,"CSP directives don't end with a colon.",pE.Severity.SYNTAX,r)):t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,'Directive "'+r+'" is not a known CSP directive.',pE.Severity.SYNTAX,r)));return t},iE.checkMissingSemicolon=function checkMissingSemicolon(e){const t=[]
|
773
773
|
;for(const[r,a]of Object.entries(e.directives))if(void 0!==a)for(const e of a)dE.isDirective(e)&&t.push(new pE.Finding(pE.Type.MISSING_SEMICOLON,'Did you forget the semicolon? "'+e+'" seems to be a directive, not a value.',pE.Severity.SYNTAX,r,e));return t},iE.checkInvalidKeyword=function checkInvalidKeyword(e){const t=[],r=Object.values(mE.Keyword).map((e=>e.replace(/'/g,"")));for(const[a,n]of Object.entries(e.directives))if(void 0!==n)for(const e of n)if(r.some((t=>t===e))||e.startsWith("nonce-")||e.match(/^(sha256|sha384|sha512)-/))t.push(new pE.Finding(pE.Type.INVALID_KEYWORD,'Did you forget to surround "'+e+'" with single-ticks?',pE.Severity.SYNTAX,a,e));else if(e.startsWith("'")){if(a===dE.Directive.REQUIRE_TRUSTED_TYPES_FOR){if(e===dE.TrustedTypesSink.SCRIPT)continue}else if(a===dE.Directive.TRUSTED_TYPES){if("'allow-duplicates'"===e||"'none'"===e)continue}else if(dE.isKeyword(e)||dE.isHash(e)||dE.isNonce(e))continue
|
774
774
|
;t.push(new pE.Finding(pE.Type.INVALID_KEYWORD,e+" seems to be an invalid CSP keyword.",pE.Severity.SYNTAX,a,e))}return t};var hE={},gE={};Object.defineProperty(gE,"__esModule",{value:!0}),gE.URLS=void 0,
|
775
775
|
gE.URLS=["//gstatic.com/fsn/angular_js-bundle1.js","//www.gstatic.com/fsn/angular_js-bundle1.js","//www.googleadservices.com/pageadimg/imgad","//yandex.st/angularjs/1.2.16/angular-cookies.min.js","//yastatic.net/angularjs/1.2.23/angular.min.js","//yuedust.yuedu.126.net/js/components/angular/angular.js","//art.jobs.netease.com/script/angular.js","//csu-c45.kxcdn.com/angular/angular.js","//elysiumwebsite.s3.amazonaws.com/uploads/blog-media/rockstar/angular.min.js","//inno.blob.core.windows.net/new/libs/AngularJS/1.2.1/angular.min.js","//gift-talk.kakao.com/public/javascripts/angular.min.js","//ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular-route.min.js","//master-sumok.ru/vendors/angular/angular-cookies.js","//ayicommon-a.akamaihd.net/static/vendor/angular-1.4.2.min.js","//pangxiehaitao.com/framework/angular-1.3.9/angular-animate.min.js","//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.16/angular.min.js","//96fe3ee995e96e922b6b-d10c35bd0a0de2c718b252bc575fdb73.ssl.cf1.rackcdn.com/angular.js","//oss.maxcdn.com/angularjs/1.2.20/angular.min.js","//reports.zemanta.com/smedia/common/angularjs/1.2.11/angular.js","//cdn.shopify.com/s/files/1/0225/6463/t/1/assets/angular-animate.min.js","//parademanagement.com.s3-website-ap-southeast-1.amazonaws.com/js/angular.min.js","//cdn.jsdelivr.net/angularjs/1.1.2/angular.min.js","//eb2883ede55c53e09fd5-9c145fb03d93709ea57875d307e2d82e.ssl.cf3.rackcdn.com/components/angular-resource.min.js","//andors-trail.googlecode.com/git/AndorsTrailEdit/lib/angular.min.js","//cdn.walkme.com/General/EnvironmentTests/angular/angular.min.js","//laundrymail.com/angular/angular.js","//s3-eu-west-1.amazonaws.com/staticancpa/js/angular-cookies.min.js","//collade.demo.stswp.com/js/vendor/angular.min.js","//mrfishie.github.io/sailor/bower_components/angular/angular.min.js","//askgithub.com/static/js/angular.min.js","//services.amazon.com/solution-providers/assets/vendor/angular-cookies.min.js","//raw.githubusercontent.com/angular/code.angularjs.org/master/1.0.7/angular-resource.js","//prb-resume.appspot.com/bower_components/angular-animate/angular-animate.js","//dl.dropboxusercontent.com/u/30877786/angular.min.js","//static.tumblr.com/x5qdx0r/nPOnngtff/angular-resource.min_1_.js","//storage.googleapis.com/assets-prod.urbansitter.net/us-sym/assets/vendor/angular-sanitize/angular-sanitize.min.js","//twitter.github.io/labella.js/bower_components/angular/angular.min.js","//cdn2-casinoroom.global.ssl.fastly.net/js/lib/angular-animate.min.js","//www.adobe.com/devnet-apps/flashshowcase/lib/angular/angular.1.1.5.min.js","//eternal-sunset.herokuapp.com/bower_components/angular/angular.js","//cdn.bootcss.com/angular.js/1.2.0/angular.min.js"]
|
776
776
|
;var fE={};Object.defineProperty(fE,"__esModule",{value:!0}),fE.URLS=void 0,fE.URLS=["//vk.com/swf/video.swf","//ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf"];var yE={};Object.defineProperty(yE,"__esModule",{value:!0}),yE.URLS=yE.NEEDS_EVAL=void 0,yE.NEEDS_EVAL=["googletagmanager.com","www.googletagmanager.com","www.googleadservices.com","google-analytics.com","ssl.google-analytics.com","www.google-analytics.com"],
|
777
|
-
yE.URLS=["//bebezoo.1688.com/fragment/index.htm","//www.google-analytics.com/gtm/js","//googleads.g.doubleclick.net/pagead/conversion/1036918760/wcm","//www.googleadservices.com/pagead/conversion/1070110417/wcm","//www.google.com/tools/feedback/escalation-options","//pin.aliyun.com/check_audio","//offer.alibaba.com/market/CID100002954/5/fetchKeyword.do","//ccrprod.alipay.com/ccr/arriveTime.json","//group.aliexpress.com/ajaxAcquireGroupbuyProduct.do","//detector.alicdn.com/2.7.3/index.php","//suggest.taobao.com/sug","//translate.google.com/translate_a/l","//count.tbcdn.cn//counter3","//wb.amap.com/channel.php","//translate.googleapis.com/translate_a/l","//afpeng.alimama.com/ex","//accounts.google.com/o/oauth2/revoke","//pagead2.googlesyndication.com/relatedsearch","//yandex.ru/soft/browsers/check","//api.facebook.com/restserver.php","//mts0.googleapis.com/maps/vt","//syndication.twitter.com/widgets/timelines/765840589183213568","//www.youtube.com/profile_style","//googletagmanager.com/gtm/js","//mc.yandex.ru/watch/24306916/1","//share.yandex.net/counter/gpp/","//ok.go.mail.ru/lady_on_lady_recipes_r.json","//d1f69o4buvlrj5.cloudfront.net/__efa_15_1_ornpba.xekq.arg/optout_check","//www.googletagmanager.com/gtm/js","//api.vk.com/method/wall.get","//www.sharethis.com/get-publisher-info.php","//google.ru/maps/vt","//pro.netrox.sc/oapi/h_checksite.ashx","//vimeo.com/api/oembed.json/","//de.blog.newrelic.com/wp-admin/admin-ajax.php","//ajax.googleapis.com/ajax/services/search/news","//ssl.google-analytics.com/gtm/js","//pubsub.pubnub.com/subscribe/demo/hello_world/","//pass.yandex.ua/services","//id.rambler.ru/script/topline_info.js","//m.addthis.com/live/red_lojson/100eng.json","//passport.ngs.ru/ajax/check","//catalog.api.2gis.ru/ads/search","//gum.criteo.com/sync","//maps.google.com/maps/vt","//ynuf.alipay.com/service/um.json","//securepubads.g.doubleclick.net/gampad/ads","//c.tiles.mapbox.com/v3/texastribune.tx-congress-cvap/6/15/26.grid.json","//rexchange.begun.ru/banners","//an.yandex.ru/page/147484","//links.services.disqus.com/api/ping","//api.map.baidu.com/","//tj.gongchang.com/api/keywordrecomm/","//data.gongchang.com/livegrail/","//ulogin.ru/token.php","//beta.gismeteo.ru/api/informer/layout.js/120x240-3/ru/","//maps.googleapis.com/maps/api/js/GeoPhotoService.GetMetadata","//a.config.skype.com/config/v1/Skype/908_1.33.0.111/SkypePersonalization","//maps.beeline.ru/w","//target.ukr.net/","//www.meteoprog.ua/data/weather/informer/Poltava.js","//cdn.syndication.twimg.com/widgets/timelines/599200054310604802","//wslocker.ru/client/user.chk.php","//community.adobe.com/CommunityPod/getJSON","//maps.google.lv/maps/vt","//dev.virtualearth.net/REST/V1/Imagery/Metadata/AerialWithLabels/26.318581","//awaps.yandex.ru/10/8938/02400400.","//a248.e.akamai.net/h5.hulu.com/h5.mp4","//nominatim.openstreetmap.org/","//plugins.mozilla.org/en-us/plugins_list.json","//h.cackle.me/widget/32153/bootstrap","//graph.facebook.com/1/","//fellowes.ugc.bazaarvoice.com/data/reviews.json","//widgets.pinterest.com/v3/pidgets/boards/ciciwin/hedgehog-squirrel-crafts/pins/","//
|
778
|
-
;var vE={};function getSchemeFreeUrl(e){return e=(e=e.replace(/^\w[+\w.-]*:\/\//i,"")).replace(/^\/\//,"")}function setScheme(e){return e.startsWith("//")?e.replace("//","https://"):e}Object.defineProperty(vE,"__esModule",{value:!0}),vE.applyCheckFunktionToDirectives=vE.matchWildcardUrls=vE.getHostname=vE.getSchemeFreeUrl=void 0,vE.getSchemeFreeUrl=getSchemeFreeUrl,vE.getHostname=function getHostname(e){const t=new URL("https://"+getSchemeFreeUrl(e).replace("*","wildcard_placeholder")).hostname.replace("wildcard_placeholder","*"),r=/^\[[\d:]+\]/;return getSchemeFreeUrl(e).match(r)&&!t.match(r)?"["+t+"]":t},vE.matchWildcardUrls=function matchWildcardUrls(e,t){const r=new URL(setScheme(e.replace("*","wildcard_placeholder"))),a=t.map((e=>new URL(setScheme(e)))),n=r.hostname.toLowerCase(),i=n.startsWith("wildcard_placeholder."),o=n.replace(/^\wildcard_placeholder/i,""),s=r.pathname,c="/"!==s;for(const e of a){const t=e.hostname
|
779
|
-
if(!e.pathname.startsWith(s))continue}else if(e.pathname!==s)continue;return e}}return null},vE.applyCheckFunktionToDirectives=function applyCheckFunktionToDirectives(e,t){const r=Object.keys(e.directives);for(const a of r){const r=e.directives[a];r&&t(a,r)}},function(e){var t=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var a={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(a,e,n);return r(a,e),a};Object.defineProperty(e,"__esModule",{value:!0}),
|
777
|
+
yE.URLS=["//bebezoo.1688.com/fragment/index.htm","//www.google-analytics.com/gtm/js","//googleads.g.doubleclick.net/pagead/conversion/1036918760/wcm","//www.googleadservices.com/pagead/conversion/1070110417/wcm","//www.google.com/tools/feedback/escalation-options","//pin.aliyun.com/check_audio","//offer.alibaba.com/market/CID100002954/5/fetchKeyword.do","//ccrprod.alipay.com/ccr/arriveTime.json","//group.aliexpress.com/ajaxAcquireGroupbuyProduct.do","//detector.alicdn.com/2.7.3/index.php","//suggest.taobao.com/sug","//translate.google.com/translate_a/l","//count.tbcdn.cn//counter3","//wb.amap.com/channel.php","//translate.googleapis.com/translate_a/l","//afpeng.alimama.com/ex","//accounts.google.com/o/oauth2/revoke","//pagead2.googlesyndication.com/relatedsearch","//yandex.ru/soft/browsers/check","//api.facebook.com/restserver.php","//mts0.googleapis.com/maps/vt","//syndication.twitter.com/widgets/timelines/765840589183213568","//www.youtube.com/profile_style","//googletagmanager.com/gtm/js","//mc.yandex.ru/watch/24306916/1","//share.yandex.net/counter/gpp/","//ok.go.mail.ru/lady_on_lady_recipes_r.json","//d1f69o4buvlrj5.cloudfront.net/__efa_15_1_ornpba.xekq.arg/optout_check","//www.googletagmanager.com/gtm/js","//api.vk.com/method/wall.get","//www.sharethis.com/get-publisher-info.php","//google.ru/maps/vt","//pro.netrox.sc/oapi/h_checksite.ashx","//vimeo.com/api/oembed.json/","//de.blog.newrelic.com/wp-admin/admin-ajax.php","//ajax.googleapis.com/ajax/services/search/news","//ssl.google-analytics.com/gtm/js","//pubsub.pubnub.com/subscribe/demo/hello_world/","//pass.yandex.ua/services","//id.rambler.ru/script/topline_info.js","//m.addthis.com/live/red_lojson/100eng.json","//passport.ngs.ru/ajax/check","//catalog.api.2gis.ru/ads/search","//gum.criteo.com/sync","//maps.google.com/maps/vt","//ynuf.alipay.com/service/um.json","//securepubads.g.doubleclick.net/gampad/ads","//c.tiles.mapbox.com/v3/texastribune.tx-congress-cvap/6/15/26.grid.json","//rexchange.begun.ru/banners","//an.yandex.ru/page/147484","//links.services.disqus.com/api/ping","//api.map.baidu.com/","//tj.gongchang.com/api/keywordrecomm/","//data.gongchang.com/livegrail/","//ulogin.ru/token.php","//beta.gismeteo.ru/api/informer/layout.js/120x240-3/ru/","//maps.googleapis.com/maps/api/js/GeoPhotoService.GetMetadata","//a.config.skype.com/config/v1/Skype/908_1.33.0.111/SkypePersonalization","//maps.beeline.ru/w","//target.ukr.net/","//www.meteoprog.ua/data/weather/informer/Poltava.js","//cdn.syndication.twimg.com/widgets/timelines/599200054310604802","//wslocker.ru/client/user.chk.php","//community.adobe.com/CommunityPod/getJSON","//maps.google.lv/maps/vt","//dev.virtualearth.net/REST/V1/Imagery/Metadata/AerialWithLabels/26.318581","//awaps.yandex.ru/10/8938/02400400.","//a248.e.akamai.net/h5.hulu.com/h5.mp4","//nominatim.openstreetmap.org/","//plugins.mozilla.org/en-us/plugins_list.json","//h.cackle.me/widget/32153/bootstrap","//graph.facebook.com/1/","//fellowes.ugc.bazaarvoice.com/data/reviews.json","//widgets.pinterest.com/v3/pidgets/boards/ciciwin/hedgehog-squirrel-crafts/pins/","//www.linkedin.com/countserv/count/share","//se.wikipedia.org/w/api.php","//cse.google.com/api/007627024705277327428/cse/r3vs7b0fcli/queries/js","//relap.io/api/v2/similar_pages_jsonp.js","//c1n3.hypercomments.com/stream/subscribe","//maps.google.de/maps/vt","//books.google.com/books","//connect.mail.ru/share_count","//tr.indeed.com/m/newjobs","//www-onepick-opensocial.googleusercontent.com/gadgets/proxy","//www.panoramio.com/map/get_panoramas.php","//client.siteheart.com/streamcli/client","//www.facebook.com/restserver.php","//autocomplete.travelpayouts.com/avia","//www.googleapis.com/freebase/v1/topic/m/0344_","//mts1.googleapis.com/mapslt/ft","//api.twitter.com/1/statuses/oembed.json","//fast.wistia.com/embed/medias/o75jtw7654.json","//partner.googleadservices.com/gampad/ads","//pass.yandex.ru/services","//gupiao.baidu.com/stocks/stockbets","//widget.admitad.com/widget/init","//api.instagram.com/v1/tags/partykungen23328/media/recent","//video.media.yql.yahoo.com/v1/video/sapi/streams/063fb76c-6c70-38c5-9bbc-04b7c384de2b","//ib.adnxs.com/jpt","//pass.yandex.com/services","//www.google.de/maps/vt","//clients1.google.com/complete/search","//api.userlike.com/api/chat/slot/proactive/","//www.youku.com/index_cookielist/s/jsonp","//mt1.googleapis.com/mapslt/ft","//api.mixpanel.com/track/","//wpd.b.qq.com/cgi/get_sign.php","//pipes.yahooapis.com/pipes/pipe.run","//gdata.youtube.com/feeds/api/videos/WsJIHN1kNWc","//9.chart.apis.google.com/chart","//cdn.syndication.twitter.com/moments/709229296800440320","//api.flickr.com/services/feeds/photos_friends.gne","//cbks0.googleapis.com/cbk","//www.blogger.com/feeds/5578653387562324002/posts/summary/4427562025302749269","//query.yahooapis.com/v1/public/yql","//kecngantang.blogspot.com/feeds/posts/default/-/Komik","//www.travelpayouts.com/widgets/50f53ce9ada1b54bcc000031.json","//i.cackle.me/widget/32586/bootstrap","//translate.yandex.net/api/v1.5/tr.json/detect","//a.tiles.mapbox.com/v3/zentralmedia.map-n2raeauc.jsonp","//maps.google.ru/maps/vt","//c1n2.hypercomments.com/stream/subscribe","//rec.ydf.yandex.ru/cookie","//cdn.jsdelivr.net"]
|
778
|
+
;var vE={};function getSchemeFreeUrl(e){return e=(e=e.replace(/^\w[+\w.-]*:\/\//i,"")).replace(/^\/\//,"")}function setScheme(e){return e.startsWith("//")?e.replace("//","https://"):e}Object.defineProperty(vE,"__esModule",{value:!0}),vE.applyCheckFunktionToDirectives=vE.matchWildcardUrls=vE.getHostname=vE.getSchemeFreeUrl=void 0,vE.getSchemeFreeUrl=getSchemeFreeUrl,vE.getHostname=function getHostname(e){const t=new URL("https://"+getSchemeFreeUrl(e).replace(":*","").replace("*","wildcard_placeholder")).hostname.replace("wildcard_placeholder","*"),r=/^\[[\d:]+\]/;return getSchemeFreeUrl(e).match(r)&&!t.match(r)?"["+t+"]":t},vE.matchWildcardUrls=function matchWildcardUrls(e,t){const r=new URL(setScheme(e.replace(":*","").replace("*","wildcard_placeholder"))),a=t.map((e=>new URL(setScheme(e)))),n=r.hostname.toLowerCase(),i=n.startsWith("wildcard_placeholder."),o=n.replace(/^\wildcard_placeholder/i,""),s=r.pathname,c="/"!==s;for(const e of a){const t=e.hostname
|
779
|
+
;if(t.endsWith(o)&&(i||n===t)){if(c)if(s.endsWith("/")){if(!e.pathname.startsWith(s))continue}else if(e.pathname!==s)continue;return e}}return null},vE.applyCheckFunktionToDirectives=function applyCheckFunktionToDirectives(e,t){const r=Object.keys(e.directives);for(const a of r){const r=e.directives[a];r&&t(a,r)}},function(e){var t=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var a={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(a,e,n);return r(a,e),a};Object.defineProperty(e,"__esModule",{value:!0}),
|
780
780
|
e.checkHasConfiguredReporting=e.checkSrcHttp=e.checkNonceLength=e.checkDeprecatedDirective=e.checkIpSource=e.looksLikeIpAddress=e.checkFlashObjectAllowlistBypass=e.checkScriptAllowlistBypass=e.checkMissingDirectives=e.checkMultipleMissingBaseUriDirective=e.checkMissingBaseUriDirective=e.checkMissingScriptSrcDirective=e.checkMissingObjectSrcDirective=e.checkWildcards=e.checkPlainUrlSchemes=e.checkScriptUnsafeEval=e.checkScriptUnsafeInline=e.URL_SCHEMES_CAUSING_XSS=e.DIRECTIVES_CAUSING_XSS=void 0;const n=a(gE),i=a(fE),o=a(yE),s=a(oE),c=oE,l=sE,u=a(vE);function checkMissingObjectSrcDirective(e){let t=[];return c.Directive.OBJECT_SRC in e.directives?t=e.directives[c.Directive.OBJECT_SRC]:c.Directive.DEFAULT_SRC in e.directives&&(t=e.directives[c.Directive.DEFAULT_SRC]),void 0!==t&&t.length>=1?[]:[new l.Finding(l.Type.MISSING_DIRECTIVES,"Missing object-src allows the injection of plugins which can execute JavaScript. Can you set it to 'none'?",l.Severity.HIGH,c.Directive.OBJECT_SRC)]}
|
781
781
|
function checkMissingScriptSrcDirective(e){return c.Directive.SCRIPT_SRC in e.directives||c.Directive.DEFAULT_SRC in e.directives?[]:[new l.Finding(l.Type.MISSING_DIRECTIVES,"script-src directive is missing.",l.Severity.HIGH,c.Directive.SCRIPT_SRC)]}function checkMissingBaseUriDirective(e){return checkMultipleMissingBaseUriDirective([e])}function checkMultipleMissingBaseUriDirective(e){if(e.some((e=>e.policyHasScriptNonces()||e.policyHasScriptHashes()&&e.policyHasStrictDynamic()))&&!e.some((e=>c.Directive.BASE_URI in e.directives))){const e="Missing base-uri allows the injection of base tags. They can be used to set the base URL for all relative (script) URLs to an attacker controlled domain. Can you set it to 'none' or 'self'?";return[new l.Finding(l.Type.MISSING_DIRECTIVES,e,l.Severity.HIGH,c.Directive.BASE_URI)]}return[]}function looksLikeIpAddress(e){return!(!e.startsWith("[")||!e.endsWith("]"))||!!/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test(e)}
|
782
782
|
e.DIRECTIVES_CAUSING_XSS=[c.Directive.SCRIPT_SRC,c.Directive.OBJECT_SRC,c.Directive.BASE_URI],e.URL_SCHEMES_CAUSING_XSS=["data:","http:","https:"],e.checkScriptUnsafeInline=function checkScriptUnsafeInline(e){const t=e.getEffectiveDirective(c.Directive.SCRIPT_SRC);return(e.directives[t]||[]).includes(c.Keyword.UNSAFE_INLINE)?[new l.Finding(l.Type.SCRIPT_UNSAFE_INLINE,"'unsafe-inline' allows the execution of unsafe in-page scripts and event handlers.",l.Severity.HIGH,t,c.Keyword.UNSAFE_INLINE)]:[]},e.checkScriptUnsafeEval=function checkScriptUnsafeEval(e){const t=e.getEffectiveDirective(c.Directive.SCRIPT_SRC);return(e.directives[t]||[]).includes(c.Keyword.UNSAFE_EVAL)?[new l.Finding(l.Type.SCRIPT_UNSAFE_EVAL,"'unsafe-eval' allows the execution of code injected into DOM APIs such as eval().",l.Severity.MEDIUM_MAYBE,t,c.Keyword.UNSAFE_EVAL)]:[]},e.checkPlainUrlSchemes=function checkPlainUrlSchemes(t){const r=[],a=t.getEffectiveDirectives(e.DIRECTIVES_CAUSING_XSS);for(const n of a){
|
783
783
|
const a=t.directives[n]||[];for(const t of a)e.URL_SCHEMES_CAUSING_XSS.includes(t)&&r.push(new l.Finding(l.Type.PLAIN_URL_SCHEMES,t+" URI in "+n+" allows the execution of unsafe scripts.",l.Severity.HIGH,n,t))}return r},e.checkWildcards=function checkWildcards(t){const r=[],a=t.getEffectiveDirectives(e.DIRECTIVES_CAUSING_XSS);for(const e of a){const a=t.directives[e]||[];for(const t of a){"*"!==u.getSchemeFreeUrl(t)||r.push(new l.Finding(l.Type.PLAIN_WILDCARD,e+" should not allow '*' as source",l.Severity.HIGH,e,t))}}return r},e.checkMissingObjectSrcDirective=checkMissingObjectSrcDirective,e.checkMissingScriptSrcDirective=checkMissingScriptSrcDirective,e.checkMissingBaseUriDirective=checkMissingBaseUriDirective,e.checkMultipleMissingBaseUriDirective=checkMultipleMissingBaseUriDirective,e.checkMissingDirectives=function checkMissingDirectives(e){return[...checkMissingObjectSrcDirective(e),...checkMissingScriptSrcDirective(e),...checkMissingBaseUriDirective(e)]},
|
784
|
-
e.checkScriptAllowlistBypass=function checkScriptAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.SCRIPT_SRC),a=e.directives[r]||[];if(a.includes(c.Keyword.NONE))return t;for(const e of a){if(e===c.Keyword.SELF){t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"'self' can be problematic if you host JSONP,
|
784
|
+
e.checkScriptAllowlistBypass=function checkScriptAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.SCRIPT_SRC),a=e.directives[r]||[];if(a.includes(c.Keyword.NONE))return t;for(const e of a){if(e===c.Keyword.SELF){t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"'self' can be problematic if you host JSONP, AngularJS or user uploaded files.",l.Severity.MEDIUM_MAYBE,r,e));continue}if(e.startsWith("'"))continue;if(s.isUrlScheme(e)||-1===e.indexOf("."))continue;const i="//"+u.getSchemeFreeUrl(e),d=u.matchWildcardUrls(i,n.URLS);let m=u.matchWildcardUrls(i,o.URLS);if(m){const e=o.NEEDS_EVAL.includes(m.hostname),t=a.includes(c.Keyword.UNSAFE_EVAL);e&&!t&&(m=null)}if(m||d){let a="",n="";m&&(a=m.hostname,n=" JSONP endpoints"),d&&(a=d.hostname,n+=""===n.trim()?"":" and",n+=" Angular libraries"),t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,a+" is known to host"+n+" which allow to bypass this CSP.",l.Severity.HIGH,r,e))
|
785
785
|
}else t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"No bypass found; make sure that this URL doesn't serve JSONP replies or Angular libraries.",l.Severity.MEDIUM_MAYBE,r,e))}return t},e.checkFlashObjectAllowlistBypass=function checkFlashObjectAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.OBJECT_SRC),a=e.directives[r]||[],n=e.directives[c.Directive.PLUGIN_TYPES];if(n&&!n.includes("application/x-shockwave-flash"))return[];for(const e of a){if(e===c.Keyword.NONE)return[];const a="//"+u.getSchemeFreeUrl(e),n=u.matchWildcardUrls(a,i.URLS);n?t.push(new l.Finding(l.Type.OBJECT_ALLOWLIST_BYPASS,n.hostname+" is known to host Flash files which allow to bypass this CSP.",l.Severity.HIGH,r,e)):r===c.Directive.OBJECT_SRC&&t.push(new l.Finding(l.Type.OBJECT_ALLOWLIST_BYPASS,"Can you restrict object-src to 'none' only?",l.Severity.MEDIUM_MAYBE,r,e))}return t},e.looksLikeIpAddress=looksLikeIpAddress,e.checkIpSource=function checkIpSource(e){const t=[]
|
786
786
|
;return u.applyCheckFunktionToDirectives(e,((e,r)=>{for(const a of r){const r=u.getHostname(a);looksLikeIpAddress(r)&&("127.0.0.1"===r?t.push(new l.Finding(l.Type.IP_SOURCE,e+" directive allows localhost as source. Please make sure to remove this in production environments.",l.Severity.INFO,e,a)):t.push(new l.Finding(l.Type.IP_SOURCE,e+" directive has an IP-Address as source: "+r+" (will be ignored by browsers!). ",l.Severity.INFO,e,a)))}})),t},e.checkDeprecatedDirective=function checkDeprecatedDirective(e){const t=[];return c.Directive.REFLECTED_XSS in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"reflected-xss is deprecated since CSP2. Please, use the X-XSS-Protection header instead.",l.Severity.INFO,c.Directive.REFLECTED_XSS)),c.Directive.REFERRER in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"referrer is deprecated since CSP2. Please, use the Referrer-Policy header instead.",l.Severity.INFO,c.Directive.REFERRER)),
|
787
787
|
c.Directive.DISOWN_OPENER in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"disown-opener is deprecated since CSP3. Please, use the Cross Origin Opener Policy header instead.",l.Severity.INFO,c.Directive.DISOWN_OPENER)),t},e.checkNonceLength=function checkNonceLength(e){const t=new RegExp("^'nonce-(.+)'$"),r=[];return u.applyCheckFunktionToDirectives(e,((e,a)=>{for(const n of a){const a=n.match(t);if(!a)continue;a[1].length<8&&r.push(new l.Finding(l.Type.NONCE_LENGTH,"Nonces should be at least 8 characters long.",l.Severity.MEDIUM,e,n)),s.isNonce(n,!0)||r.push(new l.Finding(l.Type.NONCE_CHARSET,"Nonces should only use the base64 charset.",l.Severity.INFO,e,n))}})),r},e.checkSrcHttp=function checkSrcHttp(e){const t=[];return u.applyCheckFunktionToDirectives(e,((e,r)=>{for(const a of r){const r=e===c.Directive.REPORT_URI?"Use HTTPS to send violation reports securely.":"Allow only resources downloaded over HTTPS."
|
@@ -974,38 +974,38 @@ static get meta(){return{id:"interactive",title:hC(dC.UIStrings.interactiveMetri
|
|
974
974
|
score:fC.computeLogNormalScore(n.scoring,a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:SC(yC.UIStrings.seconds,{timeInMs:a.timing})}}},gC.exports.UIStrings=wC;var TC={exports:{}};const EC=kc,xC=Qk,_C=oi,AC={description:"The maximum potential First Input Delay that your users could experience is the duration of the longest task. [Learn more](https://web.dev/lighthouse-max-potential-fid/)."},RC=_C.createMessageInstanceIdFn("lighthouse-core/audits/metrics/max-potential-fid.js",AC);TC.exports=class MaxPotentialFID extends EC{static get meta(){return{id:"max-potential-fid",title:RC(_C.UIStrings.maxPotentialFIDMetric),description:RC(AC.description),scoreDisplayMode:EC.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static get defaultOptions(){return{p10:130,median:250}}static async audit(e,t){const r={trace:e.traces[EC.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[EC.DEFAULT_PASS],
|
975
975
|
gatherContext:e.GatherContext,settings:t.settings},a=await xC.request(r,t);return{score:EC.computeLogNormalScore({p10:t.options.p10,median:t.options.median},a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:RC(_C.UIStrings.ms,{timeInMs:a.timing})}}},TC.exports.UIStrings=AC;var kC={exports:{}};const DC=kc,CC=oi,IC=zk,NC={description:"Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://web.dev/speed-index/)."},LC=CC.createMessageInstanceIdFn("lighthouse-core/audits/metrics/speed-index.js",NC);kC.exports=class SpeedIndex extends DC{static get meta(){return{id:"speed-index",title:LC(CC.UIStrings.speedIndexMetric),description:LC(NC.description),scoreDisplayMode:DC.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static get defaultOptions(){return{mobile:{scoring:{p10:3387,median:5800}},desktop:{scoring:{p10:1311,median:2300}}}}static async audit(e,t){const r={
|
976
976
|
trace:e.traces[DC.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[DC.DEFAULT_PASS],gatherContext:e.GatherContext,settings:t.settings},a=await IC.request(r,t),n=t.options[t.settings.formFactor];return{score:DC.computeLogNormalScore(n.scoring,a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:LC(CC.UIStrings.seconds,{timeInMs:a.timing})}}},kC.exports.UIStrings=NC;var MC={exports:{}};const PC=kc,OC=gD,FC=oi,UC={description:"Sum of all time periods between FCP and Time to Interactive, when task length exceeded 50ms, expressed in milliseconds. [Learn more](https://web.dev/lighthouse-total-blocking-time/)."},jC=FC.createMessageInstanceIdFn("lighthouse-core/audits/metrics/total-blocking-time.js",UC);MC.exports=class TotalBlockingTime extends PC{static get meta(){return{id:"total-blocking-time",title:jC(FC.UIStrings.totalBlockingTimeMetric),description:jC(UC.description),scoreDisplayMode:PC.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}
|
977
|
-
static get defaultOptions(){return{mobile:{scoring:{p10:200,median:600}},desktop:{scoring:{p10:150,median:350}}}}static async audit(e,t){const r=e.traces[PC.DEFAULT_PASS],a=e.devtoolsLogs[PC.DEFAULT_PASS],n=e.GatherContext,i={trace:r,devtoolsLog:a,gatherContext:n,settings:t.settings};if("timespan"===n.gatherMode&&"simulate"===t.settings.throttlingMethod)return{score:1,notApplicable:!0};const o=await OC.request(i,t),s=t.options[t.settings.formFactor];return{score:PC.computeLogNormalScore(s.scoring,o.timing),numericValue:o.timing,numericUnit:"millisecond",displayValue:jC(FC.UIStrings.ms,{timeInMs:o.timing})}}},MC.exports.UIStrings=UC;const BC=kc,$C=ji,qC=Lo;var
|
978
|
-
|
979
|
-
granularity:1,text:"Resource Size"},{key:"statusCode",itemType:"text",text:"Status Code"},{key:"mimeType",itemType:"text",text:"MIME Type"},{key:"resourceType",itemType:"text",text:"Resource Type"}],
|
980
|
-
;let n=0;const i=a.rtt,o=[];for(const[e,t]of a.additionalRttByOrigin.entries()){if(!e.startsWith("http"))continue;const r=t+i;o.push({origin:e,rtt:r}),n=Number.isFinite(r)?Math.max(r,n):n}o.sort(((e,t)=>t.rtt-e.rtt));const s=[{key:"origin",itemType:"text",text:
|
981
|
-
;
|
982
|
-
;
|
983
|
-
;for(const[t,r]of Object.entries(e.JsUsage))for(const e of r)i.set(e.scriptId,t);const o=r.map((e=>{const t=i.get(e.scriptId);if(!t)return{source:{type:"url",value:"(unknown)"}};const r=a.find((e=>e.script.src===t));return{source:
|
984
|
-
nonReplaceCompositeMode:'Effect has composite mode other than "replace"',incompatibleAnimations:"Target has another animation which is incompatible",unsupportedTimingParameters:"Effect has unsupported timing parameters"},
|
985
|
-
requiredArtifacts:["TraceElements","HostUserAgent"]}}static async audit(e){const t=e.HostUserAgent.match(/Chrome\/(\d+)/);if(!t||Number(t[1])<86)return{score:1,notApplicable:!0};const r=[];let a=!1;e.TraceElements.forEach((e=>{if("animation"!==e.traceEventType)return;const t=e.animations||[],n=new Map;for(const{name:e,failureReasonsMask:r,unsupportedProperties:i}of t){if(!r)continue;const t=getActionableFailureReasons(r,i||[]);for(const r of t){e&&(a=!0);const t=n.get(e)||new Set;t.add(r),n.set(e,t)}}if(!n.size)return;const i=[];for(const[e,t]of n)for(const r of t)i.push({failureReason:r,
|
986
|
-
;return r.length>0&&(o=hI
|
987
|
-
;if(n?.options?.firstPartyHostnames)i=n.options.firstPartyHostnames;else{const e=
|
988
|
-
description:"Keep the quantity and size of network requests under the targets set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",requestCountOverBudget:"{count, plural,\n =1 {1 request}\n other {# requests}\n }"},
|
989
|
-
"third-party":
|
990
|
-
},t),
|
991
|
-
requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static async audit(e,t){const r=e.GatherContext,a={trace:e.traces[
|
992
|
-
},l.roughEstimateOfTTI),numericValue:l.roughEstimateOfTTI,numericUnit:"millisecond",displayValue:
|
993
|
-
const r=e.devtoolsLogs[this.DEFAULT_PASS],a=await
|
994
|
-
supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext","URL","TraceElements","ImageElements"],scoreDisplayMode:
|
995
|
-
;for(const{node:e}of n.traverseGenerator())"network"===e.type&&(e.isMainDocument()?s=e:e.id===t.id&&(o=e));if(!s)throw new Error("Could not find main document node");if(!o)throw new Error("Could not find the LCP node");o.removeAllDependencies(),o.addDependency(s);const c=a.simulate(r,{flexibleOrdering:!0}),l=a.simulate(n,{flexibleOrdering:!0
|
996
|
-
const r=e.GatherContext,a=e.traces[PreloadLCPImageAudit.DEFAULT_PASS],n=e.devtoolsLogs[PreloadLCPImageAudit.DEFAULT_PASS],i=e.URL,o={trace:a,devtoolsLog:n,gatherContext:r,settings:t.settings},s=e.TraceElements.find((e=>"largest-contentful-paint"===e.traceEventType)),[c,l,u]=await Promise.all([
|
997
|
-
exports:{}};const
|
998
|
-
|
999
|
-
|
1000
|
-
budgets:t.settings.budgets},t),n=[{key:"label",itemType:"text",text:
|
1001
|
-
|
977
|
+
static get defaultOptions(){return{mobile:{scoring:{p10:200,median:600}},desktop:{scoring:{p10:150,median:350}}}}static async audit(e,t){const r=e.traces[PC.DEFAULT_PASS],a=e.devtoolsLogs[PC.DEFAULT_PASS],n=e.GatherContext,i={trace:r,devtoolsLog:a,gatherContext:n,settings:t.settings};if("timespan"===n.gatherMode&&"simulate"===t.settings.throttlingMethod)return{score:1,notApplicable:!0};const o=await OC.request(i,t),s=t.options[t.settings.formFactor];return{score:PC.computeLogNormalScore(s.scoring,o.timing),numericValue:o.timing,numericUnit:"millisecond",displayValue:jC(FC.UIStrings.ms,{timeInMs:o.timing})}}},MC.exports.UIStrings=UC;const BC=kc,$C=ji,qC=Lo,zC=HT;var VC=class NetworkRequests extends BC{static get meta(){return{id:"network-requests",scoreDisplayMode:BC.SCORING_MODES.INFORMATIVE,title:"Network Requests",description:"Lists the network requests that were made during page load.",requiredArtifacts:["devtoolsLogs","URL","GatherContext"]}}static async audit(e,t){
|
978
|
+
const r=e.devtoolsLogs[BC.DEFAULT_PASS],a=await qC.request(r,t),n=a.reduce(((e,t)=>Math.min(e,t.startTime)),1/0);let i;if("navigation"===e.GatherContext.gatherMode){const a=await zC.request({devtoolsLog:r,URL:e.URL},t);i=a.frameId}const timeToMs=e=>e<n||!Number.isFinite(e)?void 0:1e3*(e-n),o=a.map((e=>{const t=e.lrStatistics?.endTimeDeltaMs,r=e.lrStatistics?.TCPMs,a=e.lrStatistics?.requestMs,n=e.lrStatistics?.responseMs,o=e.isLinkPreload||void 0,s=i&&e.frameId===i||void 0;return{url:$C.elideDataURI(e.url),protocol:e.protocol,startTime:timeToMs(e.startTime),endTime:timeToMs(e.endTime),finished:e.finished,transferSize:e.transferSize,resourceSize:e.resourceSize,statusCode:e.statusCode,mimeType:e.mimeType,resourceType:e.resourceType,isLinkPreload:o,experimentalFromMainFrame:s,lrEndTimeDeltaMs:t,lrTCPMs:r,lrRequestMs:a,lrResponseMs:n}})),s=BC.makeTableDetails([{key:"url",itemType:"url",text:"URL"},{key:"protocol",itemType:"text",text:"Protocol"},{key:"startTime",itemType:"ms",granularity:1,
|
979
|
+
text:"Start Time"},{key:"endTime",itemType:"ms",granularity:1,text:"End Time"},{key:"transferSize",itemType:"bytes",displayUnit:"kb",granularity:1,text:"Transfer Size"},{key:"resourceSize",itemType:"bytes",displayUnit:"kb",granularity:1,text:"Resource Size"},{key:"statusCode",itemType:"text",text:"Status Code"},{key:"mimeType",itemType:"text",text:"MIME Type"},{key:"resourceType",itemType:"text",text:"Resource Type"}],o),c=Number.isFinite(n)?1e6*n:void 0;return s.debugData={type:"debugdata",networkStartTimeTs:c},{score:1,details:s}}},WC={exports:{}};const GC=kc,HC=oi,YC=Lo,KC=xl,JC={title:"Network Round Trip Times",description:"Network round trip times (RTT) have a large impact on performance. If the RTT to an origin is high, it's an indication that servers closer to the user could improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/)."},XC=HC.createMessageInstanceIdFn("lighthouse-core/audits/network-rtt.js",JC);WC.exports=class NetworkRTT extends GC{
|
980
|
+
static get meta(){return{id:"network-rtt",scoreDisplayMode:GC.SCORING_MODES.INFORMATIVE,title:XC(JC.title),description:XC(JC.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[GC.DEFAULT_PASS];if(!(await YC.request(r,t)).length)return{score:1,notApplicable:!0};const a=await KC.request(r,t);let n=0;const i=a.rtt,o=[];for(const[e,t]of a.additionalRttByOrigin.entries()){if(!e.startsWith("http"))continue;const r=t+i;o.push({origin:e,rtt:r}),n=Number.isFinite(r)?Math.max(r,n):n}o.sort(((e,t)=>t.rtt-e.rtt));const s=[{key:"origin",itemType:"text",text:XC(HC.UIStrings.columnURL)},{key:"rtt",itemType:"ms",granularity:1,text:XC(HC.UIStrings.columnTimeSpent)}],c=GC.makeTableDetails(s,o);return{score:1,numericValue:n,numericUnit:"millisecond",displayValue:XC(HC.UIStrings.ms,{timeInMs:n}),details:c}}},WC.exports.UIStrings=JC;var ZC={exports:{}};const QC=kc,eI=oi,tI=Lo,rI=xl,aI={title:"Server Backend Latencies",
|
981
|
+
description:"Server latencies can impact web performance. If the server latency of an origin is high, it's an indication the server is overloaded or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall)."},nI=eI.createMessageInstanceIdFn("lighthouse-core/audits/network-server-latency.js",aI);ZC.exports=class NetworkServerLatency extends QC{static get meta(){return{id:"network-server-latency",scoreDisplayMode:QC.SCORING_MODES.INFORMATIVE,title:nI(aI.title),description:nI(aI.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[QC.DEFAULT_PASS];if(!(await tI.request(r,t)).length)return{score:1,notApplicable:!0};const a=await rI.request(r,t);let n=0;const i=[];for(const[e,t]of a.serverResponseTimeByOrigin.entries())e.startsWith("http")&&(n=Math.max(t,n),i.push({origin:e,serverResponseTime:t}));i.sort(((e,t)=>t.serverResponseTime-e.serverResponseTime));const o=[{key:"origin",
|
982
|
+
itemType:"text",text:nI(eI.UIStrings.columnURL)},{key:"serverResponseTime",itemType:"ms",granularity:1,text:nI(eI.UIStrings.columnTimeSpent)}],s=QC.makeTableDetails(o,i);return{score:Math.max(1-n/500,0),numericValue:n,numericUnit:"millisecond",displayValue:nI(eI.UIStrings.ms,{timeInMs:n}),details:s}}},ZC.exports.UIStrings=aI;var iI={exports:{}};const oI=kc,sI=jb,cI=oi,lI={title:"Avoids `unload` event listeners",failureTitle:"Registers an `unload` listener",description:"The `unload` event does not fire reliably and listening for it can prevent browser optimizations like the Back-Forward Cache. Use `pagehide` or `visibilitychange` events instead. [Learn more](https://web.dev/bfcache/#never-use-the-unload-event)"},uI=cI.createMessageInstanceIdFn("lighthouse-core/audits/no-unload-listeners.js",lI);iI.exports=class NoUnloadListeners extends oI{static get meta(){return{id:"no-unload-listeners",title:uI(lI.title),failureTitle:uI(lI.failureTitle),description:uI(lI.description),
|
983
|
+
requiredArtifacts:["GlobalListeners","JsUsage","SourceMaps","ScriptElements"]}}static async audit(e,t){const r=e.GlobalListeners.filter((e=>"unload"===e.type));if(!r.length)return{score:1};const a=await sI.request(e,t),n=[{key:"source",itemType:"source-location",text:uI(cI.UIStrings.columnSource)}],i=new Map;for(const[t,r]of Object.entries(e.JsUsage))for(const e of r)i.set(e.scriptId,t);const o=r.map((e=>{const t=i.get(e.scriptId);if(!t)return{source:{type:"url",value:"(unknown)"}};const r=a.find((e=>e.script.src===t));return{source:oI.makeSourceLocation(t,e.lineNumber,e.columnNumber,r)}}));return{score:0,details:oI.makeTableDetails(n,o)}}},iI.exports.UIStrings=lI;var dI={exports:{}};const mI=kc,pI=oi,hI={title:"Avoid non-composited animations",description:"Animations which are not composited can be janky and increase CLS. [Learn more](https://web.dev/non-composited-animations)",
|
984
|
+
displayValue:"{itemCount, plural,\n =1 {# animated element found}\n other {# animated elements found}\n }",unsupportedCSSProperty:"{propertyCount, plural,\n =1 {Unsupported CSS Property: {properties}}\n other {Unsupported CSS Properties: {properties}}\n }",transformDependsBoxSize:"Transform-related property depends on box size",filterMayMovePixels:"Filter-related property may move pixels",nonReplaceCompositeMode:'Effect has composite mode other than "replace"',incompatibleAnimations:"Target has another animation which is incompatible",unsupportedTimingParameters:"Effect has unsupported timing parameters"},gI=pI.createMessageInstanceIdFn("lighthouse-core/audits/non-composited-animations.js",hI),fI=[{flag:8192,text:hI.unsupportedCSSProperty},{flag:2048,text:hI.transformDependsBoxSize},{flag:4096,text:hI.filterMayMovePixels},{flag:16,text:hI.nonReplaceCompositeMode},{flag:64,text:hI.incompatibleAnimations},{flag:8,text:hI.unsupportedTimingParameters}]
|
985
|
+
;function getActionableFailureReasons(e,t){return fI.filter((t=>e&t.flag)).map((e=>e.text===hI.unsupportedCSSProperty?gI(e.text,{propertyCount:t.length,properties:t.join(", ")}):gI(e.text)))}dI.exports=class NonCompositedAnimations extends mI{static get meta(){return{id:"non-composited-animations",scoreDisplayMode:mI.SCORING_MODES.INFORMATIVE,title:gI(hI.title),description:gI(hI.description),requiredArtifacts:["TraceElements","HostUserAgent"]}}static async audit(e){const t=e.HostUserAgent.match(/Chrome\/(\d+)/);if(!t||Number(t[1])<86)return{score:1,notApplicable:!0};const r=[];let a=!1;e.TraceElements.forEach((e=>{if("animation"!==e.traceEventType)return;const t=e.animations||[],n=new Map;for(const{name:e,failureReasonsMask:r,unsupportedProperties:i}of t){if(!r)continue;const t=getActionableFailureReasons(r,i||[]);for(const r of t){e&&(a=!0);const t=n.get(e)||new Set;t.add(r),n.set(e,t)}}if(!n.size)return;const i=[];for(const[e,t]of n)for(const r of t)i.push({failureReason:r,
|
986
|
+
animation:e});r.push({node:mI.makeNodeItem(e.node),subItems:{type:"subitems",items:i}})}));const n=[{key:"node",itemType:"node",subItemsHeading:{key:"failureReason",itemType:"text"},text:gI(pI.UIStrings.columnElement)}];a&&n.push({key:null,itemType:"text",subItemsHeading:{key:"animation",itemType:"text"},text:gI(pI.UIStrings.columnName)});const i=mI.makeTableDetails(n,r);let o;return r.length>0&&(o=gI(hI.displayValue,{itemCount:r.length})),{score:0===r.length?1:0,notApplicable:0===r.length,details:i,displayValue:o}}},dI.exports.UIStrings=hI;var yI={exports:{}};const vI=Ao,bI=Lo,wI=ji,SI=Ki,TI=Tu,{Util:EI}=Ni;class ResourceSummary$2{static determineResourceType(e){if(!e.resourceType)return"other";return{Stylesheet:"stylesheet",Image:"image",Media:"media",Font:"font",Script:"script",Document:"document"}[e.resourceType]||"other"}static summarize(e,t,r){const a={stylesheet:{count:0,resourceSize:0,transferSize:0},image:{count:0,resourceSize:0,transferSize:0},media:{count:0,resourceSize:0,
|
987
|
+
transferSize:0},font:{count:0,resourceSize:0,transferSize:0},script:{count:0,resourceSize:0,transferSize:0},document:{count:0,resourceSize:0,transferSize:0},other:{count:0,resourceSize:0,transferSize:0},total:{count:0,resourceSize:0,transferSize:0},"third-party":{count:0,resourceSize:0,transferSize:0}},n=TI.getMatchingBudget(r,t);let i=[];if(n?.options?.firstPartyHostnames)i=n.options.firstPartyHostnames;else{const e=EI.getRootDomain(t);i=[`*.${e}`]}return e.filter((e=>("other"!==this.determineResourceType(e)||!e.url.endsWith("/favicon.ico"))&&!SI.isNonNetworkRequest(e))).forEach((e=>{const t=this.determineResourceType(e);a[t].count++,a[t].resourceSize+=e.resourceSize,a[t].transferSize+=e.transferSize,a.total.count++,a.total.resourceSize+=e.resourceSize,a.total.transferSize+=e.transferSize;i.some((t=>{const r=new wI(e.url);return t.startsWith("*.")?r.hostname.endsWith(t.slice(2)):r.hostname===t}))||(a["third-party"].count++,a["third-party"].resourceSize+=e.resourceSize,
|
988
|
+
a["third-party"].transferSize+=e.transferSize)})),a}static async compute_(e,t){const r=await bI.request(e.devtoolsLog,t);return ResourceSummary$2.summarize(r,e.URL.finalUrl,e.budgets)}}var xI=vI(ResourceSummary$2,["URL","devtoolsLog","budgets"]);const _I=kc,AI=xI,RI=HT,kI=Tu,DI=oi,CI={title:"Performance budget",description:"Keep the quantity and size of network requests under the targets set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",requestCountOverBudget:"{count, plural,\n =1 {1 request}\n other {# requests}\n }"},II=DI.createMessageInstanceIdFn("lighthouse-core/audits/performance-budget.js",CI);yI.exports=class ResourceBudget extends _I{static get meta(){return{id:"performance-budget",title:II(CI.title),description:II(CI.description),scoreDisplayMode:_I.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","URL"]}}static getRowLabel(e){return{
|
989
|
+
total:DI.UIStrings.totalResourceType,document:DI.UIStrings.documentResourceType,script:DI.UIStrings.scriptResourceType,stylesheet:DI.UIStrings.stylesheetResourceType,image:DI.UIStrings.imageResourceType,media:DI.UIStrings.mediaResourceType,font:DI.UIStrings.fontResourceType,other:DI.UIStrings.otherResourceType,"third-party":DI.UIStrings.thirdPartyResourceType}[e]}static tableItems(e,t){return Object.keys(t).map((r=>{const a=II(this.getRowLabel(r)),n=t[r].count,i=t[r].transferSize;let o,s;if(e.resourceSizes){const t=e.resourceSizes.find((e=>e.resourceType===r));t&&i>1024*t.budget&&(o=i-1024*t.budget)}if(e.resourceCounts){const t=e.resourceCounts.find((e=>e.resourceType===r));if(t&&n>t.budget){const e=n-t.budget;s=II(CI.requestCountOverBudget,{count:e})}}return{resourceType:r,label:a,requestCount:n,transferSize:i,countOverBudget:s,sizeOverBudget:o}
|
990
|
+
})).filter((t=>!(!e.resourceSizes||!e.resourceSizes.some((e=>e.resourceType===t.resourceType)))||!(!e.resourceCounts||!e.resourceCounts.some((e=>e.resourceType===t.resourceType))))).sort(((e,t)=>(t.sizeOverBudget||0)-(e.sizeOverBudget||0)))}static async audit(e,t){const r=e.devtoolsLogs[_I.DEFAULT_PASS],a={devtoolsLog:r,URL:e.URL,budgets:t.settings.budgets},n=await AI.request(a,t),i=await RI.request({URL:e.URL,devtoolsLog:r},t),o=kI.getMatchingBudget(t.settings.budgets,i.url);if(!o)return{score:0,notApplicable:!0};const s=[{key:"label",itemType:"text",text:II(DI.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:II(DI.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:II(DI.UIStrings.columnTransferSize)},{key:"countOverBudget",itemType:"text",text:""},{key:"sizeOverBudget",itemType:"bytes",text:II(DI.UIStrings.columnOverBudget)}];return{details:_I.makeTableDetails(s,this.tableItems(o,n)),score:1}}},yI.exports.UIStrings=CI
|
991
|
+
;const NI=kc,LI=oi,MI=db,PI=fb,OI=Tb,FI=Uk,UI=vk,jI=LI.createMessageInstanceIdFn("lighthouse-core/audits/predictive-perf.js",{});var BI=class PredictivePerf extends NI{static get meta(){return{id:"predictive-perf",title:"Predicted Performance (beta)",description:"Predicted performance evaluates how your site will perform under a cellular connection on a mobile device.",scoreDisplayMode:NI.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static async audit(e,t){const r=e.GatherContext,a={trace:e.traces[NI.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[NI.DEFAULT_PASS],gatherContext:r,settings:{}},n=await MI.request(a,t),i=await PI.request(a,t),o=await OI.request(a,t),s=await FI.request(a,t),c=await UI.request(a,t),l={roughEstimateOfFCP:n.timing,optimisticFCP:n.optimisticEstimate.timeInMs,pessimisticFCP:n.pessimisticEstimate.timeInMs,roughEstimateOfFMP:i.timing,optimisticFMP:i.optimisticEstimate.timeInMs,
|
992
|
+
pessimisticFMP:i.pessimisticEstimate.timeInMs,roughEstimateOfTTI:o.timing,optimisticTTI:o.optimisticEstimate.timeInMs,pessimisticTTI:o.pessimisticEstimate.timeInMs,roughEstimateOfSI:s.timing,optimisticSI:s.optimisticEstimate.timeInMs,pessimisticSI:s.pessimisticEstimate.timeInMs,roughEstimateOfLCP:c.timing,optimisticLCP:c.optimisticEstimate.timeInMs,pessimisticLCP:c.pessimisticEstimate.timeInMs};return{score:NI.computeLogNormalScore({p10:3651,median:1e4},l.roughEstimateOfTTI),numericValue:l.roughEstimateOfTTI,numericUnit:"millisecond",displayValue:jI(LI.UIStrings.ms,{timeInMs:l.roughEstimateOfTTI}),details:{type:"debugdata",items:[l]}}}},$I={exports:{}};const qI=kc,zI=oi,VI=Q_.exports,WI=/^(optional)$/,GI=Lo,HI={title:"Fonts with `font-display: optional` are preloaded",failureTitle:"Fonts with `font-display: optional` are not preloaded",description:"Preload `optional` fonts so first-time visitors may use them. [Learn more](https://web.dev/preload-optional-fonts/)"
|
993
|
+
},YI=zI.createMessageInstanceIdFn("lighthouse-core/audits/preload-fonts.js",HI);class PreloadFontsAudit extends qI{static get meta(){return{id:"preload-fonts",title:YI(HI.title),failureTitle:YI(HI.failureTitle),description:YI(HI.description),requiredArtifacts:["devtoolsLogs","URL","CSSUsage"]}}static getURLsAttemptedToPreload(e){const t=e.filter((e=>"Font"===e.resourceType)).filter((e=>e.isLinkPreload)).map((e=>e.url));return new Set(t)}static async audit_(e,t){const r=e.devtoolsLogs[this.DEFAULT_PASS],a=await GI.request(r,t),n=VI.findFontDisplayDeclarations(e,WI).passingURLs,i=PreloadFontsAudit.getURLsAttemptedToPreload(a),o=Array.from(n).filter((e=>!i.has(e))).map((e=>({url:e}))),s=[{key:"url",itemType:"url",text:YI(zI.UIStrings.columnURL)}];return{score:o.length>0?0:1,details:qI.makeTableDetails(s,o),notApplicable:0===n.size}}static async audit(){return{score:1,notApplicable:!0}}}$I.exports=PreloadFontsAudit,$I.exports.UIStrings=HI;var KI={exports:{}}
|
994
|
+
;const JI=kc,XI=oi,ZI=Ki,QI=HT,eN=vk,tN=Dl,rN=Ib,aN={title:"Preload Largest Contentful Paint image",description:"Preload the image used by the LCP element in order to improve your LCP time. [Learn more](https://web.dev/optimize-lcp/#preload-important-resources)."},nN=XI.createMessageInstanceIdFn("lighthouse-core/audits/preload-lcp-image.js",aN);class PreloadLCPImageAudit extends JI{static get meta(){return{id:"preload-lcp-image",title:nN(aN.title),description:nN(aN.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext","URL","TraceElements","ImageElements"],scoreDisplayMode:JI.SCORING_MODES.NUMERIC}}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!ZI.isNonNetworkRequest(e)&&(!(r.length<=a)&&e.frameId===t.frameId))}static findLCPNode(e,t){let r,a;return e.traverse(((e,n)=>{"network"===e.type&&e.record.url===t&&(r=e,a=n.slice(1).filter((e=>"network"===e.type)))})),{lcpNode:r,path:a}}
|
995
|
+
static getLCPNodeToPreload(e,t,r,a){if(!r)return{};const n=a.find((e=>e.node.devtoolsNodePath===r.node.devtoolsNodePath));if(!n)return{};const i=n.src,{lcpNode:o,path:s}=PreloadLCPImageAudit.findLCPNode(t,i);if(!o||!s)return{};return{lcpNodeToPreload:PreloadLCPImageAudit.shouldPreloadRequest(o.record,e,s)?o:void 0,initiatorPath:[{url:o.record.url,initiatorType:o.initiatorType},...s.map((e=>({url:e.record.url,initiatorType:e.initiatorType})))]}}static computeWasteWithGraph(e,t,r,a){if(!e||!t)return{wastedMs:0,results:[]};const n=r.cloneWithRelationships(),i=new Set;for(const e of t.getDependencies())i.add(e.id);let o=null,s=null;for(const{node:e}of n.traverseGenerator())"network"===e.type&&(e.isMainDocument()?s=e:e.id===t.id&&(o=e));if(!s)throw new Error("Could not find main document node");if(!o)throw new Error("Could not find the LCP node");o.removeAllDependencies(),o.addDependency(s);const c=a.simulate(r,{flexibleOrdering:!0}),l=a.simulate(n,{flexibleOrdering:!0
|
996
|
+
}),u=c.nodeTimings.get(t);if(!u)throw new Error("Impossible - node timings should never be undefined");const d=l.nodeTimings.get(o);if(!d)throw new Error("Impossible - node timings should never be undefined");const m=Array.from(l.nodeTimings.keys()).reduce(((e,t)=>e.set(t.id,t)),new Map);let p=0;for(const e of Array.from(i)){const t=m.get(e);if(!t)throw new Error("Impossible - node should never be undefined");const r=l.nodeTimings.get(t)?.endTime||0;p=Math.max(p,r)}const h=u.endTime-Math.max(d.endTime,p);return{wastedMs:h,results:[{node:JI.makeNodeItem(e.node),url:t.record.url,wastedMs:h}]}}static async audit(e,t){const r=e.GatherContext,a=e.traces[PreloadLCPImageAudit.DEFAULT_PASS],n=e.devtoolsLogs[PreloadLCPImageAudit.DEFAULT_PASS],i=e.URL,o={trace:a,devtoolsLog:n,gatherContext:r,settings:t.settings},s=e.TraceElements.find((e=>"largest-contentful-paint"===e.traceEventType)),[c,l,u]=await Promise.all([QI.request({devtoolsLog:n,URL:i},t),eN.request(o,t),tN.request({devtoolsLog:n,
|
997
|
+
settings:t.settings},t)]),d=l.pessimisticGraph,{lcpNodeToPreload:m,initiatorPath:p}=PreloadLCPImageAudit.getLCPNodeToPreload(c,d,s,e.ImageElements),{results:h,wastedMs:f}=PreloadLCPImageAudit.computeWasteWithGraph(s,m,d,u),y=[{key:"node",valueType:"node",label:""},{key:"url",valueType:"url",label:nN(XI.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:nN(XI.UIStrings.columnWastedMs)}],v=JI.makeOpportunityDetails(y,h,f);return p&&(v.debugData={type:"debugdata",initiatorPath:p,pathLength:p.length}),{score:rN.scoreForWastedMs(f),numericValue:f,numericUnit:"millisecond",displayValue:f?nN(XI.UIStrings.displayValueMsSavings,{wastedMs:f}):"",details:v}}}KI.exports=PreloadLCPImageAudit,KI.exports.UIStrings=aN;var iN={exports:{}};const oN=kc,sN=Ib,cN=oi,lN=Yp,uN=Lo,dN=HT,mN=Tb,pN={title:"Avoid multiple page redirects",description:"Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects/)."
|
998
|
+
},hN=cN.createMessageInstanceIdFn("lighthouse-core/audits/redirects.js",pN);class Redirects extends oN{static get meta(){return{id:"redirects",title:hN(pN.title),description:hN(pN.description),scoreDisplayMode:oN.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["URL","GatherContext","devtoolsLogs","traces"]}}static getDocumentRequestChain(e,t,r){const a=[];for(const e of r.processEvents){if("navigationStart"!==e.name)continue;const r=e.args.data||{};if(!r.documentLoaderURL||!r.isLoadingMainFrame)continue;let n=t.find((e=>e.url===r.documentLoaderURL));for(;n;)a.push(n),n=n.redirectDestination}return a.length?a:(e.redirects||[]).concat(e)}static async audit(e,t){const r=t.settings,a=e.traces[oN.DEFAULT_PASS],n=e.devtoolsLogs[oN.DEFAULT_PASS],i=e.GatherContext,o=await lN.request(a,t),s=await uN.request(n,t),c=await dN.request({URL:e.URL,devtoolsLog:n},t),l={trace:a,devtoolsLog:n,gatherContext:i,settings:r},u=await mN.request(l,t),d=new Map
|
999
|
+
;for(const[e,t]of u.pessimisticEstimate.nodeTimings.entries())"network"===e.type&&d.set(e.record.url,t);const m=Redirects.getDocumentRequestChain(c,s,o);let p=0;const h=[];for(let e=0;e<m.length&&!(m.length<2);e++){const t=m[e],a=m[e+1]||t,n=d.get(t.url),i=d.get(a.url);if(!n||!i)throw new Error("Could not find redirects in graph");const o=i.startTime-n.startTime,s=a.startTime-t.startTime,c="simulate"===r.throttlingMethod?o:1e3*s;p+=c,h.push({url:t.url,wastedMs:c})}const f=[{key:"url",valueType:"url",label:hN(cN.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:hN(cN.UIStrings.columnTimeSpent)}],y=oN.makeOpportunityDetails(f,h,p);return{score:m.length<=2?1:sN.scoreForWastedMs(p),numericValue:p,numericUnit:"millisecond",displayValue:p?hN(cN.UIStrings.displayValueMsSavings,{wastedMs:p}):"",details:y}}}iN.exports=Redirects,iN.exports.UIStrings=pN;var gN={exports:{}};const fN=kc,yN=xI,vN=oi,bN={title:"Keep request counts low and transfer sizes small",
|
1000
|
+
description:"To set budgets for the quantity and size of page resources, add a budget.json file. [Learn more](https://web.dev/use-lighthouse-for-performance-budgets/).",displayValue:"{requestCount, plural, =1 {1 request • {byteCount, number, bytes} KiB} other {# requests • {byteCount, number, bytes} KiB}}"},wN=vN.createMessageInstanceIdFn("lighthouse-core/audits/resource-summary.js",bN);gN.exports=class ResourceSummary extends fN{static get meta(){return{id:"resource-summary",title:wN(bN.title),description:wN(bN.description),scoreDisplayMode:fN.SCORING_MODES.INFORMATIVE,requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[fN.DEFAULT_PASS],a=await yN.request({devtoolsLog:r,URL:e.URL,budgets:t.settings.budgets},t),n=[{key:"label",itemType:"text",text:wN(vN.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:wN(vN.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:wN(vN.UIStrings.columnTransferSize)}],i={
|
1001
|
+
total:wN(vN.UIStrings.totalResourceType),document:wN(vN.UIStrings.documentResourceType),script:wN(vN.UIStrings.scriptResourceType),stylesheet:wN(vN.UIStrings.stylesheetResourceType),image:wN(vN.UIStrings.imageResourceType),media:wN(vN.UIStrings.mediaResourceType),font:wN(vN.UIStrings.fontResourceType),other:wN(vN.UIStrings.otherResourceType),"third-party":wN(vN.UIStrings.thirdPartyResourceType)},o=Object.keys(a).map((e=>({resourceType:e,label:i[e],requestCount:a[e].count,transferSize:a[e].transferSize}))),s=o.find((e=>"third-party"===e.resourceType))||[],c=o.filter((e=>"third-party"!==e.resourceType)).sort(((e,t)=>t.transferSize-e.transferSize)).concat(s);return{details:fN.makeTableDetails(n,c),score:1,displayValue:wN(bN.displayValue,{requestCount:a.total.count,byteCount:a.total.transferSize})}}},gN.exports.UIStrings=bN;var SN={exports:{}};!function(e){function JPEGEncoder(e){
|
1002
1002
|
var t,r,a,n,i,o=Math.floor,s=new Array(64),c=new Array(64),l=new Array(64),u=new Array(64),d=new Array(65535),m=new Array(65535),p=new Array(64),h=new Array(64),f=[],y=0,v=7,b=new Array(64),w=new Array(64),S=new Array(64),T=new Array(256),E=new Array(2048),x=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],_=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],A=[0,1,2,3,4,5,6,7,8,9,10,11],R=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],k=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],D=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],C=[0,1,2,3,4,5,6,7,8,9,10,11],I=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],N=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250]
|
1003
1003
|
;function computeHuffmanTbl(e,t){for(var r=0,a=0,n=new Array,i=1;i<=16;i++){for(var o=1;o<=e[i];o++)n[t[a]]=[],n[t[a]][0]=r,n[t[a]][1]=i,a++,r++;r*=2}return n}function writeBits(e){for(var t=e[0],r=e[1]-1;r>=0;)t&1<<r&&(y|=1<<v),r--,--v<0&&(255==y?(writeByte(255),writeByte(0)):writeByte(y),v=7,y=0)}function writeByte(e){f.push(e)}function writeWord(e){writeByte(e>>8&255),writeByte(255&e)}function processDU(e,t,r,a,n){for(var i,o=n[0],s=n[240],c=function fDCTQuant(e,t){var r,a,n,i,o,s,c,l,u,d,m=0;for(u=0;u<8;++u){r=e[m],a=e[m+1],n=e[m+2],i=e[m+3],o=e[m+4],s=e[m+5],c=e[m+6];var h=r+(l=e[m+7]),f=r-l,y=a+c,v=a-c,b=n+s,w=n-s,S=i+o,T=i-o,E=h+S,x=h-S,_=y+b,A=y-b;e[m]=E+_,e[m+4]=E-_;var R=.707106781*(A+x);e[m+2]=x+R,e[m+6]=x-R;var k=.382683433*((E=T+w)-(A=v+f)),D=.5411961*E+k,C=1.306562965*A+k,I=.707106781*(_=w+v),N=f+I,L=f-I;e[m+5]=L+D,e[m+3]=L-D,e[m+1]=N+C,e[m+7]=N-C,m+=8}for(m=0,u=0;u<8;++u){r=e[m],a=e[m+8],n=e[m+16],i=e[m+24],o=e[m+32],s=e[m+40],c=e[m+48]
|
1004
1004
|
;var M=r+(l=e[m+56]),P=r-l,O=a+c,F=a-c,U=n+s,j=n-s,B=i+o,$=i-o,q=M+B,z=M-B,V=O+U,W=O-U;e[m]=q+V,e[m+32]=q-V;var G=.707106781*(W+z);e[m+16]=z+G,e[m+48]=z-G;var H=.382683433*((q=$+j)-(W=F+P)),Y=.5411961*q+H,K=1.306562965*W+H,J=.707106781*(V=j+F),X=P+J,Z=P-J;e[m+40]=Z+Y,e[m+24]=Z-Y,e[m+8]=X+K,e[m+56]=X-K,m++}for(u=0;u<64;++u)d=e[u]*t[u],p[u]=d>0?d+.5|0:d-.5|0;return p}(e,t),l=0;l<64;++l)h[x[l]]=c[l];var u=h[0]-r;r=h[0],0==u?writeBits(a[0]):(writeBits(a[m[i=32767+u]]),writeBits(d[i]));for(var f=63;f>0&&0==h[f];f--);if(0==f)return writeBits(o),r;for(var y,v=1;v<=f;){for(var b=v;0==h[v]&&v<=f;++v);var w=v-b;if(w>=16){y=w>>4;for(var S=1;S<=y;++S)writeBits(s);w&=15}i=32767+h[v],writeBits(n[(w<<4)+m[i]]),writeBits(d[i]),v++}return 63!=f&&writeBits(o),r}function setQuality(e){if(e<=0&&(e=1),e>100&&(e=100),i!=e){(function initQuantTables(e){
|
1005
1005
|
for(var t=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],r=0;r<64;r++){var a=o((t[r]*e+50)/100);a<1?a=1:a>255&&(a=255),s[x[r]]=a}for(var n=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],i=0;i<64;i++){var d=o((n[i]*e+50)/100);d<1?d=1:d>255&&(d=255),c[x[i]]=d}for(var m=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],p=0,h=0;h<8;h++)for(var f=0;f<8;f++)l[p]=1/(s[x[p]]*m[h]*m[f]*8),u[p]=1/(c[x[p]]*m[h]*m[f]*8),p++})(e<50?Math.floor(5e3/e):Math.floor(200-2*e)),i=e}}this.encode=function(e,i){(new Date).getTime(),i&&setQuality(i),f=new Array,y=0,v=7,writeWord(65496),function writeAPP0(){writeWord(65504),writeWord(16),writeByte(74),writeByte(70),writeByte(73),
|
1006
1006
|
writeByte(70),writeByte(0),writeByte(1),writeByte(1),writeByte(0),writeWord(1),writeWord(1),writeByte(0),writeByte(0)}(),function writeAPP1(e){if(e){writeWord(65505),69===e[0]&&120===e[1]&&105===e[2]&&102===e[3]?writeWord(e.length+2):(writeWord(e.length+5+2),writeByte(69),writeByte(120),writeByte(105),writeByte(102),writeByte(0));for(var t=0;t<e.length;t++)writeByte(e[t])}}(e.exifBuffer),function writeDQT(){writeWord(65499),writeWord(132),writeByte(0);for(var e=0;e<64;e++)writeByte(s[e]);writeByte(1);for(var t=0;t<64;t++)writeByte(c[t])}(),function writeSOF0(e,t){writeWord(65472),writeWord(17),writeByte(8),writeWord(t),writeWord(e),writeByte(3),writeByte(1),writeByte(17),writeByte(0),writeByte(2),writeByte(17),writeByte(1),writeByte(3),writeByte(17),writeByte(1)}(e.width,e.height),function writeDHT(){writeWord(65476),writeWord(418),writeByte(0);for(var e=0;e<16;e++)writeByte(_[e+1]);for(var t=0;t<=11;t++)writeByte(A[t]);writeByte(16);for(var r=0;r<16;r++)writeByte(R[r+1])
|
1007
1007
|
;for(var a=0;a<=161;a++)writeByte(k[a]);writeByte(1);for(var n=0;n<16;n++)writeByte(D[n+1]);for(var i=0;i<=11;i++)writeByte(C[i]);writeByte(17);for(var o=0;o<16;o++)writeByte(I[o+1]);for(var s=0;s<=161;s++)writeByte(N[s])}(),function writeSOS(){writeWord(65498),writeWord(12),writeByte(3),writeByte(1),writeByte(0),writeByte(2),writeByte(17),writeByte(3),writeByte(17),writeByte(0),writeByte(63),writeByte(0)}();var o=0,d=0,m=0;y=0,v=7,this.encode.displayName="_encode_";for(var p,h,T,x,L,M,P,O,F,U=e.data,j=e.width,B=e.height,$=4*j,q=0;q<B;){for(p=0;p<$;){for(M=L=$*q+p,P=-1,O=0,F=0;F<64;F++)M=L+(O=F>>3)*$+(P=4*(7&F)),q+O>=B&&(M-=$*(q+1+O-B)),p+P>=$&&(M-=p+P-$+4),h=U[M++],T=U[M++],x=U[M++],b[F]=(E[h]+E[T+256>>0]+E[x+512>>0]>>16)-128,w[F]=(E[h+768>>0]+E[T+1024>>0]+E[x+1280>>0]>>16)-128,S[F]=(E[h+1280>>0]+E[T+1536>>0]+E[x+1792>>0]>>16)-128;o=processDU(b,l,o,t,a),d=processDU(w,u,d,r,n),m=processDU(S,u,m,r,n),p+=32}q+=8}if(v>=0){var z=[];z[1]=v+1,z[0]=(1<<v+1)-1,writeBits(z)}
|
1008
|
-
return writeWord(65497),Buffer$2.from(f)},function init(){(new Date).getTime(),e||(e=50),function initCharLookupTable(){for(var e=String.fromCharCode,t=0;t<256;t++)T[t]=e(t)}(),function initHuffmanTbl(){t=computeHuffmanTbl(_,A),r=computeHuffmanTbl(D,C),a=computeHuffmanTbl(R,k),n=computeHuffmanTbl(I,N)}(),function initCategoryNumber(){for(var e=1,t=2,r=1;r<=15;r++){for(var a=e;a<t;a++)m[32767+a]=r,d[32767+a]=[],d[32767+a][1]=r,d[32767+a][0]=a;for(var n=-(t-1);n<=-e;n++)m[32767+n]=r,d[32767+n]=[],d[32767+n][1]=r,d[32767+n][0]=t-1+n;e<<=1,t<<=1}}(),function initRGBYUVTable(){for(var e=0;e<256;e++)E[e]=19595*e,E[e+256>>0]=38470*e,E[e+512>>0]=7471*e+32768,E[e+768>>0]=-11059*e,E[e+1024>>0]=-21709*e,E[e+1280>>0]=32768*e+8421375,E[e+1536>>0]=-27439*e,E[e+1792>>0]=-5329*e}(),setQuality(e),(new Date).getTime()}()}e.exports=function encode(e,t){void 0===t&&(t=50);return{data:new JPEGEncoder(t).encode(e,t),width:e.width,height:e.height}}}(
|
1008
|
+
return writeWord(65497),Buffer$2.from(f)},function init(){(new Date).getTime(),e||(e=50),function initCharLookupTable(){for(var e=String.fromCharCode,t=0;t<256;t++)T[t]=e(t)}(),function initHuffmanTbl(){t=computeHuffmanTbl(_,A),r=computeHuffmanTbl(D,C),a=computeHuffmanTbl(R,k),n=computeHuffmanTbl(I,N)}(),function initCategoryNumber(){for(var e=1,t=2,r=1;r<=15;r++){for(var a=e;a<t;a++)m[32767+a]=r,d[32767+a]=[],d[32767+a][1]=r,d[32767+a][0]=a;for(var n=-(t-1);n<=-e;n++)m[32767+n]=r,d[32767+n]=[],d[32767+n][1]=r,d[32767+n][0]=t-1+n;e<<=1,t<<=1}}(),function initRGBYUVTable(){for(var e=0;e<256;e++)E[e]=19595*e,E[e+256>>0]=38470*e,E[e+512>>0]=7471*e+32768,E[e+768>>0]=-11059*e,E[e+1024>>0]=-21709*e,E[e+1280>>0]=32768*e+8421375,E[e+1536>>0]=-27439*e,E[e+1792>>0]=-5329*e}(),setQuality(e),(new Date).getTime()}()}e.exports=function encode(e,t){void 0===t&&(t=50);return{data:new JPEGEncoder(t).encode(e,t),width:e.width,height:e.height}}}(SN);var TN={exports:{}};!function(e){
|
1009
1009
|
var t=function jpegImage(){var e=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),t=4017,r=799,a=3406,n=2276,i=1567,o=3784,s=5793,c=2896;function constructor(){}function buildHuffmanTable(e,t){for(var r,a,n=0,i=[],o=16;o>0&&!e[o-1];)o--;i.push({children:[],index:0});var s,c=i[0];for(r=0;r<o;r++){for(a=0;a<e[r];a++){for((c=i.pop()).children[c.index]=t[n];c.index>0;){if(0===i.length)throw new Error("Could not recreate Huffman Table");c=i.pop()}for(c.index++,i.push(c);i.length<=r;)i.push(s={children:[],index:0}),c.children[c.index]=s.children,c=s;n++}r+1<o&&(i.push(s={children:[],index:0}),c.children[c.index]=s.children,c=s)}return i[0].children}function decodeScan(t,r,a,n,i,o,s,c,l,u){a.precision,a.samplesPerLine,a.scanLines;var d=a.mcusPerLine,m=a.progressive;a.maxH,a.maxV;var p=r,h=0,f=0;function readBit(){if(f>0)return f--,h>>f&1
|
1010
1010
|
;if(255==(h=t[r++])){var e=t[r++];if(e)throw new Error("unexpected marker: "+(h<<8|e).toString(16))}return f=7,h>>>7}function decodeHuffman(e){for(var t,r=e;null!==(t=readBit());){if("number"==typeof(r=r[t]))return r;if("object"!=typeof r)throw new Error("invalid huffman sequence")}return null}function receive(e){for(var t=0;e>0;){var r=readBit();if(null===r)return;t=t<<1|r,e--}return t}function receiveAndExtend(e){var t=receive(e);return t>=1<<e-1?t:t+(-1<<e)+1}var y=0;var v,b=0;function decodeMcu(e,t,r,a,n){var i=r%d,o=(r/d|0)*e.v+a,s=i*e.h+n;void 0===e.blocks[o]&&u.tolerantDecoding||t(e,e.blocks[o][s])}function decodeBlock(e,t,r){var a=r/e.blocksPerLine|0,n=r%e.blocksPerLine;void 0===e.blocks[a]&&u.tolerantDecoding||t(e,e.blocks[a][n])}var w,S,T,E,x,_,A=n.length;_=m?0===o?0===c?function decodeDCFirst(e,t){var r=decodeHuffman(e.huffmanTableDC),a=0===r?0:receiveAndExtend(r)<<l;t[0]=e.pred+=a}:function decodeDCSuccessive(e,t){t[0]|=readBit()<<l}:0===c?function decodeACFirst(t,r){
|
1011
1011
|
if(y>0)y--;else for(var a=o,n=s;a<=n;){var i=decodeHuffman(t.huffmanTableAC),c=15&i,u=i>>4;if(0!==c)r[e[a+=u]]=receiveAndExtend(c)*(1<<l),a++;else{if(u<15){y=receive(u)+(1<<u)-1;break}a+=16}}}:function decodeACSuccessive(t,r){for(var a=o,n=s,i=0;a<=n;){var c=e[a],u=r[c]<0?-1:1;switch(b){case 0:var d=decodeHuffman(t.huffmanTableAC),m=15&d;if(i=d>>4,0===m)i<15?(y=receive(i)+(1<<i),b=4):(i=16,b=1);else{if(1!==m)throw new Error("invalid ACn encoding");v=receiveAndExtend(m),b=i?2:3}continue;case 1:case 2:r[c]?r[c]+=(readBit()<<l)*u:0==--i&&(b=2==b?3:0);break;case 3:r[c]?r[c]+=(readBit()<<l)*u:(r[c]=v<<l,b=0);break;case 4:r[c]&&(r[c]+=(readBit()<<l)*u)}a++}4===b&&0==--y&&(b=0)}:function decodeBaseline(t,r){var a=decodeHuffman(t.huffmanTableDC),n=0===a?0:receiveAndExtend(a);r[0]=t.pred+=n;for(var i=1;i<64;){var o=decodeHuffman(t.huffmanTableAC),s=15&o,c=o>>4;if(0!==s)r[e[i+=c]]=receiveAndExtend(s),i++;else{if(c<15)break;i+=16}}};var R,k,D,C,I=0
|
@@ -1019,213 +1019,213 @@ n.samplesPerLine=readUint16(),n.components={},n.componentsOrder=[];var w=n.scanL
|
|
1019
1019
|
var r,a,n,i,o,s,c,l,u,d,m,p,h,f,y,v,b,w,S,T,E,x=this.width/e,_=this.height/t,A=0,R=e*t*this.components.length;requestMemoryAllocation(R);var k=new Uint8Array(R);switch(this.components.length){case 1:for(r=this.components[0],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],u=0;u<e;u++)m=o[0|u*r.scaleX*x],k[A++]=m;break;case 2:for(r=this.components[0],a=this.components[1],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],u=0;u<e;u++)m=o[0|u*r.scaleX*x],k[A++]=m,m=s[0|u*a.scaleX*x],k[A++]=m;break;case 3:for(E=!0,this.adobe&&this.adobe.transformCode?E=!0:void 0!==this.opts.colorTransform&&(E=!!this.opts.colorTransform),r=this.components[0],a=this.components[1],n=this.components[2],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],c=n.lines[0|d*n.scaleY*_],u=0;u<e;u++)E?(m=o[0|u*r.scaleX*x],p=s[0|u*a.scaleX*x],w=clampTo8bit(m+1.402*((h=c[0|u*n.scaleX*x])-128)),S=clampTo8bit(m-.3441363*(p-128)-.71413636*(h-128)),
|
1020
1020
|
T=clampTo8bit(m+1.772*(p-128))):(w=o[0|u*r.scaleX*x],S=s[0|u*a.scaleX*x],T=c[0|u*n.scaleX*x]),k[A++]=w,k[A++]=S,k[A++]=T;break;case 4:if(!this.adobe)throw new Error("Unsupported color mode (4 components)");for(E=!1,this.adobe&&this.adobe.transformCode?E=!0:void 0!==this.opts.colorTransform&&(E=!!this.opts.colorTransform),r=this.components[0],a=this.components[1],n=this.components[2],i=this.components[3],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],c=n.lines[0|d*n.scaleY*_],l=i.lines[0|d*i.scaleY*_],u=0;u<e;u++)E?(m=o[0|u*r.scaleX*x],p=s[0|u*a.scaleX*x],h=c[0|u*n.scaleX*x],f=l[0|u*i.scaleX*x],y=255-clampTo8bit(m+1.402*(h-128)),v=255-clampTo8bit(m-.3441363*(p-128)-.71413636*(h-128)),b=255-clampTo8bit(m+1.772*(p-128))):(y=o[0|u*r.scaleX*x],v=s[0|u*a.scaleX*x],b=c[0|u*n.scaleX*x],f=l[0|u*i.scaleX*x]),k[A++]=255-y,k[A++]=255-v,k[A++]=255-b,k[A++]=255-f;break;default:throw new Error("Unsupported color mode")}return k},copyToImageData:function copyToImageData(e,t){
|
1021
1021
|
var r,a,n,i,o,s,c,l,u,d=e.width,m=e.height,p=e.data,h=this.getData(d,m),f=0,y=0;switch(this.components.length){case 1:for(a=0;a<m;a++)for(r=0;r<d;r++)n=h[f++],p[y++]=n,p[y++]=n,p[y++]=n,t&&(p[y++]=255);break;case 3:for(a=0;a<m;a++)for(r=0;r<d;r++)c=h[f++],l=h[f++],u=h[f++],p[y++]=c,p[y++]=l,p[y++]=u,t&&(p[y++]=255);break;case 4:for(a=0;a<m;a++)for(r=0;r<d;r++)o=h[f++],s=h[f++],n=h[f++],c=255-clampTo8bit(o*(1-(i=h[f++])/255)+i),l=255-clampTo8bit(s*(1-i/255)+i),u=255-clampTo8bit(n*(1-i/255)+i),p[y++]=c,p[y++]=l,p[y++]=u,t&&(p[y++]=255);break;default:throw new Error("Unsupported color mode")}}};var l=0,u=0;function requestMemoryAllocation(e=0){var t=l+e;if(t>u){var r=Math.ceil((t-u)/1024/1024);throw new Error(`maxMemoryUsageInMB limit exceeded by at least ${r}MB`)}l=t}return constructor.resetMaxMemoryUsage=function(e){l=0,u=e},constructor.getBytesAllocated=function(){return l},constructor.requestMemoryAllocation=requestMemoryAllocation,constructor}();e.exports=function decode(e,r={}){
|
1022
|
-
var a={colorTransform:void 0,useTArray:!1,formatAsRGBA:!0,tolerantDecoding:!0,maxResolutionInMP:100,maxMemoryUsageInMB:512,...r},n=new Uint8Array(e),i=new t;i.opts=a,t.resetMaxMemoryUsage(1024*a.maxMemoryUsageInMB*1024),i.parse(n);var o=a.formatAsRGBA?4:3,s=i.width*i.height*o;try{t.requestMemoryAllocation(s);var c={width:i.width,height:i.height,exifBuffer:i.exifBuffer,data:a.useTArray?new Uint8Array(s):Buffer$2.alloc(s)};i.comments.length>0&&(c.comments=i.comments)}catch(e){throw e instanceof RangeError?new Error("Could not allocate enough memory for the image. Required: "+s):e}return i.copyToImageData(c,a.formatAsRGBA),c}}(
|
1023
|
-
static scaleImageToThumbnail(e){const t=120,r=e.width/t,a=Math.floor(e.height/r),n=new Uint8Array(t*a*4);for(let i=0;i<t;i++)for(let o=0;o<a;o++){const a=Math.floor(i*r),s=4*(Math.floor(o*r)*e.width+a),c=4*(o*t+i);n[c]=e.data[s],n[c+1]=e.data[s+1],n[c+2]=e.data[s+2],n[c+3]=e.data[s+3]}return{width:t,height:a,data:n}}static async _audit(e,t){const r=e.traces[
|
1024
|
-
timing:Math.round(t-n.beginning),timestamp:1e3*t,data:`data:image/jpeg;base64,${r}`})}return{score:1,details:{type:"filmstrip",scale:l,items:o}}}static async audit(e,t){try{return await this._audit(e,t)}catch(t){if(new Set([
|
1022
|
+
var a={colorTransform:void 0,useTArray:!1,formatAsRGBA:!0,tolerantDecoding:!0,maxResolutionInMP:100,maxMemoryUsageInMB:512,...r},n=new Uint8Array(e),i=new t;i.opts=a,t.resetMaxMemoryUsage(1024*a.maxMemoryUsageInMB*1024),i.parse(n);var o=a.formatAsRGBA?4:3,s=i.width*i.height*o;try{t.requestMemoryAllocation(s);var c={width:i.width,height:i.height,exifBuffer:i.exifBuffer,data:a.useTArray?new Uint8Array(s):Buffer$2.alloc(s)};i.comments.length>0&&(c.comments=i.comments)}catch(e){throw e instanceof RangeError?new Error("Could not allocate enough memory for the image. Required: "+s):e}return i.copyToImageData(c,a.formatAsRGBA),c}}(TN);var EN={encode:SN.exports,decode:TN.exports};const xN=kc,_N=vi.exports,AN=EN,RN=ik;class ScreenshotThumbnails extends xN{static get meta(){return{id:"screenshot-thumbnails",scoreDisplayMode:xN.SCORING_MODES.INFORMATIVE,title:"Screenshot Thumbnails",description:"This is what the load of your site looked like.",requiredArtifacts:["traces","GatherContext"]}}
|
1023
|
+
static scaleImageToThumbnail(e){const t=120,r=e.width/t,a=Math.floor(e.height/r),n=new Uint8Array(t*a*4);for(let i=0;i<t;i++)for(let o=0;o<a;o++){const a=Math.floor(i*r),s=4*(Math.floor(o*r)*e.width+a),c=4*(o*t+i);n[c]=e.data[s],n[c+1]=e.data[s+1],n[c+2]=e.data[s+2],n[c+3]=e.data[s+3]}return{width:t,height:a,data:n}}static async _audit(e,t){const r=e.traces[xN.DEFAULT_PASS],a=new Map,n=await RN.request(r,t),i=t.options.minimumTimelineDuration||3e3,o=[],s=n.frames.filter((e=>!e.isProgressInterpolated())),c=n.complete||Math.max(...n.frames.map((e=>e.getTimeStamp()-n.beginning))),l=Math.max(c,i);if(!s.length||!Number.isFinite(l))throw new _N(_N.errors.INVALID_SPEEDLINE);for(let e=1;e<=10;e++){const t=n.beginning+l*e/10;let r,i=null;10===e?i=s[s.length-1]:s.forEach((e=>{e.getTimeStamp()<=t&&(i=e)}));const c=a.get(i);if(c)r=c;else{const e=i.getParsedImage(),t=ScreenshotThumbnails.scaleImageToThumbnail(e);r=AN.encode(t,90).data.toString("base64"),a.set(i,r)}o.push({
|
1024
|
+
timing:Math.round(t-n.beginning),timestamp:1e3*t,data:`data:image/jpeg;base64,${r}`})}return{score:1,details:{type:"filmstrip",scale:l,items:o}}}static async audit(e,t){try{return await this._audit(e,t)}catch(t){if(new Set([_N.errors.NO_SCREENSHOTS.code,_N.errors.SPEEDINDEX_OF_ZERO.code,_N.errors.NO_SPEEDLINE_FRAMES.code,_N.errors.INVALID_SPEEDLINE.code]).has(t.code)&&"timespan"===e.GatherContext.gatherMode)return{notApplicable:!0,score:1};throw t}}}var kN=ScreenshotThumbnails;const DN=kc,CN=jb,IN=zS,NN=qb;class ScriptTreemapDataAudit extends DN{static get meta(){return{id:"script-treemap-data",scoreDisplayMode:DN.SCORING_MODES.INFORMATIVE,title:"Script Treemap Data",description:"Used for treemap app",requiredArtifacts:["traces","devtoolsLogs","SourceMaps","ScriptElements","JsUsage","URL"]}}static makeScriptNode(e,t,r){function newNode(e){return{name:e,resourceBytes:0}}const a=newNode(t);function addAllNodesInSourcePath(e,r){let n=a;a.resourceBytes+=r.resourceBytes,
|
1025
1025
|
r.unusedBytes&&(a.unusedBytes=(a.unusedBytes||0)+r.unusedBytes);const i=e.replace(t,"").split(/\/+/);i.forEach(((e,t)=>{if(0===e.length)return;const a=t===i.length-1;let o=n.children&&n.children.find((t=>t.name===e));o||(o=newNode(e),n.children=n.children||[],n.children.push(o)),n=o,n.resourceBytes+=r.resourceBytes,r.unusedBytes&&(n.unusedBytes=(n.unusedBytes||0)+r.unusedBytes),a&&void 0!==r.duplicatedNormalizedModuleName&&(n.duplicatedNormalizedModuleName=r.duplicatedNormalizedModuleName)}))}for(const[e,t]of Object.entries(r))addAllNodesInSourcePath(e,t);if(function collapseAll(e){for(;e.children&&1===e.children.length;)e.name+="/"+e.children[0].name,e.children=e.children[0].children;if(e.children)for(const t of e.children)collapseAll(t)}(a),!a.name)return{...a,name:e,children:a.children};const n={...a};return n.name=e,n.children=[a],n}static async makeNodes(e,t){const r=[];let a=0;for(const t of e.ScriptElements)t.src||(a+=(t.content||"").length);if(a){const t=e.URL.finalUrl;r.push({
|
1026
|
-
name:t,resourceBytes:a})}const n=await
|
1027
|
-
unusedBytes:l.wastedBytes};r.push(u)}return r}static async audit(e,t){return{score:1,details:{type:"treemap-data",nodes:await ScriptTreemapDataAudit.makeNodes(e,t)}}}}var
|
1028
|
-
description:UN
|
1029
|
-
;return a.has(r.href)&&a.has(t.href)&&r.href!==t.href?{score:0,explanation:UN
|
1030
|
-
description:"Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn More](https://support.google.com/webmasters/answer/9112205)",columnFailingLink:"Uncrawlable Link"},
|
1031
|
-
key:"node",itemType:"node",text:qN
|
1026
|
+
name:t,resourceBytes:a})}const n=await CN.request(e,t),i=await NN.request(e,t);for(const a of e.ScriptElements){if(!a.src)continue;const o=a.src,s=n.find((e=>a.src===e.script.src)),c=e.JsUsage[a.src]||[];if(!s&&0===c.length){r.push({name:o,resourceBytes:a.content?.length||0});continue}const l=await IN.request({url:a.src,scriptCoverages:c,bundle:s},t);let u;if(s&&!("errorMessage"in s.sizes)){const e={};for(const t of Object.keys(s.sizes.files)){const r={resourceBytes:s.sizes.files[t]};l.sourcesWastedBytes&&(r.unusedBytes=l.sourcesWastedBytes[t]);let a=t;s.rawMap.sourceRoot&&t.startsWith(s.rawMap.sourceRoot)&&(a=t.replace(s.rawMap.sourceRoot,""));const n=NN.normalizeSource(a);i.has(n)&&(r.duplicatedNormalizedModuleName=n),e[t]=r}if(s.sizes.unmappedBytes){const t={resourceBytes:s.sizes.unmappedBytes};l.sourcesWastedBytes&&(t.unusedBytes=l.sourcesWastedBytes["(unmapped)"]),e["(unmapped)"]=t}u=this.makeScriptNode(a.src,s.rawMap.sourceRoot||"",e)}else u={name:o,resourceBytes:l.totalBytes,
|
1027
|
+
unusedBytes:l.wastedBytes};r.push(u)}return r}static async audit(e,t){return{score:1,details:{type:"treemap-data",nodes:await ScriptTreemapDataAudit.makeNodes(e,t)}}}}var LN=ScriptTreemapDataAudit,MN={exports:{}};const PN=kc,ON=ji,FN=HT,UN={title:"Document has a valid `rel=canonical`",failureTitle:"Document does not have a valid `rel=canonical`",description:"Canonical links suggest which URL to show in search results. [Learn more](https://web.dev/canonical/).",explanationConflict:"Multiple conflicting URLs ({urlList})",explanationInvalid:"Invalid URL ({url})",explanationRelative:"Is not an absolute URL ({url})",explanationPointsElsewhere:"Points to another `hreflang` location ({url})",explanationRoot:"Points to the domain's root URL (the homepage), instead of an equivalent page of content"},jN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/canonical.js",UN);class Canonical extends PN{static get meta(){return{id:"canonical",title:jN(UN.title),failureTitle:jN(UN.failureTitle),
|
1028
|
+
description:jN(UN.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL","devtoolsLogs"]}}static collectCanonicalURLs(e){const t=new Set,r=new Set;let a,n;for(const i of e)if("body"!==i.source)if("canonical"===i.rel){if(!i.hrefRaw)continue;i.href?ON.isValid(i.hrefRaw)?t.add(i.href):n=i:a=i}else"alternate"===i.rel&&i.href&&i.hreflang&&r.add(i.href);return{uniqueCanonicalURLs:t,hreflangURLs:r,invalidCanonicalLink:a,relativeCanonicallink:n}}static findInvalidCanonicalURLReason(e){const{uniqueCanonicalURLs:t,invalidCanonicalLink:r,relativeCanonicallink:a}=e;if(r)return{score:0,explanation:jN(UN.explanationInvalid,{url:r.hrefRaw})};if(a)return{score:0,explanation:jN(UN.explanationRelative,{url:a.hrefRaw})};const n=Array.from(t);return 0===n.length?{score:1,notApplicable:!0}:n.length>1?{score:0,explanation:jN(UN.explanationConflict,{urlList:n.join(", ")})}:void 0}static findCommonCanonicalURLMistakes(e,t,r){const{hreflangURLs:a}=e
|
1029
|
+
;return a.has(r.href)&&a.has(t.href)&&r.href!==t.href?{score:0,explanation:jN(UN.explanationPointsElsewhere,{url:r.href})}:t.origin===r.origin&&"/"===t.pathname&&"/"!==r.pathname?{score:0,explanation:jN(UN.explanationRoot)}:void 0}static async audit(e,t){const r=e.devtoolsLogs[PN.DEFAULT_PASS],a=await FN.request({devtoolsLog:r,URL:e.URL},t),n=new ON(a.url),i=Canonical.collectCanonicalURLs(e.LinkElements),o=Canonical.findInvalidCanonicalURLReason(i);if(o)return o;const s=new ON([...i.uniqueCanonicalURLs][0]),c=Canonical.findCommonCanonicalURLMistakes(i,s,n);return c||{score:1}}}MN.exports=Canonical,MN.exports.UIStrings=UN;var BN={exports:{}};const $N=kc,qN={title:"Links are crawlable",failureTitle:"Links are not crawlable",
|
1030
|
+
description:"Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn More](https://support.google.com/webmasters/answer/9112205)",columnFailingLink:"Uncrawlable Link"},zN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/crawlable-anchors.js",qN);BN.exports=class CrawlableAnchors extends $N{static get meta(){return{id:"crawlable-anchors",title:zN(qN.title),failureTitle:zN(qN.failureTitle),description:zN(qN.description),requiredArtifacts:["AnchorElements","URL"]}}static audit({AnchorElements:e,URL:t}){const r=e.filter((({rawHref:e,name:r="",role:a=""})=>{if(e=e.replace(/\s/g,""),r=r.trim(),(a=a.trim()).length>0)return;if(e.startsWith("mailto:"))return;if(e.startsWith("file:"))return!0;if(!(r.length>0)){if(""===e)return!0;if(/javascript:void(\(|)0(\)|)/.test(e))return!0;try{new URL(e,t.finalUrl)}catch(e){return!0}}})),a=[{
|
1031
|
+
key:"node",itemType:"node",text:zN(qN.columnFailingLink)}],n=r.map((e=>({node:$N.makeNodeItem(e.node)})));return{score:Number(0===r.length),details:$N.makeTableDetails(a,n)}}},BN.exports.UIStrings=qN;var VN={exports:{}},WN={};function min(e,t){return null===e?t:null===t?e:Math.min(e,t)}function max(e,t){return null===e?t:null===t?e:Math.max(e,t)}function translateLengthProperty(e,t,r){return"number"==typeof e?e>=0?clamp(e,1,1e4):void 0:"device-width"===e?100*t:"device-height"===e?100*r:1}function translateZoomProperty(e){return"number"==typeof e?e>=0?clamp(e,.1,10):void 0:"yes"===e?1:"device-width"===e||"device-height"===e?10:"no"===e||null===e?.1:void 0}function clamp(e,t,r){return max(min(e,r),t)}WN.getRenderingDataFromViewport=function(e,t,r,a,n){var i=t/100,o=r/100,s=null,c=null,l=null,u=null,d=null,m=null,p=null,h=null,f=null,y=t,v=r,b="zoom";if(void 0!==e["maximum-scale"]&&(s=translateZoomProperty(e["maximum-scale"])),
|
1032
1032
|
void 0!==e["minimum-scale"]&&(c=translateZoomProperty(e["minimum-scale"])),void 0!==e["initial-scale"]&&(l=translateZoomProperty(e["initial-scale"])),null!==c&&null===s&&(c=min(a,translateZoomProperty(e["minimum-scale"]))),void 0!==e.width&&(u="extend-to-zoom",m=translateLengthProperty(e.width,i,o)),void 0!==e.height&&(d="extend-to-zoom",p=translateLengthProperty(e.height,i,o)),void 0!==e["user-scalable"])if("number"==typeof(b=e["user-scalable"]))b=b>=1||b<=-1?"zoom":"fixed";else switch(b){case"yes":case"device-width":case"device-height":b="zoom";break;case"no":default:b="fixed"}null===l||void 0!==e.width&&void 0!==h||(void 0!==e.height?(u=null,m=null):(u="extend-to-zoom",m="extend-to-zoom")),null!==c&&null!==s&&(s=max(c,s)),null!==l&&(l=clamp(l,c,s));var w,S,T=null===l&&null===s?null:min(l,s);return null===T?("extend-to-zoom"===m&&(m=null),"extend-to-zoom"===p&&(p=null),"extend-to-zoom"===u&&(u=m),"extend-to-zoom"===d&&(d=p)):(w=y/T,S=v/T,"extend-to-zoom"===m&&(m=w),
|
1033
|
-
"extend-to-zoom"===p&&(p=S),"extend-to-zoom"===u&&(u=max(w,m)),"extend-to-zoom"===d&&(d=max(S,p))),null===u&&null===m||(h=max(u,min(m,y))),null===d&&null===p||(f=max(d,min(p,v))),null===h&&(h=null===f?y:0!==v?Math.round(f*(y/v)):y),null===f&&(f=0!==y?Math.round(h*(v/y)):v),{zoom:l,width:h,height:f,userZoom:b}},
|
1034
|
-
;for(;r<=t.length&&RegExp(" |\n|\t|\0d|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;return function setProperty(e,t,r){if(
|
1035
|
-
static async compute_(e){const t=e.find((e=>"viewport"===e.name));if(!t)return{hasViewportTag:!1,isMobileOptimized:!1,parserWarnings:[]};const r=[],a=
|
1036
|
-
explanationViewport:"Text is illegible because there's no viewport meta tag optimized for mobile screens.",additionalIllegibleText:"Add'l illegible text",legibleText:"Legible text",columnSelector:"Selector",columnPercentPageText:"% of Page Text",columnFontSize:"Font Size"},
|
1037
|
-
title:QN
|
1038
|
-
itemType:"source-location",text:
|
1039
|
-
;r.isInline&&"comment"!==n&&(i+=r.startLine,0===e.startLine&&(o+=r.startColumn));const s=
|
1040
|
-
;const tL=[,[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,,,,,1,1,1,1,,,1,1,1,,1,,1,,1,1],[1,1,1,,1,1,,1,1,1,,1,,,1,1,1,,,1,1,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,,,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1],[,1,,,,,,1,,1,,,,,1,,1,,,,1,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,,,1,,,,,1,1,1,,1,,1,,1,,,,,,1],[1,,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,,1,,1,,,,,1,,1,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,,1,1,1,,1,,1,1,1,,,1,1,1,1,1,1,1,1],[,,1,,,1,,1,,,,1,1,1,,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1,1,1,1,1,,,1,1,1],[1,1,1,1,1,,,1,,,1,,,1,1,1,,,,,1,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1],[,1,,1,1,1,,1,1,,1,,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,,,1,1,1,,,1,1,,,,,,1,1],[1,1,1,,,,,1,,,,1,1,,1,,,,,,1,,,,,1],[,1,,,1,,,1,,,,,,1],[,1,,1,,,,1,,,,1],[1,,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,,1,,,1,1,1,1],[,1,1,1,1,1,,,1,,,1,,1,1,,1,,1,,,,,1,,1],[,1,,,,1,,,1,1,,1,,1,1,1,1,,1,1,,,1,,,1],[,1,1,,,,,,1,,,,1,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,,1,1,1,,,1,1,1,1,1,1,,1,,,,,1,1,,1,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,1,1],[,1,1,1,,,,1,1,1,,1,1,,,1,1,,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,,1,,,,,1,1,1,,,1,,1,,,1,1],[,,,,1,,,,,,,,,,,,,,,,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,,1,1,1,,1,1,,,,1,1,1,1,1,,,1,1,1,,,,,1],[1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,1,,,,,,,1],[,1,1,,1,1,,1,,,,,,,,,,,,,1],,[1,1,1,,,,,,,,,,,,,1],[,,,,,,,,1,,,1,,,1,1,,,,,1]],[,[1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,,1],[,,,1,,,,,,,,,,,,,,,1],[,1,,,1,1,,1,,1,1,,,,1,1,,,1,1,,,,1],[1,,,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,,,,1],,[,1,1,1,1,1,,1,1,1,,1,1,,1,1,,,1,1,1,1,,1,1,,1],[,1,,,1,,,1,,1,,,1,1,1,1,,,1,1,,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,,,1,1,1,1,1,1,1,,,1,,,1,,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,,,,1],[,,,,,,,1,,,,1,,1,1],[,1,1,1,1,1,1,1,,,,1,1,1,1,1,,,1,1,,1,1,1,1,1],[,1,,,1,1,,1,,1,1,1,,,1,1,,,1,,1,1,1,1,,1],[,1,1,1,,1,1,,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1],[,,,,,,,,,,,,,,,,1],,[,1,1,1,1,1,,1,1,1,,,1,,1,1,,1,1,1,1,1,,1,,1],[,,1,,,1,,,1,1,,,1,,1,1,,1],[,1,1,,1,,,,1,1,,1,,1,1,1,1,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,1,,1,,1,1],,[,1,1,,1,,,1,,1,,,,1,1,1,,,,,,1,,,,1],[1,1,,,1,1,,1,,,,,1,,1]],[,[,1],[,,,1,,,,1,,,,1,,,,1,,,1,,,1],[,,,,,,,,,,,,,,,,,,1,1,,,,,,1],,[1,,,,,1],[,1,,,,1,,,,1],[,1,,,,,,,,,,,1,,,1,,,,,,,,,1,1],[,,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,1,,1],[,1],[,1,,1,,1,,1,,1,,1,1,1,,1,1,,1,,,,,,,1],[1,,,,,1,,,1,1,,1,,1,,1,1,,,,,1,,,1],[,1,1,,,1,,1,,1,,1,,1,1,1,1,,,1,,1,,1,1,1],[1,1,1,1,1,,1,,1,,,,1,1,1,1,,1,1,,,1,1,1,1],[1,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],,[,1,,,,,,1,1,1,,1,,,,1,,,1,1,1,,,1],[1,,,,,1,,1,1,1,,1,1,1,1,1,,1,,1,,1,,,1,1],[1,,1,1,,,,,1,,,,,,1,1,,,1,1,1,1,,,1,,1],[1,,,,,,,,,,,,,,,,,1],[,,,,,1,,,1,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,,,1],[,1,,,,1]],[,[1,1,1,,1,,1,1,1,1,1,1,1,1,1,,1,,1,,1,1,,,1,1,1],[,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],,[,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1],,[1,1,,,,1,1,,,,,,1,,,,1,,1,,1,1,,1],[1],[,,,,,,,,,,,1,,,,,,,,,,,1],[,1,,,,,,,1,1,,,1,,1,,,,1,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,,1],[,,1,,,,,1,,1],[1,,,,1,,,,,1,,,,1,1,,,,1,1,,,,,1],[,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[1,,,1,1,,,,,,,1,,1,,1,1,1,1,1,1],[,,,,,1,,,,,,,1,,,,,,,1],,[,,1,1,1,1,1,,1,1,1,,,1,1,,,1,1,,1,1,1,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,,,1],,[1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,,,1,1,1,1,,,,,,1,,1,,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,,,,1,,1,,,1,1,1,1,1],[,,,,,,,,,,,1,,,,,,,,,1,,,,1],[,1,1,,1,1,,1,,,,1,1,,1,1,,,1,,1,1,,1],[,1,,1,,1,,,1,,,1,1,,1,1,,,1,1,1],[,1,1,1,1,1,,1,1,,,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,,,,,,,,,1,,1,,1,1,,,,1,,,1],[,1,,,1,1,,,,,,,,,1,1,1,,,,,1],[1,,,1,1,,,,1,1,1,1,1,,,1,,,1,,,1,,1,,1],[,1,1,,1,1,,1,1,,,,1,1,1,,,1,1,,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,,,,1,,,,,,,,,1],[,1,,,,,,,,1,,,,,1,,,,1,,,1],[,1,1,1,1,,,1,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1],[,,,,,1,,1,,,,,1,1,1,1,1,,,1,,,,1],[,1,,,,,,,,1,,,,,,,,,,,,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,1,,,,1,,1,1,1,1,1,,1,1,,,,,,1],[,1,1,1,1,1,1,1,,1,1,,,1,1,,,,1,,1,1,,1,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,1,1,,1,,,1,1,1,1,,,1,,,,,,,1],[,1,,,,,,,,1,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1],[,1,1,,,,,,,,,,,,1,1,,,,,,1],[,1,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,,,,,1],[1,1,,,1,,,1,1,1,,,,1],,[,,,,,,,,,,,,,1,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,1,,,,,,,1],[1,1,1,,1,,1,1,1,1,1,1,1,1,,1,,,1,,1,,,1,1],[,,,,,,,,,1],[,1,,,,1,,,,,,1,,,1,,,,,1],[,1,1,,1,1,,,,,,,,,,,,,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,1,1,1,,,,1,1,,,,1,,1],[1,1,1,1,1,1,,,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,,1,1],[,,,,,,,,,,,,,,,1,,,,1],,[1,1,,1,,1,,,,,,1,,1,,1,1,,1,,1,1,,1,1,,1],[,,1,,,,,,1,,,,1,,1,,,,,1],[1,,,,,,,,,1,,,,,,1,,,,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,,1,,,,,,1,,,1,,,,,,,,1],[,1,,1,,,,,,,,,,,,1],,[1,1,,,,,,,,,,,,,,,,,,,,,,1,1],[1]],[,[1,,,,,,,,,1,,,,,1,,1,,1],[,1,1,,1,1,,1,1,1,,,1,1,1,,,,1,,,1,,,,1],[,1,,,,,,,1,,,,1,,,,,,1],[1,1,1,1,1,1,,,,1,,,,,,,,,1,1,1,1],[1],[,1,1,,,1,1,,,,,1,,1,,,,,,,,1,,,,1],[1,,1,,,1,,1,,,,,1,1,1,1,,,,1,,,,1],[,,1,,,,,,,1,,,,,,,1,,,,,,,1],[1,,,,,,,,,,,,,,1,,,,1],[,,,1,,1,,,,,1,,,,1,1,,,,1],[1,,,,,1,,,,1,,1,1,,,1,1,,1,1,1,,1,1,1,,1],[,1,1,,,,,1,,1,,1,1,1,,1,1,,,1,,1,1,1],[,1,,,,1,,,,1,,,1,,1,1,,,1,1,,,,,,1],[1,,1,1,,1,,1,1,,1,,1,1,1,1,1,,,1,1,,,,,,1],[1,,,,,,,,,,,,,,,,,,1,,,1,,1],[,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,,1,,1],[,1,,,,1,,,1,1,,1,,,1,1,,,1,,,1,,,1,1],[1,1,,1,1,1,,1,1,1,,1,,1,1,1,,,1,,1,1],[1,,1,1,1,1,,,,1,,1,1,1,,1,,,1,1,1,,1,1,1,1,1],[1,,,,,,,,,,,,,1],[,,1,,,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,,,1,,1,,1,,,,1],[,,,1,,,,,,,,,1],[,1,,,,,,,,,,,,,,1,,,,,,,,,1],[,,,,,,,,1,1,,,,,,,,,1,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,,,1,1,1],[,,,,,1,,,,1,1,1,,,1,1,,,1,,1,1,,1],[,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,1,,,,,,,,,,,,,1],[,,1,,,1,,1,1,1,,1,1,,1,,,,1,,1,1],,[,,1,,,1,,,,,,1,,,,1],[,,,,,,,,,1,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,,1,1,,1,,1,,,1,1,1,,,1],[,,,,,1,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,1,,1,1,,1,,,1],[,,,,,1,,,,,,,,,,,,,,1],[,1,1,1,1,,,,,1,,,1,,1,,,,1,1,,,,1,1],[,1,,,1,,,1,,1,1,,1,,,,,,,1],[,,1,,1,,,1,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,,,,,,,,,,1,,1,1],[,,,,,,,,,,,,1],,[,1,1,1,1,,,,1,1,,1,1,1,1,1,1,,1,1,1,1,,1,,1],[1,,,,1,,,,,,,,,,1],[1,,,,,,,,,1],,[,1,,,,1,,,,,,,,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,,1,,,,1,1,,,1,1,,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,1],[1,1,1,,,,,1,1,1,,1,1,1,1,,,1,1,,1,1,,,,,1],[,1,,,,,,,1,1,,,1,1,1,,1,,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,,,1,,,,1,,,1,,,,1,,,,,,,1,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1],[1,1,1,,1,,,1,1,1,1,,1,1,1,1,,,,1,,1,,1,,,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1,1,,,,,,,,,1],,[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,,1,,1,,,,1],[,1,,,1,1,,1,1,1,,,1,1,1,1,1,,1,1,1,,1,,,1],[1,,,1,,,,1,1,1,,,,,1,1,,,,1,,1],[1,1,,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,,1,,1,,,,,,,,1,,1],[,1,,,,1,,1,1,,,,1,1,,1,,,,1,1,1,,1],,[,1,,,,,,1,,,,,,,1],[,,,,,,,,1,,,,1,,1,,,,,,,,,,,,1]],[,[,1,1,,1,1,1,1,,1,1,1,,1,1,,1,1,,1,1,1,1,1,1,,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,,,1,,,,,,,,1,,,,,,1,,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,,1,,1,1,1,1,1,1,1,,1,1,,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1],[,1,1,,,,,1,1,1,,,1,,1,1,,,,1,,1,,,1,1],[,,,,,,,1,,,,1,1,1,1,1,,1,,,,,,,,1],[1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,,1,,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,1,1,,1,,1,1,1,,1,,1,1,,1,1,,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,,1,,,,,1,,1],[,1,1,1,,1,,1,,1,,,,1,,1,,,1,,,,,,1,1],[,1,,,1,1,,1,,1,,1,1,1,1,1,,1,1,,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,,1,,1,,1,,,,,,1,,1,,,,1,1]],[,[,1,,1,,,,,,,,,,,,,,,1,,,,1],[,,,,,,,,,1,,1,1,1,,1,,,1,,1,1],[1,1,,,,,,,1,,,,,,,1,,,,,,1],[,1,,,,,,,,,,1,,,,,,,,,1,1],,[,,,,,,,,,,,,,,,1,,,,1,,1],[,,1,1,,1,,1,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,,,,,,,,1],[1,,1,1,,,,1,,,,,,,,,1,,,1,,,1,1],[,1,1,,1,1,,1,1,1,1,1,1,1,1,1,,,1,1,,1,1,,1],[,1,,,1,1,,,,,,1,,1,,1,,,1,,1,1],[1,1,1,1,,1,,1,,1,,1,1,,1,1,1,1,1,,1,1,1,1,1],[,1,1,,,1,,1,,1,1,1,,,1,1,1,,1,1,1,1,,1,1],[,,,,1,,,1,,,,,,,1,,,,1,1],[,1,,,,,,,,,,1,,1,,1,,,,,1,,,,,1],,[1,1,,1,,1,,1,1,,,,,,1,1,,,1,1,1,1,1,1,1,1,1],[1,1,,1,,,,,,1,,,,,,1,1,,,,1,1,,,1],[,1,1,,1,1,,,,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,,,1,,,,1,,,,1,1],[,,,,1],[,,,,,,,,,1,,,1],,[,,1,,1,,,,,,,,,1,,,,,,,,,,,,1],[,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,,,1],[,1,,1,,,,,,1,,,,,1,1,,,,,1,1],[,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,,,1,,1,1,1],[,1,,,,1,,,,,,,1],[,1,,,1,,,1,,1,,1,1,,1,,,,,1,,1,,,,1,1],[,1,,,1,,,1,1,1,,1,1,1,1,1,,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,1,1,,,,1,1,,,,,,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,,1,1,,1,1,1,1,1],[,1,,,,1,,,,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,1,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,,1,1,1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,,,,,,,1,1,,,,,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,1,,1,1,1,1],,[,1,1,,,,,1,,1,,,,1,1,1,,,1,,,,,1],[,,,,,,,,,,,,,1],[,,,,,1,,,,,,,,1,1,,,,,1,,1,,,1,1],[,,,,,,,,,,,,,,1]],[,[,1],,,,,,,,,,,,,,,,,,,,[1,1,1,1,1,,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,1,1,1,1],[,1,,1,,1,,,1,1,1,,1,1,1,1,1,,,1,,,,1,,1,1],[,1,,1,,1,,,1,,,,,1,,,,,,1,1],[,1,,1,,,,,1,,,,1,,1,1,1,1,1,1,1,1,,1],[,1,,,,,,,,,,,,,,,1]],[,[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,,,,,,,,,1,1,,,,1],[,,,,,,1],[,,1],[,1,1,,,1,,1,,1,1,,1,1,1,,,,1,1,1,,,,,1],,[,1,,,,1,,,,,,1,,,1,,,,1,1,,1],[,,,,,,,1,,,,,,,,,1],[,1,,,,1,1,,,,,,1,1,1,,,,1,,1,1],[,,,,,,,1,,1,,,,,,,,,,1],[,1,1,,,,,,1,1,,,,1,,,,,,,1,,,1],,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,,1,,,1,,,,,1,,1,,1,,1,,,,,1],[1,1,1,1,1,1,1,1,,,,,1,1,,1,1,,1,,,1,,1],[,,,,,,,,,,,,,,1,,,,,,1],,[,,,,,,,,,1,,,,,,1,,,,,1],[,,1,,,,,,,1,,,1,1],[,,,1,,,,,1,,,,,1,,,,,,1,,,,1],[1,,1,1,,1,1,1,1,1,,1,,,,1,1,1,,,1,1,,,,1,1],,[1,1,,,,,,,,,,1,,1,,1,,,1],[,,,,1,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,1],[,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,,1,,,1,,,,,,,,1,,,,,,1,,,,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,1,,,,1,1,1,1,1,1,,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,1,,1,1,,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,,1,,1,,1,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,,,,,,1,,1,,,,,1,1,,,,,1],[1,,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,,1,,,,1,1,1,1,1,,,1,1,,1,,1],[,1,1,1,1,,,,,1,,1,1,1,1,1,,,1,1,,,,1,1,1],[,1,1,1,1,1,,1,,,,,1,,1,,1,,,1,,,1,1,,1]],[,[1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,,,,,1,,,,,1,1,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,,,,1,,1,1,,1,1,1,1,1,,,1,,1,,1],[1,1,1,,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,,1,,,,,,,,,,1,1,1,1,1,1,1,,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,1,1,,,,,,1,1,1,1,1,,,,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,,1,1,1],[,1,1,1,,1,,1,1,1,1,,,1,1,1,,1,1,1,1,1,,,1,1],[1,1,,,,1,,,1,1,1,,1,,1,,1,,1,1,1,1,1,,1,,1],[,1,,,,,,,1,,1,,1,1,1,1,,,,,,,,,1]],[,[,,,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,1,,,1,,,,,,1,,,1,,,,1],,[,1,,,,1,,1,,1,1,,1,1,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],[1,1,1,,,1,,,,,,,,,1,1,,,,,,,,,,1],[,1,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1,,,1],[,,,,,,,,,1],[1,1,,,,,,1,1,1,,1,1,,,,1,1,,1,,1,1,1,,1],[,1,1,1,,1,1,,,1,,1,1,1,1,,,,,,,1,,1],[,1,1,1,1,,,1,,1,,,,1,1,1,1,,1,1,,1],[,1,,,1,1,,1,,,,1,,1,1,,1,,1,,,1,,,1,,1],[,,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,,,,,1],,[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1],[,1,,,,,,,1,1,,1,,,,,1,,,1,,1],[,1,,,,1,,,1,,,,,,,,1,,1,,,1],[,,,,,,,,,,,,,1,1,,,,1,,,1],[,,,,,1,,,1,,,,1],[,1],,[,1],[1,,,,,,,,,,,,,,1,,,,,1]],[,[,1,,,,1,1,1,1,1,1,,1,1,1,1,1,,1,1,,1,1,,,1],[,,1,,,,,,,,,1],,,[1,,,1,1,,,,,,,,1,1,,1,1,,1],,[,,,,,,,,,,,,,,,,,,1,,1],,[1,,,1,1,,1,1,,,,,1,,1,,,,,1,1,,1],,[,1,,,,,,,,1,1,1,1,1,,1,1,,,,1,1],[,,,,,,,,,,,,,,,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,,1,1,1,1,1,1],[,,,,,,,,,,,1,,1,,,1],[1,,,,,,,,,,,,,,,,,,1,,1],,,[,1,,,,,,,,,,,,,,1,,,,1,1],[,,,,,,,,,1,,,1,,,,,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,1,1,,,,,,1],,[,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,1,1,,1,1,1,1,1,1,,,1,1,1,1,1,,1,1],[,1,,,,,,,,1],[,,,,1,,,1,,,1,1,,,,,,,,,,1,,,,1],[,1,,1,1,,,1,1,1,,,,1,1,1,1,,1,1,1,1,,1],[,,,,,,,1],[,1,1,,,,,1,,1,,,,,,1,,,,,,1,,1,,1],[,1,,,,,,1,,,,1,,,,,,,,,,1],[,,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1,1,1,1,,1],[,1,,,,,,,,1],[,1,1,,1,,,,,,,,1,,,,,,1,,,1,,1,,1],[,1,,1,,1,,1,1,1,,1,1,1,,1,,,1,1,,1,1,1,1,1],[,1,1,1,1,1,,,1,1,,,,1,1,1,,,,1,1,,,1,1],[,,1,1,1,1,,1,,1,,1,,1,1,1,1,,,,,1,,1,,1],[1,1,1,1,1,1,1,1,,1,,1,,1,1,1,,,1,1,,,,1,,1],[,,,1],,[,1,1,,1,,,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1],[,1,,,,,,1,,1,,1,,,,,,,1,1,,1,1],[,,,,,,1,,1,1,,1,,1,,,,,,,,,,1],[,1,1,,1,,,,1,,,,1,1,1,,,,1,,1,1,1,,1,1],,[,1,1,,,,,,,,,,,,,1,,,1,,,,,1],[,1,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,1,,,,1,,,,,1,,,,,,,1]],[,[,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[,1,1,1,1,1,,1,,1,1,,,1,1,1,1,,1,,,,,1,1,1],[,,1,1,,1,,1,1,,,,1,1,1,1,,,1,,1,1,1,1,,1],[,1,,1,,,,,,,,1,,1,,1,,,,,,,,,,1],[,,1,,1,,,1,,,,,1,1,,,1,,1,1,1,1],[,1],[,1,1,,1,,1,1,,1,,,1,1,1,,,,1,,,1,,1],[1,1,,1,1,1,,,,,,,,,,,,,1,,1,1,1],[,1,1,,,,,,,1,,,1,,1,,1,,1,1,,,1,,,1],[,,1,,,,,,,,,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,1,,,,,1,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,,1,,1,1,1,,,1,1,1,1,,,,1,1],[,,,1,1,,,1,,1,,1,,1,1,1,1,,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,,1,,1,,,,1,1,,,1,1,,1,1,,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1,,1,1,,,1],[,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,,1,,,1,,,1,,1,1,1,1,1,,1,,1,1],[,,,,,1,,,,1,,,,,1,1,,,,1],[,1,,1,1,1,,1,,,1,1,1,,,1,,,1,,1,,,1],[,,1,,,,,,,,,1,,1,,,,,1,,1],[,1,1,,,,,,,,1,1,1,,,,,,,,1,,,,,1],[,,,,,,,,1,,,,,1,,,1]],[,[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,,1,1,1,1,1,1,1,1,,,,,,,,,1,1],[,,,,,,,,1,,,,1,,1,,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,1,,1,,1,,,,1,1,,1,,1,,,,1,1,1,1,1,,,1],,[,1,,,,,,,,1,,,1,1,,,1,,1,1,,1,,1],[,1,,,1,,,,,,,,1,,,,,,,1],[1,1,,,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1],,[,1,,,,,,1,,1,,1,1,1,1,1,,,1,,1,1,,,,1],[,1,1,,,1,,1,,1,,,1,1,1,1,,,1,,,1,,,,1],[,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1],[,1,,,1,1,,1,1,,,1,1,,1,1,,1,,1,,1],[1,,1,,,,,1,,1,,1,1,1,1,,,,,1,1,,,,1,1],[,1,1,,,,,1,1,,,1,,1,1,1,1,,,,,,,,,,1],,[,1,1,,,1,,,,1,,1,1,1,1,1,,,,1,,,,1,,1],[,,,1,1,,,1,,,,,1,,1,1,1,,1,1,,,,,,1],[,1,,,,,,,,,,,1,,,,1,,,,,,,1,,1],[,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,1,,1,,,1,1,,1,1,,1],[,1,,,,,,1,,,,,1,1,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1,,,1,,,,,1],[,,,,,,,1,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,,1,,,,,,,1,,,,,,,,1,,,1],[,1,,,,,,,1],[,,,,,,,,,,1],[,1,,,,,,1,1,,,,,,1],,[,1,1,,,,,,1,,,,,1,1,,,,1],[1,,1,,1,,,,,1,,,,,1,,,,,,,,,1,1],[,1,1,,,,,,,,,1,1,1,1,,,,1,,,,,1,,,1],,[,1,1,,1,,,1,1,,,1,,,1,1,1,,1,,1,1,1,,,,1],[,,,,,1,,,,,1,,,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,,,1,,,,,1,,,,,1,,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,1],[,1,,,,,,1,,,,,,,1,1,1,,,1],[,1,,,,,,,,,,1,1,1,,,,,1,,,1],[,,,,,1,,1,,,,,1,1,1,,1,1,,1,1,1,,,1,1],[1,1,,,,,,,1,,,,,1,1,,,,,,,,,,,1],,[,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,,1,,,,,1,,,1,,,,1,,1],[,1,,,,,,,,,1]]]
|
1041
|
-
;var
|
1042
|
-
static audit({LinkElements:e}){const t=[],r=e.filter((e=>{const t="alternate"===e.rel,r=e.hreflang,a="body"===e.source;return t&&r&&!a}));for(const e of r){const r=[];let n;isExpectedLanguageCode(e.hreflang)||r.push(sL
|
1043
|
-
;const
|
1033
|
+
"extend-to-zoom"===p&&(p=S),"extend-to-zoom"===u&&(u=max(w,m)),"extend-to-zoom"===d&&(d=max(S,p))),null===u&&null===m||(h=max(u,min(m,y))),null===d&&null===p||(f=max(d,min(p,v))),null===h&&(h=null===f?y:0!==v?Math.round(f*(y/v)):y),null===f&&(f=0!==y?Math.round(h*(v/y)):v),{zoom:l,width:h,height:f,userZoom:b}},WN.parseMetaViewPortContent=function(e){for(var t={validProperties:{},unknownProperties:{},invalidValues:{}},r=1;r<=e.length;){for(;r<=e.length&&RegExp(" |\n|\t|\0d|,|;|=").test(e[r-1]);)r++;r<=e.length&&(r=parseProperty(t,e,r))}return t};var GN=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];function parseProperty(e,t,r){for(var a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(var n=t.slice(a-1,r-1);r<=t.length&&!RegExp(",|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r
|
1034
|
+
;for(;r<=t.length&&RegExp(" |\n|\t|\0d|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;return function setProperty(e,t,r){if(GN.indexOf(t)>=0){var a=parseFloat(r);if(!isNaN(a))return void(e.validProperties[t]=a);var n=r.toLowerCase();if("yes"===n||"no"===n||"device-width"===n||"device-height"===n||"viewport-fit"===t.toLowerCase()&&("auto"===n||"cover"===n))return void(e.validProperties[t]=n);e.validProperties[t]=null,e.invalidValues[t]=r}else e.unknownProperties[t]=r}(e,n,t.slice(a-1,r-1)),r}WN.expectedValues={width:["device-width","device-height","a positive number"],height:["device-width","device-height","a positive number"],"initial-scale":["a positive number"],"minimum-scale":["a positive number"],"maximum-scale":["a positive number"],"user-scalable":["yes","no","0","1"],"shrink-to-fit":["yes","no"],"viewport-fit":["auto","cover"]};const HN=WN,YN=Ao;var KN=YN(class ViewportMeta{
|
1035
|
+
static async compute_(e){const t=e.find((e=>"viewport"===e.name));if(!t)return{hasViewportTag:!1,isMobileOptimized:!1,parserWarnings:[]};const r=[],a=HN.parseMetaViewPortContent(t.content||"");Object.keys(a.unknownProperties).length&&r.push(`Invalid properties found: ${JSON.stringify(a.unknownProperties)}`),Object.keys(a.invalidValues).length&&r.push(`Invalid values found: ${JSON.stringify(a.invalidValues)}`);const n=a.validProperties;return{hasViewportTag:!0,isMobileOptimized:Boolean(n.width||n["initial-scale"]),parserWarnings:r}}},null);const JN=oi,XN=kc,ZN=KN,QN={title:"Document uses legible font sizes",failureTitle:"Document doesn't use legible font sizes",description:"Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size/).",displayValue:"{decimalProportion, number, extendedPercent} legible text",
|
1036
|
+
explanationViewport:"Text is illegible because there's no viewport meta tag optimized for mobile screens.",additionalIllegibleText:"Add'l illegible text",legibleText:"Legible text",columnSelector:"Selector",columnPercentPageText:"% of Page Text",columnFontSize:"Font Size"},eL=JN.createMessageInstanceIdFn("lighthouse-core/audits/seo/font-size.js",QN);function getSelector(e){const t=function getAttributeMap(e=[]){const t=new Map;for(let r=0;r<e.length;r+=2){const a=e[r],n=e[r+1];if(!a||!n)continue;const i=n.trim();i&&t.set(a.toLowerCase(),i)}return t}(e.attributes);if(t.has("id"))return"#"+t.get("id");{const e=t.get("class");if(e)return"."+e.split(/\s+/).join(".")}return e.nodeName.toLowerCase()}function nodeToTableNode(e){const t=(e.attributes||[]).map(((e,t)=>t%2==0?` ${e}`:`="${e}"`)).join("");return{type:"node",selector:e.parentNode?getSelector(e.parentNode):"",snippet:`<${e.nodeName.toLowerCase()}${t}>`}}VN.exports=class FontSize extends XN{static get meta(){return{id:"font-size",
|
1037
|
+
title:eL(QN.title),failureTitle:eL(QN.failureTitle),description:eL(QN.description),requiredArtifacts:["FontSize","URL","MetaElements"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await ZN.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:eL(QN.explanationViewport)};const{analyzedFailingNodesData:r,analyzedFailingTextLength:a,failingTextLength:n,totalTextLength:i}=e.FontSize;if(0===i)return{score:1};const o=function getUniqueFailingRules(e){const t=new Map;return e.forEach((e=>{const{nodeId:r,cssRule:a,fontSize:n,textLength:i,parentNode:o}=e,s=function getFontArtifactId(e,t){if(e&&"Regular"===e.type){const t=e.range?e.range.startLine:0,r=e.range?e.range.startColumn:0;return`${e.styleSheetId}@${t}:${r}`}return`node_${t}`}(a,r),c=t.get(s);c?c.textLength+=i:t.set(s,{nodeId:r,parentNode:o,cssRule:a,fontSize:n,textLength:i})})),[...t.values()]}(r),s=(i-n)/i*100,c=e.URL.finalUrl,l=[{key:"source",
|
1038
|
+
itemType:"source-location",text:eL(JN.UIStrings.columnSource)},{key:"selector",itemType:"code",text:eL(QN.columnSelector)},{key:"coverage",itemType:"text",text:eL(QN.columnPercentPageText)},{key:"fontSize",itemType:"text",text:eL(QN.columnFontSize)}],u=o.sort(((e,t)=>t.textLength-e.textLength)).map((({cssRule:e,textLength:t,fontSize:r,parentNode:a})=>{const n=t/i*100,o=function findStyleRuleSource(e,t,r){if(!t||"Attributes"===t.type||"Inline"===t.type)return{source:{type:"url",value:e},selector:nodeToTableNode(r)};if(t.parentRule&&"user-agent"===t.parentRule.origin)return{source:{type:"code",value:"User Agent Stylesheet"},selector:t.parentRule.selectors.map((e=>e.text)).join(", ")};let a="";t.parentRule&&(a=t.parentRule.selectors.map((e=>e.text)).join(", "));if(t.stylesheet&&!t.stylesheet.sourceURL)return{source:{type:"code",value:"dynamic"},selector:a};if(t.stylesheet&&t.range){const{range:e,stylesheet:r}=t,n=r.hasSourceURL?"comment":"network";let i=e.startLine,o=e.startColumn
|
1039
|
+
;r.isInline&&"comment"!==n&&(i+=r.startLine,0===e.startLine&&(o+=r.startColumn));const s=XN.makeSourceLocation(r.sourceURL,i,o);return s.urlProvider=n,{source:s,selector:a}}return{selector:a,source:{type:"code",value:"Unknown"}}}(c,e,a);return{source:o.source,selector:o.selector,coverage:`${n.toFixed(2)}%`,fontSize:`${r}px`}}));if(a<n){const e=(n-a)/i*100;u.push({source:{type:"code",value:eL(QN.additionalIllegibleText)},selector:"",coverage:`${e.toFixed(2)}%`,fontSize:"< 12px"})}s>0&&u.push({source:{type:"code",value:eL(QN.legibleText)},selector:"",coverage:`${s.toFixed(2)}%`,fontSize:"≥ 12px"});const d=eL(QN.displayValue,{decimalProportion:s/100}),m=XN.makeTableDetails(l,u);return{score:Number(s>=60),details:m,displayValue:d}}},VN.exports.UIStrings=QN;var tL={exports:{}}
|
1040
|
+
;const rL=[,[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,,,,,1,1,1,1,,,1,1,1,,1,,1,,1,1],[1,1,1,,1,1,,1,1,1,,1,,,1,1,1,,,1,1,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,,,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1],[,1,,,,,,1,,1,,,,,1,,1,,,,1,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,,,1,,,,,1,1,1,,1,,1,,1,,,,,,1],[1,,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,,1,,1,,,,,1,,1,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,,1,1,1,,1,,1,1,1,,,1,1,1,1,1,1,1,1],[,,1,,,1,,1,,,,1,1,1,,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1,1,1,1,1,,,1,1,1],[1,1,1,1,1,,,1,,,1,,,1,1,1,,,,,1,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1],[,1,,1,1,1,,1,1,,1,,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,,,1,1,1,,,1,1,,,,,,1,1],[1,1,1,,,,,1,,,,1,1,,1,,,,,,1,,,,,1],[,1,,,1,,,1,,,,,,1],[,1,,1,,,,1,,,,1],[1,,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,,1,,,1,1,1,1],[,1,1,1,1,1,,,1,,,1,,1,1,,1,,1,,,,,1,,1],[,1,,,,1,,,1,1,,1,,1,1,1,1,,1,1,,,1,,,1],[,1,1,,,,,,1,,,,1,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,,1,1,1,,,1,1,1,1,1,1,,1,,,,,1,1,,1,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,1,1],[,1,1,1,,,,1,1,1,,1,1,,,1,1,,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,,1,,,,,1,1,1,,,1,,1,,,1,1],[,,,,1,,,,,,,,,,,,,,,,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,,1,1,1,,1,1,,,,1,1,1,1,1,,,1,1,1,,,,,1],[1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,1,,,,,,,1],[,1,1,,1,1,,1,,,,,,,,,,,,,1],,[1,1,1,,,,,,,,,,,,,1],[,,,,,,,,1,,,1,,,1,1,,,,,1]],[,[1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,,1],[,,,1,,,,,,,,,,,,,,,1],[,1,,,1,1,,1,,1,1,,,,1,1,,,1,1,,,,1],[1,,,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,,,,1],,[,1,1,1,1,1,,1,1,1,,1,1,,1,1,,,1,1,1,1,,1,1,,1],[,1,,,1,,,1,,1,,,1,1,1,1,,,1,1,,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,,,1,1,1,1,1,1,1,,,1,,,1,,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,,,,1],[,,,,,,,1,,,,1,,1,1],[,1,1,1,1,1,1,1,,,,1,1,1,1,1,,,1,1,,1,1,1,1,1],[,1,,,1,1,,1,,1,1,1,,,1,1,,,1,,1,1,1,1,,1],[,1,1,1,,1,1,,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1],[,,,,,,,,,,,,,,,,1],,[,1,1,1,1,1,,1,1,1,,,1,,1,1,,1,1,1,1,1,,1,,1],[,,1,,,1,,,1,1,,,1,,1,1,,1],[,1,1,,1,,,,1,1,,1,,1,1,1,1,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,1,,1,,1,1],,[,1,1,,1,,,1,,1,,,,1,1,1,,,,,,1,,,,1],[1,1,,,1,1,,1,,,,,1,,1]],[,[,1],[,,,1,,,,1,,,,1,,,,1,,,1,,,1],[,,,,,,,,,,,,,,,,,,1,1,,,,,,1],,[1,,,,,1],[,1,,,,1,,,,1],[,1,,,,,,,,,,,1,,,1,,,,,,,,,1,1],[,,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,1,,1],[,1],[,1,,1,,1,,1,,1,,1,1,1,,1,1,,1,,,,,,,1],[1,,,,,1,,,1,1,,1,,1,,1,1,,,,,1,,,1],[,1,1,,,1,,1,,1,,1,,1,1,1,1,,,1,,1,,1,1,1],[1,1,1,1,1,,1,,1,,,,1,1,1,1,,1,1,,,1,1,1,1],[1,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],,[,1,,,,,,1,1,1,,1,,,,1,,,1,1,1,,,1],[1,,,,,1,,1,1,1,,1,1,1,1,1,,1,,1,,1,,,1,1],[1,,1,1,,,,,1,,,,,,1,1,,,1,1,1,1,,,1,,1],[1,,,,,,,,,,,,,,,,,1],[,,,,,1,,,1,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,,,1],[,1,,,,1]],[,[1,1,1,,1,,1,1,1,1,1,1,1,1,1,,1,,1,,1,1,,,1,1,1],[,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],,[,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1],,[1,1,,,,1,1,,,,,,1,,,,1,,1,,1,1,,1],[1],[,,,,,,,,,,,1,,,,,,,,,,,1],[,1,,,,,,,1,1,,,1,,1,,,,1,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,,1],[,,1,,,,,1,,1],[1,,,,1,,,,,1,,,,1,1,,,,1,1,,,,,1],[,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[1,,,1,1,,,,,,,1,,1,,1,1,1,1,1,1],[,,,,,1,,,,,,,1,,,,,,,1],,[,,1,1,1,1,1,,1,1,1,,,1,1,,,1,1,,1,1,1,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,,,1],,[1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,,,1,1,1,1,,,,,,1,,1,,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,,,,1,,1,,,1,1,1,1,1],[,,,,,,,,,,,1,,,,,,,,,1,,,,1],[,1,1,,1,1,,1,,,,1,1,,1,1,,,1,,1,1,,1],[,1,,1,,1,,,1,,,1,1,,1,1,,,1,1,1],[,1,1,1,1,1,,1,1,,,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,,,,,,,,,1,,1,,1,1,,,,1,,,1],[,1,,,1,1,,,,,,,,,1,1,1,,,,,1],[1,,,1,1,,,,1,1,1,1,1,,,1,,,1,,,1,,1,,1],[,1,1,,1,1,,1,1,,,,1,1,1,,,1,1,,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,,,,1,,,,,,,,,1],[,1,,,,,,,,1,,,,,1,,,,1,,,1],[,1,1,1,1,,,1,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1],[,,,,,1,,1,,,,,1,1,1,1,1,,,1,,,,1],[,1,,,,,,,,1,,,,,,,,,,,,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,1,,,,1,,1,1,1,1,1,,1,1,,,,,,1],[,1,1,1,1,1,1,1,,1,1,,,1,1,,,,1,,1,1,,1,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,1,1,,1,,,1,1,1,1,,,1,,,,,,,1],[,1,,,,,,,,1,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1],[,1,1,,,,,,,,,,,,1,1,,,,,,1],[,1,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,,,,,1],[1,1,,,1,,,1,1,1,,,,1],,[,,,,,,,,,,,,,1,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,1,,,,,,,1],[1,1,1,,1,,1,1,1,1,1,1,1,1,,1,,,1,,1,,,1,1],[,,,,,,,,,1],[,1,,,,1,,,,,,1,,,1,,,,,1],[,1,1,,1,1,,,,,,,,,,,,,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,1,1,1,,,,1,1,,,,1,,1],[1,1,1,1,1,1,,,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,,1,1],[,,,,,,,,,,,,,,,1,,,,1],,[1,1,,1,,1,,,,,,1,,1,,1,1,,1,,1,1,,1,1,,1],[,,1,,,,,,1,,,,1,,1,,,,,1],[1,,,,,,,,,1,,,,,,1,,,,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,,1,,,,,,1,,,1,,,,,,,,1],[,1,,1,,,,,,,,,,,,1],,[1,1,,,,,,,,,,,,,,,,,,,,,,1,1],[1]],[,[1,,,,,,,,,1,,,,,1,,1,,1],[,1,1,,1,1,,1,1,1,,,1,1,1,,,,1,,,1,,,,1],[,1,,,,,,,1,,,,1,,,,,,1],[1,1,1,1,1,1,,,,1,,,,,,,,,1,1,1,1],[1],[,1,1,,,1,1,,,,,1,,1,,,,,,,,1,,,,1],[1,,1,,,1,,1,,,,,1,1,1,1,,,,1,,,,1],[,,1,,,,,,,1,,,,,,,1,,,,,,,1],[1,,,,,,,,,,,,,,1,,,,1],[,,,1,,1,,,,,1,,,,1,1,,,,1],[1,,,,,1,,,,1,,1,1,,,1,1,,1,1,1,,1,1,1,,1],[,1,1,,,,,1,,1,,1,1,1,,1,1,,,1,,1,1,1],[,1,,,,1,,,,1,,,1,,1,1,,,1,1,,,,,,1],[1,,1,1,,1,,1,1,,1,,1,1,1,1,1,,,1,1,,,,,,1],[1,,,,,,,,,,,,,,,,,,1,,,1,,1],[,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,,1,,1],[,1,,,,1,,,1,1,,1,,,1,1,,,1,,,1,,,1,1],[1,1,,1,1,1,,1,1,1,,1,,1,1,1,,,1,,1,1],[1,,1,1,1,1,,,,1,,1,1,1,,1,,,1,1,1,,1,1,1,1,1],[1,,,,,,,,,,,,,1],[,,1,,,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,,,1,,1,,1,,,,1],[,,,1,,,,,,,,,1],[,1,,,,,,,,,,,,,,1,,,,,,,,,1],[,,,,,,,,1,1,,,,,,,,,1,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,,,1,1,1],[,,,,,1,,,,1,1,1,,,1,1,,,1,,1,1,,1],[,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,1,,,,,,,,,,,,,1],[,,1,,,1,,1,1,1,,1,1,,1,,,,1,,1,1],,[,,1,,,1,,,,,,1,,,,1],[,,,,,,,,,1,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,,1,1,,1,,1,,,1,1,1,,,1],[,,,,,1,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,1,,1,1,,1,,,1],[,,,,,1,,,,,,,,,,,,,,1],[,1,1,1,1,,,,,1,,,1,,1,,,,1,1,,,,1,1],[,1,,,1,,,1,,1,1,,1,,,,,,,1],[,,1,,1,,,1,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,,,,,,,,,,1,,1,1],[,,,,,,,,,,,,1],,[,1,1,1,1,,,,1,1,,1,1,1,1,1,1,,1,1,1,1,,1,,1],[1,,,,1,,,,,,,,,,1],[1,,,,,,,,,1],,[,1,,,,1,,,,,,,,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,,1,,,,1,1,,,1,1,,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,1],[1,1,1,,,,,1,1,1,,1,1,1,1,,,1,1,,1,1,,,,,1],[,1,,,,,,,1,1,,,1,1,1,,1,,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,,,1,,,,1,,,1,,,,1,,,,,,,1,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1],[1,1,1,,1,,,1,1,1,1,,1,1,1,1,,,,1,,1,,1,,,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1,1,,,,,,,,,1],,[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,,1,,1,,,,1],[,1,,,1,1,,1,1,1,,,1,1,1,1,1,,1,1,1,,1,,,1],[1,,,1,,,,1,1,1,,,,,1,1,,,,1,,1],[1,1,,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,,1,,1,,,,,,,,1,,1],[,1,,,,1,,1,1,,,,1,1,,1,,,,1,1,1,,1],,[,1,,,,,,1,,,,,,,1],[,,,,,,,,1,,,,1,,1,,,,,,,,,,,,1]],[,[,1,1,,1,1,1,1,,1,1,1,,1,1,,1,1,,1,1,1,1,1,1,,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,,,1,,,,,,,,1,,,,,,1,,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,,1,,1,1,1,1,1,1,1,,1,1,,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1],[,1,1,,,,,1,1,1,,,1,,1,1,,,,1,,1,,,1,1],[,,,,,,,1,,,,1,1,1,1,1,,1,,,,,,,,1],[1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,,1,,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,1,1,,1,,1,1,1,,1,,1,1,,1,1,,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,,1,,,,,1,,1],[,1,1,1,,1,,1,,1,,,,1,,1,,,1,,,,,,1,1],[,1,,,1,1,,1,,1,,1,1,1,1,1,,1,1,,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,,1,,1,,1,,,,,,1,,1,,,,1,1]],[,[,1,,1,,,,,,,,,,,,,,,1,,,,1],[,,,,,,,,,1,,1,1,1,,1,,,1,,1,1],[1,1,,,,,,,1,,,,,,,1,,,,,,1],[,1,,,,,,,,,,1,,,,,,,,,1,1],,[,,,,,,,,,,,,,,,1,,,,1,,1],[,,1,1,,1,,1,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,,,,,,,,1],[1,,1,1,,,,1,,,,,,,,,1,,,1,,,1,1],[,1,1,,1,1,,1,1,1,1,1,1,1,1,1,,,1,1,,1,1,,1],[,1,,,1,1,,,,,,1,,1,,1,,,1,,1,1],[1,1,1,1,,1,,1,,1,,1,1,,1,1,1,1,1,,1,1,1,1,1],[,1,1,,,1,,1,,1,1,1,,,1,1,1,,1,1,1,1,,1,1],[,,,,1,,,1,,,,,,,1,,,,1,1],[,1,,,,,,,,,,1,,1,,1,,,,,1,,,,,1],,[1,1,,1,,1,,1,1,,,,,,1,1,,,1,1,1,1,1,1,1,1,1],[1,1,,1,,,,,,1,,,,,,1,1,,,,1,1,,,1],[,1,1,,1,1,,,,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,,,1,,,,1,,,,1,1],[,,,,1],[,,,,,,,,,1,,,1],,[,,1,,1,,,,,,,,,1,,,,,,,,,,,,1],[,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,,,1],[,1,,1,,,,,,1,,,,,1,1,,,,,1,1],[,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,,,1,,1,1,1],[,1,,,,1,,,,,,,1],[,1,,,1,,,1,,1,,1,1,,1,,,,,1,,1,,,,1,1],[,1,,,1,,,1,1,1,,1,1,1,1,1,,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,1,1,,,,1,1,,,,,,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,,1,1,,1,1,1,1,1],[,1,,,,1,,,,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,1,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,,1,1,1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,,,,,,,1,1,,,,,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,1,,1,1,1,1],,[,1,1,,,,,1,,1,,,,1,1,1,,,1,,,,,1],[,,,,,,,,,,,,,1],[,,,,,1,,,,,,,,1,1,,,,,1,,1,,,1,1],[,,,,,,,,,,,,,,1]],[,[,1],,,,,,,,,,,,,,,,,,,,[1,1,1,1,1,,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,1,1,1,1],[,1,,1,,1,,,1,1,1,,1,1,1,1,1,,,1,,,,1,,1,1],[,1,,1,,1,,,1,,,,,1,,,,,,1,1],[,1,,1,,,,,1,,,,1,,1,1,1,1,1,1,1,1,,1],[,1,,,,,,,,,,,,,,,1]],[,[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,,,,,,,,,1,1,,,,1],[,,,,,,1],[,,1],[,1,1,,,1,,1,,1,1,,1,1,1,,,,1,1,1,,,,,1],,[,1,,,,1,,,,,,1,,,1,,,,1,1,,1],[,,,,,,,1,,,,,,,,,1],[,1,,,,1,1,,,,,,1,1,1,,,,1,,1,1],[,,,,,,,1,,1,,,,,,,,,,1],[,1,1,,,,,,1,1,,,,1,,,,,,,1,,,1],,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,,1,,,1,,,,,1,,1,,1,,1,,,,,1],[1,1,1,1,1,1,1,1,,,,,1,1,,1,1,,1,,,1,,1],[,,,,,,,,,,,,,,1,,,,,,1],,[,,,,,,,,,1,,,,,,1,,,,,1],[,,1,,,,,,,1,,,1,1],[,,,1,,,,,1,,,,,1,,,,,,1,,,,1],[1,,1,1,,1,1,1,1,1,,1,,,,1,1,1,,,1,1,,,,1,1],,[1,1,,,,,,,,,,1,,1,,1,,,1],[,,,,1,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,1],[,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,,1,,,1,,,,,,,,1,,,,,,1,,,,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,1,,,,1,1,1,1,1,1,,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,1,,1,1,,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,,1,,1,,1,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,,,,,,1,,1,,,,,1,1,,,,,1],[1,,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,,1,,,,1,1,1,1,1,,,1,1,,1,,1],[,1,1,1,1,,,,,1,,1,1,1,1,1,,,1,1,,,,1,1,1],[,1,1,1,1,1,,1,,,,,1,,1,,1,,,1,,,1,1,,1]],[,[1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,,,,,1,,,,,1,1,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,,,,1,,1,1,,1,1,1,1,1,,,1,,1,,1],[1,1,1,,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,,1,,,,,,,,,,1,1,1,1,1,1,1,,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,1,1,,,,,,1,1,1,1,1,,,,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,,1,1,1],[,1,1,1,,1,,1,1,1,1,,,1,1,1,,1,1,1,1,1,,,1,1],[1,1,,,,1,,,1,1,1,,1,,1,,1,,1,1,1,1,1,,1,,1],[,1,,,,,,,1,,1,,1,1,1,1,,,,,,,,,1]],[,[,,,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,1,,,1,,,,,,1,,,1,,,,1],,[,1,,,,1,,1,,1,1,,1,1,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],[1,1,1,,,1,,,,,,,,,1,1,,,,,,,,,,1],[,1,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1,,,1],[,,,,,,,,,1],[1,1,,,,,,1,1,1,,1,1,,,,1,1,,1,,1,1,1,,1],[,1,1,1,,1,1,,,1,,1,1,1,1,,,,,,,1,,1],[,1,1,1,1,,,1,,1,,,,1,1,1,1,,1,1,,1],[,1,,,1,1,,1,,,,1,,1,1,,1,,1,,,1,,,1,,1],[,,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,,,,,1],,[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1],[,1,,,,,,,1,1,,1,,,,,1,,,1,,1],[,1,,,,1,,,1,,,,,,,,1,,1,,,1],[,,,,,,,,,,,,,1,1,,,,1,,,1],[,,,,,1,,,1,,,,1],[,1],,[,1],[1,,,,,,,,,,,,,,1,,,,,1]],[,[,1,,,,1,1,1,1,1,1,,1,1,1,1,1,,1,1,,1,1,,,1],[,,1,,,,,,,,,1],,,[1,,,1,1,,,,,,,,1,1,,1,1,,1],,[,,,,,,,,,,,,,,,,,,1,,1],,[1,,,1,1,,1,1,,,,,1,,1,,,,,1,1,,1],,[,1,,,,,,,,1,1,1,1,1,,1,1,,,,1,1],[,,,,,,,,,,,,,,,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,,1,1,1,1,1,1],[,,,,,,,,,,,1,,1,,,1],[1,,,,,,,,,,,,,,,,,,1,,1],,,[,1,,,,,,,,,,,,,,1,,,,1,1],[,,,,,,,,,1,,,1,,,,,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,1,1,,,,,,1],,[,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,1,1,,1,1,1,1,1,1,,,1,1,1,1,1,,1,1],[,1,,,,,,,,1],[,,,,1,,,1,,,1,1,,,,,,,,,,1,,,,1],[,1,,1,1,,,1,1,1,,,,1,1,1,1,,1,1,1,1,,1],[,,,,,,,1],[,1,1,,,,,1,,1,,,,,,1,,,,,,1,,1,,1],[,1,,,,,,1,,,,1,,,,,,,,,,1],[,,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1,1,1,1,,1],[,1,,,,,,,,1],[,1,1,,1,,,,,,,,1,,,,,,1,,,1,,1,,1],[,1,,1,,1,,1,1,1,,1,1,1,,1,,,1,1,,1,1,1,1,1],[,1,1,1,1,1,,,1,1,,,,1,1,1,,,,1,1,,,1,1],[,,1,1,1,1,,1,,1,,1,,1,1,1,1,,,,,1,,1,,1],[1,1,1,1,1,1,1,1,,1,,1,,1,1,1,,,1,1,,,,1,,1],[,,,1],,[,1,1,,1,,,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1],[,1,,,,,,1,,1,,1,,,,,,,1,1,,1,1],[,,,,,,1,,1,1,,1,,1,,,,,,,,,,1],[,1,1,,1,,,,1,,,,1,1,1,,,,1,,1,1,1,,1,1],,[,1,1,,,,,,,,,,,,,1,,,1,,,,,1],[,1,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,1,,,,1,,,,,1,,,,,,,1]],[,[,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[,1,1,1,1,1,,1,,1,1,,,1,1,1,1,,1,,,,,1,1,1],[,,1,1,,1,,1,1,,,,1,1,1,1,,,1,,1,1,1,1,,1],[,1,,1,,,,,,,,1,,1,,1,,,,,,,,,,1],[,,1,,1,,,1,,,,,1,1,,,1,,1,1,1,1],[,1],[,1,1,,1,,1,1,,1,,,1,1,1,,,,1,,,1,,1],[1,1,,1,1,1,,,,,,,,,,,,,1,,1,1,1],[,1,1,,,,,,,1,,,1,,1,,1,,1,1,,,1,,,1],[,,1,,,,,,,,,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,1,,,,,1,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,,1,,1,1,1,,,1,1,1,1,,,,1,1],[,,,1,1,,,1,,1,,1,,1,1,1,1,,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,,1,,1,,,,1,1,,,1,1,,1,1,,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1,,1,1,,,1],[,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,,1,,,1,,,1,,1,1,1,1,1,,1,,1,1],[,,,,,1,,,,1,,,,,1,1,,,,1],[,1,,1,1,1,,1,,,1,1,1,,,1,,,1,,1,,,1],[,,1,,,,,,,,,1,,1,,,,,1,,1],[,1,1,,,,,,,,1,1,1,,,,,,,,1,,,,,1],[,,,,,,,,1,,,,,1,,,1]],[,[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,,1,1,1,1,1,1,1,1,,,,,,,,,1,1],[,,,,,,,,1,,,,1,,1,,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,1,,1,,1,,,,1,1,,1,,1,,,,1,1,1,1,1,,,1],,[,1,,,,,,,,1,,,1,1,,,1,,1,1,,1,,1],[,1,,,1,,,,,,,,1,,,,,,,1],[1,1,,,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1],,[,1,,,,,,1,,1,,1,1,1,1,1,,,1,,1,1,,,,1],[,1,1,,,1,,1,,1,,,1,1,1,1,,,1,,,1,,,,1],[,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1],[,1,,,1,1,,1,1,,,1,1,,1,1,,1,,1,,1],[1,,1,,,,,1,,1,,1,1,1,1,,,,,1,1,,,,1,1],[,1,1,,,,,1,1,,,1,,1,1,1,1,,,,,,,,,,1],,[,1,1,,,1,,,,1,,1,1,1,1,1,,,,1,,,,1,,1],[,,,1,1,,,1,,,,,1,,1,1,1,,1,1,,,,,,1],[,1,,,,,,,,,,,1,,,,1,,,,,,,1,,1],[,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,1,,1,,,1,1,,1,1,,1],[,1,,,,,,1,,,,,1,1,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1,,,1,,,,,1],[,,,,,,,1,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,,1,,,,,,,1,,,,,,,,1,,,1],[,1,,,,,,,1],[,,,,,,,,,,1],[,1,,,,,,1,1,,,,,,1],,[,1,1,,,,,,1,,,,,1,1,,,,1],[1,,1,,1,,,,,1,,,,,1,,,,,,,,,1,1],[,1,1,,,,,,,,,1,1,1,1,,,,1,,,,,1,,,1],,[,1,1,,1,,,1,1,,,1,,,1,1,1,,1,,1,1,1,,,,1],[,,,,,1,,,,,1,,,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,,,1,,,,,1,,,,,1,,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,1],[,1,,,,,,1,,,,,,,1,1,1,,,1],[,1,,,,,,,,,,1,1,1,,,,,1,,,1],[,,,,,1,,1,,,,,1,1,1,,1,1,,1,1,1,,,1,1],[1,1,,,,,,,1,,,,,1,1,,,,,,,,,,,1],,[,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,,1,,,,,1,,,1,,,,1,,1],[,1,,,,,,,,,1]]]
|
1041
|
+
;var aL={isValidLang:function isValidLang$1(e){let t=rL;for(;e.length<3;)e+="`";for(let r=0;r<=e.length-1;r++){if(t=t[e.charCodeAt(r)-96],!t)return!1}return!0}};const nL=kc,iL=oi,{isValidLang:oL}=aL,sL={title:"Document has a valid `hreflang`",failureTitle:"Document doesn't have a valid `hreflang`",description:"hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more](https://web.dev/hreflang/).",unexpectedLanguage:"Unexpected language code",notFullyQualified:"Relative href value"},cL=iL.createMessageInstanceIdFn("lighthouse-core/audits/seo/hreflang.js",sL);function isExpectedLanguageCode(e){if("x-default"===e.toLowerCase())return!0;const[t]=e.split("-");return oL(t.toLowerCase())}tL.exports=class Hreflang extends nL{static get meta(){return{id:"hreflang",title:cL(sL.title),failureTitle:cL(sL.failureTitle),description:cL(sL.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL"]}}
|
1042
|
+
static audit({LinkElements:e}){const t=[],r=e.filter((e=>{const t="alternate"===e.rel,r=e.hreflang,a="body"===e.source;return t&&r&&!a}));for(const e of r){const r=[];let n;isExpectedLanguageCode(e.hreflang)||r.push(cL(sL.unexpectedLanguage)),(a=e.hrefRaw.toLowerCase()).startsWith("http:")||a.startsWith("https:")||r.push(cL(sL.notFullyQualified)),"head"===e.source?n=e.node?{...nL.makeNodeItem(e.node),snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:{type:"node",snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:"headers"===e.source&&(n=`Link: <${e.hrefRaw}>; rel="alternate"; hreflang="${e.hreflang}"`),n&&r.length&&t.push({source:n,subItems:{type:"subitems",items:r.map((e=>({reason:e})))}})}var a;const n=nL.makeTableDetails([{key:"source",itemType:"code",subItemsHeading:{key:"reason",itemType:"text"},text:""}],t);return{score:Number(0===t.length),details:n}}},tL.exports.UIStrings=sL;var lL={exports:{}}
|
1043
|
+
;const uL=kc,dL=Lo,mL=Fo,pL={title:"Page has successful HTTP status code",failureTitle:"Page has unsuccessful HTTP status code",description:"Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more](https://web.dev/http-status-code/)."},hL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/http-status-code.js",pL);lL.exports=class HTTPStatusCode extends uL{static get meta(){return{id:"http-status-code",title:hL(pL.title),failureTitle:hL(pL.failureTitle),description:hL(pL.description),requiredArtifacts:["devtoolsLogs","URL","GatherContext"],supportedModes:["navigation"]}}static async audit(e,t){const r=e.devtoolsLogs[uL.DEFAULT_PASS],a=e.URL,n=await dL.request(r,t),i=mL.findMainDocument(n,a.finalUrl).statusCode;return i>=400&&i<=599?{score:0,displayValue:`${i}`}:{score:1}}},lL.exports.UIStrings=pL;var gL={exports:{}};function trimLine(e){return e?Array.isArray(e)?e.map(trimLine):String(e).trim():null}function removeComments(e){var t=e.indexOf("#")
|
1044
1044
|
;return t>-1?e.substr(0,t):e}function splitLine(e){var t=String(e).indexOf(":");return!e||t<0?null:[e.slice(0,t),e.slice(t+1)]}function formatUserAgent(e){var t=e.toLowerCase(),r=t.indexOf("/");return r>-1&&(t=t.substr(0,r)),t.trim()}function normaliseEncoding(e){try{return urlEncodeToUpper(encodeURI(e).replace(/%25/g,"%"))}catch(t){return e}}function urlEncodeToUpper(e){return e.replace(/%[0-9a-fA-F]{2}/g,(function(e){return e.toUpperCase()}))}function matches(e,t){var r=new Array(t.length+1),a=1;r[0]=0;for(var n=0;n<e.length;n++){if("$"===e[n]&&n+1===e.length)return r[a-1]===t.length;if("*"==e[n]){a=t.length-r[0]+1;for(var i=1;i<a;i++)r[i]=r[i-1]+1}else{var o=0;for(i=0;i<a;i++)r[i]<t.length&&t[r[i]]===e[n]&&(r[o++]=r[i]+1);if(0==o)return!1;a=o}}return!0}function parseUrl(e){try{return new URL(e,"http://robots-relative.samclarke.com/")}catch(e){return null}}function Robots$1(e,t){this._url=parseUrl(e)||{},this._url.port=this._url.port||80,this._rules=Object.create(null),
|
1045
1045
|
this._sitemaps=[],this._preferredHost=null,function parseRobots(e,t){for(var r=e.split(/\r\n|\r|\n/).map(removeComments).map(splitLine).map(trimLine),a=[],n=!0,i=0;i<r.length;i++){var o=r[i];if(o&&o[0]){switch(o[0].toLowerCase()){case"user-agent":n&&(a.length=0),o[1]&&a.push(formatUserAgent(o[1]));break;case"disallow":t.addRule(a,o[1],!1,i+1);break;case"allow":t.addRule(a,o[1],!0,i+1);break;case"crawl-delay":t.setCrawlDelay(a,o[1]);break;case"sitemap":o[1]&&t.addSitemap(o[1]);break;case"host":o[1]&&t.setPreferredHost(o[1].toLowerCase())}n="user-agent"!==o[0].toLowerCase()}}}(t||"",this)}Robots$1.prototype.addRule=function(e,t,r,a){var n=this._rules;e.forEach((function(e){n[e]=n[e]||[],t&&n[e].push({pattern:normaliseEncoding(t),allow:r,lineNumber:a})}))},Robots$1.prototype.setCrawlDelay=function(e,t){var r=this._rules,a=Number(t);e.forEach((function(e){r[e]=r[e]||[],isNaN(a)||(r[e].crawlDelay=a)}))},Robots$1.prototype.addSitemap=function(e){this._sitemaps.push(e)},
|
1046
1046
|
Robots$1.prototype.setPreferredHost=function(e){this._preferredHost=e},Robots$1.prototype._getRule=function(e,t){var r=parseUrl(e)||{},a=formatUserAgent(t||"*");if(r.port=r.port||80,r.protocol===this._url.protocol&&r.hostname===this._url.hostname&&r.port===this._url.port){var n=this._rules[a]||this._rules["*"]||[];return function findRule(e,t){for(var r=null,a=0;a<t.length;a++){var n=t[a];matches(n.pattern,e)&&(!r||n.pattern.length>r.pattern.length||n.pattern.length==r.pattern.length&&n.allow&&!r.allow)&&(r=n)}return r}(urlEncodeToUpper(r.pathname+r.search),n)}},Robots$1.prototype.isAllowed=function(e,t){var r=this._getRule(e,t);if(void 0!==r)return!r||r.allow},Robots$1.prototype.getMatchingLineNumber=function(e,t){var r=this._getRule(e,t);return r?r.lineNumber:-1},Robots$1.prototype.isDisallowed=function(e,t){return!this.isAllowed(e,t)},Robots$1.prototype.getCrawlDelay=function(e){var t=formatUserAgent(e||"*");return(this._rules[t]||this._rules["*"]||{}).crawlDelay},
|
1047
|
-
Robots$1.prototype.getPreferredHost=function(){return this._preferredHost},Robots$1.prototype.getSitemaps=function(){return this._sitemaps.slice(0)};var
|
1048
|
-
failureTitle:TL
|
1049
|
-
line:e-1,column:0}})}}const n=
|
1050
|
-
description:"Descriptive link text helps search engines understand your content. [Learn more](https://web.dev/link-text/).",displayValue:"{itemCount, plural,\n =1 {1 link found}\n other {# links found}\n }"},
|
1051
|
-
;return t.length&&(a=kL
|
1052
|
-
description:"Meta descriptions may be included in search results to concisely summarize page content. [Learn more](https://web.dev/meta-description/).",explanation:"Description text is empty."},
|
1053
|
-
title:"Document avoids plugins",failureTitle:"Document uses plugins",description:"Search engines can't index plugin content, and many devices restrict plugins or don't support them. [Learn more](https://web.dev/plugins/)."},
|
1054
|
-
;if("EMBED"===e.tagName&&t&&isPluginURL(t))return!0;if("OBJECT"===e.tagName&&e.data&&isPluginURL(e.data))return!0;return e.params.filter((e=>
|
1055
|
-
displayValueValidationError:"{itemCount, plural,\n =1 {1 error found}\n other {# errors found}\n }",explanation:"Lighthouse was unable to download a robots.txt file"},
|
1056
|
-
;if(-1!==e&&e!==t.length-1)throw new Error('"$" should only be used at the end of the pattern')}}(a,n),{directive:a,value:n}}
|
1057
|
-
}(r),n=
|
1058
|
-
return e=
|
1059
|
-
},
|
1060
|
-
const r=[];return e.forEach((e=>{const a=
|
1061
|
-
}(function mergeSymmetricFailures(e){const t=[];return e.forEach(((r,a)=>{const n=e.find((e=>e.tapTarget===r.overlappingTarget&&e.overlappingTarget===r.tapTarget));if(!n)return void t.push(r);const{overlapScoreRatio:i}=r,{overlapScoreRatio:o}=n;(i>o||i===o&&a<e.indexOf(n))&&t.push(r)})),t}(a)),i=[{key:"tapTarget",itemType:"node",text:bM
|
1062
|
-
description:"Keep the server response time for the main document short because all other requests depend on it. [Learn more](https://web.dev/time-to-first-byte/).",displayValue:"Root document took {timeInMs, number, milliseconds} ms"},
|
1063
|
-
;const n=ServerResponseTime.calculateResponseTime(a),i=n<600,o=RM
|
1064
|
-
explanationNoManifest:"This page is controlled by a service worker, however no `start_url` was found because no manifest was fetched.",explanationBadManifest:"This page is controlled by a service worker, however no `start_url` was found because manifest failed to parse as valid JSON",explanationBadStartUrl:"This page is controlled by a service worker, however the `start_url` ({startUrl}) is not in the service worker's scope ({scopeUrl})"},
|
1065
|
-
;if(e){const t=new
|
1066
|
-
;var
|
1067
|
-
return{id:"splash-screen",title:jM
|
1068
|
-
},
|
1069
|
-
{failures:r,manifestValues:n,themeColor:a?.content||null}}}
|
1070
|
-
failureTitle:rP
|
1071
|
-
},i=Math.max(4096,r.transferSize/20),o=Math.min(5,a.length);let s=0;for(;s<o;){const e=a[s];if(0===e.blockingTime&&e.transferSize<i)break;s++,n.transferSize+=e.transferSize,n.blockingTime+=e.blockingTime}if(!n.blockingTime&&!n.transferSize)return[];a=a.slice(0,s);const c={url:
|
1072
|
-
items:ThirdPartySummary$1.makeSubItems(e,l,t)}}))).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize)),m=[{key:"entity",itemType:"link",text:rP
|
1073
|
-
description:"Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required. [Learn more](https://web.dev/third-party-facades/).",displayValue:"{itemCount, plural,\n =1 {# facade alternative available}\n other {# facade alternatives available}\n }",columnProduct:"Product",categoryVideo:"{productName} (Video)",categoryCustomerSuccess:"{productName} (Customer Success)",categoryMarketing:"{productName} (Marketing)",categorySocial:"{productName} (Social)"},
|
1074
|
-
e.sort(((e,t)=>t.transferSize-e.transferSize));let t=e.findIndex((e=>e.transferSize<1e3))||1;if((-1===t||t>5)&&(t=5),t>=e.length-1)return;const r=e.splice(t).reduce(((e,t)=>(e.transferSize+=t.transferSize,e.blockingTime+=t.blockingTime,e)));r.transferSize<1e3||(r.url=
|
1075
|
-
;for(const{product:e,entity:t}of d){const r=
|
1076
|
-
title:"Timing budget",description:"Set a timing budget to help you keep an eye on the performance of your site. Performant sites load fast and respond to user input events quickly. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",columnTimingMetric:"Metric",columnMeasurement:"Measurement"},
|
1077
|
-
"speed-index":
|
1078
|
-
value:Number(a.measurement),granularity:.01}),"number"==typeof a.overBudget&&(a.overBudget={type:"numeric",value:Number(a.overBudget),granularity:.01})),r}static async audit(e,t){const r=e.GatherContext,a=e.devtoolsLogs[
|
1079
|
-
description:"Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn more](https://web.dev/optimize-cls/#images-without-dimensions)"},
|
1080
|
-
;const t=e.attributeWidth,r=e.attributeHeight,a=e.cssEffectiveRules.width,n=e.cssEffectiveRules.height,i=e.cssEffectiveRules.aspectRatio,o=UnsizedImages.doesHtmlAttrProvideExplicitSize(t),s=UnsizedImages.isCssPropExplicitlySet(a),c=UnsizedImages.doesHtmlAttrProvideExplicitSize(r),l=UnsizedImages.isCssPropExplicitlySet(n),u=UnsizedImages.isCssPropExplicitlySet(i),d=o||s,m=c||l;return d&&m||d&&u||m&&u}static isNonNetworkSvg(e){const t="image/svg+xml"===
|
1081
|
-
text:""},{key:"url",itemType:"url",text:
|
1082
|
-
;const
|
1083
|
-
timingType:e.isMark?"Mark":"Measure"}))).sort(((e,t)=>e.timingType===t.timingType?e.startTime-t.startTime:"Measure"===e.timingType?-1:1)),a=[{key:"name",itemType:"text",text:
|
1084
|
-
unusedWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Only use `preconnect` for important origins that the page will certainly request.',crossoriginWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.',tooManyPreconnectLinksWarning:"More than 2 `<link rel=preconnect>` connections were found. These should be used sparingly and only to the most important origins."},
|
1085
|
-
static hasAlreadyConnectedToOrigin(e){return!!e.timing&&e.timing.dnsEnd-e.timing.dnsStart==0&&e.timing.connectEnd-e.timing.connectStart==0}static socketStartTimeIsBelowThreshold(e,t){return Math.max(0,e.startTime-t.endTime)<15}static async audit(e,t){const r=e.traces[UsesRelPreconnectAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS],n=t.settings;let i=0;const o=[],s=await
|
1086
|
-
if(!UsesRelPreconnectAudit.hasValidTiming(e)||e.initiator.url===l.url||!e.parsedURL||!e.parsedURL.securityOrigin||l.parsedURL.securityOrigin===e.parsedURL.securityOrigin||!y.has(e.url)||UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(e)||!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(e,l))return;const t=e.parsedURL.securityOrigin,r=v.get(t)||[];r.push(e),v.set(t,r)}));const b=e.LinkElements.filter((e=>"preconnect"===e.rel)),w=new Set(b.map((e=>
|
1087
|
-
;for(const e of w)e&&(c.some((t=>e===t.parsedURL.securityOrigin))||o.push(KP
|
1088
|
-
crossoriginWarning:'A preload `<link>` was found for "{preloadURL}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.'},
|
1089
|
-
const t=a.get(e.frameId);if(!t)return!1;if(!t.has(e.url))return!1;return!(e.fromDiskCache||e.fromMemoryCache||e.fromPrefetchCache)&&!e.isLinkPreload}));return new Set(n.map((e=>e.url)))}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!!
|
1090
|
-
const t=c.get(e.record),r=s.nodeTimings.get(e),n=a.nodeTimings.get(t);if(!n||!r)throw new Error("Missing preload node");const i=Math.round(n.endTime-r.endTime);i<100||l.push({url:e.record.url,wastedMs:i})}return l.length?{wastedMs:Math.max(...l.map((e=>e.wastedMs))),results:l}:{wastedMs:0,results:l}}static async audit_(e,t){const r=e.traces[UsesRelPreloadAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS],n=e.URL,i={devtoolsLog:a,settings:t.settings},[o,s,c]=await Promise.all([
|
1091
|
-
label:
|
1047
|
+
Robots$1.prototype.getPreferredHost=function(){return this._preferredHost},Robots$1.prototype.getSitemaps=function(){return this._sitemaps.slice(0)};var fL=Robots$1;const yL=kc,robotsParser=function(e,t){return new fL(e,t)},vL=ji,bL=HT,wL=new Set(["noindex","none"]),SL="unavailable_after",TL={title:"Page isn’t blocked from indexing",failureTitle:"Page is blocked from indexing",description:"Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more](https://web.dev/is-crawable/)."},EL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/is-crawlable.js",TL);function hasBlockingDirective(e){return e.split(",").map((e=>e.toLowerCase().trim())).some((e=>wL.has(e)||function isUnavailable(e){const t=e.split(":");if(t.length<=1||t[0]!==SL)return!1;const r=Date.parse(t.slice(1).join(":"));return!isNaN(r)&&r<Date.now()}(e)))}gL.exports=class IsCrawlable extends yL{static get meta(){return{id:"is-crawlable",title:EL(TL.title),
|
1048
|
+
failureTitle:EL(TL.failureTitle),description:EL(TL.description),supportedModes:["navigation"],requiredArtifacts:["MetaElements","RobotsTxt","URL","devtoolsLogs"]}}static audit(e,t){const r=e.devtoolsLogs[yL.DEFAULT_PASS],a=e.MetaElements.find((e=>"robots"===e.name));return bL.request({devtoolsLog:r,URL:e.URL},t).then((t=>{const r=[];if(a){const e=a.content||"";hasBlockingDirective(e)&&r.push({source:{...yL.makeNodeItem(a.node),snippet:`<meta name="robots" content="${e}" />`}})}if(t.responseHeaders&&t.responseHeaders.filter((e=>"x-robots-tag"===e.name.toLowerCase()&&!function hasUserAgent(e){const t=e.match(/^([^,:]+):/);return!!t&&t[1].toLowerCase()!==SL}(e.value)&&hasBlockingDirective(e.value))).forEach((e=>r.push({source:`${e.name}: ${e.value}`}))),e.RobotsTxt.content){const a=new vL("/robots.txt",t.url),n=robotsParser(a.href,e.RobotsTxt.content);if(!n.isAllowed(t.url)){const e=n.getMatchingLineNumber(t.url)||1;r.push({source:{type:"source-location",url:a.href,urlProvider:"network",
|
1049
|
+
line:e-1,column:0}})}}const n=yL.makeTableDetails([{key:"source",itemType:"code",text:"Blocking Directive Source"}],r);return{score:Number(0===r.length),details:n}}))}},gL.exports.UIStrings=TL;var xL={exports:{}};const _L=kc,AL=ji,RL=new Set(["click here","click this","go","here","information","learn more","more","more info","more information","right here","read more","see more","start","this","ここをクリック","こちらをクリック","リンク","続きを読む","続く","全文表示","click aquí","click aqui","clicka aquí","clicka aqui","pincha aquí","pincha aqui","aquí","aqui","más","mas","más información","más informacion","mas información","mas informacion","este","enlace","este enlace","empezar","clique aqui","ir","mais informação","mais informações","mais","veja mais","여기","여기를 클릭","클릭","링크","자세히","자세히 보기","계속","이동","전체 보기","här","klicka här","läs mer","mer","mer info","mer information"]),kL={title:"Links have descriptive text",failureTitle:"Links do not have descriptive text",
|
1050
|
+
description:"Descriptive link text helps search engines understand your content. [Learn more](https://web.dev/link-text/).",displayValue:"{itemCount, plural,\n =1 {1 link found}\n other {# links found}\n }"},DL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/link-text.js",kL);xL.exports=class LinkText extends _L{static get meta(){return{id:"link-text",title:DL(kL.title),failureTitle:DL(kL.failureTitle),description:DL(kL.description),requiredArtifacts:["URL","AnchorElements"]}}static audit(e){const t=e.AnchorElements.filter((e=>e.href&&!e.rel.includes("nofollow"))).filter((t=>{const r=t.href.toLowerCase();return!(r.startsWith("javascript:")||r.startsWith("mailto:")||AL.equalWithExcludedFragments(t.href,e.URL.finalUrl))&&RL.has(t.text.trim().toLowerCase())})).map((e=>({href:e.href,text:e.text.trim()}))),r=_L.makeTableDetails([{key:"href",itemType:"url",text:"Link destination"},{key:"text",itemType:"text",text:"Link Text"}],t,{});let a
|
1051
|
+
;return t.length&&(a=DL(kL.displayValue,{itemCount:t.length})),{score:Number(0===t.length),details:r,displayValue:a}}},xL.exports.UIStrings=kL;var CL={exports:{}};const IL=iy,NL={description:"Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data/).",title:"Structured data is valid"},LL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/manual/structured-data.js",NL);CL.exports=class StructuredData extends IL{static get meta(){return Object.assign({id:"structured-data",description:LL(NL.description),title:LL(NL.title)},super.partialMeta)}},CL.exports.UIStrings=NL;var ML={exports:{}};const PL=kc,OL={title:"Document has a meta description",failureTitle:"Document does not have a meta description",
|
1052
|
+
description:"Meta descriptions may be included in search results to concisely summarize page content. [Learn more](https://web.dev/meta-description/).",explanation:"Description text is empty."},FL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/meta-description.js",OL);ML.exports=class Description extends PL{static get meta(){return{id:"meta-description",title:FL(OL.title),failureTitle:FL(OL.failureTitle),description:FL(OL.description),requiredArtifacts:["MetaElements"]}}static audit(e){const t=e.MetaElements.find((e=>"description"===e.name));if(!t)return{score:0};return 0===(t.content||"").trim().length?{score:0,explanation:FL(OL.explanation)}:{score:1}}},ML.exports.UIStrings=OL;var UL={exports:{}};const jL=kc,BL=ji,$L="application/x-java-applet",qL="application/x-java-bean",zL=new Set(["application/x-shockwave-flash",$L,qL,"application/x-silverlight","application/x-silverlight-2"]),VL=new Set(["swf","flv","class","xap"]),WL=new Set(["code","movie","source","src"]),GL={
|
1053
|
+
title:"Document avoids plugins",failureTitle:"Document uses plugins",description:"Search engines can't index plugin content, and many devices restrict plugins or don't support them. [Learn more](https://web.dev/plugins/)."},HL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/plugins.js",GL);function isPluginURL(e){try{const t=new BL(e,"http://example.com").pathname.split(".");if(t.length<2)return!1;const r=t[t.length-1];return VL.has(r.trim().toLowerCase())}catch(e){return!1}}UL.exports=class Plugins extends jL{static get meta(){return{id:"plugins",title:HL(GL.title),failureTitle:HL(GL.failureTitle),description:HL(GL.description),requiredArtifacts:["EmbeddedContent"]}}static audit(e){const t=e.EmbeddedContent.filter((e=>{if("APPLET"===e.tagName)return!0;if(("EMBED"===e.tagName||"OBJECT"===e.tagName)&&e.type&&function isPluginType(e){return e=e.trim().toLowerCase(),zL.has(e)||e.startsWith($L)||e.startsWith(qL)}(e.type))return!0;const t=e.src||e.code
|
1054
|
+
;if("EMBED"===e.tagName&&t&&isPluginURL(t))return!0;if("OBJECT"===e.tagName&&e.data&&isPluginURL(e.data))return!0;return e.params.filter((e=>WL.has(e.name.trim().toLowerCase())&&isPluginURL(e.value))).length>0})).map((e=>({source:jL.makeNodeItem(e.node)}))),r=jL.makeTableDetails([{key:"source",itemType:"code",text:"Element source"}],t);return{score:Number(0===t.length),details:r}}},UL.exports.UIStrings=GL;var YL={exports:{}};const KL=kc,JL=ji,XL="sitemap",ZL="user-agent",QL="allow",eM="disallow",tM=new Set([QL,eM]),rM=new Set([ZL,eM,QL,XL,"crawl-delay","clean-param","host","request-rate","visit-time","noindex"]),aM=new Set(["https:","http:","ftp:"]),nM={title:"robots.txt is valid",failureTitle:"robots.txt is not valid",description:"If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt/).",displayValueHttpBadCode:"Request for robots.txt returned HTTP status: {statusCode}",
|
1055
|
+
displayValueValidationError:"{itemCount, plural,\n =1 {1 error found}\n other {# errors found}\n }",explanation:"Lighthouse was unable to download a robots.txt file"},iM=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/robots-txt.js",nM);function parseLine(e){const t=e.indexOf("#");if(-1!==t&&(e=e.substr(0,t)),0===(e=e.trim()).length)return null;const r=e.indexOf(":");if(-1===r)throw new Error("Syntax not understood");const a=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim();return function verifyDirective(e,t){if(!rM.has(e))throw new Error("Unknown directive");if(e===XL){let e;try{e=new JL(t)}catch(e){throw new Error("Invalid sitemap URL")}if(!aM.has(e.protocol))throw new Error("Invalid sitemap URL protocol")}if(e===ZL&&!t)throw new Error("No user-agent specified");if(e===QL||e===eM){if(""!==t&&"/"!==t[0]&&"*"!==t[0])throw new Error('Pattern should either be empty, start with "/" or "*"');const e=t.indexOf("$")
|
1056
|
+
;if(-1!==e&&e!==t.length-1)throw new Error('"$" should only be used at the end of the pattern')}}(a,n),{directive:a,value:n}}YL.exports=class RobotsTxt extends KL{static get meta(){return{id:"robots-txt",title:iM(nM.title),failureTitle:iM(nM.failureTitle),description:iM(nM.description),requiredArtifacts:["RobotsTxt"]}}static audit(e){const{status:t,content:r}=e.RobotsTxt;if(!t)return{score:0,explanation:iM(nM.explanation)};if(t>=500)return{score:0,displayValue:iM(nM.displayValueHttpBadCode,{statusCode:t})};if(t>=400||""===r)return{score:1,notApplicable:!0};if(null===r)throw new Error(`Status ${t} was valid, but content was null`);const a=function validateRobots(e){const t=[];let r=!1;return e.split(/\r\n|\r|\n/).forEach(((e,a)=>{let n;try{n=parseLine(e)}catch(r){t.push({index:(a+1).toString(),line:e,message:r.message.toString()})}n&&(n.directive===ZL?r=!0:!r&&tM.has(n.directive)&&t.push({index:(a+1).toString(),line:e,message:"No user-agent specified"}))})),t
|
1057
|
+
}(r),n=KL.makeTableDetails([{key:"index",itemType:"text",text:"Line #"},{key:"line",itemType:"code",text:"Content"},{key:"message",itemType:"code",text:"Error"}],a,{});let i;return a.length&&(i=iM(nM.displayValueValidationError,{itemCount:a.length})),{score:Number(0===a.length),details:n,displayValue:i}}},YL.exports.UIStrings=nM;var oM={exports:{}};const sM=kp;function almostEqual(e,t){return Math.abs(e-t)<=10}function mergeTouchingClientRects(e){for(let t=0;t<e.length;t++)for(let r=t+1;r<e.length;r++){const a=e[t],n=e[r],i=almostEqual(a.top,n.top)||almostEqual(a.bottom,n.bottom),o=almostEqual(a.left,n.left)||almostEqual(a.right,n.right);if(sM.rectsTouchOrOverlap(a,n)&&(i||o)){const t=sM.getBoundingRect([a,n]),r=sM.getRectCenterPoint(t);if(!sM.rectContainsPoint(a,r)&&!sM.rectContainsPoint(n,r))continue;return(e=e.filter((e=>e!==a&&e!==n))).push(t),mergeTouchingClientRects(e)}}return e}var cM={getTappableRectsFromClientRects:function getTappableRectsFromClientRects$1(e){
|
1058
|
+
return e=sM.filterOutTinyRects(e),e=mergeTouchingClientRects(e=sM.filterOutRectsContainedByOthers(e))}};const lM=kc,uM=KN,{rectsTouchOrOverlap:dM,getRectOverlapArea:mM,getRectAtCenter:pM,allRectsContainedWithinEachOther:hM,getLargestRect:gM,getBoundingRectWithPadding:fM}=kp,{getTappableRectsFromClientRects:yM}=cM,vM=oi,bM={title:"Tap targets are sized appropriately",failureTitle:"Tap targets are not sized appropriately",description:"Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets/).",tapTargetHeader:"Tap Target",overlappingTargetHeader:"Overlapping Target",explanationViewportMetaNotOptimized:"Tap targets are too small because there's no viewport meta tag optimized for mobile screens",displayValue:"{decimalProportion, number, percent} appropriately sized tap targets"
|
1059
|
+
},wM=vM.createMessageInstanceIdFn("lighthouse-core/audits/seo/tap-targets.js",bM);function clientRectBelowMinimumSize(e){return e.width<48||e.height<48}function getOverlapFailureForTargetPair(e,t){let r=null;for(const a of e){const e=pM(a,48),n=mM(e,a);for(const a of t){const t=mM(e,a),i=t/n;i<.25||(!r||i>r.overlapScoreRatio)&&(r={overlapScoreRatio:i,tapTargetScore:n,overlappingTargetScore:t})}}return r}class TapTargets extends lM{static get meta(){return{id:"tap-targets",title:wM(bM.title),failureTitle:wM(bM.failureTitle),description:wM(bM.description),requiredArtifacts:["MetaElements","TapTargets"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await uM.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:wM(bM.explanationViewportMetaNotOptimized)};const r=function getBoundedTapTargets(e){return e.map((e=>({tapTarget:e,paddedBoundsRect:fM(e.clientRects,48)})))}(e.TapTargets),a=function getAllOverlapFailures(e,t){
|
1060
|
+
const r=[];return e.forEach((e=>{const a=yM(e.tapTarget.clientRects);for(const n of t){if(n===e)continue;if(!dM(e.paddedBoundsRect,n.paddedBoundsRect))continue;if(e.tapTarget.href===n.tapTarget.href&&/https?:\/\//.test(e.tapTarget.href))continue;const t=n.tapTarget.clientRects;if(hM(a,t))continue;const i=getOverlapFailureForTargetPair(a,t);i&&r.push({...i,tapTarget:e.tapTarget,overlappingTarget:n.tapTarget})}})),r}(function getTooSmallTargets(e){return e.filter((e=>e.tapTarget.clientRects.every(clientRectBelowMinimumSize)))}(r),r),n=function getTableItems(e){const t=e.map((e=>{const t=gM(e.tapTarget.clientRects),r=Math.floor(t.width),a=Math.floor(t.height),n=r+"x"+a;return{tapTarget:lM.makeNodeItem(e.tapTarget.node),overlappingTarget:lM.makeNodeItem(e.overlappingTarget.node),tapTargetScore:e.tapTargetScore,overlappingTargetScore:e.overlappingTargetScore,overlapScoreRatio:e.overlapScoreRatio,size:n,width:r,height:a}}));return t.sort(((e,t)=>t.overlapScoreRatio-e.overlapScoreRatio)),t
|
1061
|
+
}(function mergeSymmetricFailures(e){const t=[];return e.forEach(((r,a)=>{const n=e.find((e=>e.tapTarget===r.overlappingTarget&&e.overlappingTarget===r.tapTarget));if(!n)return void t.push(r);const{overlapScoreRatio:i}=r,{overlapScoreRatio:o}=n;(i>o||i===o&&a<e.indexOf(n))&&t.push(r)})),t}(a)),i=[{key:"tapTarget",itemType:"node",text:wM(bM.tapTargetHeader)},{key:"size",itemType:"text",text:wM(vM.UIStrings.columnSize)},{key:"overlappingTarget",itemType:"node",text:wM(bM.overlappingTargetHeader)}],o=lM.makeTableDetails(i,n),s=e.TapTargets.length,c=new Set(a.map((e=>e.tapTarget))).size;let l=1,u=1;c>0&&(u=(s-c)/s,l=.89*u);return{score:l,details:o,displayValue:wM(bM.displayValue,{decimalProportion:u})}}}TapTargets.FINGER_SIZE_PX=48,oM.exports=TapTargets,oM.exports.UIStrings=bM;var SM={exports:{}};const TM=kc,EM=oi,xM=HT,_M=Lo,AM=Fo,RM={title:"Initial server response time was short",failureTitle:"Reduce initial server response time",
|
1062
|
+
description:"Keep the server response time for the main document short because all other requests depend on it. [Learn more](https://web.dev/time-to-first-byte/).",displayValue:"Root document took {timeInMs, number, milliseconds} ms"},kM=EM.createMessageInstanceIdFn("lighthouse-core/audits/server-response-time.js",RM);class ServerResponseTime extends TM{static get meta(){return{id:"server-response-time",title:kM(RM.title),failureTitle:kM(RM.failureTitle),description:kM(RM.description),supportedModes:["timespan","navigation"],requiredArtifacts:["devtoolsLogs","URL","GatherContext"]}}static calculateResponseTime(e){const t=e.timing;return t?t.receiveHeadersEnd-t.sendEnd:0}static async audit(e,t){const r=e.devtoolsLogs[TM.DEFAULT_PASS];let a;if("timespan"===e.GatherContext.gatherMode){const n=await _M.request(r,t),i=AM.findOptionalMainDocument(n,e.URL.finalUrl);if(!i)return{score:null,notApplicable:!0};a=i}else a=await xM.request({devtoolsLog:r,URL:e.URL},t)
|
1063
|
+
;const n=ServerResponseTime.calculateResponseTime(a),i=n<600,o=kM(RM.displayValue,{timeInMs:n}),s=[{key:"url",valueType:"url",label:kM(EM.UIStrings.columnURL)},{key:"responseTime",valueType:"timespanMs",label:kM(EM.UIStrings.columnTimeSpent)}],c=TM.makeOpportunityDetails(s,[{url:a.url,responseTime:n}],n-100);return{numericValue:n,numericUnit:"millisecond",score:Number(i),displayValue:o,details:c}}}SM.exports=ServerResponseTime,SM.exports.UIStrings=RM;var DM={exports:{}};const CM=ji,IM=kc,NM={title:"Registers a service worker that controls page and `start_url`",failureTitle:"Does not register a service worker that controls page and `start_url`",description:"The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://web.dev/service-worker/).",explanationOutOfScope:"This origin has one or more service workers, however the page ({pageUrl}) is not in scope.",
|
1064
|
+
explanationNoManifest:"This page is controlled by a service worker, however no `start_url` was found because no manifest was fetched.",explanationBadManifest:"This page is controlled by a service worker, however no `start_url` was found because manifest failed to parse as valid JSON",explanationBadStartUrl:"This page is controlled by a service worker, however the `start_url` ({startUrl}) is not in the service worker's scope ({scopeUrl})"},LM=oi.createMessageInstanceIdFn("lighthouse-core/audits/service-worker.js",NM);class ServiceWorker extends IM{static get meta(){return{id:"service-worker",title:LM(NM.title),failureTitle:LM(NM.failureTitle),description:LM(NM.description),requiredArtifacts:["URL","ServiceWorker","WebAppManifest"]}}static getVersionsForOrigin(e,t){return e.filter((e=>"activated"===e.status)).filter((e=>new CM(e.scriptURL).origin===t.origin))}static getControllingServiceWorker(e,t,r){const a=[];for(const r of e){const e=t.find((e=>e.registrationId===r.registrationId))
|
1065
|
+
;if(e){const t=new CM(e.scopeURL).href,n=new CM(r.scriptURL).href;a.push({scopeUrl:t,scriptUrl:n})}}return a.filter((e=>r.href.startsWith(e.scopeUrl))).sort(((e,t)=>e.scopeUrl.length-t.scopeUrl.length)).pop()}static checkStartUrl(e,t){if(!e)return LM(NM.explanationNoManifest);if(!e.value)return LM(NM.explanationBadManifest);const r=e.value.start_url.value;return r.startsWith(t)?void 0:LM(NM.explanationBadStartUrl,{startUrl:r,scopeUrl:t})}static audit(e){const t=new CM(e.URL.finalUrl),{versions:r,registrations:a}=e.ServiceWorker,n=ServiceWorker.getVersionsForOrigin(r,t);if(0===n.length)return{score:0};const i=ServiceWorker.getControllingServiceWorker(n,a,t);if(!i)return{score:0,explanation:LM(NM.explanationOutOfScope,{pageUrl:t.href})};const{scriptUrl:o,scopeUrl:s}=i,c={type:"debugdata",scriptUrl:o,scopeUrl:s},l=ServiceWorker.checkStartUrl(e.WebAppManifest,i.scopeUrl);return l?{score:0,details:c,explanation:l}:{score:1,details:c}}}DM.exports=ServiceWorker,DM.exports.UIStrings=NM
|
1066
|
+
;var MM={exports:{}};const PM=kc;var OM=class MultiCheckAudit$2 extends PM{static async audit(e,t){const r=await this.audit_(e,t);return this.createAuditProduct(r)}static createAuditProduct(e){const t={...e,...e.manifestValues,manifestValues:void 0,allChecks:void 0};e.manifestValues?.allChecks&&e.manifestValues.allChecks.forEach((e=>{t[e.id]=e.passing}));const r={type:"debugdata",items:[t]};return e.failures.length>0?{score:0,explanation:`Failures: ${e.failures.join(",\n")}.`,details:r}:{score:1,details:r}}static audit_(e,t){throw new Error("audit_ unimplemented")}};const FM=OM,UM=DA,jM={title:"Configured for a custom splash screen",failureTitle:"Is not configured for a custom splash screen",description:"A themed splash screen ensures a high-quality experience when users launch your app from their homescreens. [Learn more](https://web.dev/splash-screen/)."},BM=oi.createMessageInstanceIdFn("lighthouse-core/audits/splash-screen.js",jM);class SplashScreen extends FM{static get meta(){
|
1067
|
+
return{id:"splash-screen",title:BM(jM.title),failureTitle:BM(jM.failureTitle),description:BM(jM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors"]}}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=["hasName","hasBackgroundColor","hasThemeColor","hasIconsAtLeast512px"];e.allChecks.filter((e=>r.includes(e.id))).forEach((e=>{e.passing||t.push(e.failureText)}))}static async audit_(e,t){const r=[],a=await UM.request(e,t);return SplashScreen.assessManifest(a,r),{failures:r,manifestValues:a}}}MM.exports=SplashScreen,MM.exports.UIStrings=jM;var $M={exports:{}};const qM=OM,zM=DA,VM=Rs,WM={title:"Sets a theme color for the address bar.",failureTitle:"Does not set a theme color for the address bar.",description:"The browser address bar can be themed to match your site. [Learn more](https://web.dev/themed-omnibox/)."
|
1068
|
+
},GM=oi.createMessageInstanceIdFn("lighthouse-core/audits/themed-omnibox.js",WM);class ThemedOmnibox extends qM{static get meta(){return{id:"themed-omnibox",title:GM(WM.title),failureTitle:GM(WM.failureTitle),description:GM(WM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors","MetaElements"]}}static isValidColor(e){return VM.valueType(e)===VM.TYPES.COLOR}static assessMetaThemecolor(e,t){e?ThemedOmnibox.isValidColor(e.content||"")||t.push("The theme-color meta tag did not contain a valid CSS color"):t.push('No `<meta name="theme-color">` tag found')}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=e.allChecks.find((e=>"hasThemeColor"===e.id));r&&!r.passing&&t.push(r.failureText)}static async audit_(e,t){const r=[],a=e.MetaElements.find((e=>"theme-color"===e.name)),n=await zM.request(e,t);return ThemedOmnibox.assessManifest(n,r),ThemedOmnibox.assessMetaThemecolor(a,r),
|
1069
|
+
{failures:r,manifestValues:n,themeColor:a?.content||null}}}$M.exports=ThemedOmnibox,$M.exports.UIStrings=WM;var HM={exports:{}},YM={exports:{}};const KM=kc,JM=oi,XM=uw,ZM=Lo,QM=Rv,{getJavaScriptURLs:eP,getAttributableURLForTask:tP}=Iv,rP={title:"Minimize third-party usage",failureTitle:"Reduce the impact of third-party code",description:"Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).",columnThirdParty:"Third-Party",displayValue:"Third-party code blocked the main thread for {timeInMs, number, milliseconds} ms"},aP=JM.createMessageInstanceIdFn("lighthouse-core/audits/third-party-summary.js",rP);class ThirdPartySummary$1 extends KM{static get meta(){return{id:"third-party-summary",title:aP(rP.title),
|
1070
|
+
failureTitle:aP(rP.failureTitle),description:aP(rP.description),requiredArtifacts:["traces","devtoolsLogs","URL"]}}static getSummaries(e,t,r){const a=new Map,n=new Map,i={mainThreadTime:0,blockingTime:0,transferSize:0};for(const t of e){const e=a.get(t.url)||{...i};e.transferSize+=t.transferSize,a.set(t.url,e)}const o=eP(e);for(const e of t){const t=tP(e,o),n=a.get(t)||{...i},s=e.selfTime*r;n.mainThreadTime+=s,n.blockingTime+=Math.max(s-50,0),a.set(t,n)}const s=new Map;for(const[e,t]of a.entries()){const r=XM.getEntity(e);if(!r){a.delete(e);continue}const o=n.get(r)||{...i};o.transferSize+=t.transferSize,o.mainThreadTime+=t.mainThreadTime,o.blockingTime+=t.blockingTime,n.set(r,o);const c=s.get(r)||[];c.push(e),s.set(r,c)}return{byURL:a,byEntity:n,urls:s}}static makeSubItems(e,t,r){let a=(t.urls.get(e)||[]).map((e=>({url:e,...t.byURL.get(e)}))).filter((e=>e.transferSize>0)).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize));const n={transferSize:0,blockingTime:0
|
1071
|
+
},i=Math.max(4096,r.transferSize/20),o=Math.min(5,a.length);let s=0;for(;s<o;){const e=a[s];if(0===e.blockingTime&&e.transferSize<i)break;s++,n.transferSize+=e.transferSize,n.blockingTime+=e.blockingTime}if(!n.blockingTime&&!n.transferSize)return[];a=a.slice(0,s);const c={url:aP(JM.UIStrings.otherResourcesLabel),transferSize:r.transferSize-n.transferSize,blockingTime:r.blockingTime-n.blockingTime};return c.transferSize>i&&a.push(c),a}static async audit(e,t){const r=t.settings||{},a=e.traces[KM.DEFAULT_PASS],n=e.devtoolsLogs[KM.DEFAULT_PASS],i=await ZM.request(n,t),o=XM.getEntity(e.URL.finalUrl),s=await QM.request(a,t),c="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,l=ThirdPartySummary$1.getSummaries(i,s,c),u={wastedBytes:0,wastedMs:0},d=Array.from(l.byEntity.entries()).filter((([e])=>!(o&&o.name===e.name))).map((([e,t])=>(u.wastedBytes+=t.transferSize,u.wastedMs+=t.blockingTime,{...t,entity:{type:"link",text:e.name,url:e.homepage||""},subItems:{type:"subitems",
|
1072
|
+
items:ThirdPartySummary$1.makeSubItems(e,l,t)}}))).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize)),m=[{key:"entity",itemType:"link",text:aP(rP.columnThirdParty),subItemsHeading:{key:"url",itemType:"url"}},{key:"transferSize",granularity:1,itemType:"bytes",text:aP(JM.UIStrings.columnTransferSize),subItemsHeading:{key:"transferSize"}},{key:"blockingTime",granularity:1,itemType:"ms",text:aP(JM.UIStrings.columnBlockingTime),subItemsHeading:{key:"blockingTime"}}];return d.length?{score:Number(u.wastedMs<=250),displayValue:aP(rP.displayValue,{timeInMs:u.wastedMs}),details:KM.makeTableDetails(m,d,u)}:{score:1,notApplicable:!0}}}YM.exports=ThirdPartySummary$1,YM.exports.UIStrings=rP;const nP=kc,iP=oi,oP=uw,sP=Lo,cP=HT,lP=Rv,uP=YM.exports,dP={title:"Lazy load third-party resources with facades",failureTitle:"Some third-party resources can be lazy loaded with a facade",
|
1073
|
+
description:"Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required. [Learn more](https://web.dev/third-party-facades/).",displayValue:"{itemCount, plural,\n =1 {# facade alternative available}\n other {# facade alternatives available}\n }",columnProduct:"Product",categoryVideo:"{productName} (Video)",categoryCustomerSuccess:"{productName} (Customer Success)",categoryMarketing:"{productName} (Marketing)",categorySocial:"{productName} (Social)"},mP=iP.createMessageInstanceIdFn("lighthouse-core/audits/third-party-facades.js",dP),pP={video:dP.categoryVideo,"customer-success":dP.categoryCustomerSuccess,marketing:dP.categoryMarketing,social:dP.categorySocial};class ThirdPartyFacades extends nP{static get meta(){return{id:"third-party-facades",title:mP(dP.title),failureTitle:mP(dP.failureTitle),description:mP(dP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL"]}}static condenseItems(e){
|
1074
|
+
e.sort(((e,t)=>t.transferSize-e.transferSize));let t=e.findIndex((e=>e.transferSize<1e3))||1;if((-1===t||t>5)&&(t=5),t>=e.length-1)return;const r=e.splice(t).reduce(((e,t)=>(e.transferSize+=t.transferSize,e.blockingTime+=t.blockingTime,e)));r.transferSize<1e3||(r.url=mP(iP.UIStrings.otherResourcesLabel),e.push(r))}static getProductsWithFacade(e,t){const r=new Map;for(const a of e.keys()){const e=oP.getEntity(a);if(!e||oP.isFirstParty(a,t))continue;const n=oP.getProduct(a);n&&n.facades&&n.facades.length&&(r.has(n.name)||r.set(n.name,{product:n,entity:e}))}return Array.from(r.values())}static async audit(e,t){const r=t.settings,a=e.traces[nP.DEFAULT_PASS],n=e.devtoolsLogs[nP.DEFAULT_PASS],i=await sP.request(n,t),o=await cP.request({devtoolsLog:n,URL:e.URL},t),s=oP.getEntity(o.url),c=await lP.request(a,t),l="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,u=uP.getSummaries(i,c,l),d=ThirdPartyFacades.getProductsWithFacade(u.byURL,s),m=[]
|
1075
|
+
;for(const{product:e,entity:t}of d){const r=pP[e.categories[0]];let a;a=r?mP(r,{productName:e.name}):e.name;const n=u.urls.get(t),i=u.byEntity.get(t);if(!n||!i)continue;const o=Array.from(n).map((e=>({url:e,...u.byURL.get(e)})));this.condenseItems(o),m.push({product:a,transferSize:i.transferSize,blockingTime:i.blockingTime,subItems:{type:"subitems",items:o}})}if(!m.length)return{score:1,notApplicable:!0};const p=[{key:"product",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:mP(dP.columnProduct)},{key:"transferSize",itemType:"bytes",subItemsHeading:{key:"transferSize"},granularity:1,text:mP(iP.UIStrings.columnTransferSize)},{key:"blockingTime",itemType:"ms",subItemsHeading:{key:"blockingTime"},granularity:1,text:mP(iP.UIStrings.columnBlockingTime)}];return{score:0,displayValue:mP(dP.displayValue,{itemCount:m.length}),details:nP.makeTableDetails(p,m)}}}HM.exports=ThirdPartyFacades,HM.exports.UIStrings=dP;var hP={exports:{}};const gP=kc,fP=CD,yP=HT,vP=Tu,bP=oi,wP={
|
1076
|
+
title:"Timing budget",description:"Set a timing budget to help you keep an eye on the performance of your site. Performant sites load fast and respond to user input events quickly. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",columnTimingMetric:"Metric",columnMeasurement:"Measurement"},SP=bP.createMessageInstanceIdFn("lighthouse-core/audits/timing-budget.js",wP);hP.exports=class TimingBudget extends gP{static get meta(){return{id:"timing-budget",title:SP(wP.title),description:SP(wP.description),scoreDisplayMode:gP.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL","GatherContext"]}}static getRowLabel(e){const t={"first-contentful-paint":bP.UIStrings.firstContentfulPaintMetric,interactive:bP.UIStrings.interactiveMetric,"first-meaningful-paint":bP.UIStrings.firstMeaningfulPaintMetric,"max-potential-fid":bP.UIStrings.maxPotentialFIDMetric,"total-blocking-time":bP.UIStrings.totalBlockingTimeMetric,
|
1077
|
+
"speed-index":bP.UIStrings.speedIndexMetric,"largest-contentful-paint":bP.UIStrings.largestContentfulPaintMetric,"cumulative-layout-shift":bP.UIStrings.cumulativeLayoutShiftMetric};return SP(t[e])}static getMeasurement(e,t){return{"first-contentful-paint":t.firstContentfulPaint,interactive:t.interactive,"first-meaningful-paint":t.firstMeaningfulPaint,"max-potential-fid":t.maxPotentialFID,"total-blocking-time":t.totalBlockingTime,"speed-index":t.speedIndex,"largest-contentful-paint":t.largestContentfulPaint,"cumulative-layout-shift":t.cumulativeLayoutShift}[e]}static tableItems(e,t){let r=[];if(!e.timings)return r;r=e.timings.map((e=>{const r=e.metric,a=this.getRowLabel(r),n=this.getMeasurement(r,t);return{metric:r,label:a,measurement:n,overBudget:n&&n>e.budget?n-e.budget:void 0}})).sort(((e,t)=>(t.overBudget||0)-(e.overBudget||0)));const a=r.find((e=>"cumulative-layout-shift"===e.metric));return a&&("number"==typeof a.measurement&&(a.measurement={type:"numeric",
|
1078
|
+
value:Number(a.measurement),granularity:.01}),"number"==typeof a.overBudget&&(a.overBudget={type:"numeric",value:Number(a.overBudget),granularity:.01})),r}static async audit(e,t){const r=e.GatherContext,a=e.devtoolsLogs[gP.DEFAULT_PASS],n=e.traces[gP.DEFAULT_PASS],i=await yP.request({URL:e.URL,devtoolsLog:a},t),o={trace:n,devtoolsLog:a,gatherContext:r,settings:t.settings},s=(await fP.request(o,t)).metrics,c=vP.getMatchingBudget(t.settings.budgets,i.url);if(!c)return{score:0,notApplicable:!0};const l=[{key:"label",itemType:"text",text:SP(wP.columnTimingMetric)},{key:"measurement",itemType:"ms",text:SP(wP.columnMeasurement)},{key:"overBudget",itemType:"ms",text:SP(bP.UIStrings.columnOverBudget)}];return{details:gP.makeTableDetails(l,this.tableItems(c,s)),score:1}}},hP.exports.UIStrings=wP;var TP={exports:{}};const EP=kc,xP=oi,_P=ji,AP={title:"Image elements have explicit `width` and `height`",failureTitle:"Image elements do not have explicit `width` and `height`",
|
1079
|
+
description:"Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn more](https://web.dev/optimize-cls/#images-without-dimensions)"},RP=xP.createMessageInstanceIdFn("lighthouse-core/audits/unsized-images.js",AP);class UnsizedImages extends EP{static get meta(){return{id:"unsized-images",title:RP(AP.title),failureTitle:RP(AP.failureTitle),description:RP(AP.description),requiredArtifacts:["ImageElements"]}}static doesHtmlAttrProvideExplicitSize(e){if(!e)return!1;if(e.startsWith("+"))return!1;return parseInt(e,10)>=0}static isCssPropExplicitlySet(e){return!!e&&!["auto","initial","unset","inherit"].includes(e)}static isSizedImage(e){if(void 0===e.cssEffectiveRules)return!0
|
1080
|
+
;const t=e.attributeWidth,r=e.attributeHeight,a=e.cssEffectiveRules.width,n=e.cssEffectiveRules.height,i=e.cssEffectiveRules.aspectRatio,o=UnsizedImages.doesHtmlAttrProvideExplicitSize(t),s=UnsizedImages.isCssPropExplicitlySet(a),c=UnsizedImages.doesHtmlAttrProvideExplicitSize(r),l=UnsizedImages.isCssPropExplicitlySet(n),u=UnsizedImages.isCssPropExplicitlySet(i),d=o||s,m=c||l;return d&&m||d&&u||m&&u}static isNonNetworkSvg(e){const t="image/svg+xml"===_P.guessMimeType(e.src),r=e.src.slice(0,e.src.indexOf(":")),a=_P.isNonNetworkProtocol(r);return t&&a}static async audit(e){const t=e.ImageElements.filter((e=>!e.isCss&&!e.isInShadowDOM)),r=[];for(const e of t){if("fixed"===e.computedStyles.position||"absolute"===e.computedStyles.position)continue;if(UnsizedImages.isNonNetworkSvg(e))continue;if(UnsizedImages.isSizedImage(e))continue;const t=e.node.boundingRect;0===t.width&&0===t.height||r.push({url:_P.elideDataURI(e.src),node:EP.makeNodeItem(e.node)})}const a=[{key:"node",itemType:"node",
|
1081
|
+
text:""},{key:"url",itemType:"url",text:RP(xP.UIStrings.columnURL)}];return{score:r.length>0?0:1,notApplicable:0===t.length,details:EP.makeTableDetails(a,r)}}}TP.exports=UnsizedImages,TP.exports.UIStrings=AP;var kP={exports:{}};const DP=Ao,CP=Yp;var IP=DP(class UserTimings$1{static async compute_(e,t){const r=await CP.request(e,t),a=[],n={};return r.processEvents.filter((e=>!!e.cat.includes("blink.user_timing")&&("requestStart"!==e.name&&"navigationStart"!==e.name&&"paintNonDefaultBackgroundColor"!==e.name&&void 0===e.args.frame))).forEach((e=>{"R"===e.ph||"I"===e.ph.toUpperCase()?a.push({name:e.name,isMark:!0,args:e.args,startTime:e.ts}):"b"===e.ph.toLowerCase()?n[e.name]=e.ts:"e"===e.ph.toLowerCase()&&a.push({name:e.name,isMark:!1,args:e.args,startTime:n[e.name],endTime:e.ts,duration:e.ts-n[e.name]})})),a.forEach((e=>{e.startTime=(e.startTime-r.timeOriginEvt.ts)/1e3,e.isMark||(e.endTime=(e.endTime-r.timeOriginEvt.ts)/1e3,e.duration=e.duration/1e3)})),a}},null)
|
1082
|
+
;const NP=kc,LP=oi,MP=IP,PP={title:"User Timing marks and measures",description:"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more](https://web.dev/user-timings/).",displayValue:"{itemCount, plural,\n =1 {1 user timing}\n other {# user timings}\n }",columnType:"Type"},OP=LP.createMessageInstanceIdFn("lighthouse-core/audits/user-timings.js",PP);class UserTimings extends NP{static get meta(){return{id:"user-timings",title:OP(PP.title),description:OP(PP.description),scoreDisplayMode:NP.SCORING_MODES.INFORMATIVE,requiredArtifacts:["traces"]}}static get excludedPrefixes(){return["goog_"]}static excludeEvent(e){return UserTimings.excludedPrefixes.every((t=>!e.name.startsWith(t)))}static audit(e,t){const r=e.traces[NP.DEFAULT_PASS];return MP.request(r,t).then((e=>{const t=e.filter(UserTimings.excludeEvent),r=t.map((e=>({name:e.name,startTime:e.startTime,duration:e.isMark?void 0:e.duration,
|
1083
|
+
timingType:e.isMark?"Mark":"Measure"}))).sort(((e,t)=>e.timingType===t.timingType?e.startTime-t.startTime:"Measure"===e.timingType?-1:1)),a=[{key:"name",itemType:"text",text:OP(LP.UIStrings.columnName)},{key:"timingType",itemType:"text",text:OP(PP.columnType)},{key:"startTime",itemType:"ms",granularity:.01,text:OP(LP.UIStrings.columnStartTime)},{key:"duration",itemType:"ms",granularity:.01,text:OP(LP.UIStrings.columnDuration)}],n=NP.makeTableDetails(a,r);let i;return t.length&&(i=OP(PP.displayValue,{itemCount:t.length})),{score:Number(0===t.length),notApplicable:0===t.length,displayValue:i,details:n}}))}}kP.exports=UserTimings,kP.exports.UIStrings=PP;var FP={exports:{}};const UP=kc,jP=Ib,BP=ji,$P=oi,qP=Lo,zP=HT,VP=Dl,WP=Yp,GP=Xp,HP=eb,YP=vk,KP={title:"Preconnect to required origins",description:"Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect/).",
|
1084
|
+
unusedWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Only use `preconnect` for important origins that the page will certainly request.',crossoriginWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.',tooManyPreconnectLinksWarning:"More than 2 `<link rel=preconnect>` connections were found. These should be used sparingly and only to the most important origins."},JP=$P.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preconnect.js",KP);class UsesRelPreconnectAudit extends UP{static get meta(){return{id:"uses-rel-preconnect",title:JP(KP.title),description:JP(KP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL","LinkElements"],scoreDisplayMode:UP.SCORING_MODES.NUMERIC}}static hasValidTiming(e){return!!e.timing&&e.timing.connectEnd>0&&e.timing.connectStart>0}
|
1085
|
+
static hasAlreadyConnectedToOrigin(e){return!!e.timing&&e.timing.dnsEnd-e.timing.dnsStart==0&&e.timing.connectEnd-e.timing.connectStart==0}static socketStartTimeIsBelowThreshold(e,t){return Math.max(0,e.startTime-t.endTime)<15}static async audit(e,t){const r=e.traces[UsesRelPreconnectAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS],n=t.settings;let i=0;const o=[],s=await WP.request(r,t),[c,l,u,d,m]=await Promise.all([qP.request(a,t),zP.request({devtoolsLog:a,URL:e.URL},t),VP.request({devtoolsLog:a,settings:n},t),GP.request(s,t),HP.request({trace:r,devtoolsLog:a},t)]),{rtt:p,additionalRttByOrigin:h}=u.getOptions(),f=await YP.getPessimisticGraph(m,d),y=new Set;f.traverse((e=>{"network"===e.type&&y.add(e.record.url)}));const v=new Map;c.forEach((e=>{
|
1086
|
+
if(!UsesRelPreconnectAudit.hasValidTiming(e)||e.initiator.url===l.url||!e.parsedURL||!e.parsedURL.securityOrigin||l.parsedURL.securityOrigin===e.parsedURL.securityOrigin||!y.has(e.url)||UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(e)||!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(e,l))return;const t=e.parsedURL.securityOrigin,r=v.get(t)||[];r.push(e),v.set(t,r)}));const b=e.LinkElements.filter((e=>"preconnect"===e.rel)),w=new Set(b.map((e=>BP.getOrigin(e.href||""))));let S=[];v.forEach((e=>{const t=e.reduce(((e,t)=>t.startTime<e.startTime?t:e));if(!t.timing)return;const r=t.parsedURL.securityOrigin,a=h.get(r)||0;let n=p+a;"https"===t.parsedURL.scheme&&(n*=2);const s=1e3*t.startTime-1e3*l.endTime+t.timing.dnsStart,c=Math.min(n,s);c<50||(w.has(r)?o.push(JP(KP.crossoriginWarning,{securityOrigin:r})):(i=Math.max(c,i),S.push({url:r,wastedMs:c})))})),S=S.sort(((e,t)=>t.wastedMs-e.wastedMs))
|
1087
|
+
;for(const e of w)e&&(c.some((t=>e===t.parsedURL.securityOrigin))||o.push(JP(KP.unusedWarning,{securityOrigin:e})));if(b.length>=2)return{score:1,warnings:b.length>=3?[...o,JP(KP.tooManyPreconnectLinksWarning)]:o};const T=[{key:"url",valueType:"url",label:JP($P.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:JP($P.UIStrings.columnWastedMs)}],E=UP.makeOpportunityDetails(T,S,i);return{score:jP.scoreForWastedMs(i),numericValue:i,numericUnit:"millisecond",displayValue:i?JP($P.UIStrings.displayValueMsSavings,{wastedMs:i}):"",warnings:o,details:E}}}FP.exports=UsesRelPreconnectAudit,FP.exports.UIStrings=KP;var XP={exports:{}};const ZP=ji,QP=Ki,eO=kc,tO=Ib,rO=ZT,aO=oi,nO=HT,iO=eb,oO=Dl,sO={title:"Preload key requests",description:"Consider using `<link rel=preload>` to prioritize fetching resources that are currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload/).",
|
1088
|
+
crossoriginWarning:'A preload `<link>` was found for "{preloadURL}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.'},cO=aO.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preload.js",sO);class UsesRelPreloadAudit extends eO{static get meta(){return{id:"uses-rel-preload",title:cO(sO.title),description:cO(sO.description),supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL"],scoreDisplayMode:eO.SCORING_MODES.NUMERIC}}static getURLsToPreload(e,t){const r=new Set;return t.traverse(((t,a)=>{if("network"!==t.type)return;const n=a.slice(1).filter((e=>"network"===e.type));UsesRelPreloadAudit.shouldPreloadRequest(t.record,e,n)&&r.add(t.record.url)})),r}static getURLsFailedToPreload(e){const t=[];e.traverse((e=>"network"===e.type&&t.push(e.record)));const r=t.filter((e=>e.isLinkPreload)),a=new Map;for(const e of r){const t=a.get(e.frameId)||new Set;t.add(e.url),a.set(e.frameId,t)}const n=t.filter((e=>{
|
1089
|
+
const t=a.get(e.frameId);if(!t)return!1;if(!t.has(e.url))return!1;return!(e.fromDiskCache||e.fromMemoryCache||e.fromPrefetchCache)&&!e.isLinkPreload}));return new Set(n.map((e=>e.url)))}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!!rO.isCritical(e,t)&&(!QP.isNonNetworkRequest(e)&&(r.length===a+2&&(e.frameId===t.frameId&&ZP.rootDomainsMatch(e.url,t.url)))))}static computeWasteWithGraph(e,t,r){if(!e.size)return{wastedMs:0,results:[]};const a=r.simulate(t,{flexibleOrdering:!0}),n=t.cloneWithRelationships(),i=[];let o=null;if(n.traverse((t=>{"network"===t.type&&(t.isMainDocument()?o=t:t.record&&e.has(t.record.url)&&i.push(t))})),!o)throw new Error("Could not find main document node");for(const e of i)e.removeAllDependencies(),e.addDependency(o);const s=r.simulate(n,{flexibleOrdering:!0}),c=Array.from(a.nodeTimings.keys()).reduce(((e,t)=>e.set(t.record,t)),new Map),l=[];for(const e of i){
|
1090
|
+
const t=c.get(e.record),r=s.nodeTimings.get(e),n=a.nodeTimings.get(t);if(!n||!r)throw new Error("Missing preload node");const i=Math.round(n.endTime-r.endTime);i<100||l.push({url:e.record.url,wastedMs:i})}return l.length?{wastedMs:Math.max(...l.map((e=>e.wastedMs))),results:l}:{wastedMs:0,results:l}}static async audit_(e,t){const r=e.traces[UsesRelPreloadAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS],n=e.URL,i={devtoolsLog:a,settings:t.settings},[o,s,c]=await Promise.all([nO.request({devtoolsLog:a,URL:n},t),iO.request({trace:r,devtoolsLog:a},t),oO.request(i,t)]),l=UsesRelPreloadAudit.getURLsToPreload(o,s),{results:u,wastedMs:d}=UsesRelPreloadAudit.computeWasteWithGraph(l,s,c);let m;u.sort(((e,t)=>t.wastedMs-e.wastedMs));const p=UsesRelPreloadAudit.getURLsFailedToPreload(s);p.size&&(m=Array.from(p).map((e=>cO(sO.crossoriginWarning,{preloadURL:e}))));const h=[{key:"url",valueType:"url",label:cO(aO.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",
|
1091
|
+
label:cO(aO.UIStrings.columnWastedMs)}],f=eO.makeOpportunityDetails(h,u,d);return{score:tO.scoreForWastedMs(d),numericValue:d,numericUnit:"millisecond",displayValue:d?cO(aO.UIStrings.displayValueMsSavings,{wastedMs:d}):"",details:f,warnings:m}}static async audit(){return{score:1,notApplicable:!0,details:eO.makeOpportunityDetails([],[],0)}}}XP.exports=UsesRelPreloadAudit,XP.exports.UIStrings=sO;var lO={exports:{}};
|
1092
1092
|
/**
|
1093
1093
|
* @license Copyright 2020 Google Inc. All Rights Reserved.
|
1094
1094
|
* 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
|
1095
1095
|
* 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.
|
1096
|
-
*/const
|
1097
|
-
description:pO
|
1098
|
-
key:"sourceMapUrl",itemType:"url",text:pO
|
1099
|
-
;
|
1100
|
-
displayValue:"{timeInMs, number, milliseconds} ms spent on event '{interactionType}'",eventTarget:"Event target"},
|
1101
|
-
static getPhaseTimes(e){const t=e.args.data,r=e.ts,a=r-1e3*t.timeStamp,n=a+1e3*t.processingStart,i=a+1e3*t.processingEnd;return{inputDelay:{startTs:r,endTs:n},processingDelay:{startTs:n,endTs:i},presentationDelay:{startTs:i,endTs:r+1e3*t.duration}}}static getThreadBreakdownTable(e,t,r,a){const n=
|
1102
|
-
key:"phase",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:"Phase"},{key:"total",itemType:"ms",subItemsHeading:{key:"total",granularity:1,itemType:"ms"},granularity:1,text:"Total time"},{key:null,itemType:"ms",subItemsHeading:{key:"scripting",granularity:1,itemType:"ms"},text:"Script evaluation"},{key:null,itemType:"ms",subItemsHeading:{key:"layout",granularity:1,itemType:"ms"},text:
|
1103
|
-
trace:a,settings:r},i=await
|
1096
|
+
*/const uO=uw,dO=kc,mO=oi,pO={title:"Page has valid source maps",failureTitle:"Missing source maps for large first-party JavaScript",description:"Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps).",columnMapURL:"Map URL",missingSourceMapErrorMessage:"Large JavaScript file is missing a source map",missingSourceMapItemsWarningMesssage:"{missingItems, plural,\n =1 {Warning: missing 1 item in `.sourcesContent`}\n other {Warning: missing # items in `.sourcesContent`}\n }"},hO=mO.createMessageInstanceIdFn("lighthouse-core/audits/valid-source-maps.js",pO);lO.exports=class ValidSourceMaps extends dO{static get meta(){return{id:"valid-source-maps",title:hO(pO.title),failureTitle:hO(pO.failureTitle),
|
1097
|
+
description:hO(pO.description),requiredArtifacts:["ScriptElements","SourceMaps","URL"]}}static isLargeFirstPartyJS(e,t){if(null===e.content)return!1;const r=e.content.length>=512e3,a=!!e.src&&uO.isFirstParty(e.src,uO.getEntity(t));return r&&a}static async audit(e){const{SourceMaps:t}=e,r=new Set;let a=!1;const n=[];for(const i of e.ScriptElements){if(!i.src)continue;const o=t.find((e=>e.scriptUrl===i.src)),s=[];if(!this.isLargeFirstPartyJS(i,e.URL.finalUrl)||o&&o.map||(a=!0,r.add(i.src),s.push({error:hO(pO.missingSourceMapErrorMessage)})),o&&!o.map&&s.push({error:o.errorMessage}),o?.map){const e=o.map.sourcesContent||[];let t=0;for(let r=0;r<o.map.sources.length;r++)(e.length<r||!e[r])&&(t+=1);t>0&&s.push({error:hO(pO.missingSourceMapItemsWarningMesssage,{missingItems:t})})}(o||s.length)&&n.push({scriptUrl:i.src,sourceMapUrl:o?.sourceMapUrl,subItems:{type:"subitems",items:s}})}const i=[{key:"scriptUrl",itemType:"url",subItemsHeading:{key:"error"},text:hO(mO.UIStrings.columnURL)},{
|
1098
|
+
key:"sourceMapUrl",itemType:"url",text:hO(pO.columnMapURL)}];return n.sort(((e,t)=>{const a=r.has(e.scriptUrl),n=r.has(t.scriptUrl);return a&&!n?-1:!a&&n?1:e.subItems.items.length&&!t.subItems.items.length?-1:!e.subItems.items.length&&t.subItems.items.length?1:t.scriptUrl.localeCompare(e.scriptUrl)})),{score:a?0:1,details:dO.makeTableDetails(i,n)}}},lO.exports.UIStrings=pO;var gO={exports:{}};const fO=kc,yO=KN,vO={title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',failureTitle:'Does not have a `<meta name="viewport">` tag with `width` or `initial-scale`',description:'A `<meta name="viewport">` not only optimizes your app for mobile screen sizes, but also prevents [a 300 millisecond delay to user input](https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away). [Learn more](https://web.dev/viewport/).',explanationNoTag:'No `<meta name="viewport">` tag found'},bO=oi.createMessageInstanceIdFn("lighthouse-core/audits/viewport.js",vO)
|
1099
|
+
;gO.exports=class Viewport extends fO{static get meta(){return{id:"viewport",title:bO(vO.title),failureTitle:bO(vO.failureTitle),description:bO(vO.description),requiredArtifacts:["MetaElements"]}}static async audit(e,t){const r=await yO.request(e.MetaElements,t);return r.hasViewportTag?{score:Number(r.isMobileOptimized),warnings:r.parserWarnings}:{score:0,explanation:bO(vO.explanationNoTag)}}},gO.exports.UIStrings=vO;var wO={exports:{}};const SO=kc,TO=ah,EO=Yp,xO=oi,_O=Lo,AO=Ev,{taskGroups:RO}=wv,kO=ao,{getExecutionTimingsByURL:DO}=Iv,CO=$D.exports.defaultOptions,IO=vi.exports,NO={title:"Minimizes work during key interaction",failureTitle:"Minimize work during key interaction",description:"This is the thread-blocking work occurring during the Interaction to Next Paint measurement. [Learn more](https://web.dev/inp/).",inputDelay:"Input delay",processingDelay:"Processing delay",presentationDelay:"Presentation delay",
|
1100
|
+
displayValue:"{timeInMs, number, milliseconds} ms spent on event '{interactionType}'",eventTarget:"Event target"},LO=xO.createMessageInstanceIdFn("lighthouse-core/audits/work-during-interaction.js",NO);class WorkDuringInteraction extends SO{static get meta(){return{id:"work-during-interaction",title:LO(NO.title),failureTitle:LO(NO.failureTitle),description:LO(NO.description),scoreDisplayMode:SO.SCORING_MODES.NUMERIC,supportedModes:["timespan"],requiredArtifacts:["traces","devtoolsLogs","TraceElements"]}}static recursivelyClipTasks(e,t,r,a){const n=e.event.ts,i=e.endEvent?.ts??e.event.ts+Number(e.event.dur||0);e.startTime=Math.max(r,Math.min(a,n))/1e3,e.endTime=Math.max(r,Math.min(a,i))/1e3,e.duration=e.endTime-e.startTime;const o=e.children.map((t=>WorkDuringInteraction.recursivelyClipTasks(t,e,r,a))).reduce(((e,t)=>e+t),0);return e.selfTime=e.duration-o,e.duration}static clipTasksByTs(e,t,r){for(const a of e)a.parent||WorkDuringInteraction.recursivelyClipTasks(a,void 0,t,r)}
|
1101
|
+
static getPhaseTimes(e){const t=e.args.data,r=e.ts,a=r-1e3*t.timeStamp,n=a+1e3*t.processingStart,i=a+1e3*t.processingEnd;return{inputDelay:{startTs:r,endTs:n},processingDelay:{startTs:n,endTs:i},presentationDelay:{startTs:i,endTs:r+1e3*t.duration}}}static getThreadBreakdownTable(e,t,r,a){const n=kO.filteredTraceSort(t.traceEvents,(t=>t.pid===e.pid&&t.tid===e.tid)),i=n.reduce(((e,t)=>Math.max(t.ts+(t.dur||0),e)),0),{frames:o}=r,s=AO.getMainThreadTasks(n,o,i),c=WorkDuringInteraction.getPhaseTimes(e),l=[];for(const[e,t]of Object.entries(c)){WorkDuringInteraction.clipTasksByTs(s,t.startTs,t.endTs);const r=DO(s,a),n=[];for(const[e,t]of r){const r=Object.values(t).reduce(((e,t)=>e+t)),a=t[RO.scriptEvaluation.id]||0,i=t[RO.styleLayout.id]||0,o=t[RO.paintCompositeRender.id]||0;n.push({url:e,total:r,scripting:a,layout:i,render:o})}const i=n.filter((e=>e.total>1)).sort(((e,t)=>t.total-e.total));l.push({phase:LO(NO[e]),total:(t.endTs-t.startTs)/1e3,subItems:{type:"subitems",items:i}})}const u=[{
|
1102
|
+
key:"phase",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:"Phase"},{key:"total",itemType:"ms",subItemsHeading:{key:"total",granularity:1,itemType:"ms"},granularity:1,text:"Total time"},{key:null,itemType:"ms",subItemsHeading:{key:"scripting",granularity:1,itemType:"ms"},text:"Script evaluation"},{key:null,itemType:"ms",subItemsHeading:{key:"layout",granularity:1,itemType:"ms"},text:RO.styleLayout.label},{key:null,itemType:"ms",subItemsHeading:{key:"render",granularity:1,itemType:"ms"},text:RO.paintCompositeRender.label}];return{table:SO.makeTableDetails(u,l),phases:c}}static getTraceElementTable(e){const t=e.find((e=>"responsiveness"===e.traceEventType));if(!t)return;const r=[{key:"node",itemType:"node",text:LO(NO.eventTarget)}],a=[{node:SO.makeNodeItem(t.node)}];return SO.makeTableDetails(r,a)}static async audit(e,t){const{settings:r}=t;if("simulate"===r.throttlingMethod)return{score:null,notApplicable:!0};const a=e.traces[WorkDuringInteraction.DEFAULT_PASS],n={
|
1103
|
+
trace:a,settings:r},i=await TO.request(n,t);if(null===i)return{score:null,notApplicable:!0};if("FallbackTiming"===i.name)throw new IO(IO.errors.UNSUPPORTED_OLD_CHROME,{featureName:"detailed EventTiming trace events"});const o=[],s=WorkDuringInteraction.getTraceElementTable(e.TraceElements);s&&o.push(s);const c=e.devtoolsLogs[WorkDuringInteraction.DEFAULT_PASS],l=await _O.request(c,t),u=await EO.request(a,t),{table:d,phases:m}=WorkDuringInteraction.getThreadBreakdownTable(i,a,u,l);o.push(d);const p=i.args.data.type;o.push({type:"debugdata",interactionType:p,phases:m});const h=i.args.data.duration,f=LO(NO.displayValue,{timeInMs:h,interactionType:p});return{score:h<CO.p10?1:0,displayValue:f,details:{type:"list",items:o}}}}wO.exports=WorkDuringInteraction,wO.exports.UIStrings=NO;var MO={exports:{}},PO={exports:{}};const OO={GROUPS__METRICS:"Metrics",GROUPS__ADS_PERFORMANCE:"Ad Speed",GROUPS__ADS_BEST_PRACTICES:"Tag Best Practices",NOT_APPLICABLE__DEFAULT:"Audit not applicable",
|
1104
1104
|
NOT_APPLICABLE__INVALID_TIMING:"Invalid timing task data",NOT_APPLICABLE__NO_AD_RELATED_REQ:"No ad-related requests",NOT_APPLICABLE__NO_AD_RENDERED:"No ads rendered",NOT_APPLICABLE__NO_ADS_VIEWPORT:"No ads in viewport",NOT_APPLICABLE__NO_ADS:"No ads requested",NOT_APPLICABLE__NO_BIDS:"No bids detected",NOT_APPLICABLE__NO_EVENT_MATCHING_REQ:"No event matches network records",NOT_APPLICABLE__NO_GPT:"GPT not requested",NOT_APPLICABLE__NO_RECORDS:"No successful network records",NOT_APPLICABLE__NO_VISIBLE_SLOTS:"No visible slots",NOT_APPLICABLE__NO_TAG:"No tag requested",NOT_APPLICABLE__NO_TAGS:"No tags requested",NOT_APPLICABLE__NO_TASKS:"No tasks to compare",NOT_APPLICABLE__NO_VALID_AD_WIDTHS:"No requested ads contain ads of valid width",NOT_APPLICABLE__NO_LAYOUT_SHIFTS:"No layout shift events found",ERRORS__AREA_LARGER_THAN_VIEWPORT:"Calculated ad area is larger than viewport",ERRORS__VIEWPORT_AREA_ZERO:"Viewport area is zero",
|
1105
|
-
WARNINGS__NO_ADS:"No ads were requested when fetching this page.",WARNINGS__NO_AD_RENDERED:"No ads were rendered when rendering this page.",WARNINGS__NO_TAG:"The GPT tag was not requested."},
|
1106
|
-
NoRecords:notApplicableObj(
|
1105
|
+
WARNINGS__NO_ADS:"No ads were requested when fetching this page.",WARNINGS__NO_AD_RENDERED:"No ads were rendered when rendering this page.",WARNINGS__NO_TAG:"The GPT tag was not requested."},FO=oi.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js",OO),notApplicableObj=e=>({notApplicable:!0,score:1,displayValue:FO(e)}),UO={Default:notApplicableObj(OO.NOT_APPLICABLE__DEFAULT),InvalidTiming:notApplicableObj(OO.NOT_APPLICABLE__INVALID_TIMING),NoAdRelatedReq:notApplicableObj(OO.NOT_APPLICABLE__NO_AD_RELATED_REQ),NoAdRendered:notApplicableObj(OO.NOT_APPLICABLE__NO_AD_RENDERED),NoAdsViewport:notApplicableObj(OO.NOT_APPLICABLE__NO_ADS_VIEWPORT),NoAds:notApplicableObj(OO.NOT_APPLICABLE__NO_ADS),NoBids:notApplicableObj(OO.NOT_APPLICABLE__NO_BIDS),NoEventMatchingReq:notApplicableObj(OO.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),NoGpt:notApplicableObj(OO.NOT_APPLICABLE__NO_GPT),NoLayoutShifts:notApplicableObj(OO.NOT_APPLICABLE__NO_LAYOUT_SHIFTS),
|
1106
|
+
NoRecords:notApplicableObj(OO.NOT_APPLICABLE__NO_RECORDS),NoVisibleSlots:notApplicableObj(OO.NOT_APPLICABLE__NO_VISIBLE_SLOTS),NoTag:notApplicableObj(OO.NOT_APPLICABLE__NO_TAG),NoTags:notApplicableObj(OO.NOT_APPLICABLE__NO_TAGS),NoTasks:notApplicableObj(OO.NOT_APPLICABLE__NO_TASKS),NoValidAdWidths:notApplicableObj(OO.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)},jO={NoAds:FO(OO.WARNINGS__NO_ADS),NoAdRendered:FO(OO.WARNINGS__NO_AD_RENDERED),NoTag:FO(OO.WARNINGS__NO_TAG)},BO={ViewportAreaZero:FO(OO.ERRORS__VIEWPORT_AREA_ZERO)},$O={Metrics:FO(OO.GROUPS__METRICS),AdsPerformance:FO(OO.GROUPS__ADS_PERFORMANCE),AdsBestPractices:FO(OO.GROUPS__ADS_BEST_PRACTICES)};PO.exports={auditNotApplicable:UO,runWarning:jO,auditError:BO,group:$O},PO.exports.UIStrings=OO,function(e){const t=oi,{group:r}=PO.exports,a="lighthouse-plugin-publisher-ads",n={
|
1107
1107
|
categoryDescription:"A Lighthouse plugin to improve ad speed and overall quality that is targeted at sites using GPT or AdSense tag. [Learn more](https://developers.google.com/publisher-ads-audits/reference)"},i=t.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/plugin.js",n);e.exports={audits:[{path:`${a}/audits/ad-blocking-tasks`},{path:`${a}/audits/ad-render-blocking-resources`},{path:`${a}/audits/ad-request-critical-path`},{path:`${a}/audits/bid-request-from-page-start`},{path:`${a}/audits/ad-request-from-page-start`},{path:`${a}/audits/ad-top-of-viewport`},{path:`${a}/audits/ads-in-viewport`},{path:`${a}/audits/async-ad-tags`},{path:`${a}/audits/blocking-load-events`},{path:`${a}/audits/bottleneck-requests`},{path:`${a}/audits/duplicate-tags`},{path:`${a}/audits/first-ad-render`},{path:`${a}/audits/full-width-slots`},{path:`${a}/audits/gpt-bids-parallel`},{path:`${a}/audits/loads-gpt-from-official-source`},{path:`${a}/audits/loads-ad-tag-over-https`},{
|
1108
1108
|
path:`${a}/audits/script-injected-tags`},{path:`${a}/audits/serial-header-bidding`},{path:`${a}/audits/tag-load-time`},{path:`${a}/audits/viewport-ad-density`},{path:`${a}/audits/cumulative-ad-shift`},{path:`${a}/audits/deprecated-api-usage`},{path:`${a}/audits/gpt-errors-overall`},{path:`${a}/audits/total-ad-blocking-time`}],groups:{metrics:{title:r.Metrics},"ads-performance":{title:r.AdsPerformance},"ads-best-practices":{title:r.AdsBestPractices}},category:{title:"Publisher Ads",description:i(n.categoryDescription),auditRefs:[{id:"tag-load-time",weight:5,group:"metrics"},{id:"bid-request-from-page-start",weight:5,group:"metrics"},{id:"ad-request-from-page-start",weight:25,group:"metrics"},{id:"first-ad-render",weight:10,group:"metrics"},{id:"cumulative-ad-shift",weight:5,group:"metrics"},{id:"total-ad-blocking-time",weight:2,group:"metrics"},{id:"gpt-bids-parallel",weight:1,group:"ads-performance"},{id:"serial-header-bidding",weight:1,group:"ads-performance"},{
|
1109
1109
|
id:"bottleneck-requests",weight:1,group:"ads-performance"},{id:"script-injected-tags",weight:1,group:"ads-performance"},{id:"blocking-load-events",weight:1,group:"ads-performance"},{id:"ad-render-blocking-resources",weight:1,group:"ads-performance"},{id:"ad-blocking-tasks",weight:1,group:"ads-performance"},{id:"ad-request-critical-path",weight:0,group:"ads-performance"},{id:"ads-in-viewport",weight:4,group:"ads-best-practices"},{id:"async-ad-tags",weight:2,group:"ads-best-practices"},{id:"loads-ad-tag-over-https",weight:1,group:"ads-best-practices"},{id:"loads-gpt-from-official-source",weight:4,group:"ads-best-practices"},{id:"viewport-ad-density",weight:2,group:"ads-best-practices"},{id:"ad-top-of-viewport",weight:2,group:"ads-best-practices"},{id:"duplicate-tags",weight:1,group:"ads-best-practices"},{id:"deprecated-gpt-api-usage",weight:0,group:"ads-best-practices"},{id:"gpt-errors-overall",weight:0,group:"ads-best-practices"}]}},Object.defineProperty(e.exports,"UIStrings",{
|
1110
|
-
enumerable:!1,get:()=>n})}(
|
1110
|
+
enumerable:!1,get:()=>n})}(MO);var qO={exports:{}},zO=[{label:"Prebid JS",patterns:["^https?://([^.]*.)?prebid[.]org/.*","^https?://acdn[.]adnxs[.]com/prebid/.*"]},{label:"33Across",patterns:["^https?://ssc[.]33across.com/api/.*"]},{label:"AppNexus",patterns:["^https?://ib[.]adnxs[.]com/.*"]},{label:"Amazon Ads",patterns:["^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*"]},{label:"AdTechus (AOL)",patterns:["^https?://([^.]*.)?adserver[.]adtechus[.]com/.*"]},{label:"Aardvark",patterns:["^https?://thor[.]rtk[.]io/.*"]},{label:"AdBlade",patterns:["^https?://rtb[.]adblade[.]com/prebidjs/bid.*"]},{label:"AdBund",patterns:["^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*","^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*"]},{label:"AdButler",patterns:["^https?://servedbyadbutler[.]com/adserve.*"]},{label:"Adequant",patterns:["^https?://rex[.]adequant[.]com/rex/c2s_prebid.*"]},{label:"AdForm",patterns:["^https?://adx[.]adform[.]net/adx.*"]},{label:"AdMedia",
|
1111
1111
|
patterns:["^https?://b[.]admedia[.]com/banner/prebid/bidder.*"]},{label:"AdMixer",patterns:["^https?://inv-nets[.]admixer[.]net/prebid[.]aspx.*","^https?://inv-nets[.]admixer[.]net/videoprebid[.]aspx.*"]},{label:"AOL",patterns:["^https?://adserver-us[.]adtech[.]advertising[.]com.*","^https?://adserver-eu[.]adtech[.]advertising[.]com.*","^https?://adserver-as[.]adtech[.]advertising[.]com.*","^https?://adserver[.]adtech[.]de/pubapi/.*"]},{label:"Beachfront",patterns:["^https?://reachms[.]bfmio[.]com/bid[.]json?exchange_id=.*"]},{label:"Bidfluence",patterns:["^https?://cdn[.]bidfluence[.]com/forge[.]js.*"]},{label:"Brightcom",patterns:["^https?://hb[.]iselephant[.]com/auc/ortb.*"]},{label:"C1x",patterns:["^https?://ht-integration[.]c1exchange[.]com:9000/ht.*"]},{label:"CentroBid",patterns:["^https?://t[.]brand-server[.]com/hb.*"]},{label:"Conversant",patterns:["^https?://media[.]msg[.]dotomi[.]com/s2s/.*"]},{label:"Criteo",
|
1112
1112
|
patterns:["^https?://static[.]criteo[.]net/js/ld/publishertag[.]js.*","^https?://([^.]*.)?bidder[.]criteo[.]com/cdb.*","^https?://([^.]*.)?rtax[.]criteo[.]com/delivery/rta.*","^https?://([^.]*.)?rtax[.]eu[.]criteo[.]com/delivery/rta.*"]},{label:"Datablocks",patterns:["^https?://[a-z0-9_.-]*[.]dblks[.]net/.*"]},{label:"Districtm",patterns:["^https?://prebid[.]districtm[.]ca/lib[.]js.*"]},{label:"E-Planning",patterns:["^https?://ads[.]us[.]e-planning[.]net.*"]},{label:"Essens",patterns:["^https?://bid[.]essrtb[.]com/bid/prebid_call.*"]},{label:"Facebook",patterns:["^https?://an[.]facebook[.]com/v2/placementbid[.]json.*"]},{label:"FeatureForward",patterns:["^https?://prmbdr[.]featureforward[.]com/newbidder/.*"]},{label:"Fidelity",patterns:["^https?://x[.]fidelity-media[.]com.*"]},{label:"GetIntent",patterns:["^https?://px[.]adhigh[.]net/rtb/direct_banner.*","^https?://px[.]adhigh[.]net/rtb/direct_vast.*"]},{label:"GumGum",patterns:["^https?://g2[.]gumgum[.]com/hbid/imp.*"]},{
|
1113
1113
|
label:"Hiromedia",patterns:["^https?://hb-rtb[.]ktdpublishers[.]com/bid/get.*"]},{label:"Imonomy",patterns:["^https?://b[.]imonomy[.]com/openrtb/hb/.*"]},{label:"ImproveDigital",patterns:["^https?://ad[.]360yield[.]com/hb.*"]},{label:"IndexExchange",patterns:["^https?://as(-sec)?[.]casalemedia[.]com/(cygnus|headertag).*","^https?://js(-sec)?[.]indexww[.]com/ht/.*"]},{label:"InnerActive",patterns:["^https?://ad-tag[.]inner-active[.]mobi/simpleM2M/requestJsonAd.*"]},{label:"Innity",patterns:["^https?://as[.]innity[.]com/synd/.*"]},{label:"JCM",patterns:["^https?://media[.]adfrontiers[.]com/pq.*"]},{label:"JustPremium",patterns:["^https?://pre[.]ads[.]justpremium[.]com/v/.*"]},{label:"Kargo",patterns:["^https?://krk[.]kargo[.]com/api/v1/bid.*"]},{label:"Komoona",patterns:["^https?://bidder[.]komoona[.]com/v1/GetSBids.*"]},{label:"KruxLink",patterns:["^https?://link[.]krxd[.]net/hb.*"]},{label:"Kumma",patterns:["^https?://cdn[.]kumma[.]com/pb_ortb[.]js.*"]},{label:"Mantis",
|
1114
1114
|
patterns:["^https?://mantodea[.]mantisadnetwork[.]com/website/prebid.*"]},{label:"MarsMedia",patterns:["^https?://bid306[.]rtbsrv[.]com:9306/bidder.*"]},{label:"Media.net",patterns:["^https?://contextual[.]media[.]net/bidexchange.*"]},{label:"MemeGlobal",patterns:["^https?://stinger[.]memeglobal[.]com/api/v1/services/prebid.*"]},{label:"MobFox",patterns:["^https?://my[.]mobfox[.]com/request[.]php.*"]},{label:"NanoInteractive",patterns:["^https?://tmp[.]audiencemanager[.]de/hb.*"]},{label:"OpenX",patterns:["^https?://([^.]*.)?d[.]openx[.]net/w/1[.]0/arj.*","^https?://([^.]*.)?servedbyopenx[.]com/.*"]},{label:"Piximedia",patterns:["^https?://static[.]adserver[.]pm/prebid.*"]},{label:"Platformio",patterns:["^https?://piohbdisp[.]hb[.]adx1[.]com.*"]},{label:"Pollux",patterns:["^https?://adn[.]plxnt[.]com/prebid.*"]},{label:"PubGears",patterns:["^https?://c[.]pubgears[.]com/tags.*"]},{label:"Pubmatic",
|
1115
1115
|
patterns:["^https?://ads[.]pubmatic[.]com/AdServer/js/gshowad[.]js.*","^https?://([^.]*.)?gads.pubmatic[.]com/.*","^https?://hbopenbid.pubmatic[.]com/.*"]},{label:"Pulsepoint",patterns:["^https?://bid[.]contextweb[.]com/header/tag.*"]},{label:"Quantcast",patterns:["^https?://global[.]qc[.]rtb[.]quantserve[.]com:8080/qchb.*"]},{label:"Rhythmone",patterns:["^https?://tag[.]1rx[.]io/rmp/.*"]},{label:"Roxot",patterns:["^https?://r[.]rxthdr[.]com.*"]},{label:"Rubicon",patterns:["^https?://([^.]*.)?(fastlane|optimized-by|anvil)[.]rubiconproject[.]com/a/api.*","^https?://fastlane-adv[.]rubiconproject[.]com/v1/auction/video.*"]},{label:"Sekindo",patterns:["^https?://hb[.]sekindo[.]com/live/liveView[.]php.*"]},{label:"ShareThrough",patterns:["^https?://btlr[.]sharethrough[.]com/header-bid/.*"]},{label:"Smart AdServer",patterns:["^https?://prg[.]smartadserver[.]com/prebid.*"]},{label:"Sonobi",patterns:["^https?://apex[.]go[.]sonobi[.]com/trinity[.]js.*"]},{label:"Sovrn",
|
1116
1116
|
patterns:["^https?://ap[.]lijit[.]com/rtb/bid.*"]},{label:"SpringServe",patterns:["^https?://bidder[.]springserve[.]com/display/hbid.*"]},{label:"StickyAds",patterns:["^https?://cdn[.]stickyadstv[.]com/mustang/mustang[.]min[.]js.*","^https?://cdn[.]stickyadstv[.]com/prime-time/.*"]},{label:"TapSense3",patterns:["^https?://ads04[.]tapsense[.]com/ads/headerad.*"]},{label:"ThoughtLeadr",patterns:["^https?://a[.]thoughtleadr[.]com/v4/.*"]},{label:"TremorBid",patterns:["^https?://([^.]*.)?ads[.]tremorhub[.]com/ad/tag.*"]},{label:"Trion",patterns:["^https?://in-appadvertising[.]com/api/bidRequest.*"]},{label:"TripleLift",patterns:["^https?://tlx[.]3lift[.]com/header/auction.*"]},{label:"TrustX",patterns:["^https?://sofia[.]trustx[.]org/hb.*"]},{label:"UCFunnel",patterns:["^https?://agent[.]aralego[.]com/header.*"]},{label:"Underdog Media",patterns:["^https?://udmserve[.]net/udm/img[.]fetch.*"]},{label:"UnRuly",patterns:["^https?://targeting[.]unrulymedia[.]com/prebid.*"]},{
|
1117
|
-
label:"VertaMedia",patterns:["^https?://rtb[.]vertamedia[.]com/hb/.*"]},{label:"Vertoz",patterns:["^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*"]},{label:"WideOrbig",patterns:["^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*"]},{label:"WideSpace",patterns:["^https?://engine[.]widespace[.]com/map/engine/hb/.*"]},{label:"YieldBot",patterns:["^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*"]},{label:"YieldMo",patterns:["^https?://ads[.]yieldmo[.]com/exchange/prebid.*"]}];const
|
1118
|
-
this.maxStale=null,this.maxStaleDuration=null,this.minFresh=null,this.immutable=null,this.mustRevalidate=null,this.noCache=null,this.noStore=null,this.noTransform=null,this.onlyIfCached=null,this.private=null,this.proxyRevalidate=null,this.public=null}parse(e){if(!e||0===e.length)return this;const t={},r=e.match(
|
1119
|
-
this.proxyRevalidate=parseBooleanOnly(t[
|
1120
|
-
;return(e.responseHeaders||[]).find((e=>e.name.toLowerCase()===r))}var
|
1121
|
-
return isAdSenseTag(e=toURL$2(e))||isAdSenseImplTag(e)}function isAdSenseAdRequest(e){if(!e)return!1;const t=new
|
1122
|
-
if(!e)return!1;return"/gampad/ads"===new
|
1123
|
-
isAdSenseImplTag,isAdSenseAdRequest,isAdSenseIframe,isGptTag:isGptTag$2,isGptImplTag:isGptImplTag$4,isGptIframe:isGptIframe$1,isAdTag:function isAdTag$3(e){return isAdSenseTag(e)||isGptTag$2(e)||isAMPTag(e)},isAdScript:isAdScript$2,isAdRequest:function isAdRequest$5(e){return isAdSenseAdRequest(e)||isGptAdRequest$1(e)||isAMPAdRequest(e)},isAdIframe:function isAdIframe$3(e){return isAdSenseIframe(e)||isGptIframe$1(e)},isImplTag:function isImplTag$3(e){return isAdSenseTag(e)||isGptImplTag$4(e)||isAMPImplTag(e)},containsAnySubstring:function containsAnySubstring$1(e,t){return t.some((t=>e.includes(t)))},hasImpressionPath:function hasImpressionPath(e){return"/pcs/view"===e.pathname||"/pagead/adview"===e.pathname},getHeaderBidder:getHeaderBidder$2,isBidRelatedRequest:isBidRelatedRequest$1,isBidRequest:function isBidRequest$4(e){return isBidRelatedRequest$1(e)&&function isPossibleBidRequest(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&!
|
1124
|
-
isStaticRequest:function isStaticRequest$1(e){return["parser","preload","other"].includes(e.initiator.type)},toURL:toURL$2,trimUrl:function trimUrl$1(e){const t=new
|
1125
|
-
function isAdTask(e){return!!function getCpuNodeUrls(e){const t=new Set;for(const{args:r}of e.childEvents)r.data&&r.data.url&&t.add(r.data.url);return Array.from(t)}(e).find((e=>
|
1126
|
-
const t=e.record.frameId,r=AdLanternMetric$6.getPessimisticGraph(e),a=r.cloneWithRelationships((e=>{if(e.type===
|
1127
|
-
const a=new Map,n=await
|
1128
|
-
getBidStartTime:function getBidStartTime$1(e){const t=e.find(
|
1129
|
-
;class LanternAdRequestTime extends
|
1130
|
-
static async getSimulationGraph(e,t,r){const a=await
|
1131
|
-
return"simulate"==r.settings.throttlingMethod?this.computeSimulatedResult(e,t,r):this.computeObservedResult(e,t,r)}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var
|
1132
|
-
columnScript:"Attributable URL",columnStartTime:"Start",columnDuration:"Duration"},
|
1133
|
-
if(e.startTime>i||e.duration<r)continue;const t=
|
1134
|
-
description:"Render-blocking resources slow down tag load times. Consider loading critical JS/CSS inline or loading scripts asynchronously or loading the tag earlier in the head. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).",failureDisplayValue:"Up to {timeInMs, number, seconds} s tag load time improvement",columnUrl:"Resource",columnStartTime:"Start",columnDuration:"Duration"},
|
1135
|
-
requiredArtifacts:["LinkElements","ScriptElements","devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[
|
1136
|
-
...AdRenderBlockingResources.makeTableDetails(
|
1137
|
-
;for(let n=t.initiator.stack;n;n=n.parent)for(const{url:i}of n.callFrames){if(a.has(i))continue;a.add(i);const o=e.requestsByUrl.get(i);if(o&&(linkGraph(e,o,r),"Script"==o.resourceType)){const a=n.callFrames[0].url,i=e.requestsByUrl.get(a);i&&addInitiatedRequests(i,t,e,r)}}return linkGraph(e,t.initiatorRequest||null,r),r}function buildNetworkSummary(e,t){const r=new Map;for(const t of e)r.set(t.url,t);const a=t.filter((e=>e.name.startsWith("XHR"))).filter((e=>!!(e.args.data||{}).url)),n=new Map;for(const e of a){const t=e.args.data||{},r=n.get(t.url)||new Set;for(const{url:e}of t.stackTrace||[])r.add(e);n.set(t.url,r)}return{requestsByUrl:r,xhrEdges:n,allRecords:e}}var
|
1138
|
-
const e=o.pop();e&&!r.has(e)&&(r.add(e),o.push(...e.getDependencies()))}const s=new Set;for(o.push(...e.getDependents());o.length;){const e=o.pop();if(e&&!s.has(e)){if(s.add(e),r.has(e))for(const e of o)r.add(e);o.push(...e.getDependents())}}for(const e of r)e.type===
|
1139
|
-
;const u=new Set(["Script","XHR","Fetch","EventStream","Document",void 0]),d=Array.from(i).filter((e=>e.endTime<o.startTime)).filter((e=>u.has(e.resourceType))).filter((e=>"text/css"!=e.mimeType)),m=await
|
1140
|
-
;return function computeSelfTimes(e){if(!e.length)return[];let t=
|
1141
|
-
},
|
1142
|
-
;const s=function computeIdleTimes(e){let t=1/0;const r=[];for(let a=0;a<e.length;){const{startTime:n,endTime:i}=e[a];for(n-t>150&&r.push(n-t),t=i;++a<e.length&&e[a].startTime<t;)t=Math.max(t,e[a].endTime)}return r}(n),c=Math.max(...s),l=s.reduce(((e,t)=>e+t),0);return{numericValue:i,numericUnit:"unitless",score:o?0:1,displayValue:jU
|
1143
|
-
;class BidRequestTime extends
|
1144
|
-
},
|
1145
|
-
;const
|
1146
|
-
p10:6500,median:1e4},provided:{p10:1900,median:3500}}}static async audit(e,t){const r={trace:e.traces[
|
1147
|
-
description:"Over 10% of ads are never viewed because users scroll past them before they become viewable. By moving ad slots away from the very top of the viewport, users are more likely to see ads before scrolling away. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport).",failureDisplayValue:"A scroll of {valueInPx, number} px would hide half of your topmost ad",columnSlot:"Top Slot ID"},
|
1148
|
-
midpoint:e.clientRect.top+e.clientRect.height/2,id:e.id})));if(!r.length)return
|
1149
|
-
const r=!(e.right<t.left||t.right<e.left),a=!(e.bottom<t.top||t.bottom<e.top);return r&&a},toClientRect:function toClientRect$1([e,t,r,a]){return{left:e,top:t,width:r,height:a,right:e+r,bottom:t+a}}};const{auditNotApplicable:
|
1150
|
-
},
|
1151
|
-
;for(const a of e)t(a)&&r++;return r},bucket:function bucket$1(e,t){const r=new Map;for(const a of e){const e=t(a);if(null!=e){const t=r.get(e)||[];t.push(a),r.set(e,t)}}return r},flatten:function flatten(e){const t=[];for(const r of e)t.push(...r);return t}};const Cj
|
1152
|
-
id:"async-ad-tags",title
|
1153
|
-
failureTitle:"Avoid waiting on load events",description:"Waiting on load events increases ad latency. To speed up ads, eliminate the following load event handlers. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/blocking-load-events).",displayValue:"{timeInMs, number, seconds} s blocked",columnEvent:"Event Name",columnTime:"Event Time",columnScript:"Script",columnBlockedUrl:"Blocked URL",columnFunctionName:"Function"},
|
1154
|
-
function findTraceEventOfCallFrame(e,t){return t.find((t=>"FunctionCall"==t.name&&t.args.data&&t.args.data.functionName==e.functionName&&t.args.data.scriptId==e.scriptId&&t.args.data.url==e.url&&Math.abs(t.args.data.lineNumber==e.lineNumber)<2&&Math.abs(t.args.data.columnNumber==e.columnNumber)<2))}function findEventIntervals(e,t){let r={};const a=[];for(const n of t)n.name==`${e}EventStart`?r={start:n.ts,end:1/0,eventName:e}:n.name==`${e}EventEnd`&&(r.end=n.ts,a.push(r));return a}function quantifyBlockedTime(e,t,r){const a=t.find((t=>t.url==e.url)),n=t.find((t=>t.url==e.blockedUrl));if(!a||!n)return 0;const i=r.get(a),o=r.get(n);return i&&o?o.startTime-i.endTime:0}class BlockingLoadEvents extends
|
1155
|
-
const r=e.traces[
|
1156
|
-
|
1157
|
-
key:"duration",itemType:"ms",text:dB
|
1158
|
-
;const
|
1159
|
-
itemType:"text",text:EB
|
1160
|
-
;const
|
1161
|
-
description:"This metric measures the time for the first ad iframe to render from page navigation. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/first-ad-render).",displayValue:"{timeInMs, number, seconds} s"},
|
1162
|
-
const i=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"];return{numericValue:n,numericUnit:"millisecond",score:
|
1163
|
-
failureTitle:YB
|
1164
|
-
description:"To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-bids-parallel).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},
|
1165
|
-
;const o=n.filter(
|
1166
|
-
},
|
1167
|
-
description:'For privacy and security, always load GPT/AdSense over HTTPS. Insecure pages should explicitly request the ad script securely. GPT Example: `<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js">` AdSense Example: `<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">`. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https).'},
|
1168
|
-
type:"debugdata",numAdTagHttpReqs:n.length-i.length,numAdTagHttpsReqs:i.length};if(!n.length){const e=
|
1169
|
-
},
|
1170
|
-
const r=await async function findStaticallyLoadableTags(e,t){const r=e.devtoolsLogs[
|
1171
|
-
;const
|
1172
|
-
return
|
1173
|
-
;e&&a.push(Object.assign({},e,{url:n.url,type:t}))}return a}(s.get(
|
1174
|
-
static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=
|
1175
|
-
scoreDisplayMode:
|
1176
|
-
description:"The ads to page-height ratio can impact user experience and ultimately user retention. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density).",displayValue:"{adDensity, number, percent} ads to page-height ratio"},
|
1177
|
-
const r=new Set([...e.map((e=>e.clientRect.left)),...e.map((e=>e.clientRect.right))].map((e=>Math.min(Math.max(1,e),t.innerWidth-1))));e=e.sort(((e,t)=>e.clientRect.top!==t.clientRect.top?e.clientRect.top-t.clientRect.top:e.clientRect.bottom-t.clientRect.bottom));let a=0;for(const t of r){let r=0,n=0;for(const a of e){if(t<a.clientRect.left||t>a.clientRect.right)continue;if(a.isPositionFixed){r+=a.clientRect.height;continue}const e=a.clientRect.bottom-Math.max(n,a.clientRect.top);e>0&&(r+=e),n=Math.max(n,a.clientRect.bottom)}a=Math.max(a,r)}return a}(r,t),n=Math.max(...r.map((e=>e.clientRect.top+e.clientRect.height/2)))+t.innerHeight,i=Math.min(1,a/n);return{score:i>.3?0:1,numericValue:i,numericUnit:"unitless",displayValue:_q
|
1178
|
-
title:"Cumulative ad shift",failureTitle:"Reduce ad-related layout shift",description:"Measures layout shifts that were caused by ads or happened near ads. Reducing cumulative ad-related layout shift will improve user experience. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/cumulative-ad-shift)."},
|
1179
|
-
const t=r.clientRect;if((e.top>=t.top||a.top>=t.bottom)&&
|
1180
|
-
const r=e.traces[
|
1181
|
-
displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},
|
1182
|
-
key:"description",itemType:"code",text:
|
1183
|
-
requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[
|
1184
|
-
title:"Total ad JS blocking time",failureTitle:"Reduce ad JS blocking time",description:"Ad-related scripts are blocking the main thread. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/total-ad-blocking-time).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",columnName:"Name",columnBlockingTime:"Blocking Time"},
|
1185
|
-
const r=e.traces[
|
1186
|
-
if(globalThis.isDevtools||globalThis.isLightrider)return!0;try{return require.resolve("lighthouse-logger"),!1}catch(e){return!0}}const mergeOptionsOfItems=function(e){const t=[];for(const r of e){const e=r.path&&t.find((e=>e.path===r.path));e?e.options=Object.assign({},e.options,r.options):t.push(r)}return t};const
|
1187
|
-
;const
|
1117
|
+
label:"VertaMedia",patterns:["^https?://rtb[.]vertamedia[.]com/hb/.*"]},{label:"Vertoz",patterns:["^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*"]},{label:"WideOrbig",patterns:["^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*"]},{label:"WideSpace",patterns:["^https?://engine[.]widespace[.]com/map/engine/hb/.*"]},{label:"YieldBot",patterns:["^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*"]},{label:"YieldMo",patterns:["^https?://ads[.]yieldmo[.]com/exchange/prebid.*"]}];const VO=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g,WO="max-age",GO="s-maxage",HO="max-stale",YO="min-fresh",KO="immutable",JO="must-revalidate",XO="no-cache",ZO="no-store",QO="no-transform",eF="only-if-cached",tF="private",rF="proxy-revalidate",aF="public";function parseBooleanOnly(e){return null===e}function parseDuration(e){if(!e)return null;const t=parseInt(e,10);return!Number.isFinite(t)||t<0?null:t}class CacheControl{constructor(){this.maxAge=null,this.sharedMaxAge=null,
|
1118
|
+
this.maxStale=null,this.maxStaleDuration=null,this.minFresh=null,this.immutable=null,this.mustRevalidate=null,this.noCache=null,this.noStore=null,this.noTransform=null,this.onlyIfCached=null,this.private=null,this.proxyRevalidate=null,this.public=null}parse(e){if(!e||0===e.length)return this;const t={},r=e.match(VO)||[];return Array.prototype.forEach.call(r,(e=>{const r=e.split("=",2),[a]=r;let n=null;r.length>1&&(n=r[1].trim()),t[a.toLowerCase()]=n})),this.maxAge=parseDuration(t[WO]),this.sharedMaxAge=parseDuration(t[GO]),this.maxStale=parseBooleanOnly(t[HO]),this.maxStaleDuration=parseDuration(t[HO]),this.maxStaleDuration&&(this.maxStale=!0),this.minFresh=parseDuration(t[YO]),this.immutable=parseBooleanOnly(t[KO]),this.mustRevalidate=parseBooleanOnly(t[JO]),this.noCache=parseBooleanOnly(t[XO]),this.noStore=parseBooleanOnly(t[ZO]),this.noTransform=parseBooleanOnly(t[QO]),this.onlyIfCached=parseBooleanOnly(t[eF]),this.private=parseBooleanOnly(t[tF]),
|
1119
|
+
this.proxyRevalidate=parseBooleanOnly(t[rF]),this.public=parseBooleanOnly(t[aF]),this}format(){const e=[];return"number"==typeof this.maxAge&&e.push(`${WO}=${this.maxAge}`),"number"==typeof this.sharedMaxAge&&e.push(`${GO}=${this.sharedMaxAge}`),this.maxStale&&("number"==typeof this.maxStaleDuration?e.push(`${HO}=${this.maxStaleDuration}`):e.push(HO)),"number"==typeof this.minFresh&&e.push(`${YO}=${this.minFresh}`),this.immutable&&e.push(KO),this.mustRevalidate&&e.push(JO),this.noCache&&e.push(XO),this.noStore&&e.push(ZO),this.noTransform&&e.push(QO),this.onlyIfCached&&e.push(eF),this.private&&e.push(tF),this.proxyRevalidate&&e.push(rF),this.public&&e.push(aF),e.join(", ")}}var nF={CacheControl,parse:function parse(e){return(new CacheControl).parse(e)},format:function format$2(e){return e instanceof CacheControl?e.format():CacheControl.prototype.format.call(e)}};const iF=QS.exports,{parse:oF}=nF;function getHeader(e,t){const r=t.toLowerCase()
|
1120
|
+
;return(e.responseHeaders||[]).find((e=>e.name.toLowerCase()===r))}var sF={isCacheable:function isCacheable$2(e){if(!iF.isCacheableAsset(e))return!1;const t=getHeader(e,"cache-control");if(t){try{const e=oF(t.value);if(e.noStore||e.noCache||0===e.maxAge)return!1}catch(e){}return!0}return!!getHeader(e,"expires")||!!getHeader(e,"last-modified")}};const cF=zO,lF=uw,{isCacheable:uF}=sF,{URL:dF}=Gn;function toURL$2(e){let t;try{t="string"==typeof e?new dF(e):e}catch(e){t=new dF("http://_")}return t}function isGoogleAds$2(e){return e=toURL$2(e),/(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.test(e.hostname)}function isAdSenseTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=["/pagead/js/adsbygoogle.js","/pagead/show_ads.js"].includes(e.pathname);return t&&r}function isAdSenseImplTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=/(^\/pagead\/js\/.*\/show_ads_impl.*?\.js)/.test(e.pathname);return t&&r}function isAdSense$1(e){
|
1121
|
+
return isAdSenseTag(e=toURL$2(e))||isAdSenseImplTag(e)}function isAdSenseAdRequest(e){if(!e)return!1;const t=new dF(e.url);return"/pagead/ads"===t.pathname&&"googleads.g.doubleclick.net"===t.host}function isAdSenseIframe(e){return/(^aswift_\d+)/.test(e.id)}function isGptTag$2(e){const{host:t,pathname:r}=toURL$2(e),a=["www.googletagservices.com","pagead2.googlesyndication.com","securepubads.g.doubleclick.net"].includes(t),n=["/tag/js/gpt.js","/tag/js/gpt_mobile.js"].includes(r);return a&&n}function isAMPTag(e){const{host:t,pathname:r}=toURL$2(e),a=["cdn.ampproject.org"].includes(t),n=["/v0/amp-ad-0.1.js"].includes(r);return a&&n}function isGptImplTag$4(e){return isGoogleAds$2(e)&&/(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.test(toURL$2(e).pathname)}function isAMPImplTag(e){return/^\/[a-z_]*\/\d+\/v0\/amp-ad-network-doubleclick-impl-0.1.js/.test(toURL$2(e).pathname)}function isGpt$3(e){return isGptTag$2(e=toURL$2(e))||isGptImplTag$4(e)}function isGptAdRequest$1(e){
|
1122
|
+
if(!e)return!1;return"/gampad/ads"===new dF(e.url).pathname&&"XHR"===e.resourceType&&isGoogleAds$2(e.url)}function isAMPAdRequest(e){if(!e)return!1;const t=new dF(e.url);return"/gampad/ads"===t.pathname&&"securepubads.g.doubleclick.net"===t.host&&"Fetch"===e.resourceType}function isGptIframe$1(e){return/(^google_ads_iframe_)/.test(e.id)}function isAdScript$2(e){return isAdSense$1(e)||isGpt$3(e)||function isAMP(e){return isAMPTag(e)||isAMPImplTag(e)}(e)}function getHeaderBidder$2(e){for(const t of cF)for(const r of t.patterns)if(new RegExp(r).test(e))return t.label}function isBidRelatedRequest$1(e){return!!getHeaderBidder$2("string"==typeof e?e:e.url)}var mF={isGoogleAds:isGoogleAds$2,isGptAdRequest:isGptAdRequest$1,isImpressionPing:function isImpressionPing$3(e){const{host:t,pathname:r}=toURL$2(e);return["securepubads.g.doubleclick.net","googleads4.g.doubleclick.net"].includes(t)&&["/pcs/view","/pagead/adview"].includes(r)},isGpt:isGpt$3,isAdSense:isAdSense$1,isAdSenseTag,
|
1123
|
+
isAdSenseImplTag,isAdSenseAdRequest,isAdSenseIframe,isGptTag:isGptTag$2,isGptImplTag:isGptImplTag$4,isGptIframe:isGptIframe$1,isAdTag:function isAdTag$3(e){return isAdSenseTag(e)||isGptTag$2(e)||isAMPTag(e)},isAdScript:isAdScript$2,isAdRequest:function isAdRequest$5(e){return isAdSenseAdRequest(e)||isGptAdRequest$1(e)||isAMPAdRequest(e)},isAdIframe:function isAdIframe$3(e){return isAdSenseIframe(e)||isGptIframe$1(e)},isImplTag:function isImplTag$3(e){return isAdSenseTag(e)||isGptImplTag$4(e)||isAMPImplTag(e)},containsAnySubstring:function containsAnySubstring$1(e,t){return t.some((t=>e.includes(t)))},hasImpressionPath:function hasImpressionPath(e){return"/pcs/view"===e.pathname||"/pagead/adview"===e.pathname},getHeaderBidder:getHeaderBidder$2,isBidRelatedRequest:isBidRelatedRequest$1,isBidRequest:function isBidRequest$4(e){return isBidRelatedRequest$1(e)&&function isPossibleBidRequest(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&!uF(e)}(e)},
|
1124
|
+
isStaticRequest:function isStaticRequest$1(e){return["parser","preload","other"].includes(e.initiator.type)},toURL:toURL$2,trimUrl:function trimUrl$1(e){const t=new dF(e),r=t.pathname.length>60?t.pathname.substr(0,60)+"...":t.pathname;return t.origin+r},getNameOrTld:function getNameOrTld$2(e){const t=getHeaderBidder$2(e);if(t)return t;if(isGpt$3(e))return"GPT";if(isAdSense$1(e))return"AdSense";if(isAMPTag(e))return"AMP tag";const r=lF.getEntity(e);if(r)return r.name;const{host:a}=new dF(e),[n=""]=a.match(/([^.]*(\.[a-z]{2,3}){1,2})$/)||[];return n||a},isAMPTag,isAMPAdRequest,isAdRelated:function isAdRelated$3(e){const t="string"==typeof e?e:e.url;if(isAdScript$2(t)||getHeaderBidder$2(t))return!0;const r=lF.getEntity(t);return!!r&&r.categories.includes("ad")}};const pF=Zc,hF=sb,{isBidRelatedRequest:gF,isImpressionPing:fF,isGoogleAds:yF,isGptAdRequest:vF,isGptTag:bF,isGptImplTag:wF,toURL:SF}=mF;function getFrame(e){return e.args.frame||e.args.data&&e.args.data.frame||null}
|
1125
|
+
function isAdTask(e){return!!function getCpuNodeUrls(e){const t=new Set;for(const{args:r}of e.childEvents)r.data&&r.data.url&&t.add(r.data.url);return Array.from(t)}(e).find((e=>gF(e)||yF(SF(e))))}function addEdge(e,t){e===t||e.endTime>t.startTime||e.addDependent(t)}function addEdges(e){const t=[],r=[];e.traverse((e=>{e.type===pF.TYPES.NETWORK&&(bF(e.record.url)&&"Script"===e.record.resourceType?r.push(e):vF(e.record)&&t.push(e))})),e.traverse((e=>{if(e.type===pF.TYPES.NETWORK){if(wF(e.record.url)){const t=e;for(const e of r)addEdge(e,t)}if(gF(e.record)){const r=e;for(const e of t)addEdge(r,e)}if(fF(e.record.url)){const r=e;for(const e of t){addEdge(e,r);for(const t of e.getDependents())addEdge(t,r)}}}}))}class AdLanternMetric$6 extends hF{static get COEFFICIENTS(){return{intercept:0,optimistic:1,pessimistic:0}}static getPessimisticGraph(e){const t=e.cloneWithRelationships((e=>!0));return addEdges(t),t}static getOptimisticGraph(e){
|
1126
|
+
const t=e.record.frameId,r=AdLanternMetric$6.getPessimisticGraph(e),a=r.cloneWithRelationships((e=>{if(e.type===pF.TYPES.CPU)return function isLongTask(e){return e.event.dur>5e4}(e)||isAdTask(e)||!!getFrame(e.event)&&getFrame(e.event)!==t;if(e.hasRenderBlockingPriority())return!0;const r=e.record.url;return gF(r)||yF(SF(r))}));return addEdges(r),a}static getEstimateFromSimulation(e,t){throw new Error("getEstimateFromSimulation not implemented by "+this.name)}static findTiming(e,t){let r={startTime:1/0,endTime:-1/0,duration:0};for(const[a,n]of e.entries())t(a,n)&&r.startTime>n.startTime&&(r=n);return r}static findNetworkTiming(e,t){return this.findTiming(e,(e=>e.type===pF.TYPES.NETWORK&&t(e.record)))}}var TF=AdLanternMetric$6;const EF=TF,xF=Dl,_F=Lo,AF=eb,{isAdRequest:RF,isBidRequest:kF,isImplTag:DF,isImpressionPing:CF}=mF,{URL:IF}=Gn;function getPageStartTime$4(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.startTime:t}async function getTimingsByRecord$5(e,t,r){
|
1127
|
+
const a=new Map,n=await _F.request(t,r);if("simulate"==r.settings.throttlingMethod){const n=await AF.request({trace:e,devtoolsLog:t},r),i=EF.getOptimisticGraph(n),o=await xF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:s}=o.simulate(i,{});for(const[{record:e},t]of s.entries())e&&a.set(e,t)}else{const e=getPageStartTime$4(n);for(const t of n)a.set(t,{startTime:1e3*(t.startTime-e),endTime:1e3*(t.endTime-e),duration:1e3*(t.endTime-t.startTime)})}return a}function getScriptUrl$1(e){if(e.args.data&&["EvaluateScript","FunctionCall"].includes(e.name))return e.args.data.url?e.args.data.url:e.args.data.stackTrace?e.args.data.stackTrace[0].url:void 0}var NF={getTagEndTime:function getTagEndTime$1(e){const t=e.find((e=>DF(new IF(e.url))));return t?t.endTime:-1},getImpressionStartTime:function getImpressionStartTime$1(e){const t=e.find((e=>CF(e.url)));return t?t.startTime:-1},getAdStartTime:function getAdStartTime$2(e){const t=e.find(RF);return t?t.startTime:-1},
|
1128
|
+
getBidStartTime:function getBidStartTime$1(e){const t=e.find(kF);return t?t.startTime:-1},getPageStartTime:getPageStartTime$4,getPageResponseTime:function getPageResponseTime(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.responseReceivedTime:t},getScriptUrl:getScriptUrl$1,getTimingsByRecord:getTimingsByRecord$5,getScriptEvaluationTimes:async function getScriptEvaluationTimes$1(e,t,r){const a=1e3*getPageStartTime$4(await _F.request(t,r)),n=new Map;for(const t of e.traceEvents){const e=getScriptUrl$1(t);if(!e)continue;const r=t.ts/1e3-a;(!n.has(e)||n.get(e)>r)&&n.set(e,r)}if("simulate"!==r.settings.throttlingMethod)return n;const i=await getTimingsByRecord$5(e,t,r),o=new Map;for(const[e,t]of i.entries()){const i=n.get(e.url);if(!i)continue;if(o.has(e.url))continue;const s=1e3*e.startTime-a,c=t.endTime,l=r.settings.throttling.cpuSlowdownMultiplier*(i-s);o.set(e.url,c+l)}return o}};const LF=TF,MF=Ew,PF=Ao,{getAdStartTime:OF,getPageStartTime:FF}=NF,{isAdRequest:UF}=mF
|
1129
|
+
;class LanternAdRequestTime extends LF{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:LF.findNetworkTiming(r,UF).startTime,nodeTimings:r}}}LanternAdRequestTime=PF(LanternAdRequestTime);class AdRequestTime$1 extends MF{static async computeSimulatedMetric(e,t){return LanternAdRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=FF(t),a=1e3*(OF(t)-r);return Promise.resolve({timing:a})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var jF=AdRequestTime$1=PF(AdRequestTime$1);var BF={getAttributableUrl:function getAttributableUrl$3(e,t=new Set){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0],n=r||a;if(n)return n;let i=50,o="";for(const r of e.children){const e=getAttributableUrl$3(r,t);e&&r.duration>i&&(o=e,i=r.duration)}return o}};const $F=TF,qF=Zc,zF=Ew,{getAttributableUrl:VF}=BF,WF=Dl,GF=Rv,HF=Ao,YF=Lo,KF=eb;class LongTasks$2 extends zF{
|
1130
|
+
static async getSimulationGraph(e,t,r){const a=await KF.request({trace:e,devtoolsLog:t},r);return $F.getOptimisticGraph(a)}static async computeSimulatedResult(e,t,r){const a=await this.getSimulationGraph(e,t,r),n=await WF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:i}=n.simulate(a,{}),o=[];for(const[e,t]of i.entries())e.type!==qF.TYPES.CPU||t.duration<100||o.push({event:e.event,startTime:t.startTime,endTime:t.endTime,duration:t.duration,selfTime:t.duration,attributableURLs:Array.from(e.getEvaluateScriptURLs()),children:[],parent:e.parent,unbounded:e.unbounded,group:e.group});return o}static async computeObservedResult(e,t,r){const a=await GF.request(e,r),n=await YF.request(t,r),i=new Set(n.filter((e=>"Script"===e.resourceType)).map((e=>e.url)));return a.filter((e=>function isLong(e,t){if(e.duration<50)return!1;const r=VF(e,t);if(!r)return!1;if(e.parent)return r!=VF(e.parent,t);return!0}(e,i)))}static async compute_({trace:e,devtoolsLog:t},r){
|
1131
|
+
return"simulate"==r.settings.throttlingMethod?this.computeSimulatedResult(e,t,r):this.computeObservedResult(e,t,r)}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var JF=LongTasks$2=HF(LongTasks$2),XF=getAugmentedNamespace(Object.freeze({__proto__:null,Audit:kc}));const ZF=jF,QF=oi,eU=JF,{auditNotApplicable:tU}=PO.exports,{Audit:rU}=XF,{getAttributableUrl:aU}=BF,{isAdScript:nU}=mF,{URL:iU}=Gn,oU={title:"No long tasks blocking ad-related network requests",failureTitle:"Avoid long tasks that block ad-related network requests",description:"Tasks blocking the main thread can delay ad requests and cause a poor user experience. Consider removing long blocking tasks or moving them off of the main thread. These tasks can be especially detrimental to performance on less powerful devices. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",
|
1132
|
+
columnScript:"Attributable URL",columnStartTime:"Start",columnDuration:"Duration"},sU=QF.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js",oU),cU=[{key:"script",itemType:"url",text:sU(oU.columnScript)},{key:"startTime",itemType:"ms",text:sU(oU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:sU(oU.columnDuration),granularity:1}];class AdBlockingTasks extends rU{static get meta(){return{id:"ad-blocking-tasks",title:sU(oU.title),failureTitle:sU(oU.failureTitle),description:sU(oU.description),requiredArtifacts:["traces","devtoolsLogs"]}}static async audit(e,t){const r="simulate"==t.settings.throttlingMethod?200:100,a={trace:e.traces[rU.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[rU.DEFAULT_PASS],settings:t.settings};let n=[];try{n=await eU.request(a,t)}catch(e){return tU.InvalidTiming}if(!n.length)return tU.NoTasks;const{timing:i}=await ZF.request(a,t);if(!(i>0))return tU.NoAdRelatedReq;const o=[];for(const e of n){
|
1133
|
+
if(e.startTime>i||e.duration<r)continue;const t=aU(e);if(t&&nU(new iU(t)))continue;const a=t&&new iU(t),n=a&&a.origin+a.pathname||"Other";o.push({script:n,rawUrl:t,startTime:e.startTime,endTime:e.endTime,duration:e.duration,isTopLevel:!e.parent})}let s=Array.from(o);s.length>10&&(s=o.filter((e=>"Other"!==e.script&&e.isTopLevel)).sort(((e,t)=>t.duration-e.duration)).splice(0,10).sort(((e,t)=>e.startTime-t.startTime)));const c=s.reduce(((e,t)=>t.isTopLevel?e+t.duration:e),0),l=s.length>0;return{score:l?0:1,numericValue:c,numericUnit:"millisecond",displayValue:l?sU(oU.failureDisplayValue,{timeInMs:c}):"",details:AdBlockingTasks.makeTableDetails(cU,s)}}}qO.exports=AdBlockingTasks,qO.exports.UIStrings=oU;var lU={exports:{}};const uU=oi,dU=Lo,{auditNotApplicable:mU}=PO.exports,{Audit:pU}=XF,{getTimingsByRecord:hU}=NF,{isAdTag:gU}=mF,{URL:fU}=Gn,yU={title:"Minimal render-blocking resources found",failureTitle:"Avoid render-blocking resources",
|
1134
|
+
description:"Render-blocking resources slow down tag load times. Consider loading critical JS/CSS inline or loading scripts asynchronously or loading the tag earlier in the head. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).",failureDisplayValue:"Up to {timeInMs, number, seconds} s tag load time improvement",columnUrl:"Resource",columnStartTime:"Start",columnDuration:"Duration"},vU=uU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js",yU),bU=[{key:"url",itemType:"url",text:vU(yU.columnUrl)},{key:"startTime",itemType:"ms",text:vU(yU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:vU(yU.columnDuration),granularity:1}];class AdRenderBlockingResources extends pU{static get meta(){return{id:"ad-render-blocking-resources",title:vU(yU.title),failureTitle:vU(yU.failureTitle),scoreDisplayMode:"binary",description:vU(yU.description),
|
1135
|
+
requiredArtifacts:["LinkElements","ScriptElements","devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[pU.DEFAULT_PASS],a=e.traces[pU.DEFAULT_PASS],n=await dU.request(r,t),i=n.find((e=>gU(new fU(e.url))));if(!i)return mU.NoTag;const o=await hU(a,r,t),s=new Set;for(const t of e.LinkElements)t.href&&"stylesheet"==t.rel&&s.add(t.href);for(const t of e.ScriptElements)!t.src||t.defer||t.async||s.add(t.src);const c=n.filter((e=>e.endTime<i.startTime)).filter((e=>e!=i.initiatorRequest)).filter((e=>e.initiator.type="parser")).filter((e=>s.has(e.url))).map((e=>Object.assign({url:e.url},o.get(e))));c.sort(((e,t)=>e.endTime-t.endTime));const l=o.get(i)||{startTime:1/0},u=c.map((e=>e.startTime)),d=c.map((e=>e.endTime)),m=Math.min(...u),p=Math.min(Math.max(...d),l.startTime)-m;let h="";c.length>0&&p>0&&(h=vU(yU.failureDisplayValue,{timeInMs:p}));return{score:c.length>0&&p>100?0:1,numericValue:c.length,numericUnit:"unitless",displayValue:h,details:{opportunity:p,
|
1136
|
+
...AdRenderBlockingResources.makeTableDetails(bU,c)}}}}lU.exports=AdRenderBlockingResources,lU.exports.UIStrings=yU;var wU={exports:{}};var SU={assert:function assert$2(e){if(null==e)throw new Error("Expected not to be null");return e}};const TU=Zc,EU=Lo,{assert:xU}=SU,{getNameOrTld:_U,trimUrl:AU}=mF,{getNetworkInitiators:RU}=eb,{getTimingsByRecord:kU}=NF,{isAdRequest:DU,isAdSense:CU,isGpt:IU,isBidRequest:NU,isAdRelated:LU}=mF;function isXhrCritical(e,t,r){const a=t.xhrEdges.get(e.url);if(!a)return!1;for(const{url:e}of r)if(a.has(e))return!0;return!1}function addInitiatedRequests(e,t,r,a){const n=r.allRecords.filter((e=>null!=e.resourceType)).filter((e=>["Script","XHR"].includes(e.resourceType||"")&&e.endTime<t.startTime)).filter((t=>t.initiatorRequest==e||RU(t).includes(e.url)));for(const e of n){"XHR"==e.resourceType&&isXhrCritical(e,r,a)&&linkGraph(r,e,a)}}function linkGraph(e,t,r=new Set){if(!t||r.has(t))return r;r.add(t);const a=new Set
|
1137
|
+
;for(let n=t.initiator.stack;n;n=n.parent)for(const{url:i}of n.callFrames){if(a.has(i))continue;a.add(i);const o=e.requestsByUrl.get(i);if(o&&(linkGraph(e,o,r),"Script"==o.resourceType)){const a=n.callFrames[0].url,i=e.requestsByUrl.get(a);i&&addInitiatedRequests(i,t,e,r)}}return linkGraph(e,t.initiatorRequest||null,r),r}function buildNetworkSummary(e,t){const r=new Map;for(const t of e)r.set(t.url,t);const a=t.filter((e=>e.name.startsWith("XHR"))).filter((e=>!!(e.args.data||{}).url)),n=new Map;for(const e of a){const t=e.args.data||{},r=n.get(t.url)||new Set;for(const{url:e}of t.stackTrace||[])r.add(e);n.set(t.url,r)}return{requestsByUrl:r,xhrEdges:n,allRecords:e}}var MU={getTransitiveClosure:function getTransitiveClosure(e,t){const r=new Set,a=function findTargetRequest(e,t){let r=null;return e.traverse((e=>{e.type!==TU.TYPES.CPU&&t(e.record)&&(r&&r.startTime<e.startTime||(r=e))})),r}(e,t),n=[],i=[];if(null==a)return{requests:n,traceEvents:i};const o=[a];for(;o.length;){
|
1138
|
+
const e=o.pop();e&&!r.has(e)&&(r.add(e),o.push(...e.getDependencies()))}const s=new Set;for(o.push(...e.getDependents());o.length;){const e=o.pop();if(e&&!s.has(e)){if(s.add(e),r.has(e))for(const e of o)r.add(e);o.push(...e.getDependents())}}for(const e of r)e.type===TU.TYPES.NETWORK?e.endTime<xU(a).startTime&&n.push(e.record):e.type===TU.TYPES.CPU&&e.event.ts<1e6*xU(a).startTime&&i.push(e.event,...e.childEvents);return{requests:n,traceEvents:i}},getCriticalGraph:function getCriticalGraph$1(e,t,r){const a=buildNetworkSummary(e,t),n=new Set;return linkGraph(a,r,n),n},computeAdRequestWaterfall:async function computeAdRequestWaterfall$4(e,t,r){const a=await EU.request(t,r),n=a.find(DU)||a.find(NU)||a.find(LU);if(null==n)return Promise.resolve([]);const i=new Set,o=xU(n),s=a.filter((e=>IU(e.url)||CU(e.url))),c=a.filter((e=>NU(e)&&e.endTime<=o.startTime)),l=buildNetworkSummary(a,e.traceEvents);for(const e of[o,...c,...s])linkGraph(l,e,i)
|
1139
|
+
;const u=new Set(["Script","XHR","Fetch","EventStream","Document",void 0]),d=Array.from(i).filter((e=>e.endTime<o.startTime)).filter((e=>u.has(e.resourceType))).filter((e=>"text/css"!=e.mimeType)),m=await kU(e,t,r),p=function computeSummaries(e){e.sort(((e,t)=>e.nameOrTld!=t.nameOrTld?e.nameOrTld<t.nameOrTld?-1:1:e.type!=t.type?e.type<t.type?-1:1:e.startTime!=t.startTime?e.startTime<t.startTime?-1:1:e.endTime-t.endTime));const t=[];for(let n=0;n<e.length;n++){const i=e[n];let o;for(;n<e.length&&(o=e[n+1],o&&(r=o,a=i,!(Math.max(r.startTime,a.startTime)>Math.min(r.endTime,a.endTime)||r.type&&a.type&&r.type!=a.type||"Script"==r.type||r.nameOrTld!=a.nameOrTld)));)i.endTime=Math.max(i.endTime,o.endTime),i.duration=i.endTime-i.startTime,n++;t.push(i)}var r,a;return t.sort(((e,t)=>e.startTime-t.startTime)),t}(d.map((e=>{const{startTime:t,endTime:r}=m.get(e)||e;return{startTime:t,endTime:r,duration:r-t,selfTime:0,url:AU(e.url),nameOrTld:_U(e.url),type:e.resourceType,record:e}})))
|
1140
|
+
;return function computeSelfTimes(e){if(!e.length)return[];let t=xU(e[0]);t.selfTime=t.duration;let r=t.startTime;for(const a of e){if(a.endTime<r||a==t)continue;const e=Math.max(r,a.startTime),n=Math.min(t.endTime,a.endTime);e<n&&(t.selfTime-=n-e),r=Math.max(r,n),a.endTime>t.endTime&&(a.selfTime=a.endTime-e,t=a)}}(p),p}};const PU=oi,{auditNotApplicable:OU}=PO.exports,{Audit:FU}=XF,{computeAdRequestWaterfall:UU}=MU,jU={title:"Ad request waterfall",failureTitle:"Reduce critical path for ad loading",description:"Consider reducing the number of resources, loading multiple resources simultaneously, or loading resources earlier to improve ad speed. Requests that block ad loading can be found below. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path).",displayValue:"{serialResources, plural, =1 {1 serial resource} other {# serial resources}}",columnUrl:"Request",columnType:"Type",columnStartTime:"Start",columnEndTime:"End"
|
1141
|
+
},BU=PU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js",jU),$U=[{key:"nameOrTld",itemType:"text",text:BU(jU.columnType)},{key:"url",itemType:"url",text:BU(jU.columnUrl)},{key:"startTime",itemType:"ms",text:BU(jU.columnStartTime),granularity:1},{key:"endTime",itemType:"ms",text:BU(jU.columnEndTime),granularity:1}];class AdRequestCriticalPath extends FU{static get meta(){return{id:"ad-request-critical-path",title:BU(jU.title),failureTitle:BU(jU.failureTitle),description:BU(jU.description),scoreDisplayMode:"informative",requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[FU.DEFAULT_PASS],a=e.devtoolsLogs[FU.DEFAULT_PASS],n=(await UU(r,a,t)).filter((e=>e.startTime>0&&e.startTime<e.endTime));if(!n.length)return OU.NoAds;const i=function computeDepth(e){let t=0,r=0;for(const{startTime:a,endTime:n}of e)a>=t?(++r,t=n):t=Math.min(t,n);return r}(n),o=i>3;for(const e of n)delete e.record
|
1142
|
+
;const s=function computeIdleTimes(e){let t=1/0;const r=[];for(let a=0;a<e.length;){const{startTime:n,endTime:i}=e[a];for(n-t>150&&r.push(n-t),t=i;++a<e.length&&e[a].startTime<t;)t=Math.max(t,e[a].endTime)}return r}(n),c=Math.max(...s),l=s.reduce(((e,t)=>e+t),0);return{numericValue:i,numericUnit:"unitless",score:o?0:1,displayValue:BU(jU.displayValue,{serialResources:i}),details:{size:n.length,depth:i,maxIdleTime:c,totalIdleTime:l,...AdRequestCriticalPath.makeTableDetails($U,n)}}}}wU.exports=AdRequestCriticalPath,wU.exports.UIStrings=jU;var qU={exports:{}};const zU=TF,VU=Ew,WU=Ao,{getAdStartTime:GU,getBidStartTime:HU,getPageStartTime:YU}=NF,{isAdRequest:KU,isBidRequest:JU}=mF;class LanternBidRequestTime extends zU{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e,a=zU.findNetworkTiming(r,JU).startTime;return a>zU.findNetworkTiming(r,KU).startTime?{timeInMs:-1,nodeTimings:r}:{timeInMs:a,nodeTimings:r}}}LanternBidRequestTime=WU(LanternBidRequestTime)
|
1143
|
+
;class BidRequestTime extends VU{static async computeSimulatedMetric(e,t){return LanternBidRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=YU(t),a=HU(t);if(GU(t)<a)return{timing:-1};return{timing:1e3*(a-r)}}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const XU=BidRequestTime=WU(BidRequestTime),ZU=oi,{auditNotApplicable:QU}=PO.exports,{Audit:ej}=XF,tj={title:"First bid request time",failureTitle:"Reduce time to send the first bid request",description:"This metric measures the elapsed time from the start of page load until the first bid request is made. Delayed bid requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bid-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"
|
1144
|
+
},rj=ZU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js",tj);qU.exports=class BidRequestFromPageStart extends ej{static get meta(){return{id:"bid-request-from-page-start",title:rj(tj.title),failureTitle:rj(tj.failureTitle),description:rj(tj.description),scoreDisplayMode:ej.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[ej.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[ej.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await XU.request(r,t);return n>0?{numericValue:n,numericUnit:"millisecond",score:ej.computeLogNormalScore(a,n),displayValue:rj(tj.displayValue,{timeInMs:n})}:QU.NoBids}},qU.exports.UIStrings=tj;var aj={exports:{}}
|
1145
|
+
;const nj=jF,ij=oi,{auditNotApplicable:oj,runWarning:sj}=PO.exports,{Audit:cj}=XF,lj={title:"First ad request time",failureTitle:"Reduce time to send the first ad request",description:"This metric measures the elapsed time from the start of page load until the first ad request is made. Delayed ad requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"},uj=ij.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js",lj);aj.exports=class AdRequestFromPageStart extends cj{static get meta(){return{id:"ad-request-from-page-start",title:uj(lj.title),failureTitle:uj(lj.failureTitle),description:uj(lj.description),scoreDisplayMode:cj.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{
|
1146
|
+
p10:6500,median:1e4},provided:{p10:1900,median:3500}}}static async audit(e,t){const r={trace:e.traces[cj.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[cj.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await nj.request(r,t);if(!(n>0)){const e=oj.NoAds;return e.runWarnings=[sj.NoAds],e}return{numericValue:n,numericUnit:"millisecond",score:cj.computeLogNormalScore(a,n),displayValue:uj(lj.displayValue,{timeInMs:n})}}},aj.exports.UIStrings=lj;var dj={exports:{}};const mj=oi,{auditNotApplicable:pj}=PO.exports,{Audit:hj}=XF,{isAdIframe:gj}=mF,fj={title:"No ad found at the very top of the viewport",failureTitle:"Move the top ad further down the page",
|
1147
|
+
description:"Over 10% of ads are never viewed because users scroll past them before they become viewable. By moving ad slots away from the very top of the viewport, users are more likely to see ads before scrolling away. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport).",failureDisplayValue:"A scroll of {valueInPx, number} px would hide half of your topmost ad",columnSlot:"Top Slot ID"},yj=mj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js",fj),vj=[{key:"slot",itemType:"text",text:yj(fj.columnSlot)}];class AdTopOfViewport extends hj{static get meta(){return{id:"ad-top-of-viewport",title:yj(fj.title),failureTitle:yj(fj.failureTitle),description:yj(fj.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter(gj).filter((e=>e.clientRect.width*e.clientRect.height>1&&!e.isPositionFixed)).map((e=>({
|
1148
|
+
midpoint:e.clientRect.top+e.clientRect.height/2,id:e.id})));if(!r.length)return pj.NoVisibleSlots;const a=r.reduce(((e,t)=>e.midpoint<t.midpoint?e:t)),n=a.midpoint<t.innerHeight;if(!n)return pj.NoAdsViewport;const i=n&&a.midpoint<100?0:1;return{score:i,numericValue:a.midpoint,numericUnit:"unitless",displayValue:i?"":yj(fj.failureDisplayValue,{valueInPx:a.midpoint}),details:AdTopOfViewport.makeTableDetails(vj,i?[]:[{slot:a.id}])}}}dj.exports=AdTopOfViewport,dj.exports.UIStrings=fj;var bj={exports:{}};function isBoxInViewport$1(e,t){const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return n<o&&i<s&&n<r&&i<a&&0<o&&0<s}var wj={boxViewableArea:function boxViewableArea(e,t){if(!isBoxInViewport$1(e,t))return 0;const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return(Math.min(o,r)-Math.max(n,0))*(Math.min(s,a)-Math.max(i,0))},isBoxInViewport:isBoxInViewport$1,overlaps:function overlaps$1(e,t){
|
1149
|
+
const r=!(e.right<t.left||t.right<e.left),a=!(e.bottom<t.top||t.bottom<e.top);return r&&a},toClientRect:function toClientRect$1([e,t,r,a]){return{left:e,top:t,width:r,height:a,right:e+r,bottom:t+a}}};const{auditNotApplicable:Sj}=PO.exports,{Audit:Tj}=XF,Ej=oi,{isBoxInViewport:xj}=wj,{isGptIframe:_j}=mF,Aj={title:"Few or no ads loaded outside viewport",failureTitle:"Avoid loading ads until they are nearly on-screen",description:"Too many ads loaded outside the viewport lowers viewability rates and impacts user experience. Consider loading ads below the fold lazily as the user scrolls down. Consider using GPT's [Lazy Loading API](https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad). [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport).",failureDisplayValue:"{hiddenAds, plural, =1 {1 ad} other {# ads}} out of view",columnSlot:"Slots Outside Viewport"
|
1150
|
+
},Rj=Ej.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js",Aj),kj=[{key:"slot",itemType:"text",text:Rj(Aj.columnSlot)}];class AdsInViewport extends Tj{static get meta(){return{id:"ads-in-viewport",title:Rj(Aj.title),failureTitle:Rj(Aj.failureTitle),description:Rj(Aj.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>_j(e)&&e.clientRect.height*e.clientRect.width>1));if(!r.length)return Sj.NoVisibleSlots;const a=r.filter((e=>!xj(e.clientRect,t))).map((e=>({slot:e.id}))).sort(((e,t)=>e.slot.localeCompare(t.slot)));return{numericValue:(r.length-a.length)/r.length,numericUnit:"unitless",score:a.length>3?0:1,displayValue:a.length?Rj(Aj.failureDisplayValue,{hiddenAds:a.length}):"",details:AdsInViewport.makeTableDetails(kj,a)}}}bj.exports=AdsInViewport,bj.exports.UIStrings=Aj;var Dj={exports:{}};var Cj={count:function count(e,t){let r=0
|
1151
|
+
;for(const a of e)t(a)&&r++;return r},bucket:function bucket$1(e,t){const r=new Map;for(const a of e){const e=t(a);if(null!=e){const t=r.get(e)||[];t.push(a),r.set(e,t)}}return r},flatten:function flatten(e){const t=[];for(const r of e)t.push(...r);return t}};const Ij=Cj,Nj=oi,Lj=HT,Mj=Lo,{auditNotApplicable:Pj}=PO.exports,{Audit:Oj}=XF,{isAdTag:Fj,isStaticRequest:Uj}=mF,{URL:jj}=Gn,Bj={title:"Ad tag is loaded asynchronously",failureTitle:"Load ad tag asynchronously",description:"Loading the ad tag synchronously blocks content rendering until the tag is fetched and loaded. Consider using the `async` attribute to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags)."},$j=Nj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js",Bj);function isAsync(e){return"Low"==e.priority||Uj(e)}Dj.exports=class AsyncAdTags extends Oj{static get meta(){return{
|
1152
|
+
id:"async-ad-tags",title:$j(Bj.title),failureTitle:$j(Bj.failureTitle),description:$j(Bj.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[Oj.DEFAULT_PASS],a=await Mj.request(r,t),n=await Lj.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>Fj(new jj(e.url)))).filter((e=>e.frameId===n.frameId));if(!i.length)return Pj.NoTag;const o=Ij.count(i,isAsync)-i.length;return{score:Number(0===o),numericValue:o,numericUnit:"unitless"}}},Dj.exports.UIStrings=Bj;var qj={exports:{}};const zj=on.default,Vj=Ao,Wj=Yp,Gj=Xp;zj.warn("trace-of-tab","trace-of-tab is deprecated, use processed-trace / processed-navigation instead");var Hj=Vj(class TraceOfTab$1{static async compute_(e,t){const r=await Wj.request(e,t),a=await Gj.request(r,t);return{...r,...a}}},null);const Yj=oi,Kj=Lo,Jj=Hj,{auditNotApplicable:Xj}=PO.exports,{Audit:Zj}=XF,{computeAdRequestWaterfall:Qj}=MU,{getTimingsByRecord:eB}=NF,tB={title:"Ads not blocked by load events",
|
1153
|
+
failureTitle:"Avoid waiting on load events",description:"Waiting on load events increases ad latency. To speed up ads, eliminate the following load event handlers. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/blocking-load-events).",displayValue:"{timeInMs, number, seconds} s blocked",columnEvent:"Event Name",columnTime:"Event Time",columnScript:"Script",columnBlockedUrl:"Blocked URL",columnFunctionName:"Function"},rB=Yj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js",tB),aB=[{key:"eventName",itemType:"text",text:rB(tB.columnEvent)},{key:"time",itemType:"ms",text:rB(tB.columnTime),granularity:1},{key:"url",itemType:"url",text:rB(tB.columnScript)},{key:"functionName",itemType:"text",text:rB(tB.columnFunctionName)}];function findOriginalCallFrame(e){const{record:t}=e;let r=t&&t.initiator&&t.initiator.stack;if(r){for(;r.parent;)r=r.parent;return r.callFrames[r.callFrames.length-1]}}
|
1154
|
+
function findTraceEventOfCallFrame(e,t){return t.find((t=>"FunctionCall"==t.name&&t.args.data&&t.args.data.functionName==e.functionName&&t.args.data.scriptId==e.scriptId&&t.args.data.url==e.url&&Math.abs(t.args.data.lineNumber==e.lineNumber)<2&&Math.abs(t.args.data.columnNumber==e.columnNumber)<2))}function findEventIntervals(e,t){let r={};const a=[];for(const n of t)n.name==`${e}EventStart`?r={start:n.ts,end:1/0,eventName:e}:n.name==`${e}EventEnd`&&(r.end=n.ts,a.push(r));return a}function quantifyBlockedTime(e,t,r){const a=t.find((t=>t.url==e.url)),n=t.find((t=>t.url==e.blockedUrl));if(!a||!n)return 0;const i=r.get(a),o=r.get(n);return i&&o?o.startTime-i.endTime:0}class BlockingLoadEvents extends Zj{static get meta(){return{id:"blocking-load-events",title:rB(tB.title),failureTitle:rB(tB.failureTitle),description:rB(tB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
|
1155
|
+
const r=e.traces[Zj.DEFAULT_PASS],a=e.devtoolsLogs[Zj.DEFAULT_PASS],n=await Kj.request(a,t),{timings:i,processEvents:o}=await Jj.request(r,t),s=await eB(r,a,t),c=(await Qj(r,a,t)).sort(((e,t)=>e.startTime-t.startTime));if(!c.length)return Xj.NoAdRelatedReq;const l=[...findEventIntervals("domContentLoaded",o),...findEventIntervals("load",o)],u=[],d=new Set;for(const e of c){const t=findOriginalCallFrame(e);if(!t)continue;const r=JSON.stringify(t);if(d.has(r))continue;d.add(r);const a=findTraceEventOfCallFrame(t,o);if(!a)continue;const c=l.find((e=>e.start<=a.ts&&a.ts<=e.end));if(c){const r=Object.assign({eventName:c.eventName,blockedUrl:e.url,time:i[c.eventName],blockedTime:1/0},t);r.blockedTime=quantifyBlockedTime(r,n,s),u.push(r)}}const m=u.length>0;let p=0;return m&&(p=Math.min(...u.map((e=>e.blockedTime)))),{numericValue:u.length,numericUnit:"unitless",score:m?0:1,displayValue:m&&p?rB(tB.displayValue,{timeInMs:p}):"",details:BlockingLoadEvents.makeTableDetails(aB,u)}}}
|
1156
|
+
qj.exports=BlockingLoadEvents,qj.exports.UIStrings=tB;var nB={exports:{}};const iB=oi,{auditNotApplicable:oB}=PO.exports,{Audit:sB}=XF,{computeAdRequestWaterfall:cB}=MU,{isAdScript:lB,toURL:uB}=mF,dB={title:"No bottleneck requests found",failureTitle:"Avoid bottleneck requests",description:"Speed up, load earlier, parallelize, or eliminate the following requests and their dependencies in order to speed up ad loading. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bottleneck-requests).",displayValue:"{blockedTime, number, seconds} s spent blocked on requests",columnUrl:"Blocking Request",columnInitiatorUrl:"Initiator Request",columnStartTime:"Start",columnSelfTime:"Exclusive Time",columnDuration:"Total Time"},mB=iB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js",dB),pB=[{key:"url",itemType:"url",text:mB(dB.columnUrl)},{key:"selfTime",itemType:"ms",text:mB(dB.columnSelfTime),granularity:1},{
|
1157
|
+
key:"duration",itemType:"ms",text:mB(dB.columnDuration),granularity:1}];class BottleneckRequests extends sB{static get meta(){return{id:"bottleneck-requests",title:mB(dB.title),failureTitle:mB(dB.failureTitle),description:mB(dB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[sB.DEFAULT_PASS],a=e.devtoolsLogs[sB.DEFAULT_PASS],n=(await cB(r,a,t)).filter((e=>e.startTime>0));if(!n.length)return oB.NoAdRelatedReq;const cost=e=>3*e.selfTime+e.duration,i=n.filter((e=>!lB(uB(e.url))&&(e.selfTime>250||e.duration>1e3))).sort(((e,t)=>cost(t)-cost(e))).slice(0,5),o=i.reduce(((e,t)=>e+t.selfTime),0)/1e3,s=1e3*o>1e3;for(const e of i)delete e.record;return{numericValue:i.length,numericUnit:"unitless",score:s?0:1,displayValue:s?mB(dB.displayValue,{blockedTime:o}):"",details:BottleneckRequests.makeTableDetails(pB,i)}}}nB.exports=BottleneckRequests,nB.exports.UIStrings=dB;var hB={exports:{}}
|
1158
|
+
;const gB=oi,fB=HT,yB=Lo,vB=Ki,{auditNotApplicable:bB}=PO.exports,{Audit:wB}=XF,{containsAnySubstring:SB}=mF,{URL:TB}=Gn,EB={title:"No duplicate tags found",failureTitle:"Load tags only once",description:"Loading a tag more than once in the same page is redundant and adds overhead without benefit. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags).",failureDisplayValue:"{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}",columnScript:"Script",columnNumReqs:"Duplicate Requests",columnFrameId:"Frame ID"},xB=gB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js",EB),_B=["googletagservices.com/tag/js/gpt.js","securepubads.g.doubleclick.net/tag/js/gpt.js","pagead2.googlesyndication.com/pagead/js/adsbygoogle.js","pagead2.googlesyndication.com/pagead/js/show_ads.js","cdn.ampproject.org/v0/amp-ad-0.1.js"],AB=[{key:"script",itemType:"url",text:xB(EB.columnScript)},{key:"numReqs",
|
1159
|
+
itemType:"text",text:xB(EB.columnNumReqs)}];class DuplicateTags extends wB{static get meta(){return{id:"duplicate-tags",title:xB(EB.title),failureTitle:xB(EB.failureTitle),description:xB(EB.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[wB.DEFAULT_PASS],a=await yB.request(r,t),n=await fB.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>e.frameId===n.frameId)).filter((e=>SB(e.url,_B))).filter((e=>e.resourceType===vB.TYPES.Script));if(!i.length)return bB.NoTags;const o=new Map;for(const e of i){const t=new TB(e.url).pathname,r=o.get(t)||0;o.set(t,r+1)}const s=[];for(const[e,t]of o)t>1&&s.push({script:e,numReqs:t});return{numericValue:s.length,numericUnit:"unitless",score:s.length?0:1,details:DuplicateTags.makeTableDetails(AB,s),displayValue:s.length?xB(EB.failureDisplayValue,{duplicateTags:s.length}):""}}}hB.exports=DuplicateTags,hB.exports.UIStrings=EB;var RB={exports:{}}
|
1160
|
+
;const kB=TF,DB=Ew,CB=Ao,{getPageStartTime:IB,getImpressionStartTime:NB}=NF,{isImpressionPing:LB}=mF;class LanternAdRenderTime extends kB{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:kB.findNetworkTiming(r,(e=>!!e.url&&LB(new URL(e.url)))).startTime,nodeTimings:r}}}LanternAdRenderTime=CB(LanternAdRenderTime);class AdRenderTime extends DB{static async computeSimulatedMetric(e,t){return LanternAdRenderTime.request(e,t)}static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=IB(r),n=1e3*(NB(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const MB=AdRenderTime=CB(AdRenderTime),PB=oi,{auditNotApplicable:OB,runWarning:FB}=PO.exports,{Audit:UB}=XF,jB={title:"Latency of first ad render",failureTitle:"Reduce time to render first ad",
|
1161
|
+
description:"This metric measures the time for the first ad iframe to render from page navigation. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/first-ad-render).",displayValue:"{timeInMs, number, seconds} s"},BB=PB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js",jB);RB.exports=class FirstAdRender extends UB{static get meta(){return{id:"first-ad-render",title:BB(jB.title),failureTitle:BB(jB.failureTitle),description:BB(jB.description),scoreDisplayMode:UB.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:12900,median:22e3},provided:{p10:2750,median:3700}}}static async audit(e,t){const r=e.traces[UB.DEFAULT_PASS],a={devtoolsLog:e.devtoolsLogs[UB.DEFAULT_PASS],trace:r,settings:t.settings},{timing:n}=await MB.request(a,t);if(!(n>0)){const e=OB.NoAdRendered;return e.runWarnings=[FB.NoAdRendered],e}
|
1162
|
+
const i=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"];return{numericValue:n,numericUnit:"millisecond",score:UB.computeLogNormalScore(i,n),displayValue:BB(jB.displayValue,{timeInMs:n})}}},RB.exports.UIStrings=jB;var $B={exports:{}};const qB=oi,zB=Lo,{auditNotApplicable:VB}=PO.exports,{Audit:WB}=XF,{isAdRequest:GB}=mF,{URL:HB}=Gn,YB={title:"Ad slots effectively use horizontal space",failureTitle:"Increase the width of ad slots",description:"Ad slots that utilize most of the page width generally experience increased click-through rate over smaller ad sizes. We recommend leaving no more than 25% of the viewport width unutilized on mobile devices.",failureDisplayValue:"{percentUnused, number, percent} of viewport width is underutilized"},KB=qB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js",YB);$B.exports=class FullWidthSlots extends WB{static get meta(){return{id:"full-width-slots",title:KB(YB.title),
|
1163
|
+
failureTitle:KB(YB.failureTitle),description:KB(YB.description),requiredArtifacts:["ViewportDimensions","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[WB.DEFAULT_PASS],a=await zB.request(r,t),n=e.ViewportDimensions.innerWidth,i=a.filter(GB).map((e=>new HB(e.url)));if(!i.length)return VB.NoAds;const o=i.map((e=>e.searchParams.get("prev_iu_szs")||e.searchParams.get("sz"))).join("|").split(/[|,]/).map((e=>parseInt(e.split("x")[0]))).filter((e=>e<=n&&e>1));if(!o.length)return VB.NoValidAdWidths;const s=1-Math.max(...o)/n,c=s>.25?0:1;return{score:c,numericValue:s,numericUnit:"unitless",displayValue:c?"":KB(YB.failureDisplayValue,{percentUnused:s})}}},$B.exports.UIStrings=YB;var JB={exports:{}};const XB=Lo,{assert:ZB}=SU,{auditNotApplicable:QB}=PO.exports,{Audit:e$}=XF,{getCriticalGraph:t$}=MU,{getTimingsByRecord:r$}=NF,{isGptImplTag:a$,isBidRequest:n$,getHeaderBidder:i$}=mF,o$={title:"GPT and bids loaded in parallel",failureTitle:"Load GPT and bids in parallel",
|
1164
|
+
description:"To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-bids-parallel).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},s$=[{key:"bidder",itemType:"text",text:o$.columnBidder},{key:"url",itemType:"url",text:o$.columnUrl},{key:"startTime",itemType:"ms",text:o$.columnStartTime},{key:"duration",itemType:"ms",text:o$.columnDuration}];class GptBidsInParallel extends e${static get meta(){return{id:"gpt-bids-parallel",title:o$.title,failureTitle:o$.failureTitle,description:o$.description,requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[e$.DEFAULT_PASS],a=e.traces[e$.DEFAULT_PASS],n=await XB.request(r,t),i=n.find((e=>a$(e.url)));if(!i)return QB.NoGpt
|
1165
|
+
;const o=n.filter(n$).filter((e=>e.frameId==i.frameId));if(!o.length)return QB.NoBids;const s=await r$(a,r,t),c=[],l=new Set;for(const e of o)if(t$(n,a.traceEvents,e).has(i)){const{startTime:t,endTime:r}=s.get(e)||e,a=ZB(i$(e.url));if(l.has(a))continue;l.add(a),c.push({bidder:a,url:e.url,startTime:t,duration:r-t})}const u=c.length>0;return{numericValue:c.length,numericUnit:"unitless",score:u?0:1,details:u?GptBidsInParallel.makeTableDetails(s$,c):void 0}}}JB.exports=GptBidsInParallel,JB.exports.UIStrings=o$;var c$={exports:{}};const l$=oi,u$=Lo,{auditNotApplicable:d$}=PO.exports,{Audit:m$}=XF,{isGptTag:p$}=mF,{URL:h$}=Gn,g$={title:"GPT tag is loaded from an official source",failureTitle:"Load GPT from an official source",description:"Load GPT from 'securepubads.g.doubleclick.net' for standard integrations or from 'pagead2.googlesyndication.com' for limited ads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-official-source)."
|
1166
|
+
},f$=l$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source.js",g$);c$.exports=class LoadsGptFromOfficalSource extends m${static get meta(){return{id:"loads-gpt-from-official-source",title:f$(g$.title),failureTitle:f$(g$.failureTitle),description:f$(g$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[m$.DEFAULT_PASS],a=(await u$.request(r,t)).map((e=>new h$(e.url))).find(p$);if(!a)return d$.NoGpt;const n=["securepubads.g.doubleclick.net","pagead2.googlesyndication.com"].includes(a.host);return{score:Number(n),numericValue:Number(!n),numericUnit:"unitless"}}},c$.exports.UIStrings=g$;var y$={exports:{}};const v$=oi,b$=Lo,{auditNotApplicable:w$}=PO.exports,{Audit:S$}=XF,{isAdTag:T$}=mF,{URL:E$}=Gn,x$={title:"Ad tag is loaded over HTTPS",failureTitle:"Load ad tag over HTTPS",
|
1167
|
+
description:'For privacy and security, always load GPT/AdSense over HTTPS. Insecure pages should explicitly request the ad script securely. GPT Example: `<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js">` AdSense Example: `<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">`. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https).'},_$=v$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js",x$);y$.exports=class LoadsAdTagOverHttps extends S${static get meta(){return{id:"loads-ad-tag-over-https",title:_$(x$.title),failureTitle:_$(x$.failureTitle),description:_$(x$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[S$.DEFAULT_PASS],a=await b$.request(r,t);if(!a.find((e=>200==e.statusCode)))return w$.NoRecords;const n=a.filter((e=>T$(new E$(e.url)))),i=n.filter((e=>e.isSecure)),o={
|
1168
|
+
type:"debugdata",numAdTagHttpReqs:n.length-i.length,numAdTagHttpsReqs:i.length};if(!n.length){const e=w$.NoTag;return e.details=o,e}return{numericValue:o.numAdTagHttpReqs,score:o.numAdTagHttpReqs?0:1,details:o}}},y$.exports.UIStrings=x$;var A$={exports:{}};const R$=Cj,k$=oi,D$=eb,{auditNotApplicable:C$}=PO.exports,{Audit:I$}=XF,{computeAdRequestWaterfall:N$}=MU,{getScriptEvaluationTimes:L$}=NF,M$={title:"Ad scripts are loaded statically",failureTitle:"Load ad scripts statically",description:"Load the following scripts directly with `<script async src=...>` instead of injecting scripts with JavaScript. Doing so allows the browser to preload scripts sooner. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags).",failureDisplayValue:"Load {tags, plural, =1 {1 script} other {# scripts}} statically",columnUrl:"Script",columnLoadTime:"Load Time"
|
1169
|
+
},P$=k$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js",M$),O$=[{key:"url",itemType:"url",text:P$(M$.columnUrl)},{key:"loadTime",itemType:"ms",granularity:1,text:P$(M$.columnLoadTime)}],F$=[/amazon-adsystem\.com\/aax2\/apstag.js/,/js-sec\.indexww\.com\/ht\/p\/.*\.js/,/pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,/static\.criteo\.net\/js\/.*\/publishertag\.js/,/www\.googletagservices\.com\/tag\/js\/gpt\.js/,/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/,/cdn\.ampproject\.org\/v0\/amp-ad-\d+\.\d+\.js/];function initiatedByInlineScript(e){if("script"!==e.initiator.type)return!1;const t=D$.getNetworkInitiators(e);return 1===t.length&&t[0]===e.documentURL}class StaticAdTags extends I${static get meta(){return{id:"script-injected-tags",title:P$(M$.title),failureTitle:P$(M$.failureTitle),description:P$(M$.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
|
1170
|
+
const r=await async function findStaticallyLoadableTags(e,t){const r=e.devtoolsLogs[I$.DEFAULT_PASS],a=e.traces[I$.DEFAULT_PASS],n=[],i=await N$(a,r,t);for(const{record:e}of i)e&&"Script"===e.resourceType&&(initiatedByInlineScript(e)||F$.find((t=>e.url.match(t))))&&n.push(e);return n}(e,t);if(!r.length)return C$.NoTag;const a=new Set,n=[],i=e.devtoolsLogs[I$.DEFAULT_PASS],o=e.traces[I$.DEFAULT_PASS],s=await L$(o,i,t);for(const e of r){if(a.has(e.url))continue;a.add(e.url);const t=r.filter((t=>t.url===e.url));if(0===R$.count(t,(e=>"parser"===e.initiator.type&&!e.isLinkPreload))){const t=s.get(e.url)||0;if(t<400)continue;n.push({url:e.url,loadTime:t})}}n.sort(((e,t)=>e.loadTime-t.loadTime));const c=n.length>0;return{displayValue:c?P$(M$.failureDisplayValue,{tags:n.length}):"",score:Number(!c),numericValue:n.length,numericUnit:"unitless",details:StaticAdTags.makeTableDetails(O$,n)}}}A$.exports=StaticAdTags,A$.exports.UIStrings=M$;var U$={exports:{}}
|
1171
|
+
;const j$=jF,B$=oi,$$=HT,q$=Lo,{auditNotApplicable:z$}=PO.exports,{Audit:V$}=XF,{bucket:W$}=Cj,{getTimingsByRecord:G$}=NF,{isCacheable:H$}=sF,{isGoogleAds:Y$,getHeaderBidder:K$}=mF,{URL:J$}=Gn,X$={title:"Header bidding is parallelized",failureTitle:"Parallelize bid requests",description:"Send header bidding requests simultaneously, rather than serially, to retrieve bids more quickly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},Z$=B$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js",X$),Q$=[{key:"bidder",itemType:"text",text:Z$(X$.columnBidder)},{key:"url",itemType:"url",text:Z$(X$.columnUrl)},{key:"startTime",itemType:"ms",text:Z$(X$.columnStartTime)},{key:"duration",itemType:"ms",text:Z$(X$.columnDuration)}],tq="ad",rq="bid",aq="unknown";function checkRecordType(e){
|
1172
|
+
return Y$(new J$(e.url))?tq:K$(e.url)?rq:aq}function isPossibleBid(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&e.endTime-e.startTime>=.05&&!H$(e)}function clearQueryString(e){const t=new J$(e);return t.search="",t.toString()}class SerialHeaderBidding extends V${static get meta(){return{id:"serial-header-bidding",title:Z$(X$.title),failureTitle:Z$(X$.failureTitle),description:Z$(X$.description),requiredArtifacts:["devtoolsLogs","traces","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[V$.DEFAULT_PASS],a=e.traces[V$.DEFAULT_PASS],n=await q$.request(r,t);if(!n.length)return z$.NoRecords;const i=await $$.request({URL:e.URL,devtoolsLog:r},t),o=n.filter(isPossibleBid).filter((e=>e.frameId==i.frameId)),s=W$(o,checkRecordType);if(!s.has(rq))return z$.NoBids;const c={trace:a,devtoolsLog:r,settings:t.settings},{timing:l}=await j$.request(c,t),u=await G$(a,r,t),d=function constructRecords(e,t,r){const a=[];for(const n of e){const e=r.get(n)
|
1173
|
+
;e&&a.push(Object.assign({},e,{url:n.url,type:t}))}return a}(s.get(rq)||[],rq,u);let m,p=[];for(const e of d)l>0&&e.endTime>l||(e.bidder=K$(e.url),e.url=clearQueryString(e.url),m&&e.startTime>=m.endTime&&(p.push(m),p.push(e)),(!m||e.endTime<m.endTime||e.startTime>=m.endTime)&&(m=e));p=Array.from(new Set(p));const h=p.length>1;return{numericValue:Number(h),numericUnit:"unitless",score:h?0:1,details:h?SerialHeaderBidding.makeTableDetails(Q$,p):void 0}}}U$.exports=SerialHeaderBidding,U$.exports.UIStrings=X$;var nq={exports:{}};const iq=TF,oq=Ew,sq=Ao,{getPageStartTime:cq,getTagEndTime:lq}=NF,{isImplTag:uq}=mF,{URL:dq}=Gn;class LanternTagLoadTime extends iq{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:iq.findNetworkTiming(r,(e=>!!e.url&&uq(new dq(e.url)))).endTime,nodeTimings:r}}}LanternTagLoadTime=sq(LanternTagLoadTime);class TagLoadTime$1 extends oq{static async computeSimulatedMetric(e,t){return LanternTagLoadTime.request(e,t)}
|
1174
|
+
static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=cq(r),n=1e3*(lq(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const mq=TagLoadTime$1=sq(TagLoadTime$1),pq=oi,{auditNotApplicable:hq,runWarning:gq}=PO.exports,{Audit:fq}=XF,yq={title:"Tag load time",failureTitle:"Reduce tag load time",description:"This metric measures the time for the ad tag's implementation script (pubads_impl.js for GPT; adsbygoogle.js for AdSense) to load after the page loads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/tag-load-time).",displayValue:"{timeInMs, number, seconds} s"},vq=pq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js",yq);nq.exports=class TagLoadTime extends fq{static get meta(){return{id:"tag-load-time",title:vq(yq.title),failureTitle:vq(yq.failureTitle),description:vq(yq.description),
|
1175
|
+
scoreDisplayMode:fq.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[fq.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[fq.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await mq.request(r,t);if(!(n>0)){const e=hq.NoTag;return e.runWarnings=[gq.NoTag],e}return{numericValue:n,numericUnit:"millisecond",score:fq.computeLogNormalScore(a,n),displayValue:vq(yq.displayValue,{timeInMs:n})}}},nq.exports.UIStrings=yq;var bq={exports:{}};const wq=oi,{auditNotApplicable:Sq,auditError:Tq}=PO.exports,{Audit:Eq}=XF,{isAdIframe:xq}=mF,_q={title:"Ads to page-height ratio is within recommended range",failureTitle:"Reduce ads to page-height ratio",
|
1176
|
+
description:"The ads to page-height ratio can impact user experience and ultimately user retention. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density).",displayValue:"{adDensity, number, percent} ads to page-height ratio"},Aq=wq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js",_q);bq.exports=class ViewportAdDensity extends Eq{static get meta(){return{id:"viewport-ad-density",title:Aq(_q.title),failureTitle:Aq(_q.failureTitle),description:Aq(_q.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>xq(e)&&e.clientRect.width*e.clientRect.height>1));if(!r.length)return Sq.NoVisibleSlots;if(t.innerHeight<=0)throw new Error(Tq.ViewportAreaZero);const a=function computeAdLength(e,t){
|
1177
|
+
const r=new Set([...e.map((e=>e.clientRect.left)),...e.map((e=>e.clientRect.right))].map((e=>Math.min(Math.max(1,e),t.innerWidth-1))));e=e.sort(((e,t)=>e.clientRect.top!==t.clientRect.top?e.clientRect.top-t.clientRect.top:e.clientRect.bottom-t.clientRect.bottom));let a=0;for(const t of r){let r=0,n=0;for(const a of e){if(t<a.clientRect.left||t>a.clientRect.right)continue;if(a.isPositionFixed){r+=a.clientRect.height;continue}const e=a.clientRect.bottom-Math.max(n,a.clientRect.top);e>0&&(r+=e),n=Math.max(n,a.clientRect.bottom)}a=Math.max(a,r)}return a}(r,t),n=Math.max(...r.map((e=>e.clientRect.top+e.clientRect.height/2)))+t.innerHeight,i=Math.min(1,a/n);return{score:i>.3?0:1,numericValue:i,numericUnit:"unitless",displayValue:Aq(_q.displayValue,{adDensity:i})}}},bq.exports.UIStrings=_q;var Rq={exports:{}};const kq=oi,{auditNotApplicable:Dq}=PO.exports,{Audit:Cq}=XF,{getScriptUrl:Iq}=NF,{isAdIframe:Nq,isAdRelated:Lq,isImplTag:Mq}=mF,{overlaps:Pq,toClientRect:Oq}=wj,Fq={
|
1178
|
+
title:"Cumulative ad shift",failureTitle:"Reduce ad-related layout shift",description:"Measures layout shifts that were caused by ads or happened near ads. Reducing cumulative ad-related layout shift will improve user experience. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/cumulative-ad-shift)."},Uq=kq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift.js",Fq);Rq.exports=class CumulativeAdShift extends Cq{static get meta(){return{id:"cumulative-ad-shift",title:Uq(Fq.title),failureTitle:Uq(Fq.failureTitle),description:Uq(Fq.description),scoreDisplayMode:Cq.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","IFrameElements"]}}static get defaultOptions(){return{p10:.05,median:.25}}static isAdExpansion(e,t){if(!e.args||!e.args.data)return!1;for(const r of e.args.data.impacted_nodes||[]){const e=Oq(r.old_rect||[]),a=Oq(r.new_rect||[]);if(!(e.top>a.top||e.height!==a.height))for(const r of t){
|
1179
|
+
const t=r.clientRect;if((e.top>=t.top||a.top>=t.bottom)&&Pq(e,t))return!0}}return!1}static isAttributableToTask(e,t){if(!e.args||!e.args.data)return!1;return!!t.find((t=>t.ts<e.ts&&e.ts-t.ts<5e4))}static compute(e,t,r,a){let n=0,i=0,o=0,s=0,c=0,l=0;for(const u of e)u.args&&u.args.data&&u.args.data.is_main_frame&&(n+=u.args.data.score,i++,(this.isAdExpansion(u,r)||this.isAttributableToTask(u,t))&&(o+=u.args.data.score,s++,u.ts<a&&(c+=u.args.data.score,l++)));return{cumulativeShift:n,numShifts:i,cumulativeAdShift:o,numAdShifts:s,cumulativePreImplTagAdShift:c,numPreImplTagAdShifts:l}}static getLayoutShiftEventsByWindow(e){let t=0,r=[],a=0,n=[];for(const i of e){if("LayoutShift"!==i.name||!i.args||!i.args.data)continue;if(n.length){const e=n[0],o=n[n.length-1];(o.ts-e.ts>5e6||i.ts-o.ts>1e6)&&(a>t&&(r=n,t=a),n=[],a=0)}n.push(i);const e=i.args.data;a+=e.weighted_score_delta||e.score||0}return r.length||(r=n),r}static async audit(e,t){
|
1180
|
+
const r=e.traces[Cq.DEFAULT_PASS],a=this.getLayoutShiftEventsByWindow(r.traceEvents);if(!a.length)return Dq.NoLayoutShifts;const n=r.traceEvents.filter((e=>Lq(Iq(e)||""))),i=n.find((e=>Mq(Iq(e)||"")))||{ts:1/0},o=e.IFrameElements.filter(Nq),s=this.compute(a,n,o,i.ts),c=s.cumulativeAdShift;return o.length||c?{numericValue:c,numericUnit:"unitless",score:Cq.computeLogNormalScore({p10:t.options.p10,median:t.options.median},c),displayValue:c.toLocaleString(t.settings.locale),details:s}:Dq.NoAdRendered}},Rq.exports.UIStrings=Fq;var jq={exports:{}};const Bq=oi,$q=Lo,{auditNotApplicable:qq}=PO.exports,{Audit:zq}=XF,{isGpt:Vq,isGptImplTag:Wq}=mF,Gq={title:"Deprecated GPT API Usage",failureTitle:"Avoid deprecated GPT APIs",description:"Deprecated GPT API methods should be avoided to ensure your page is tagged correctly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/deprecated-gpt-api-usage).",
|
1181
|
+
displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},Hq=Bq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/deprecated-api-usage.js",Gq);jq.exports=class DeprecatedApiUsage extends zq{static get meta(){return{id:"deprecated-gpt-api-usage",title:Hq(Gq.title),failureTitle:Hq(Gq.failureTitle),description:Hq(Gq.description),scoreDisplayMode:"informative",requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[zq.DEFAULT_PASS];if(!(await $q.request(r,t)).find((e=>Wq(e.url))))return qq.NoGpt;const a=e.ConsoleMessages.filter((e=>"warning"===e.level||"error"===e.level)).filter((e=>e.url&&Vq(e.url))).filter((e=>e.text.toLowerCase().includes("deprecated")||e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:Hq(Bq.UIStrings.columnURL)},{
|
1182
|
+
key:"description",itemType:"code",text:Hq(Bq.UIStrings.columnDescription)}],i=zq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:Hq(Gq.displayValue,{numErrors:o})}}},jq.exports.UIStrings=Gq;var Yq={exports:{}};const Kq=oi,Jq=Lo,{auditNotApplicable:Xq}=PO.exports,{Audit:Zq}=XF,{isGpt:Qq,isGptImplTag:ez}=mF,tz={title:"GPT Errors",failureTitle:"Fix GPT errors",description:"Fix GPT errors to ensure your page is tagged as intended. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-errors-overall).",displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},rz=Kq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/gpt-errors-overall.js",tz);Yq.exports=class GptErrorsOverall extends Zq{static get meta(){return{id:"gpt-errors-overall",title:rz(tz.title),failureTitle:rz(tz.failureTitle),description:rz(tz.description),scoreDisplayMode:"informative",
|
1183
|
+
requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[Zq.DEFAULT_PASS];if(!(await Jq.request(r,t)).find((e=>ez(e.url))))return Xq.NoGpt;const a=e.ConsoleMessages.filter((e=>"error"===e.level||"warning"===e.level)).filter((e=>e.url&&Qq(e.url))).filter((e=>!e.text.toLowerCase().includes("deprecated")&&!e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:rz(Kq.UIStrings.columnURL)},{key:"description",itemType:"code",text:rz(Kq.UIStrings.columnDescription)}],i=Zq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:rz(tz.displayValue,{numErrors:o})}}},Yq.exports.UIStrings=tz;var az={exports:{}};const nz=oi,iz=JF,oz=Lo,{auditNotApplicable:sz}=PO.exports,{Audit:cz}=XF,{getAttributableUrl:lz}=BF,{isAdRelated:uz,getNameOrTld:dz}=mF,mz={
|
1184
|
+
title:"Total ad JS blocking time",failureTitle:"Reduce ad JS blocking time",description:"Ad-related scripts are blocking the main thread. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/total-ad-blocking-time).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",columnName:"Name",columnBlockingTime:"Blocking Time"},pz=nz.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time.js",mz),hz=[{key:"name",itemType:"text",text:pz(mz.columnName)},{key:"blockingTime",itemType:"ms",text:pz(mz.columnBlockingTime),granularity:1}];class TotalAdBlockingTime extends cz{static get meta(){return{id:"total-ad-blocking-time",title:pz(mz.title),failureTitle:pz(mz.failureTitle),description:pz(mz.description),requiredArtifacts:["traces","devtoolsLogs"]}}static get defaultOptions(){return{simulate:{p10:290,median:600},provided:{p10:150,median:350}}}static async audit(e,t){
|
1185
|
+
const r=e.traces[cz.DEFAULT_PASS],a=e.devtoolsLogs[cz.DEFAULT_PASS];if(!(await oz.request(a,t)).find((e=>uz(e.url))))return sz.NoAdRelatedReq;const n={trace:r,devtoolsLog:a,settings:t.settings};let i=[];try{i=await iz.request(n,t)}catch(e){return sz.InvalidTiming}let o=0;const s=new Map;for(const e of i){const t=lz(e);if(!t||!uz(t))continue;if(e.parent)continue;const r=e.duration-50;o+=r;const a=dz(t),n=s.get(a)||0;s.set(a,n+r)}const c=[];for(const[e,t]of s.entries())c.push({name:e,blockingTime:t});c.sort(((e,t)=>t.blockingTime-e.blockingTime));const l=t.options[t.settings.throttlingMethod]||t.options.provided;return{score:cz.computeLogNormalScore(l,o),numericValue:o,numericUnit:"millisecond",displayValue:pz(mz.failureDisplayValue,{timeInMs:o}),details:TotalAdBlockingTime.makeTableDetails(hz,c)}}}az.exports=TotalAdBlockingTime,az.exports.UIStrings=mz;const gz=bn,fz=la,yz=mn,vz=Tu,bz=xu,wz=pu,Sz=oi,Tz=Su;function isBundledEnvironment(){
|
1186
|
+
if(globalThis.isDevtools||globalThis.isLightrider)return!0;try{return require.resolve("lighthouse-logger"),!1}catch(e){return!0}}const mergeOptionsOfItems=function(e){const t=[];for(const r of e){const e=r.path&&t.find((e=>e.path===r.path));e?e.options=Object.assign({},e.options,r.options):t.push(r)}return t};const Ez=function _mergeConfigFragment(e,t,r=!1){if(null==e)return t;if(void 0===t)return e;if(Array.isArray(t)){if(r)return t;if(!Array.isArray(e))throw new TypeError("Expected array but got "+typeof e);const a=e.slice();return t.forEach((e=>{a.some((t=>fz(t,e)))||a.push(e)})),a}if("object"==typeof t){if("object"!=typeof e)throw new TypeError("Expected object but got "+typeof e);if(Array.isArray(e))throw new TypeError("Expected object but got Array");return Object.keys(t).forEach((a=>{const n=r||"settings"===a&&"object"==typeof e[a];e[a]=_mergeConfigFragment(e[a],t[a],n)})),e}return t}
|
1187
|
+
;const xz=new Map([["../gather/gatherers/accessibility",ku],["../gather/gatherers/anchor-elements",Lu],["../gather/gatherers/cache-contents",Pu],["../gather/gatherers/console-messages",Fu],["../gather/gatherers/css-usage",$u],["../gather/gatherers/devtools-log-compat",Vu],["../gather/gatherers/devtools-log",Ws],["../gather/gatherers/dobetterweb/doctype",Gu],["../gather/gatherers/dobetterweb/domstats",Ku],["../gather/gatherers/dobetterweb/optimized-images",nd],["../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste",sd],["../gather/gatherers/dobetterweb/response-compression",gm],["../gather/gatherers/dobetterweb/tags-blocking-first-paint",bm],["../gather/gatherers/full-page-screenshot",_m],["../gather/gatherers/global-listeners",Rm],["../gather/gatherers/iframe-elements",Cm],["../gather/gatherers/image-elements",Fm],["../gather/gatherers/inputs",Bm],["../gather/gatherers/inspector-issues",Vm],["../gather/gatherers/installability-errors",$s],["../gather/gatherers/js-usage",Gm],["../gather/gatherers/link-elements",ip],["../gather/gatherers/main-document-content",dp],["../gather/gatherers/meta-elements",hp],["../gather/gatherers/network-user-agent",Ys],["../gather/gatherers/script-elements",Tp],["../gather/gatherers/seo/embedded-content",_p],["../gather/gatherers/seo/font-size",Im.exports],["../gather/gatherers/seo/robots-txt",Rp],["../gather/gatherers/seo/tap-targets",Lp],["../gather/gatherers/service-worker",Op],["../gather/gatherers/source-maps",jp],["../gather/gatherers/stacks",Xs],["../gather/gatherers/trace-compat",qp],["../gather/gatherers/trace-elements",hh],["../gather/gatherers/trace",oo],["../gather/gatherers/viewport-dimensions",fh],["../gather/gatherers/web-app-manifest",Us],["../audits/accessibility/accesskeys",yh.exports],["../audits/accessibility/aria-allowed-attr",_h.exports],["../audits/accessibility/aria-command-name",Dh.exports],["../audits/accessibility/aria-hidden-body",Lh.exports],["../audits/accessibility/aria-hidden-focus",Fh.exports],["../audits/accessibility/aria-input-field-name",$h.exports],["../audits/accessibility/aria-meter-name",Wh.exports],["../audits/accessibility/aria-progressbar-name",Kh.exports],["../audits/accessibility/aria-required-attr",Qh.exports],["../audits/accessibility/aria-required-children",ag.exports],["../audits/accessibility/aria-required-parent",sg.exports],["../audits/accessibility/aria-roles",dg.exports],["../audits/accessibility/aria-toggle-field-name",gg.exports],["../audits/accessibility/aria-tooltip-name",bg.exports],["../audits/accessibility/aria-treeitem-name",Eg.exports],["../audits/accessibility/aria-valid-attr-value",Rg.exports],["../audits/accessibility/aria-valid-attr",Ig.exports],["../audits/accessibility/button-name",Pg.exports],["../audits/accessibility/bypass",jg.exports],["../audits/accessibility/color-contrast",zg.exports],["../audits/accessibility/definition-list",Hg.exports],["../audits/accessibility/dlitem",Xg.exports],["../audits/accessibility/document-title",tf.exports],["../audits/accessibility/duplicate-id-active",of.exports],["../audits/accessibility/duplicate-id-aria",uf.exports],["../audits/accessibility/form-field-multiple-labels",hf.exports],["../audits/accessibility/frame-title",vf.exports],["../audits/accessibility/heading-order",Tf.exports],["../audits/accessibility/html-has-lang",Af.exports],["../audits/accessibility/html-lang-valid",Cf.exports],["../audits/accessibility/image-alt",Mf.exports],["../audits/accessibility/input-image-alt",Uf.exports],["../audits/accessibility/label",qf.exports],["../audits/accessibility/link-name",Gf.exports],["../audits/accessibility/list",Jf.exports],["../audits/accessibility/listitem",ey.exports],["../audits/accessibility/manual/custom-controls-labels",sy],["../audits/accessibility/manual/custom-controls-roles",ly],["../audits/accessibility/manual/focus-traps",dy],["../audits/accessibility/manual/focusable-controls",py],["../audits/accessibility/manual/interactive-element-affordance",gy],["../audits/accessibility/manual/logical-tab-order",yy],["../audits/accessibility/manual/managed-focus",by],["../audits/accessibility/manual/offscreen-content-hidden",Sy],["../audits/accessibility/manual/use-landmarks",Ey],["../audits/accessibility/manual/visual-order-follows-dom",_y],["../audits/accessibility/meta-refresh",Ay.exports],["../audits/accessibility/meta-viewport",Cy.exports],["../audits/accessibility/object-alt",My.exports],["../audits/accessibility/tabindex",Uy.exports],["../audits/accessibility/td-headers-attr",qy.exports],["../audits/accessibility/th-has-data-cells",Gy.exports],["../audits/accessibility/valid-lang",Jy.exports],["../audits/accessibility/video-caption",ev.exports],["../audits/apple-touch-icon",nv.exports],["../audits/autocomplete",cv.exports],["../audits/bootup-time",yv.exports],["../audits/byte-efficiency/duplicated-javascript",Bv.exports],["../audits/byte-efficiency/efficient-animated-content",Jb.exports],["../audits/byte-efficiency/legacy-javascript",rw.exports],["../audits/byte-efficiency/modern-image-formats",mw.exports],["../audits/byte-efficiency/offscreen-images",vw.exports],["../audits/byte-efficiency/render-blocking-resources",zw.exports],["../audits/byte-efficiency/total-byte-weight",dS.exports],["../audits/byte-efficiency/unminified-css",vS.exports],["../audits/byte-efficiency/unminified-javascript",kS.exports],["../audits/byte-efficiency/unused-css-rules",PS.exports],["../audits/byte-efficiency/unused-javascript",$S.exports],["../audits/byte-efficiency/uses-long-cache-ttl",QS.exports],["../audits/byte-efficiency/uses-optimized-images",lT.exports],["../audits/byte-efficiency/uses-responsive-images-snapshot",gT.exports],["../audits/byte-efficiency/uses-responsive-images",fT.exports],["../audits/byte-efficiency/uses-text-compression",LT.exports],["../audits/content-width",jT.exports],["../audits/critical-request-chains",zT.exports],["../audits/csp-xss",aE.exports],["../audits/deprecations",tx.exports],["../audits/diagnostics",mx],["../audits/dobetterweb/charset",px.exports],["../audits/dobetterweb/doctype",Sx.exports],["../audits/dobetterweb/dom-size",_x.exports],["../audits/dobetterweb/geolocation-on-start",Cx.exports],["../audits/dobetterweb/inspector-issues",Ux.exports],["../audits/dobetterweb/js-libraries",qx.exports],["../audits/dobetterweb/no-document-write",Hx.exports],["../audits/dobetterweb/no-vulnerable-libraries",Zx.exports],["../audits/dobetterweb/notification-on-start",l_.exports],["../audits/dobetterweb/password-inputs-can-be-pasted-into",h_.exports],["../audits/dobetterweb/uses-http2",b_.exports],["../audits/dobetterweb/uses-passive-event-listeners",M_.exports],["../audits/errors-in-console",j_.exports],["../audits/final-screenshot",Z_],["../audits/font-display",Q_.exports],["../audits/full-page-screenshot",dA],["../audits/image-aspect-ratio",mA.exports],["../audits/image-size-responsive",vA.exports],["../audits/installable-manifest",xA.exports],["../audits/is-on-https",MA.exports],["../audits/largest-contentful-paint-element",qA.exports],["../audits/layout-shift-elements",HA.exports],["../audits/lcp-lazy-loaded",ZA.exports],["../audits/long-tasks",aR.exports],["../audits/main-thread-tasks",yR],["../audits/mainthread-work-breakdown",vR.exports],["../audits/manual/pwa-cross-browser",_R.exports],["../audits/manual/pwa-each-page-has-url",DR.exports],["../audits/manual/pwa-page-transitions",LR.exports],["../audits/maskable-icon",FR.exports],["../audits/metrics",MD],["../audits/metrics/cumulative-layout-shift",PD.exports],["../audits/metrics/experimental-interaction-to-next-paint",$D.exports],["../audits/metrics/first-contentful-paint-3g",JD],["../audits/metrics/first-contentful-paint",XD.exports],["../audits/metrics/first-meaningful-paint",aC.exports],["../audits/metrics/interactive",lC.exports],["../audits/metrics/largest-contentful-paint",gC.exports],["../audits/metrics/max-potential-fid",TC.exports],["../audits/metrics/speed-index",kC.exports],["../audits/metrics/total-blocking-time",MC.exports],["../audits/network-requests",VC],["../audits/network-rtt",WC.exports],["../audits/network-server-latency",ZC.exports],["../audits/no-unload-listeners",iI.exports],["../audits/non-composited-animations",dI.exports],["../audits/oopif-iframe-test-audit",{
|
1188
1188
|
meta:{id:"oopif-iframe-test-audit",title:"IFrame Elements",failureTitle:"IFrame Elements",description:"Audit to force the inclusion of IFrameElements artifact",requiredArtifacts:["IFrameElements"]},audit:()=>({score:1})
|
1189
|
-
}],["../audits/performance-budget",
|
1190
|
-
;function requireWrapper(e){return
|
1191
|
-
var
|
1192
|
-
;const a=requireWrapper(isBundledEnvironment()?r:resolveModulePath(r,t,"plugin")),n=
|
1193
|
-
;return n.forEach((e=>
|
1194
|
-
throw new Error("Invalid expanded Gatherer: "+JSON.stringify(a))},resolveModulePath,resolveSettings:function resolveSettings$2(e={},t){const r=
|
1195
|
-
Timing:"",PageLoadError:""});class Config$1{constructor(e,t){const r={msg:"Create config",id:"lh:init:config"};
|
1196
|
-
;const i=
|
1197
|
-
;for(const e of t.requiredArtifacts)if(!a.has(e))throw new Error(`${e} gatherer, required by audit ${t.id}, was not found in config.`)}const n=new Set;e.forEach((e=>{const t=e.passName;if(n.has(t))throw new Error(`Passes must have unique names (repeated passName: ${t}.`);n.add(t)}))}(this.passes,this.audits),
|
1198
|
-
;const{defaultPassConfig:t}=
|
1199
|
-
static filterCategoriesAndAudits(e,t){if(!e)return{categories:null,requestedAuditNames:new Set};if(t.onlyAudits&&t.skipAudits)throw new Error("Cannot set both skipAudits and onlyAudits");const r={},a=!!t.onlyCategories,n=!!t.onlyAudits,i=t.onlyCategories||[],o=t.onlyAudits||[],s=t.skipAudits||[];i.forEach((t=>{e[t]||
|
1200
|
-
}else n&&(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));c.auditRefs=c.auditRefs.filter((e=>!s.includes(e.id))),c.auditRefs.length&&(r[t]=c,c.auditRefs.forEach((e=>l.add(e.id))))}));return t.skipAudits&&t.skipAudits.includes("full-page-screenshot")||!t.onlyCategories&&!t.skipAudits||l.add("full-page-screenshot"),{categories:r,requestedAuditNames:l}}static getGatherersRequestedByAudits(e){if(!e)return new Set;const t=new Set;for(const r of e){const{requiredArtifacts:e,__internalOptionalArtifacts:a}=r.implementation.meta;e.forEach((e=>t.add(e))),a&&a.forEach((e=>t.add(e)))}return t}static generatePassesNeededByGatherers(e,t){if(!e)return null;const r=t.has("traces");return e.map((e=>{if(e.gatherers=e.gatherers.filter((e=>{const r=e.instance;return t.has(r.name)})),e.recordTrace&&!r){const t=e.passName||"unknown pass";
|
1201
|
-
})).filter((e=>!!e.recordTrace||("defaultPass"===e.passName||e.gatherers.length>0)))}static requireAudits(e,t){const r={msg:"Requiring audits",id:"lh:config:requireAudits"};
|
1202
|
-
beforePass(e){}pass(e){}afterPass(e,t){}};const
|
1203
|
-
method:r,params:a[0],sessionId:n}),t.call(e,r,...a)},e.emit[
|
1204
|
-
})),i=this._session.send(e,...t);return Promise.race([i,n]).finally((()=>{a&&clearTimeout(a)}))}async dispose(){this._session.removeAllListeners(),await this._session.detach()}_getConnection(){const e=this._session.connection();if(!e)throw new Error("Connection has been closed.");return e}}var
|
1205
|
-
this._executionContext=void 0,this._fetcher=void 0,this.defaultSession=
|
1206
|
-
stopInstrumentation:"stopSensitiveInstrumentation",getArtifact:"stopInstrumentation"};async function collectArtifactDependencies(e,t){if(!e.dependencies)return{};const r=Object.entries(e.dependencies).map((async([e,r])=>{const a=t[r.id];if(void 0===a)throw new Error(`"${r.id}" did not run`);if(a instanceof Error)throw createDependencyError(r,a);const n=Promise.resolve().then((()=>a)).catch((e=>Promise.reject(createDependencyError(r,e))));return[e,await n]}));return Object.fromEntries(await Promise.all(r))}var
|
1207
|
-
const{driver:t,artifactDefinitions:r,artifactState:a,baseArtifacts:n,phase:i,gatherMode:o,computedCache:s,settings:c,url:l}=e,u=
|
1208
|
-
Inputs:"",FullPageScreenshot:"",GlobalListeners:"",IFrameElements:"",ImageElements:"",InstallabilityErrors:"",InspectorIssues:"",JsUsage:"",LinkElements:"",MainDocumentContent:"",MetaElements:"",NetworkUserAgent:"",OptimizedImages:"",PasswordInputsWithPreventedPaste:"",ResponseCompression:"",RobotsTxt:"",ServiceWorker:"",ScriptElements:"",SourceMaps:"",Stacks:"",TagsBlockingFirstPaint:"",TapTargets:"",TraceElements:"",ViewportDimensions:"",WebAppManifest:"",devtoolsLogs:"",traces:""};for(const e of Object.keys(
|
1209
|
-
gatherer:"seo/embedded-content"},{id:
|
1210
|
-
id:
|
1211
|
-
artifacts:[
|
1212
|
-
;for(const t of Object.keys(
|
1213
|
-
return e?e.filter((e=>e.gatherer.instance.meta.supportedModes.includes(t))):null}function filterNavigationsByAvailableArtifacts(e,t){if(!e)return e;const r=new Set(t.map((e=>e.id)).concat(
|
1214
|
-
function filterCategoriesByAvailableAudits(e,t){if(!e)return e;const r=new Map(t.map((e=>[e.implementation.meta.id,e.implementation.meta]))),a=Object.entries(e).map((([e,t])=>{const a={...t,auditRefs:t.auditRefs.filter((e=>r.has(e.id)))},n=a.auditRefs.length<t.auditRefs.length,i=a.auditRefs.every((e=>{const t=r.get(e.id);return!!t&&t.scoreDisplayMode===
|
1215
|
-
;!function warnOnUnknownOnlyCategories(e,t){if(t)for(const r of t)e?.[r]||
|
1216
|
-
;const
|
1217
|
-
;i||
|
1218
|
-
}));return
|
1219
|
-
;const a=new Map,n=
|
1220
|
-
;await a.connect();const n=new Map,i=await a.url(),o={config:r,computedCache:n};return{artifacts:await
|
1221
|
-
}),c=
|
1222
|
-
;async function _setup({driver:e,config:t,requestor:r,options:a}){await e.connect(),a?.skipAboutBlank||await
|
1223
|
-
navigationError:void 0,warnings:o}}catch(e){if(!(e instanceof
|
1224
|
-
;
|
1225
|
-
await async function _cleanupNavigation({driver:e}){await
|
1226
|
-
;
|
1227
|
-
const r=a.config||t.config,{gatherMode:n}=e.GatherContext,{config:s}=
|
1228
|
-
;return this._gatherSteps.some((e=>"navigation"===e.artifacts.GatherContext.gatherMode))&&void 0===a.disableStorageReset&&(a.disableStorageReset=!0),r.settingsOverrides=a,t.configContext=r,t}_addGatherStep(e,t){const r=t?.stepName,a={artifacts:e.artifacts,name:r||this._getDefaultStepName(e.artifacts),config:t.config,configContext:t.configContext};this._gatherSteps.push(a),this._gatherStepRunnerOptions.set(a,e.runnerOptions)}async navigate(e,t){if(this.currentTimespan)throw new Error("Timespan already in progress");const r=this._getNextNavigationOptions(t),a=await
|
1229
|
-
this._addGatherStep(r,t),r}async snapshot(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await
|
1230
|
-
},
|
1231
|
-
plugins:["lighthouse-plugin-publisher-ads"],settings:r}},self.listenForStatus=function listenForStatus(e){Log.events.addListener("status",e)},self.registerLocaleData=Vn.registerLocaleData,self.lookupLocale=function lookupCanonicalLocale(e){return oi.lookupLocale(e,Vn.getCanonicalLocales())}):global.runBundledLighthouse=
|
1189
|
+
}],["../audits/performance-budget",yI.exports],["../audits/predictive-perf",BI],["../audits/preload-fonts",$I.exports],["../audits/preload-lcp-image",KI.exports],["../audits/redirects",iN.exports],["../audits/resource-summary",gN.exports],["../audits/screenshot-thumbnails",kN],["../audits/script-treemap-data",LN],["../audits/seo/canonical",MN.exports],["../audits/seo/crawlable-anchors",BN.exports],["../audits/seo/font-size",VN.exports],["../audits/seo/hreflang",tL.exports],["../audits/seo/http-status-code",lL.exports],["../audits/seo/is-crawlable",gL.exports],["../audits/seo/link-text",xL.exports],["../audits/seo/manual/structured-data",CL.exports],["../audits/seo/meta-description",ML.exports],["../audits/seo/plugins",UL.exports],["../audits/seo/robots-txt",YL.exports],["../audits/seo/tap-targets",oM.exports],["../audits/server-response-time",SM.exports],["../audits/service-worker",DM.exports],["../audits/splash-screen",MM.exports],["../audits/themed-omnibox",$M.exports],["../audits/third-party-facades",HM.exports],["../audits/third-party-summary",YM.exports],["../audits/timing-budget",hP.exports],["../audits/unsized-images",TP.exports],["../audits/user-timings",kP.exports],["../audits/uses-rel-preconnect",FP.exports],["../audits/uses-rel-preload",XP.exports],["../audits/valid-source-maps",lO.exports],["../audits/viewport",gO.exports],["../audits/work-during-interaction",wO.exports],["lighthouse-plugin-publisher-ads",MO.exports],["lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks",qO.exports],["lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources",lU.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-critical-path",wU.exports],["lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start",qU.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start",aj.exports],["lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport",dj.exports],["lighthouse-plugin-publisher-ads/audits/ads-in-viewport",bj.exports],["lighthouse-plugin-publisher-ads/audits/async-ad-tags",Dj.exports],["lighthouse-plugin-publisher-ads/audits/blocking-load-events",qj.exports],["lighthouse-plugin-publisher-ads/audits/bottleneck-requests",nB.exports],["lighthouse-plugin-publisher-ads/audits/duplicate-tags",hB.exports],["lighthouse-plugin-publisher-ads/audits/first-ad-render",RB.exports],["lighthouse-plugin-publisher-ads/audits/full-width-slots",$B.exports],["lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel",JB.exports],["lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source",c$.exports],["lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https",y$.exports],["lighthouse-plugin-publisher-ads/audits/script-injected-tags",A$.exports],["lighthouse-plugin-publisher-ads/audits/serial-header-bidding",U$.exports],["lighthouse-plugin-publisher-ads/audits/tag-load-time",nq.exports],["lighthouse-plugin-publisher-ads/audits/viewport-ad-density",bq.exports],["lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift",Rq.exports],["lighthouse-plugin-publisher-ads/audits/deprecated-api-usage",jq.exports],["lighthouse-plugin-publisher-ads/audits/gpt-errors-overall",Yq.exports],["lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time",az.exports]])
|
1190
|
+
;function requireWrapper(e){return xz.get(e)||function commonjsRequire(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}(e)}function resolveModulePath(e,t,r){try{return require.resolve(e)}catch(e){}try{return require.resolve(e,{paths:[process.cwd()]})}catch(e){}const a=gz.resolve(process.cwd(),e);try{return require.resolve(a)}catch(e){}const n="Unable to locate "+(r?`${r}: `:"")+`\`${e}\`.\n Tried to require() from these locations:\n lighthouse-core/config\n ${a}`;if(!t)throw new Error(n);const i=gz.resolve(t,e);try{return require.resolve(i)}catch(e){}try{return require.resolve(e,{paths:[t]})}catch(e){}throw new Error(n+`\n ${i}`)}function shallowClone(e){return"object"==typeof e?Object.assign(Object.create(Object.getPrototypeOf(e)),e):e}function deepClone$2(e){return JSON.parse(JSON.stringify(e))}
|
1191
|
+
var _z={deepClone:deepClone$2,deepCloneConfigJson:function deepCloneConfigJson$2(e){const t=deepClone$2(e);if(Array.isArray(t.passes)&&Array.isArray(e.passes))for(let r=0;r<t.passes.length;r++){t.passes[r].gatherers=(e.passes[r].gatherers||[]).map((e=>shallowClone(e)))}return Array.isArray(e.audits)&&(t.audits=e.audits.map((e=>shallowClone(e)))),Array.isArray(e.artifacts)&&(t.artifacts=e.artifacts.map((e=>({...e,gatherer:shallowClone(e.gatherer)})))),t},mergeConfigFragment:Ez,mergeConfigFragmentArrayByKey:function mergeConfigFragmentArrayByKey$1(e,t,r){const a=new Map,n=e||[];for(let e=0;e<n.length;e++){const t=n[e];a.set(r(t),{index:e,item:t})}for(const e of t||[]){const t=a.get(r(e));if(t){const r=t.item,a="object"==typeof e&&"object"==typeof r?Ez(r,e,!0):e;n[t.index]=a}else n.push(e)}return n},mergeOptionsOfItems,mergePlugins:function mergePlugins$2(e,t,r){const a=e.plugins||[],n=new Set([...a,...r?.plugins||[]]);for(const r of n){Tz.assertValidPluginName(e,r)
|
1192
|
+
;const a=requireWrapper(isBundledEnvironment()?r:resolveModulePath(r,t,"plugin")),n=bz.parsePlugin(a,r);e=Ez(e,n)}return e},resolveAuditsToDefns:function resolveAuditsToDefns$2(e,t){if(!e)return null;const r=wz.getAuditList(),a=e.map((e=>{const a=function expandAuditShorthand(e){if("string"==typeof e)return{path:e,options:{}};if("implementation"in e&&"function"==typeof e.implementation.audit)return e;if("path"in e&&"string"==typeof e.path)return e;if("audit"in e&&"function"==typeof e.audit)return{implementation:e,options:{}};throw new Error("Invalid Audit type "+JSON.stringify(e))}(e);let n;return n="implementation"in a?a.implementation:function requireAudit(e,t,r){const a=`${e}.js`;let n=`../audits/${e}`;if(!t.find((e=>e===a)))if(isBundledEnvironment())n=e;else{const t=resolveModulePath(e,r,"audit");n=gz.relative("lighthouse-core/config",t)}return requireWrapper(n)}(a.path,r,t),{implementation:n,path:a.path,options:a.options||{}}})),n=mergeOptionsOfItems(a)
|
1193
|
+
;return n.forEach((e=>Tz.assertValidAudit(e))),n},resolveGathererToDefn:function resolveGathererToDefn$2(e,t,r){const a=function expandGathererShorthand(e){if("string"==typeof e)return{path:e};if("implementation"in e||"instance"in e)return e;if("path"in e){if("string"!=typeof e.path)throw new Error("Invalid Gatherer type "+JSON.stringify(e));return e}if("function"==typeof e)return{implementation:e};if(e&&"function"==typeof e.beforePass)return{instance:e};throw new Error("Invalid Gatherer type "+JSON.stringify(e))}(e);if(a.instance)return{instance:a.instance,implementation:a.implementation,path:a.path};if(a.implementation){return{instance:new(0,a.implementation),implementation:a.implementation,path:a.path}}if(a.path){return function requireGatherer(e,t,r){const a=t.find((t=>t===`${e}.js`));let n=`../gather/gatherers/${e}`;a||(n=resolveModulePath(e,r,"gatherer"));const i=requireWrapper(n);return{instance:new i,implementation:i,path:e}}(a.path,t,r)}
|
1194
|
+
throw new Error("Invalid expanded Gatherer: "+JSON.stringify(a))},resolveModulePath,resolveSettings:function resolveSettings$2(e={},t){const r=Sz.lookupLocale(t?.locale||e.locale),{defaultSettings:a}=yz,n=Ez(deepClone$2(a),e,!0),i=Ez(n,function cleanFlagsForSettings(e={}){const t={};for(const r of Object.keys(e))r in yz.defaultSettings&&(t[r]=e[r]);return t}(t),!0);return i.budgets&&(i.budgets=vz.initializeBudget(i.budgets)),i.locale=r,!0===i.emulatedUserAgent&&(i.emulatedUserAgent=yz.userAgents[i.formFactor]),Tz.assertValidSettings(i),i}};const Az=gu.exports,Rz=mn,kz=Vn,Dz=Su,Cz=on.default,Iz=bn,Nz=pu,{mergePlugins:Lz,mergeConfigFragment:Mz,resolveSettings:Pz,resolveAuditsToDefns:Oz,resolveGathererToDefn:Fz,deepClone:Uz,deepCloneConfigJson:jz}=_z,Bz=Object.keys({fetchTime:"",LighthouseRunWarnings:"",HostFormFactor:"",HostUserAgent:"",NetworkUserAgent:"",BenchmarkIndex:"",WebAppManifest:"",GatherContext:"",InstallabilityErrors:"",Stacks:"",traces:"",devtoolsLogs:"",settings:"",URL:"",
|
1195
|
+
Timing:"",PageLoadError:""});class Config$1{constructor(e,t){const r={msg:"Create config",id:"lh:init:config"};Cz.time(r,"verbose");let a=t?.configPath;if(e||(e=Az,a=Iz.resolve("lighthouse-core/config","./default-config.js")),a&&!Iz.isAbsolute(a))throw new Error("configPath must be an absolute path.");if((e=jz(e)).extends){if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");e=Config$1.extendConfigJSON(jz(Az),e)}const n=a?Iz.dirname(a):void 0;e=Lz(e,n,t),t&&function assertValidFlags(e){if("devtools"===e.channel&&e.internalDisableDeviceScreenEmulation&&(e.formFactor=e.emulatedFormFactor,e.emulatedFormFactor=e.internalDisableDeviceScreenEmulation=void 0),e.emulatedFormFactor||e.internalDisableDeviceScreenEmulation)throw new Error("Invalid emulation flag. Emulation configuration changed in LH 7.0. See https://github.com/GoogleChrome/lighthouse/blob/master/docs/emulation.md")}(t)
|
1196
|
+
;const i=Pz(e.settings||{},t),o=Config$1.augmentPassesWithDefaults(e.passes);Config$1.adjustDefaultPassForThrottling(i,o);const s=Config$1.requireGatherers(o,n);this.settings=i,this.passes=s,this.audits=Config$1.requireAudits(e.audits,n),this.categories=e.categories||null,this.groups=e.groups||null,Config$1.filterConfigIfNeeded(this),function assertValidPasses(e,t){if(!Array.isArray(e))return;const r=Config$1.getGatherersRequestedByAudits(t),a=new Set(Bz);e.forEach(((e,t)=>{0===t&&"fatal"!==e.loadFailureMode&&(Cz.warn(`"${e.passName}" is the first pass but was marked as non-fatal. The first pass will always be treated as loadFailureMode=fatal.`),e.loadFailureMode="fatal"),e.gatherers.forEach((e=>{const t=e.instance;if(a.add(t.name),!r.has(t.name)){const e=`${t.name} gatherer requested, however no audit requires it.`;Cz.warn("config",e)}}))}));for(const e of t||[]){const t=e.implementation.meta
|
1197
|
+
;for(const e of t.requiredArtifacts)if(!a.has(e))throw new Error(`${e} gatherer, required by audit ${t.id}, was not found in config.`)}const n=new Set;e.forEach((e=>{const t=e.passName;if(n.has(t))throw new Error(`Passes must have unique names (repeated passName: ${t}.`);n.add(t)}))}(this.passes,this.audits),Dz.assertValidCategories(this.categories,this.audits,this.groups),Cz.timeEnd(r)}getPrintString(){const e=Uz(this);if(e.passes)for(const t of e.passes)for(const e of t.gatherers)e.implementation=void 0,e.instance=void 0;if(e.audits)for(const t of e.audits)t.implementation=void 0,0===Object.keys(t.options).length&&(t.options=void 0);return kz.replaceIcuMessages(e,e.settings.locale),JSON.stringify(e,null,2)}static extendConfigJSON(e,t){if(t.passes&&e.passes){for(const r of t.passes){const t=r.passName||Rz.defaultPassConfig.passName,a=e.passes.find((e=>e.passName===t));a?Mz(a,r):e.passes.push(r)}delete t.passes}return Mz(e,t)}static augmentPassesWithDefaults(e){if(!e)return null
|
1198
|
+
;const{defaultPassConfig:t}=Rz;return e.map((e=>Mz(Uz(t),e)))}static adjustDefaultPassForThrottling(e,t){if(!t||"devtools"!==e.throttlingMethod&&"provided"!==e.throttlingMethod)return;const r=t.find((e=>"defaultPass"===e.passName));if(!r)return;const a=Rz.nonSimulatedPassConfigOverrides;r.pauseAfterFcpMs=Math.max(a.pauseAfterFcpMs,r.pauseAfterFcpMs),r.pauseAfterLoadMs=Math.max(a.pauseAfterLoadMs,r.pauseAfterLoadMs),r.cpuQuietThresholdMs=Math.max(a.cpuQuietThresholdMs,r.cpuQuietThresholdMs),r.networkQuietThresholdMs=Math.max(a.networkQuietThresholdMs,r.networkQuietThresholdMs)}static filterConfigIfNeeded(e){const t=e.settings;if(!t.onlyCategories&&!t.onlyAudits&&!t.skipAudits)return;const{categories:r,requestedAuditNames:a}=Config$1.filterCategoriesAndAudits(e.categories,t),n=e.audits&&e.audits.filter((e=>a.has(e.implementation.meta.id))),i=Config$1.getGatherersRequestedByAudits(n),o=Config$1.generatePassesNeededByGatherers(e.passes,i);e.categories=r,e.audits=n,e.passes=o}
|
1199
|
+
static filterCategoriesAndAudits(e,t){if(!e)return{categories:null,requestedAuditNames:new Set};if(t.onlyAudits&&t.skipAudits)throw new Error("Cannot set both skipAudits and onlyAudits");const r={},a=!!t.onlyCategories,n=!!t.onlyAudits,i=t.onlyCategories||[],o=t.onlyAudits||[],s=t.skipAudits||[];i.forEach((t=>{e[t]||Cz.warn("config",`unrecognized category in 'onlyCategories': ${t}`)}));const c=new Set(o.concat(s));for(const t of c){const r=Object.keys(e).find((r=>!!e[r].auditRefs.find((e=>e.id===t))));if(r)o.includes(t)&&i.includes(r)&&Cz.warn("config",`${t} in 'onlyAudits' is already included by ${r} in 'onlyCategories'`);else{const e=s.includes(t)?"skipAudits":"onlyAudits";Cz.warn("config",`unrecognized audit in '${e}': ${t}`)}}const l=new Set(o);s.forEach((e=>l.delete(e))),Object.keys(e).forEach((t=>{const c=Uz(e[t]);if(a&&n)i.includes(t)||(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));else if(a){if(!i.includes(t))return
|
1200
|
+
}else n&&(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));c.auditRefs=c.auditRefs.filter((e=>!s.includes(e.id))),c.auditRefs.length&&(r[t]=c,c.auditRefs.forEach((e=>l.add(e.id))))}));return t.skipAudits&&t.skipAudits.includes("full-page-screenshot")||!t.onlyCategories&&!t.skipAudits||l.add("full-page-screenshot"),{categories:r,requestedAuditNames:l}}static getGatherersRequestedByAudits(e){if(!e)return new Set;const t=new Set;for(const r of e){const{requiredArtifacts:e,__internalOptionalArtifacts:a}=r.implementation.meta;e.forEach((e=>t.add(e))),a&&a.forEach((e=>t.add(e)))}return t}static generatePassesNeededByGatherers(e,t){if(!e)return null;const r=t.has("traces");return e.map((e=>{if(e.gatherers=e.gatherers.filter((e=>{const r=e.instance;return t.has(r.name)})),e.recordTrace&&!r){const t=e.passName||"unknown pass";Cz.warn("config",`Trace not requested by an audit, dropping trace in ${t}`),e.recordTrace=!1}return e
|
1201
|
+
})).filter((e=>!!e.recordTrace||("defaultPass"===e.passName||e.gatherers.length>0)))}static requireAudits(e,t){const r={msg:"Requiring audits",id:"lh:config:requireAudits"};Cz.time(r,"verbose");const a=Oz(e,t);return Cz.timeEnd(r),a}static requireGatherers(e,t){if(!e)return null;const r={msg:"Requiring gatherers",id:"lh:config:requireGatherers"};Cz.time(r,"verbose");const a=Nz.getGathererList(),n=e.map((e=>{const r=e.gatherers.map((e=>Fz(e,a,t))),n=Array.from(new Map(r.map((e=>[e.instance.name,e]))).values());return n.forEach((e=>function assertValidGatherer(e,t){if(t=t||e.name||"gatherer","function"!=typeof e.beforePass)throw new Error(`${t} has no beforePass() method.`);if("function"!=typeof e.pass)throw new Error(`${t} has no pass() method.`);if("function"!=typeof e.afterPass)throw new Error(`${t} has no afterPass() method.`)}(e.instance,e.path))),Object.assign(e,{gatherers:n})}));return Cz.timeEnd(r),n}}var $z=Config$1;var qz=class Gatherer{get name(){return this.constructor.name}
|
1202
|
+
beforePass(e){}pass(e){}afterPass(e,t){}};const zz=pu,Vz=on.default,Wz=hu,Gz=$z,Hz=ji;async function lighthouse(e,t={},r,a){t.logLevel=t.logLevel||"error",Vz.setLevel(t.logLevel);const n={config:generateConfig(r,t),computedCache:new Map},i=a||new Wz(t.port,t.hostname),o=await zz.gather((()=>{const t=Hz.normalizeUrl(e);return zz._gatherArtifactsFromBrowser(t,n,i)}),n);return zz.audit(o,n)}function generateConfig(e,t){return new Gz(e,t)}lighthouse.generateConfig=generateConfig,lighthouse.getAuditList=zz.getAuditList,lighthouse.traceCategories=To.traceCategories,lighthouse.Audit=kc,lighthouse.Gatherer=qz,lighthouse.NetworkRecords=Lo;var Yz=lighthouse;const Kz=vi.exports,Jz=Symbol("monkeypatch");class ProtocolSession$1{constructor(e){this._session=e,this._targetInfo=void 0,this._nextProtocolTimeout=void 0,this._callbackMap=new WeakMap;const t=e.emit;t[Jz]||(e.emit=(r,...a)=>{const n=this._targetInfo&&"iframe"===this._targetInfo.type?this._targetInfo.targetId:void 0;return t.call(e,"*",{
|
1203
|
+
method:r,params:a[0],sessionId:n}),t.call(e,r,...a)},e.emit[Jz]=!0)}setTargetInfo(e){this._targetInfo=e}hasNextProtocolTimeout(){return void 0!==this._nextProtocolTimeout}getNextProtocolTimeout(){return this._nextProtocolTimeout||3e4}setNextProtocolTimeout(e){this._nextProtocolTimeout=e}on(e,t){this._session.on(e,t)}once(e,t){this._session.once(e,t)}addSessionAttachedListener(e){const listener=t=>e(new ProtocolSession$1(t));this._callbackMap.set(e,listener),this._getConnection().on("sessionattached",listener)}removeSessionAttachedListener(e){const t=this._callbackMap.get(e);t&&this._getConnection().off("sessionattached",t)}addProtocolMessageListener(e){this._session.on("*",e)}removeProtocolMessageListener(e){this._session.off("*",e)}off(e,t){this._session.off(e,t)}sendCommand(e,...t){const r=this.getNextProtocolTimeout();let a;this._nextProtocolTimeout=void 0;const n=new Promise(((t,n)=>{r!==1/0&&(a=setTimeout(n,r,new Kz(Kz.errors.PROTOCOL_TIMEOUT,{protocolMethod:e})))
|
1204
|
+
})),i=this._session.send(e,...t);return Promise.race([i,n]).finally((()=>{a&&clearTimeout(a)}))}async dispose(){this._session.removeAllListeners(),await this._session.detach()}_getConnection(){const e=this._session.connection();if(!e)throw new Error("Connection has been closed.");return e}}var Xz=ProtocolSession$1;const Zz=on.default,Qz=Xz,eV=yi,tV=gi,throwNotConnectedFn=()=>{throw new Error("Session not connected")},rV={setTargetInfo:throwNotConnectedFn,hasNextProtocolTimeout:throwNotConnectedFn,getNextProtocolTimeout:throwNotConnectedFn,setNextProtocolTimeout:throwNotConnectedFn,on:throwNotConnectedFn,once:throwNotConnectedFn,off:throwNotConnectedFn,addProtocolMessageListener:throwNotConnectedFn,removeProtocolMessageListener:throwNotConnectedFn,addSessionAttachedListener:throwNotConnectedFn,removeSessionAttachedListener:throwNotConnectedFn,sendCommand:throwNotConnectedFn,dispose:throwNotConnectedFn};var aV=class Driver$3{constructor(e){this._page=e,this._session=void 0,
|
1205
|
+
this._executionContext=void 0,this._fetcher=void 0,this.defaultSession=rV}get executionContext(){return this._executionContext?this._executionContext:throwNotConnectedFn()}get fetcher(){return this._fetcher?this._fetcher:throwNotConnectedFn()}async url(){return this._page.url()}async connect(){if(this._session)return;const e={msg:"Connecting to browser",id:"lh:driver:connect"};Zz.time(e);const t=await this._page.target().createCDPSession();this._session=this.defaultSession=new Qz(t),this._executionContext=new eV(this._session),this._fetcher=new tV(this._session,this._executionContext),Zz.timeEnd(e)}async disconnect(){this._session&&await this._session.dispose()}};const nV=on.default;function createDependencyError(e,t){return new Error(`Dependency "${e.id}" failed with exception: ${t.message}`)}const iV={startInstrumentation:void 0,startSensitiveInstrumentation:"startInstrumentation",stopSensitiveInstrumentation:"startSensitiveInstrumentation",
|
1206
|
+
stopInstrumentation:"stopSensitiveInstrumentation",getArtifact:"stopInstrumentation"};async function collectArtifactDependencies(e,t){if(!e.dependencies)return{};const r=Object.entries(e.dependencies).map((async([e,r])=>{const a=t[r.id];if(void 0===a)throw new Error(`"${r.id}" did not run`);if(a instanceof Error)throw createDependencyError(r,a);const n=Promise.resolve().then((()=>a)).catch((e=>Promise.reject(createDependencyError(r,e))));return[e,await n]}));return Object.fromEntries(await Promise.all(r))}var oV={getEmptyArtifactState:function getEmptyArtifactState$3(){return{startInstrumentation:{},startSensitiveInstrumentation:{},stopSensitiveInstrumentation:{},stopInstrumentation:{},getArtifact:{}}},awaitArtifacts:async function awaitArtifacts$3(e){const t={};for(const[r,a]of Object.entries(e.getArtifact)){const e=await a.catch((e=>e));void 0!==e&&(t[r]=e)}return t},collectPhaseArtifacts:async function collectPhaseArtifacts$3(e){
|
1207
|
+
const{driver:t,artifactDefinitions:r,artifactState:a,baseArtifacts:n,phase:i,gatherMode:o,computedCache:s,settings:c,url:l}=e,u=iV[i],d=u&&a[u]||{};for(const e of r){nV["getArtifact"===i?"log":"verbose"](`artifacts:${i}`,e.id);const r=e.gatherer.instance,u=(d[e.id]||Promise.resolve()).then((async()=>{const u="getArtifact"===i?await collectArtifactDependencies(e,a.getArtifact):{};return r[i]({url:l,gatherMode:o,driver:t,baseArtifacts:n,dependencies:u,computedCache:s,settings:c})}));await u.catch((()=>{})),a[i][e.id]=u}},collectArtifactDependencies};const sV=gu.exports,cV=yu,{deepClone:lV}=_z,uV={performance:[{id:"uses-responsive-images-snapshot",weight:0},{id:"experimental-interaction-to-next-paint",weight:0,group:"metrics",acronym:"INP",relevantAudits:cV.inpRelevantAudits},{id:"work-during-interaction",weight:0}]};const dV={DevtoolsLog:"",Trace:"",Accessibility:"",AnchorElements:"",CacheContents:"",ConsoleMessages:"",CSSUsage:"",Doctype:"",DOMStats:"",EmbeddedContent:"",FontSize:"",
|
1208
|
+
Inputs:"",FullPageScreenshot:"",GlobalListeners:"",IFrameElements:"",ImageElements:"",InstallabilityErrors:"",InspectorIssues:"",JsUsage:"",LinkElements:"",MainDocumentContent:"",MetaElements:"",NetworkUserAgent:"",OptimizedImages:"",PasswordInputsWithPreventedPaste:"",ResponseCompression:"",RobotsTxt:"",ServiceWorker:"",ScriptElements:"",SourceMaps:"",Stacks:"",TagsBlockingFirstPaint:"",TapTargets:"",TraceElements:"",ViewportDimensions:"",WebAppManifest:"",devtoolsLogs:"",traces:""};for(const e of Object.keys(dV))dV[e]=e;var mV={artifacts:[{id:dV.DevtoolsLog,gatherer:"devtools-log"},{id:dV.Trace,gatherer:"trace"},{id:dV.Accessibility,gatherer:"accessibility"},{id:dV.AnchorElements,gatherer:"anchor-elements"},{id:dV.CacheContents,gatherer:"cache-contents"},{id:dV.ConsoleMessages,gatherer:"console-messages"},{id:dV.CSSUsage,gatherer:"css-usage"},{id:dV.Doctype,gatherer:"dobetterweb/doctype"},{id:dV.DOMStats,gatherer:"dobetterweb/domstats"},{id:dV.EmbeddedContent,
|
1209
|
+
gatherer:"seo/embedded-content"},{id:dV.FontSize,gatherer:"seo/font-size"},{id:dV.Inputs,gatherer:"inputs"},{id:dV.GlobalListeners,gatherer:"global-listeners"},{id:dV.IFrameElements,gatherer:"iframe-elements"},{id:dV.ImageElements,gatherer:"image-elements"},{id:dV.InstallabilityErrors,gatherer:"installability-errors"},{id:dV.InspectorIssues,gatherer:"inspector-issues"},{id:dV.JsUsage,gatherer:"js-usage"},{id:dV.LinkElements,gatherer:"link-elements"},{id:dV.MainDocumentContent,gatherer:"main-document-content"},{id:dV.MetaElements,gatherer:"meta-elements"},{id:dV.NetworkUserAgent,gatherer:"network-user-agent"},{id:dV.OptimizedImages,gatherer:"dobetterweb/optimized-images"},{id:dV.PasswordInputsWithPreventedPaste,gatherer:"dobetterweb/password-inputs-with-prevented-paste"},{id:dV.ResponseCompression,gatherer:"dobetterweb/response-compression"},{id:dV.RobotsTxt,gatherer:"seo/robots-txt"},{id:dV.ServiceWorker,gatherer:"service-worker"},{id:dV.ScriptElements,gatherer:"script-elements"},{
|
1210
|
+
id:dV.SourceMaps,gatherer:"source-maps"},{id:dV.Stacks,gatherer:"stacks"},{id:dV.TagsBlockingFirstPaint,gatherer:"dobetterweb/tags-blocking-first-paint"},{id:dV.TapTargets,gatherer:"seo/tap-targets"},{id:dV.TraceElements,gatherer:"trace-elements"},{id:dV.ViewportDimensions,gatherer:"viewport-dimensions"},{id:dV.WebAppManifest,gatherer:"web-app-manifest"},{id:dV.devtoolsLogs,gatherer:"devtools-log-compat"},{id:dV.traces,gatherer:"trace-compat"},{id:dV.FullPageScreenshot,gatherer:"full-page-screenshot"}],navigations:[{id:"default",pauseAfterFcpMs:1e3,pauseAfterLoadMs:1e3,networkQuietThresholdMs:1e3,cpuQuietThresholdMs:1e3,
|
1211
|
+
artifacts:[dV.DevtoolsLog,dV.Trace,dV.Accessibility,dV.AnchorElements,dV.CacheContents,dV.ConsoleMessages,dV.CSSUsage,dV.Doctype,dV.DOMStats,dV.EmbeddedContent,dV.FontSize,dV.Inputs,dV.GlobalListeners,dV.IFrameElements,dV.ImageElements,dV.InstallabilityErrors,dV.InspectorIssues,dV.JsUsage,dV.LinkElements,dV.MainDocumentContent,dV.MetaElements,dV.NetworkUserAgent,dV.OptimizedImages,dV.PasswordInputsWithPreventedPaste,dV.ResponseCompression,dV.RobotsTxt,dV.ServiceWorker,dV.ScriptElements,dV.SourceMaps,dV.Stacks,dV.TagsBlockingFirstPaint,dV.TapTargets,dV.TraceElements,dV.ViewportDimensions,dV.WebAppManifest,dV.devtoolsLogs,dV.traces,dV.FullPageScreenshot]}],settings:sV.settings,audits:[...(sV.audits||[]).map((e=>"string"==typeof e?{path:e}:e)),"byte-efficiency/uses-responsive-images-snapshot","metrics/experimental-interaction-to-next-paint","work-during-interaction"],categories:function mergeCategories(){if(!sV.categories)return{};const e=lV(sV.categories)
|
1212
|
+
;for(const t of Object.keys(uV))e[t]&&e[t].auditRefs.push(...uV[t]);return e}(),groups:sV.groups};const pV=on.default,hV=kc,gV=Object.keys({fetchTime:"",LighthouseRunWarnings:"",BenchmarkIndex:"",settings:"",Timing:"",URL:"",PageLoadError:"",HostFormFactor:"",HostUserAgent:"",GatherContext:""}),fV=["full-page-screenshot"],yV=["HostUserAgent","HostFormFactor","Stacks","GatherContext"];function getAuditIdsInCategories(e,t){if(!e)return new Set;const r=(t=t||Object.keys(e)).map((t=>e[t])).flatMap((e=>e?.auditRefs||[]));return new Set(r.map((e=>e.id)))}function filterArtifactsByAvailableAudits(e,t){if(!e)return null;if(!t)return e;const r=new Map(e.map((e=>[e.id,e]))),a=new Set([...yV,...t.flatMap((e=>e.implementation.meta.requiredArtifacts))]);let n=0;for(;n!==a.size;){n=a.size;for(const e of a){const t=r.get(e);if(t&&t.dependencies)for(const e of Object.values(t.dependencies))a.add(e.id)}}return e.filter((e=>a.has(e.id)))}function filterArtifactsByGatherMode(e,t){
|
1213
|
+
return e?e.filter((e=>e.gatherer.instance.meta.supportedModes.includes(t))):null}function filterNavigationsByAvailableArtifacts(e,t){if(!e)return e;const r=new Set(t.map((e=>e.id)).concat(gV));return e.map((e=>({...e,artifacts:e.artifacts.filter((e=>r.has(e.id)))}))).filter((e=>e.artifacts.length))}function filterAuditsByAvailableArtifacts(e,t){if(!e)return null;const r=new Set(t.map((e=>e.id)).concat(gV));return e.filter((e=>e.implementation.meta.requiredArtifacts.every((e=>r.has(e)))))}function filterAuditsByGatherMode(e,t){return e?e.filter((e=>{const r=e.implementation.meta;return!r.supportedModes||r.supportedModes.includes(t)})):null}function filterCategoriesByGatherMode(e,t){if(!e)return null;const r=Object.entries(e).filter((([e,r])=>!r.supportedModes||r.supportedModes.includes(t)));return Object.fromEntries(r)}function filterCategoriesByExplicitFilters(e,t){if(!e||!t)return e;const r=Object.entries(e).filter((([e])=>t.includes(e)));return Object.fromEntries(r)}
|
1214
|
+
function filterCategoriesByAvailableAudits(e,t){if(!e)return e;const r=new Map(t.map((e=>[e.implementation.meta.id,e.implementation.meta]))),a=Object.entries(e).map((([e,t])=>{const a={...t,auditRefs:t.auditRefs.filter((e=>r.has(e.id)))},n=a.auditRefs.length<t.auditRefs.length,i=a.auditRefs.every((e=>{const t=r.get(e.id);return!!t&&t.scoreDisplayMode===hV.SCORING_MODES.MANUAL}));return n&&i&&(a.auditRefs=[]),[e,a]})).filter((e=>"object"==typeof e[1]&&e[1].auditRefs.length));return Object.fromEntries(a)}var vV={filterConfigByGatherMode:function filterConfigByGatherMode$1(e,t){const r=filterArtifactsByGatherMode(e.artifacts,t),a=filterAuditsByAvailableArtifacts(filterAuditsByGatherMode(e.audits,t),r||[]),n=filterCategoriesByAvailableAudits(filterCategoriesByGatherMode(e.categories,t),a||[]);return{...e,artifacts:r,audits:a,categories:n}},filterConfigByExplicitFilters:function filterConfigByExplicitFilters$1(e,t){const{onlyAudits:r,onlyCategories:a,skipAudits:n}=t
|
1215
|
+
;!function warnOnUnknownOnlyCategories(e,t){if(t)for(const r of t)e?.[r]||pV.warn("config",`unrecognized category in 'onlyCategories': ${r}`)}(e.categories,a);let i=getAuditIdsInCategories(e.categories,void 0);a?i=getAuditIdsInCategories(e.categories,a):r&&(i=new Set);const o=new Set([...i,...r||[],...fV].filter((e=>!n||!n.includes(e)))),s=o.size&&e.audits?e.audits.filter((e=>o.has(e.implementation.meta.id))):e.audits,c=filterCategoriesByExplicitFilters(filterCategoriesByAvailableAudits(e.categories,s||[]),a),l=filterArtifactsByAvailableAudits(e.artifacts,s),u=filterNavigationsByAvailableArtifacts(e.navigations,l||[]);return{...e,artifacts:l,navigations:u,audits:s,categories:c}},filterArtifactsByGatherMode,filterArtifactsByAvailableAudits,filterNavigationsByAvailableArtifacts,filterAuditsByAvailableArtifacts,filterAuditsByGatherMode,filterCategoriesByAvailableAudits,filterCategoriesByExplicitFilters,filterCategoriesByGatherMode}
|
1216
|
+
;const bV=bn,wV=on.default,SV=pu,TV=mV,{defaultNavigationConfig:EV,nonSimulatedPassConfigOverrides:xV}=mn,{isFRGathererDefn:_V,throwInvalidDependencyOrder:AV,isValidArtifactDependency:RV,throwInvalidArtifactDependency:kV,assertArtifactTopologicalOrder:DV,assertValidConfig:CV}=Su,{filterConfigByGatherMode:IV,filterConfigByExplicitFilters:NV}=vV,{deepCloneConfigJson:LV,resolveSettings:MV,resolveAuditsToDefns:PV,resolveGathererToDefn:OV,mergePlugins:FV,mergeConfigFragment:UV,mergeConfigFragmentArrayByKey:jV}=_z,BV=bV.join("lighthouse-core/fraggle-rock/config","./default-config.js");function resolveWorkingCopy(e,t){let{configPath:r}=t;if(r&&!bV.isAbsolute(r))throw new Error("configPath must be an absolute path");e||(e=TV,r=BV);const a=r?bV.dirname(r):void 0;return{configWorkingCopy:LV(e),configPath:r,configDir:a}}function resolveArtifactDependencies(e,t,r){if(!("dependencies"in t.instance.meta))return;const a=Object.entries(t.instance.meta.dependencies).map((([a,n])=>{const i=r.get(n)
|
1217
|
+
;i||AV(e.id,a);return RV(t,i.gatherer)||kV(e.id,a),[a,{id:i.id}]}));return Object.fromEntries(a)}function resolveNavigationsToDefns(e,t,r){if(!e)return null;if(!t)throw new Error("Cannot use navigations without defining artifacts");const a={msg:"Resolve navigation definitions",id:"lh:config:resolveNavigationsToDefns"};wV.time(a,"verbose");const n=new Map(t.map((e=>[e.id,e]))),i=e.map((e=>{const t={...EV,...e},a=t.id,i=t.artifacts.map((e=>{const t=n.get(e);if(!t)throw new Error(`Unrecognized artifact "${e}" in navigation "${a}"`);return t})),o={...t,artifacts:i};return function overrideNavigationThrottlingWindows(e,t){e.disableThrottling||"simulate"!==t.throttlingMethod&&(e.cpuQuietThresholdMs=Math.max(e.cpuQuietThresholdMs||0,xV.cpuQuietThresholdMs),e.networkQuietThresholdMs=Math.max(e.networkQuietThresholdMs||0,xV.networkQuietThresholdMs),e.pauseAfterFcpMs=Math.max(e.pauseAfterFcpMs||0,xV.pauseAfterFcpMs),e.pauseAfterLoadMs=Math.max(e.pauseAfterLoadMs||0,xV.pauseAfterLoadMs))}(o,r),o
|
1218
|
+
}));return DV(i),wV.timeEnd(a),i}var $V={resolveWorkingCopy,initializeConfig:function initializeConfig$4(e,t){const r={msg:"Initialize config",id:"lh:config"};wV.time(r,"verbose");let{configWorkingCopy:a,configDir:n}=resolveWorkingCopy(e,t);a=function resolveExtensions(e){if(!e.extends)return e;if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");const{artifacts:t,navigations:r,...a}=e,n=LV(TV),i=UV(n,a);return i.artifacts=jV(n.artifacts,t,(e=>e.id)),i.navigations=jV(n.navigations,r,(e=>e.id)),i}(a),a=FV(a,n,t.settingsOverrides);const i=MV(a.settings||{},t.settingsOverrides);!function overrideSettingsForGatherMode(e,t){"timespan"===t.gatherMode&&"simulate"===e.throttlingMethod&&(e.throttlingMethod="devtools")}(i,t);const o=function resolveArtifactsToDefns(e,t){if(!e)return null;const r={msg:"Resolve artifact definitions",id:"lh:config:resolveArtifactsToDefns"};wV.time(r,"verbose")
|
1219
|
+
;const a=new Map,n=SV.getGathererList(),i=e.map((e=>{const r=e.gatherer,i=OV(r,n,t);if(!_V(i))throw new Error(`${i.instance.name} gatherer does not have a Fraggle Rock meta obj`);const o={id:e.id,gatherer:i,dependencies:resolveArtifactDependencies(e,i,a)},s=o.gatherer.instance.meta.symbol;return s&&a.set(s,o),o}));return wV.timeEnd(r),i}(a.artifacts,n);let s={artifacts:o,navigations:resolveNavigationsToDefns(a.navigations,o,i),audits:PV(a.audits,n),categories:a.categories||null,groups:a.groups||null,settings:i};const{warnings:c}=CV(s);return s=IV(s,t.gatherMode),s=NV(s,i),wV.timeEnd(r),{config:s,warnings:c}}};const qV=on.default,zV=aV,VV=pu,{getEmptyArtifactState:WV,collectPhaseArtifacts:GV,awaitArtifacts:HV}=oV,{initializeConfig:YV}=$V,{getBaseArtifacts:KV,finalizeArtifacts:JV}=ac;var XV={snapshotGather:async function snapshotGather$2(e){const{configContext:t={}}=e;qV.setLevel(t.logLevel||"error");const{config:r}=YV(e.config,{...t,gatherMode:"snapshot"}),a=new zV(e.page)
|
1220
|
+
;await a.connect();const n=new Map,i=await a.url(),o={config:r,computedCache:n};return{artifacts:await VV.gather((async()=>{const e=await KV(r,a,{gatherMode:"snapshot"});e.URL.requestedUrl=i,e.URL.finalUrl=i;const t=r.artifacts||[],o=WV();await GV({url:i,phase:"getArtifact",gatherMode:"snapshot",driver:a,baseArtifacts:e,artifactDefinitions:t,artifactState:o,computedCache:n,settings:r.settings}),await a.disconnect();const s=await HV(o);return JV(e,s)}),o),runnerOptions:o}}};const ZV=on.default,QV=aV,eW=pu,{getEmptyArtifactState:tW,collectPhaseArtifacts:rW,awaitArtifacts:aW}=oV,{prepareTargetForTimespanMode:nW}=es,{initializeConfig:iW}=$V,{getBaseArtifacts:oW,finalizeArtifacts:sW}=ac;var cW={startTimespanGather:async function startTimespanGather$2(e){const{configContext:t={}}=e;ZV.setLevel(t.logLevel||"error");const{config:r}=iW(e.config,{...t,gatherMode:"timespan"}),a=new QV(e.page);await a.connect();const n=new Map,i=r.artifacts||[],o=await a.url(),s=await oW(r,a,{gatherMode:"timespan"
|
1221
|
+
}),c=tW(),l={url:o,driver:a,artifactDefinitions:i,artifactState:c,baseArtifacts:s,computedCache:n,gatherMode:"timespan",settings:r.settings};return await nW(a,r.settings),await rW({phase:"startInstrumentation",...l}),await rW({phase:"startSensitiveInstrumentation",...l}),{async endTimespanGather(){const e=await a.url();l.url=e;const t={config:r,computedCache:n};return{artifacts:await eW.gather((async()=>{s.URL.requestedUrl=o,s.URL.finalUrl=e,await rW({phase:"stopSensitiveInstrumentation",...l}),await rW({phase:"stopInstrumentation",...l}),await rW({phase:"getArtifact",...l}),await a.disconnect();const t=await aW(c);return sW(s,t)}),t),runnerOptions:t}}}}};const lW=on.default,uW=aV,dW=pu,{getEmptyArtifactState:mW,collectPhaseArtifacts:pW,awaitArtifacts:hW}=oV,gW=es,{gotoURL:fW}=_s,yW=Ko,vW=Wo,{defaultNavigationConfig:bW}=mn,{initializeConfig:wW}=$V,{getBaseArtifacts:SW,finalizeArtifacts:TW}=ac,EW=Vn,xW=vi.exports,_W=ji,{getPageLoadError:AW}=Bo,RW=oo,kW=Ws,DW=Lo
|
1222
|
+
;async function _setup({driver:e,config:t,requestor:r,options:a}){await e.connect(),a?.skipAboutBlank||await fW(e,bW.blankPage,{waitUntil:["navigated"]});const n=await SW(t,e,{gatherMode:"navigation"});return"string"==typeof r&&(n.URL.requestedUrl=r),await gW.prepareTargetForNavigationMode(e,t.settings),{baseArtifacts:n}}async function _setupNavigation({requestor:e,driver:t,navigation:r,config:a,options:n}){n?.skipAboutBlank||await fW(t,r.blankPage,{...r,waitUntil:["navigated"]});const{warnings:i}=await gW.prepareTargetForIndividualNavigation(t.defaultSession,a.settings,{...r,requestor:e});return{warnings:i}}async function _navigate(e){const{driver:t,config:r,requestor:a}=e;try{const{requestedUrl:n,finalUrl:i,warnings:o}=await fW(t,a,{...e.navigation,debugNavigation:r.settings.debugNavigation,maxWaitForFcp:r.settings.maxWaitForFcp,maxWaitForLoad:r.settings.maxWaitForLoad,waitUntil:e.navigation.pauseAfterFcpMs?["fcp","load"]:["load"]});return{requestedUrl:n,finalUrl:i,
|
1223
|
+
navigationError:void 0,warnings:o}}catch(e){if(!(e instanceof xW))throw e;if("NO_FCP"!==e.code&&"PAGE_HUNG"!==e.code)throw e;if("string"!=typeof a)throw e;return{requestedUrl:a,finalUrl:a,navigationError:e,warnings:[]}}}async function _computeNavigationResult(e,t,r,a){const{navigationError:n,finalUrl:i}=a,o=[...r.warnings,...a.warnings],s=await async function _collectDebugData(e,t){const r=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===kW.symbol)),a=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===RW.symbol)),n=[r,a].filter((e=>Boolean(e)));if(!n.length)return{};await pW({...t,phase:"getArtifact",artifactDefinitions:n});const i=t.artifactState.getArtifact,o=r?.id,s=o&&await i[o],c=s&&await DW.request(s,e),l=a?.id;return{devtoolsLog:s,records:c,trace:l&&await i[l]}}(e,t),c=s.records?AW(n,{url:i,loadFailureMode:e.navigation.loadFailureMode,networkRecords:s.records}):n;if(c){const t=e.config.settings.locale,r=EW.getFormatted(c.friendlyMessage,t)
|
1224
|
+
;lW.error("NavigationRunner",r,a.requestedUrl);const n={},l=`pageLoadError-${e.navigation.id}`;return s.devtoolsLog&&(n.devtoolsLogs={[l]:s.devtoolsLog}),s.trace&&(n.traces={[l]:s.trace}),{requestedUrl:a.requestedUrl,finalUrl:i,pageLoadError:c,artifacts:n,warnings:[...o,c.friendlyMessage]}}{await pW({phase:"getArtifact",...t});const e=await hW(t.artifactState);return{requestedUrl:a.requestedUrl,finalUrl:i,artifacts:e,warnings:o,pageLoadError:void 0}}}async function _navigation(e){const t=mW(),r={url:await e.driver.url(),gatherMode:"navigation",driver:e.driver,computedCache:e.computedCache,artifactDefinitions:e.navigation.artifacts,artifactState:t,baseArtifacts:e.baseArtifacts,settings:e.config.settings},a=await _setupNavigation(e);await pW({phase:"startInstrumentation",...r}),await pW({phase:"startSensitiveInstrumentation",...r});const n=await _navigate(e);return r.url=n.finalUrl,await pW({phase:"stopSensitiveInstrumentation",...r}),await pW({phase:"stopInstrumentation",...r}),
|
1225
|
+
await async function _cleanupNavigation({driver:e}){await vW.clearThrottling(e.defaultSession)}(e),_computeNavigationResult(e,r,a,n)}async function _navigations({driver:e,config:t,requestor:r,baseArtifacts:a,computedCache:n,options:i}){if(!t.navigations)throw new Error("No navigations configured");const o={},s=[];for(const c of t.navigations){const l={driver:e,navigation:c,requestor:r,config:t,baseArtifacts:a,computedCache:n,options:i};let u=!1;const d=await _navigation(l);if("fatal"===c.loadFailureMode&&(d.pageLoadError&&(o.PageLoadError=d.pageLoadError,u=!0),o.URL={requestedUrl:d.requestedUrl,finalUrl:d.finalUrl}),s.push(...d.warnings),Object.assign(o,d.artifacts),u)break}return{artifacts:{...o,LighthouseRunWarnings:s}}}async function _cleanup({requestedUrl:e,driver:t,config:r}){!r.settings.disableStorageReset&&e&&await yW.clearDataForOrigin(t.defaultSession,e),await t.disconnect()}var CW={navigationGather:async function navigationGather$2(e,t){const{page:r,configContext:a={}}=t
|
1226
|
+
;lW.setLevel(a.logLevel||"error");const{config:n}=wW(t.config,{...a,gatherMode:"navigation"}),i=new Map,o={skipAboutBlank:a.skipAboutBlank};"string"!=typeof e&&(o.skipAboutBlank=!0);const s={config:n,computedCache:i};return{artifacts:await dW.gather((async()=>{const t={driver:new uW(r),config:n,requestor:"string"==typeof e?_W.normalizeUrl(e):e,options:o},{baseArtifacts:a}=await _setup(t),{artifacts:s}=await _navigations({...t,baseArtifacts:a,computedCache:i});return await _cleanup(t),TW(a,s)}),s),runnerOptions:s}},_setup,_setupNavigation,_navigate,_navigation,_navigations,_cleanup};const{generateFlowReportHtml:IW}=Zl,{snapshotGather:NW}=XV,{startTimespanGather:LW}=cW,{navigationGather:MW}=CW,PW=pu,{initializeConfig:OW}=$V;async function auditGatherSteps$1(e,t){if(!e.length)throw new Error("Need at least one step before getting the result");const r=[];for(const a of e){const{artifacts:e,name:n,configContext:i}=a;let o=t.gatherStepRunnerOptions?.get(a);if(!o){
|
1227
|
+
const r=a.config||t.config,{gatherMode:n}=e.GatherContext,{config:s}=OW(r,{...i,gatherMode:n});o={config:s,computedCache:new Map}}const s=await PW.audit(e,o);if(!s)throw new Error(`Step "${n}" did not return a result`);r.push({lhr:s.lhr,name:n})}const a=new URL(e[0].artifacts.URL.finalUrl);return{steps:r,name:t.name||`User flow (${a.hostname})`}}var FW={UserFlow:class UserFlow$1{constructor(e,t){this.options={page:e,...t},this.name=t?.name,this._gatherSteps=[],this._gatherStepRunnerOptions=new WeakMap}_shortenUrl(e){const t=new URL(e);return`${t.hostname}${t.pathname}`}_getDefaultStepName(e){const t=this._shortenUrl(e.URL.finalUrl);switch(e.GatherContext.gatherMode){case"navigation":return`Navigation report (${t})`;case"timespan":return`Timespan report (${t})`;case"snapshot":return`Snapshot report (${t})`}}_getNextNavigationOptions(e){const t={...this.options,...e},r={...t.configContext},a={...r.settingsOverrides};void 0===r.skipAboutBlank&&(r.skipAboutBlank=!0)
|
1228
|
+
;return this._gatherSteps.some((e=>"navigation"===e.artifacts.GatherContext.gatherMode))&&void 0===a.disableStorageReset&&(a.disableStorageReset=!0),r.settingsOverrides=a,t.configContext=r,t}_addGatherStep(e,t){const r=t?.stepName,a={artifacts:e.artifacts,name:r||this._getDefaultStepName(e.artifacts),config:t.config,configContext:t.configContext};this._gatherSteps.push(a),this._gatherStepRunnerOptions.set(a,e.runnerOptions)}async navigate(e,t){if(this.currentTimespan)throw new Error("Timespan already in progress");const r=this._getNextNavigationOptions(t),a=await MW(e,r);return this._addGatherStep(a,r),a}async startTimespan(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await LW(t);this.currentTimespan={timespan:r,options:t}}async endTimespan(){if(!this.currentTimespan)throw new Error("No timespan in progress");const{timespan:e,options:t}=this.currentTimespan,r=await e.endTimespanGather();return this.currentTimespan=void 0,
|
1229
|
+
this._addGatherStep(r,t),r}async snapshot(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await NW(t);return this._addGatherStep(r,t),r}async createFlowResult(){return auditGatherSteps$1(this._gatherSteps,{name:this.name,config:this.options.config,gatherStepRunnerOptions:this._gatherStepRunnerOptions})}async generateReport(){const e=await this.createFlowResult();return IW(e)}createArtifactsJson(){return{gatherSteps:this._gatherSteps,name:this.name}}},auditGatherSteps:auditGatherSteps$1};const{UserFlow:UW,auditGatherSteps:jW}=FW,{snapshotGather:BW}=XV,{startTimespanGather:$W}=cW,{navigationGather:qW}=CW,{generateFlowReportHtml:zW}=Zl,VW=pu;var WW=async function snapshot(...e){const t=await BW(...e);return VW.audit(t.artifacts,t.runnerOptions)},GW=async function startTimespan(...e){const{endTimespanGather:t}=await $W(...e);return{endTimespan:async()=>{const e=await t();return VW.audit(e.artifacts,e.runnerOptions)}}
|
1230
|
+
},HW=async function navigation(...e){const t=await qW(...e);return VW.audit(t.artifacts,t.runnerOptions)};const YW=uo;var KW=class RawConnection extends YW{constructor(e){super(),this._port=e,this._port.on("message",this.handleRawMessage.bind(this)),this._port.on("close",this.dispose.bind(this))}connect(){return Promise.resolve()}disconnect(){return this._port.close(),Promise.resolve()}sendRawMessage(e){this._port.send(e)}};globalThis.Buffer=Buffer$2,"undefined"!=typeof self?(globalThis.isDevtools=!0,self.setUpWorkerConnection=function setUpWorkerConnection(e){return new KW(e)},self.runLighthouse=Yz,self.runLighthouseNavigation=HW,self.startLighthouseTimespan=GW,self.runLighthouseSnapshot=WW,self.createConfig=function createConfig(e,t){const r={onlyCategories:e,screenEmulation:{disabled:!0}};return"desktop"===t&&(r.throttling=mn.throttling.desktopDense4G,r.emulatedUserAgent=mn.userAgents.desktop,r.formFactor="desktop"),{extends:"lighthouse:default",
|
1231
|
+
plugins:["lighthouse-plugin-publisher-ads"],settings:r}},self.listenForStatus=function listenForStatus(e){Log.events.addListener("status",e),Log.events.addListener("warning",e)},self.registerLocaleData=Vn.registerLocaleData,self.lookupLocale=function lookupCanonicalLocale(e){return oi.lookupLocale(e,Vn.getCanonicalLocales())}):global.runBundledLighthouse=Yz}();
|