HTTPArchive / custom-metrics

Custom metrics to use with WebPageTest agents
Apache License 2.0
19 stars 21 forks source link

General purpose observer injection #14

Closed rviscomi closed 2 years ago

rviscomi commented 2 years ago

Progress on:

https://github.com/HTTPArchive/almanac.httparchive.org/issues/2881 https://github.com/HTTPArchive/almanac.httparchive.org/issues/2890 https://github.com/HTTPArchive/almanac.httparchive.org/issues/2891

Changes the observer behavior to be able to handle wildcards in the property pathname. For example, navigator.* will observe all properties on the navigator object. Special handling was added for __proto__ properties. Also adds the ability to capture the call stack for any particular properties.

Tests

example.com

Results

It seems like the reset isn't being applied early enough. This might fix itself after the change is merged and the WPT agents consistently execute them in alphabetical order.

As expected, navigator.userAgent is not detected and the call stack is empty.

{
    "call_stacks": {
        "navigator.userAgent": []
    },
    "navigator.clipboard": 2,
    "navigator.storage": 2,
    "navigator.serviceWorker": 4,
    "performance.clearMarks": 1,
    "performance.clearMeasures": 1,
    "performance.getEntriesByType": 9,
    "performance.timing": 9,
    "performance.timing.domInteractive": 1,
    "performance.timing.domContentLoadedEventStart": 1,
    "performance.timing.domContentLoadedEventEnd": 1,
    "performance.timing.domComplete": 1,
    "performance.timing.loadEventStart": 1,
    "performance.timing.loadEventEnd": 1,
    "Array.prototype.constructor": 57,
    "Array.prototype.push": 9,
    "Array.prototype.slice": 1,
    "Array.prototype.sort": 2,
    "Array.prototype.includes": 16,
    "Array.prototype.indexOf": 182,
    "Array.prototype.join": 1,
    "Array.prototype.forEach": 8,
    "Array.prototype.filter": 35,
    "Array.prototype.map": 21,
    "Array.prototype.some": 2,
    "Array.prototype.reduce": 6,
    "String.prototype.includes": 13,
    "String.prototype.indexOf": 83,
    "String.prototype.match": 50,
    "String.prototype.replace": 13,
    "String.prototype.slice": 1,
    "String.prototype.split": 12,
    "String.prototype.substring": 20,
    "String.prototype.trim": 11,
    "String.prototype.toLowerCase": 35
}

https://codepen.io/rviscomi/pen/rNJMmgy

const _hjs2 = navigator;
const __483 = 'userAgent'

function functionA() {
  console.log(_hjs2[__483])
}

function functionB() {
  console.log(_hjs2['userAgent'])
  console.log(navigator.userAgent)
}

functionA();
functionB();

Results

Omitted the custom metric observations from these results for clarity, but they're the same as above.

{
    "call_stacks": {
        "navigator.userAgent": {
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionA (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:41:20)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:49:1": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionB (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:45:20)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:50:1": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionB (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:46:25)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:50:1": 1
        }
    },
    "navigator.userAgent": 3
}

nytimes.com

Results

Show custom metric results ```json { "call_stacks": { "navigator.userAgent": { "Error\n at Navigator.get (:95:19)\n at _f (https://www.nytimes.com/:53:1187)\n at https://www.nytimes.com/:53:1287\n at https://www.nytimes.com/:53:1306": 1, "Error\n at Navigator.get (:95:19)\n at https://www.nytimes.com/:55:62\n at https://www.nytimes.com/:85:40": 1, "Error\n at Navigator.get (:95:19)\n at https://www.nytimes.com/:56:13\n at https://www.nytimes.com/:85:40": 1, "Error\n at Navigator.get (:95:19)\n at getUserAgent (https://www.nytimes.com/:117:318)\n at addNYTAppClass (https://www.nytimes.com/:117:814)\n at _f (https://www.nytimes.com/:117:1770)\n at https://www.nytimes.com/:117:2505\n at https://www.nytimes.com/:117:4207": 1, "Error\n at Navigator.get (:95:19)\n at s (https://www.nytimes.com/:128:3434)\n at Object.te [as loadScripts] (https://www.nytimes.com/:128:12516)\n at _f (https://www.nytimes.com/:129:434)\n at https://www.nytimes.com/:129:678\n at https://www.nytimes.com/:129:909\n at https://www.nytimes.com/:131:13": 1, "Error\n at Navigator.get (:95:19)\n at https://www.nytimes.com/:128:1148\n at a (https://www.nytimes.com/:128:1326)\n at e (https://www.nytimes.com/:128:3315)\n at s (https://www.nytimes.com/:128:3480)\n at Object.te [as loadScripts] (https://www.nytimes.com/:128:12516)\n at _f (https://www.nytimes.com/:129:434)\n at https://www.nytimes.com/:129:678\n at https://www.nytimes.com/:129:909\n at https://www.nytimes.com/:131:13": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Pc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2267)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2229\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at Mc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:1520)\n at ug (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25529)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25313)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349\n at Array.forEach ()": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Pc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2267)\n at Array.some ()\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2084\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at Mc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:1527)\n at ug (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25529)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25313)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349": 4, "Error\n at Navigator.get (:95:19)\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:4198\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:12314": 1, "Error\n at Navigator.get (:95:19)\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:4219\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:12314": 1, "Error\n at Navigator.get (:95:19)\n at e.exports (https://www.nytimes.com/ads/prebid6.8.0.js:9:14934)\n at 115 (https://www.nytimes.com/ads/prebid6.8.0.js:3:33854)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 114 (https://www.nytimes.com/ads/prebid6.8.0.js:3:33629)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 87 (https://www.nytimes.com/ads/prebid6.8.0.js:9:110110)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 23 (https://www.nytimes.com/ads/prebid6.8.0.js:9:8924)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)": 1, "Error\n at Navigator.get (:95:19)\n at t.isSafariBrowser (https://www.nytimes.com/ads/prebid6.8.0.js:3:5536)\n at 60 (https://www.nytimes.com/ads/prebid6.8.0.js:9:69895)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 28 (https://www.nytimes.com/ads/prebid6.8.0.js:9:21210)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 22 (https://www.nytimes.com/ads/prebid6.8.0.js:9:6572)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 231 (https://www.nytimes.com/ads/prebid6.8.0.js:9:9246)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)": 1, "Error\n at Navigator.get (:95:19)\n at https://news.google.com/swg/js/v1/swg.js:319:425\n at https://news.google.com/swg/js/v1/swg.js:319:673\n at https://news.google.com/swg/js/v1/swg.js:319:683": 1, "Error\n at Navigator.get (:95:19)\n at xa (https://news.google.com/swg/js/v1/swg.js:11:473)\n at new Lf (https://news.google.com/swg/js/v1/swg.js:305:246)\n at https://news.google.com/swg/js/v1/swg.js:295:699": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1703\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1720\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1735\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1749\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1763\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1781\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1812\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1873\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1904\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2013\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2235\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2517\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3050)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2537\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3079)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2537\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2912)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3050)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2928)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3079)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2928)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:906)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:918)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:948)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2435\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2447\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2461\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2476\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:906)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:918)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:948)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1, "Error\n at Navigator.get (:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16304)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25217": 1, "Error\n at Navigator.get (:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24743)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349\n at Array.forEach ()\n at Na (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11431)": 7, "Error\n at Navigator.get (:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at .a. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array. (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16304)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24743)": 3, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at At (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27526)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27488\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:546\n at Xo (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:80623)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:57305\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59152\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1, "Error\n at Navigator.get (:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at At (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27526)\n at Array.some ()\n at _.We (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:99644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27257\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:546\n at Xo (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:80629)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:57305\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59152": 4, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:471\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:483\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:498\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:509\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:521\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:538\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:577\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:631\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:670\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:682\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:695\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:711\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:725\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:814\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at Vn (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:828\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:833\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:844\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at Vn (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:855\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:861\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:873\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:234:884\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:506:3": 1, "Error\n at Navigator.get (:95:19)\n at eval (eval at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56), :1:69)\n at eval (eval at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56), :1:85)\n at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:413:249\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:769)\n at re (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:94:337)\n at se (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:861)\n at ue (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:96:183)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:97:161": 5, "Error\n at Navigator.get (:95:19)\n at eval (eval at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56), :1:30)\n at eval (eval at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56), :1:129)\n at w..e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:3:56)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:413:249\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:769)\n at re (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:94:337)\n at se (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:861)\n at ue (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:96:183)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:97:161": 5, "Error\n at Navigator.get (:95:19)\n at :1:434\n at :7:42\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:477:414\n at b (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:478:337)\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:769)\n at e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:216:34)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:42:130\n at Array. (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:217:454)\n at Object.execute (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:217:194)": 1, "Error\n at Navigator.get (:95:19)\n at :1:479\n at :7:42\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:477:414\n at b (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:478:337)\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:93:769)\n at e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:216:34)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:42:130\n at Array. (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:217:454)\n at Object.execute (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x:217:194)": 1, "Error\n at Navigator.get (:95:19)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/pages/embeds/_type_-dashboard/index.html.svelte-62479322.js:3:42958\n at st (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:1:104)\n at Array.map ()\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:3950\n at yt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:1517)\n at We (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:5006)\n at new Lt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:6454)\n at De (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:34189)\n at Object._hydrate (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:42833)": 1, "Error\n at Navigator.get (:95:19)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/pages/embeds/_type_-dashboard/index.html.svelte-62479322.js:3:43020\n at st (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:1:104)\n at Array.map ()\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:3950\n at yt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:1517)\n at We (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:5006)\n at new Lt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:6454)\n at De (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:34189)\n at Object._hydrate (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:42833)": 1, "Error\n at Navigator.get (:95:19)\n at https://static01.nyt.com/newsgraphics/2020/08/25/live-events-calendar/e6574a3b315277a0bd1b032c30da9f3ba1e366ad/build/js/main.js:1:92": 1, "Error\n at Navigator.get (:95:19)\n at new _0x2a936d (https://dd.nytimes.com/tags.js:2:117851)\n at [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236074)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1, "Error\n at Navigator.get (:95:19)\n at [as process] (https://dd.nytimes.com/tags.js:2:129347)\n at [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1, "Error\n at Navigator.get (:95:19)\n at [as process] (https://dd.nytimes.com/tags.js:2:129477)\n at [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1, "Error\n at Navigator.get (:95:19)\n at [as process] (https://dd.nytimes.com/tags.js:2:129615)\n at [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:471\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:483\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:498\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:509\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:521\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:538\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:577\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:631\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:670\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:682\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:695\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:711\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:725\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:814\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at Ik (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:828\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:833\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:844\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at Ik (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:855\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:861\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:873\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:884\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1, "Error\n at Navigator.get (:95:19)\n at [as dd_i] (https://dd.nytimes.com/tags.js:2:137258)\n at https://dd.nytimes.com/tags.js:2:131156": 1, "Error\n at Navigator.get (:95:19)\n at _0x2a936d.dd_s (https://dd.nytimes.com/tags.js:2:144195)\n at https://dd.nytimes.com/tags.js:2:131156": 1, "Error\n at Navigator.get (:95:19)\n at _0x2a936d.dd_t (https://dd.nytimes.com/tags.js:2:145725)\n at https://dd.nytimes.com/tags.js:2:131156": 1, "Error\n at Navigator.get (:95:19)\n at _0x2a936d.dd_M (https://dd.nytimes.com/tags.js:2:166737)\n at https://dd.nytimes.com/tags.js:2:131156": 1, "Error\n at Navigator.get (:95:19)\n at _0x3efb98.exports.isSafariUA (https://dd.nytimes.com/tags.js:2:45582)\n at [as requestApi] (https://dd.nytimes.com/tags.js:2:189430)\n at https://dd.nytimes.com/tags.js:2:236294": 1 } }, "navigator.productSub": 1, "navigator.vendor": 1, "navigator.maxTouchPoints": 2, "navigator.plugins": 21, "navigator.mimeTypes": 9, "navigator.hardwareConcurrency": 1, "navigator.cookieEnabled": 1, "navigator.appName": 3, "navigator.appVersion": 3, "navigator.platform": 1, "navigator.userAgent": 125, "navigator.language": 2, "navigator.languages": 1, "navigator.webdriver": 7, "navigator.sendBeacon": 6, "navigator.clipboard": 2, "navigator.mediaDevices": 1, "navigator.storage": 2, "navigator.serviceWorker": 6, "navigator.deviceMemory": 3, "navigator.permissions": 3, "navigator.usb": 1, "navigator.userAgentData": 2, "performance.timeOrigin": 2, "performance.clearMarks": 2, "performance.clearMeasures": 1, "performance.getEntriesByType": 9, "performance.mark": 14, "performance.measure": 3, "performance.now": 257, "performance.timing": 44, "performance.timing.navigationStart": 17, "performance.timing.domLoading": 1, "performance.timing.domInteractive": 2, "performance.timing.domContentLoadedEventStart": 1, "performance.timing.domContentLoadedEventEnd": 1, "performance.timing.domComplete": 1, "performance.timing.loadEventStart": 1, "performance.timing.loadEventEnd": 1, "Array.prototype.constructor": 2113, "Array.prototype.concat": 181, "Array.prototype.fill": 73, "Array.prototype.find": 44, "Array.prototype.findIndex": 1, "Array.prototype.pop": 41, "Array.prototype.push": 10144, "Array.prototype.reverse": 90, "Array.prototype.shift": 3879, "Array.prototype.unshift": 4, "Array.prototype.slice": 1009, "Array.prototype.sort": 105, "Array.prototype.splice": 236, "Array.prototype.includes": 564, "Array.prototype.indexOf": 751, "Array.prototype.join": 1166, "Array.prototype.keys": 6, "Array.prototype.entries": 4, "Array.prototype.values": 1, "Array.prototype.forEach": 451, "Array.prototype.filter": 261, "Array.prototype.flat": 1, "Array.prototype.map": 655, "Array.prototype.every": 16, "Array.prototype.some": 4, "Array.prototype.reduce": 5143, "Array.prototype.toString": 15, "String.prototype.charAt": 79385, "String.prototype.charCodeAt": 55759, "String.prototype.concat": 15, "String.prototype.endsWith": 17, "String.prototype.includes": 1750, "String.prototype.indexOf": 154146, "String.prototype.lastIndexOf": 34, "String.prototype.match": 519, "String.prototype.matchAll": 19, "String.prototype.normalize": 58, "String.prototype.repeat": 2, "String.prototype.replace": 2543, "String.prototype.search": 7, "String.prototype.slice": 54556, "String.prototype.split": 1231, "String.prototype.substr": 211, "String.prototype.substring": 62, "String.prototype.startsWith": 78, "String.prototype.toString": 14, "String.prototype.trim": 958, "String.prototype.toLocaleLowerCase": 100, "String.prototype.toLowerCase": 4001, "String.prototype.toUpperCase": 14, "Object.prototype.constructor": 362, "Object.prototype.hasOwnProperty": 9133, "Object.prototype.propertyIsEnumerable": 5, "Object.prototype.toString": 943, "Object.prototype.valueOf": 582, "Object.prototype.__proto__": 3, "document.featurePolicy": 4 } ```
pmeenan commented 2 years ago

I'm still wondering if there is value in quantity over quality. Even lightweight, is it useful to know which properties are used most often?

For some of the sensitive ones, like window.navigator, I could see there being more value in a more-expensive hook that gets the call stack and counts occurrences by script origin. (new Error()).stack Should do it from what I can tell but you wouldn't want to do that for every method. In the case of navigator, it could identify the analytics scripts, etc instead of the origins and see if there is a smaller set of companies that would be impacted by anonymization efforts.

rviscomi commented 2 years ago

I reduced the amount of noise in my local tests by renaming the WPT metric name to 00_reset rather than just reset. But there's still some stuff getting picked up, presumably caused by WPT itself:

Test results for example.com:

{
    "call_stacks": {
        "navigator.userAgent": []
    },
    "performance.clearMarks": 1,
    "performance.clearMeasures": 1,
    "performance.getEntriesByType": 5,
    "performance.timing": 9,
    "performance.timing.domInteractive": 1,
    "performance.timing.domContentLoadedEventStart": 1,
    "performance.timing.domContentLoadedEventEnd": 1,
    "performance.timing.domComplete": 1,
    "performance.timing.loadEventStart": 1,
    "performance.timing.loadEventEnd": 1,
    "Array.prototype.indexOf": 182,
    "String.prototype.match": 50,
    "String.prototype.substring": 20
}

@pmeenan I assume there's not much we can do about those besides subtracting after the fact.

pmeenan commented 2 years ago

@rviscomi we may be able to move the WPT metrics collection to be after running the custom metrics but that will open it up to a little risk of custom metrics breaking the WPT metrics (mostly marks/measures if a custom metric does anything destructive)

rviscomi commented 2 years ago

For our private instance, how feasible would it be for WPT code to execute between toggling httparchive_enable_observations? Not a big deal as long as we have a consistent way to mask out the WPT observations, but not sure about "consistent".

pmeenan commented 2 years ago

I moved things around a bit to minimize the amount of agent logic between the scripts being injected and the custom metrics.

Updated test for example.com

{
  "call_stacks": {
    "navigator.userAgent": []
  },
  "Array.prototype.indexOf": 182,
  "String.prototype.match": 50,
  "String.prototype.substring": 20
}

Not sure where those uses are coming from but it's possible some of them are from the injected script itself.

rviscomi commented 2 years ago

Added them to the props to trace 😄

const PROPERTIES_TO_TRACE = new Set([
  'navigator.userAgent',
  'String.prototype.substring',
  'String.prototype.match',
  'Array.prototype.indexOf'
]);

Results

{
    "call_stacks": {
        "navigator.userAgent": [],
        "Array.prototype.indexOf": {
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:32:50)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:16:75)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 1,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:32:50)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 11,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:16:75)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 165
        },
        "String.prototype.match": {
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:40:22)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 9,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:40:22)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 41
        },
        "String.prototype.substring": {
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:33:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:36:49)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:33:33)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:36:49)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5
        }
    },
    "Array.prototype.indexOf": 182,
    "String.prototype.match": 50,
    "String.prototype.substring": 20
}
pmeenan commented 2 years ago

Ahh, looks like it is all from the injected performance observer that gets the LCP and CLS element details at the time of the event.

We can probably update the injected script to either disable/re-enable measurement when it is handling an event or bypass the overrides to call the native methods directly.

rviscomi commented 2 years ago

Could that execute after custom metrics? 🤔

pmeenan commented 2 years ago

No, it has to execute while the page is loading so it can get the state of the LCP element at the time the event fires.

pmeenan commented 2 years ago

Tweaking the inject script to remove as many instrumented methods as possible (switching to comparisons insted of indexof, etc). I'm down to one substring call now.

rviscomi commented 2 years ago

I wouldn't worry too much about that since this list of observers may grow in the future. I think we'll need a way to detect when a feature is used directly by WPT and ignore it. It'd add a lot of overhead but we can get call stacks for every feature and look for WPT keywords. WDYT?

pmeenan commented 2 years ago

For now we're in good shape. Updated test

{"call_stacks":{"navigator.userAgent":[]}}

I prefer that we be careful about the methods that we instrument to make sure there is enough of a ROI/use case to measure them before we talk about adding more overhead to each event because adding call stacks to every string and array method access is going to add SIGNIFICANT overhead to some sites.

I like what we did with navigator.userAgent because we have an explicit interest from the privacy analytics for seeing what specific scripts are fingerprinting.

On the call-stacks side of things, I think we want to do some agent-side processing on those as well to pull out just the top-level origin of the URL of the calling script (maybe in addition to the full stack) so it is easy to query.

rviscomi commented 2 years ago

I prefer that we be careful about the methods that we instrument to make sure there is enough of a ROI/use case to measure them before we talk about adding more overhead to each event because adding call stacks to every string and array method access is going to add SIGNIFICANT overhead to some sites.

I like what we did with navigator.userAgent because we have an explicit interest from the privacy analytics for seeing what specific scripts are fingerprinting.

On the call-stacks side of things, I think we want to do some agent-side processing on those as well to pull out just the top-level origin of the URL of the calling script (maybe in addition to the full stack) so it is easy to query.

@pmeenan if you're still ok with the full stack in the results, I think we can add some shared functions on the SQL side to make processing easier. With that, does this PR LGTY?

rviscomi commented 2 years ago

Good suggestion, thanks. Added.