Changeset 3372612
- Timestamp:
- 10/03/2025 09:44:34 PM (6 months ago)
- Location:
- debughawk
- Files:
-
- 18 edited
- 1 copied
-
tags/1.1.0 (copied) (copied from debughawk/trunk)
-
tags/1.1.0/debughawk.php (modified) (2 diffs)
-
tags/1.1.0/readme.txt (modified) (2 diffs)
-
tags/1.1.0/resources/dist/beacon.js (modified) (1 diff)
-
tags/1.1.0/resources/src/beacon.ts (modified) (2 diffs)
-
tags/1.1.0/src/Collectors/WordpressCollector.php (modified) (1 diff)
-
tags/1.1.0/src/Config.php (modified) (2 diffs)
-
tags/1.1.0/src/Dispatchers/BeaconDispatcher.php (modified) (1 diff)
-
tags/1.1.0/vendor/composer/installed.php (modified) (2 diffs)
-
tags/1.1.0/wp-content/db.php (modified) (1 diff)
-
trunk/debughawk.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/resources/dist/beacon.js (modified) (1 diff)
-
trunk/resources/src/beacon.ts (modified) (2 diffs)
-
trunk/src/Collectors/WordpressCollector.php (modified) (1 diff)
-
trunk/src/Config.php (modified) (2 diffs)
-
trunk/src/Dispatchers/BeaconDispatcher.php (modified) (1 diff)
-
trunk/vendor/composer/installed.php (modified) (2 diffs)
-
trunk/wp-content/db.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
debughawk/tags/1.1.0/debughawk.php
r3364835 r3372612 5 5 * Description: WordPress performance debugging and monitoring, simplified. 6 6 * Author: DebugHawk 7 * Version: 1. 0.17 * Version: 1.1.0 8 8 * Requires PHP: 7.4 9 9 * Requires WP: 6.3 … … 24 24 25 25 $config = defined( 'DEBUGHAWK_CONFIG' ) ? DEBUGHAWK_CONFIG : []; 26 $version = '1. 0.1';26 $version = '1.1.0'; 27 27 28 28 ( new Plugin( -
debughawk/tags/1.1.0/readme.txt
r3364835 r3372612 2 2 Contributors: A5hleyRich 3 3 Tags: performance, monitoring, debug, debugging, query monitor 4 Tested up to: 6.8. 25 Stable tag: 1. 0.14 Tested up to: 6.8.3 5 Stable tag: 1.1.0 6 6 Requires at least: 6.3 7 7 Requires PHP: 7.4 … … 51 51 == Changelog == 52 52 53 = 1.1.0 = 54 * Beacon script now served from global CDN instead of locally from WordPress 55 * Send DebugHawk plugin version as part of telemetry payload 56 53 57 = 1.0.1 = 54 58 * Only track redirects originating from the same domain -
debughawk/tags/1.1.0/resources/dist/beacon.js
r3318982 r3372612 1 (function(){"use strict";var P,x=-1,v=function(r){addEventListener("pageshow",function(e){e.persisted&&(x=e.timeStamp,r(e))},!0)},A=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},S=function(){var r=A();return r&&r.activationStart||0},p=function(r,e){var t=A(),i="navigate";return x>=0?i="back-forward-cache":t&&(document.prerendering||S()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},M=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var i=new PerformanceObserver(function(n){Promise.resolve().then(function(){e(n.getEntries())})});return i.observe(Object.assign({type:r,buffered:!0},t||{})),i}}catch{}},g=function(r,e,t,i){var n,o;return function(c){e.value>=0&&(c||i)&&((o=e.value-(n||0))||n===void 0)&&(n=e.value,e.delta=o,e.rating=function(d,a){return d>a[1]?"poor":d>a[0]?"needs-improvement":"good"}(e.value,t),r(e))}},O=function(r){requestAnimationFrame(function(){return requestAnimationFrame(function(){return r()})})},B=function(r){document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()})},T=function(r){var e=!1;return function(){e||(r(),e=!0)}},y=-1,L=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},_=function(r){document.visibilityState==="hidden"&&y>-1&&(y=r.type==="visibilitychange"?r.timeStamp:0,$())},R=function(){addEventListener("visibilitychange",_,!0),addEventListener("prerenderingchange",_,!0)},$=function(){removeEventListener("visibilitychange",_,!0),removeEventListener("prerenderingchange",_,!0)},D=function(){return y<0&&(y=L(),R(),v(function(){setTimeout(function(){y=L(),R()},0)})),{get firstHiddenTime(){return y}}},F=function(r){document.prerendering?addEventListener("prerenderingchange",function(){return r()},!0):r()},V=[1800,3e3],W=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("FCP"),o=M("paint",function(c){c.forEach(function(d){d.name==="first-contentful-paint"&&(o.disconnect(),d.startTime<i.firstHiddenTime&&(n.value=Math.max(d.startTime-S(),0),n.entries.push(d),t(!0)))})});o&&(t=g(r,n,V,e.reportAllChanges),v(function(c){n=p("FCP"),t=g(r,n,V,e.reportAllChanges),O(function(){n.value=performance.now()-c.timeStamp,t(!0)})}))})},I=[.1,.25],q=function(r,e){e=e||{},W(T(function(){var t,i=p("CLS",0),n=0,o=[],c=function(a){a.forEach(function(f){if(!f.hadRecentInput){var m=o[0],z=o[o.length-1];n&&f.startTime-z.startTime<1e3&&f.startTime-m.startTime<5e3?(n+=f.value,o.push(f)):(n=f.value,o=[f])}}),n>i.value&&(i.value=n,i.entries=o,t())},d=M("layout-shift",c);d&&(t=g(r,i,I,e.reportAllChanges),B(function(){c(d.takeRecords()),t(!0)}),v(function(){n=0,i=p("CLS",0),t=g(r,i,I,e.reportAllChanges),O(function(){return t()})}),setTimeout(t,0))}))},j=0,N=1/0,k=0,ee=function(r){r.forEach(function(e){e.interactionId&&(N=Math.min(N,e.interactionId),k=Math.max(k,e.interactionId),j=k?(k-N)/7+1:0)})},G=function(){return P?j:performance.interactionCount||0},te=function(){"interactionCount"in performance||P||(P=M("event",ee,{type:"event",buffered:!0,durationThreshold:0}))},b=[],E=new Map,Q=0,re=function(){var r=Math.min(b.length-1,Math.floor((G()-Q)/50));return b[r]},ie=[],se=function(r){if(ie.forEach(function(n){return n(r)}),r.interactionId||r.entryType==="first-input"){var e=b[b.length-1],t=E.get(r.interactionId);if(t||b.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else{var i={id:r.interactionId,latency:r.duration,entries:[r]};E.set(i.id,i),b.push(i)}b.sort(function(n,o){return o.latency-n.latency}),b.length>10&&b.splice(10).forEach(function(n){return E.delete(n.id)})}}},H=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=T(r),document.visibilityState==="hidden"?r():(t=e(r),B(r)),t},K=[200,500],ne=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},F(function(){var t;te();var i,n=p("INP"),o=function(d){H(function(){d.forEach(se);var a=re();a&&a.latency!==n.value&&(n.value=a.latency,n.entries=a.entries,i())})},c=M("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=g(r,n,K,e.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),B(function(){o(c.takeRecords()),i(!0)}),v(function(){Q=G(),b.length=0,E.clear(),n=p("INP"),i=g(r,n,K,e.reportAllChanges)}))}))},U=[2500,4e3],C={},oe=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("LCP"),o=function(a){e.reportAllChanges||(a=a.slice(-1)),a.forEach(function(f){f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-S(),0),n.entries=[f],t())})},c=M("largest-contentful-paint",o);if(c){t=g(r,n,U,e.reportAllChanges);var d=T(function(){C[n.id]||(o(c.takeRecords()),c.disconnect(),C[n.id]=!0,t(!0))});["keydown","click"].forEach(function(a){addEventListener(a,function(){return H(d)},{once:!0,capture:!0})}),B(d),v(function(a){n=p("LCP"),t=g(r,n,U,e.reportAllChanges),O(function(){n.value=performance.now()-a.timeStamp,C[n.id]=!0,t(!0)})})}})},J=[800,1800],ae=function r(e){document.prerendering?F(function(){return r(e)}):document.readyState!=="complete"?addEventListener("load",function(){return r(e)},!0):setTimeout(e,0)},ce=function(r,e){e=e||{};var t=p("TTFB"),i=g(r,t,J,e.reportAllChanges);ae(function(){var n=A();n&&(t.value=Math.max(n.responseStart-S(),0),t.entries=[n],i(!0),v(function(){t=p("TTFB",0),(i=g(r,t,J,e.reportAllChanges))(!0)}))})};const de={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},l={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},h={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},w={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class s{static getFirstMatch(e,t){const i=t.match(e);return i&&i.length>0&&i[1]||""}static getSecondMatch(e,t){const i=t.match(e);return i&&i.length>1&&i[2]||""}static matchAndReturnConst(e,t,i){if(e.test(t))return i}static getWindowsVersionName(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),t[0]===10)switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),!(t[0]===1&&t[1]<5)){if(t[0]===1&&t[1]<6)return"Cupcake";if(t[0]===1&&t[1]>=6)return"Donut";if(t[0]===2&&t[1]<2)return"Eclair";if(t[0]===2&&t[1]===2)return"Froyo";if(t[0]===2&&t[1]>2)return"Gingerbread";if(t[0]===3)return"Honeycomb";if(t[0]===4&&t[1]<1)return"Ice Cream Sandwich";if(t[0]===4&&t[1]<4)return"Jelly Bean";if(t[0]===4&&t[1]>=4)return"KitKat";if(t[0]===5)return"Lollipop";if(t[0]===6)return"Marshmallow";if(t[0]===7)return"Nougat";if(t[0]===8)return"Oreo";if(t[0]===9)return"Pie"}}static getVersionPrecision(e){return e.split(".").length}static compareVersions(e,t,i=!1){const n=s.getVersionPrecision(e),o=s.getVersionPrecision(t);let c=Math.max(n,o),d=0;const a=s.map([e,t],f=>{const m=c-s.getVersionPrecision(f),z=f+new Array(m+1).join(".0");return s.map(z.split("."),Y=>new Array(20-Y.length).join("0")+Y).reverse()});for(i&&(d=c-Math.min(n,o)),c-=1;c>=d;){if(a[0][c]>a[1][c])return 1;if(a[0][c]===a[1][c]){if(c===d)return 0;c-=1}else if(a[0][c]<a[1][c])return-1}}static map(e,t){const i=[];let n;if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n<e.length;n+=1)i.push(t(e[n]));return i}static find(e,t){let i,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(i=0,n=e.length;i<n;i+=1){const o=e[i];if(t(o,i))return o}}static assign(e,...t){const i=e;let n,o;if(Object.assign)return Object.assign(e,...t);for(n=0,o=t.length;n<o;n+=1){const c=t[n];typeof c=="object"&&c!==null&&Object.keys(c).forEach(a=>{i[a]=c[a]})}return e}static getBrowserAlias(e){return de[e]}static getBrowserTypeByAlias(e){return Z[e]||""}}const u=/version\/(\d+(\.?_?\d+)+)/i,ue=[{test:[/googlebot/i],describe(r){const e={name:"Googlebot"},t=s.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/opera/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opr\/|opios/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/SamsungBrowser/i],describe(r){const e={name:"Samsung Internet for Android"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Whale/i],describe(r){const e={name:"NAVER Whale Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MZBrowser/i],describe(r){const e={name:"MZ Browser"},t=s.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/focus/i],describe(r){const e={name:"Focus"},t=s.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/swing/i],describe(r){const e={name:"Swing"},t=s.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/coast/i],describe(r){const e={name:"Opera Coast"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(r){const e={name:"Opera Touch"},t=s.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/yabrowser/i],describe(r){const e={name:"Yandex Browser"},t=s.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/ucbrowser/i],describe(r){const e={name:"UC Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Maxthon|mxios/i],describe(r){const e={name:"Maxthon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/epiphany/i],describe(r){const e={name:"Epiphany"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/puffin/i],describe(r){const e={name:"Puffin"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sleipnir/i],describe(r){const e={name:"Sleipnir"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/k-meleon/i],describe(r){const e={name:"K-Meleon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/micromessenger/i],describe(r){const e={name:"WeChat"},t=s.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qqbrowser/i],describe(r){const e={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},t=s.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/msie|trident/i],describe(r){const e={name:"Internet Explorer"},t=s.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/\sedg\//i],describe(r){const e={name:"Microsoft Edge"},t=s.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/edg([ea]|ios)/i],describe(r){const e={name:"Microsoft Edge"},t=s.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/vivaldi/i],describe(r){const e={name:"Vivaldi"},t=s.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/seamonkey/i],describe(r){const e={name:"SeaMonkey"},t=s.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sailfish/i],describe(r){const e={name:"Sailfish"},t=s.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return t&&(e.version=t),e}},{test:[/silk/i],describe(r){const e={name:"Amazon Silk"},t=s.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/phantom/i],describe(r){const e={name:"PhantomJS"},t=s.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/slimerjs/i],describe(r){const e={name:"SlimerJS"},t=s.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e={name:"BlackBerry"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(web|hpw)[o0]s/i],describe(r){const e={name:"WebOS Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/bada/i],describe(r){const e={name:"Bada"},t=s.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/tizen/i],describe(r){const e={name:"Tizen"},t=s.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qupzilla/i],describe(r){const e={name:"QupZilla"},t=s.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/firefox|iceweasel|fxios/i],describe(r){const e={name:"Firefox"},t=s.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/electron/i],describe(r){const e={name:"Electron"},t=s.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MiuiBrowser/i],describe(r){const e={name:"Miui"},t=s.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/chromium/i],describe(r){const e={name:"Chromium"},t=s.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/chrome|crios|crmo/i],describe(r){const e={name:"Chrome"},t=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/GSA/i],describe(r){const e={name:"Google Search"},t=s.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e={name:"Android Browser"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/playstation 4/i],describe(r){const e={name:"PlayStation 4"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/safari|applewebkit/i],describe(r){const e={name:"Safari"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/.*/i],describe(r){const e=/^(.*)\/(.*) /,t=/^(.*)\/(.*)[ \t]\((.*)/,n=r.search("\\(")!==-1?t:e;return{name:s.getFirstMatch(n,r),version:s.getSecondMatch(n,r)}}}],le=[{test:[/Roku\/DVP/],describe(r){const e=s.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:h.Roku,version:e}}},{test:[/windows phone/i],describe(r){const e=s.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:h.WindowsPhone,version:e}}},{test:[/windows /i],describe(r){const e=s.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),t=s.getWindowsVersionName(e);return{name:h.Windows,version:e,versionName:t}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(r){const e={name:h.iOS},t=s.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return t&&(e.version=t),e}},{test:[/macintosh/i],describe(r){const e=s.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),t=s.getMacOSVersionName(e),i={name:h.MacOS,version:e};return t&&(i.versionName=t),i}},{test:[/(ipod|iphone|ipad)/i],describe(r){const e=s.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:h.iOS,version:e}}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e=s.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),t=s.getAndroidVersionName(e),i={name:h.Android,version:e};return t&&(i.versionName=t),i}},{test:[/(web|hpw)[o0]s/i],describe(r){const e=s.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),t={name:h.WebOS};return e&&e.length&&(t.version=e),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e=s.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||s.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||s.getFirstMatch(/\bbb(\d+)/i,r);return{name:h.BlackBerry,version:e}}},{test:[/bada/i],describe(r){const e=s.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:h.Bada,version:e}}},{test:[/tizen/i],describe(r){const e=s.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:h.Tizen,version:e}}},{test:[/linux/i],describe(){return{name:h.Linux}}},{test:[/CrOS/],describe(){return{name:h.ChromeOS}}},{test:[/PlayStation 4/],describe(r){const e=s.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:h.PlayStation4,version:e}}}],fe=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(r){const e=s.getFirstMatch(/(can-l01)/i,r)&&"Nova",t={type:l.mobile,vendor:"Huawei"};return e&&(t.model=e),t}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:l.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:l.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:l.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:l.tablet}}},{test(r){const e=r.test(/ipod|iphone/i),t=r.test(/like (ipod|iphone)/i);return e&&!t},describe(r){const e=s.getFirstMatch(/(ipod|iphone)/i,r);return{type:l.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:l.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName(!0)==="blackberry"},describe(){return{type:l.mobile,vendor:"BlackBerry"}}},{test(r){return r.getBrowserName(!0)==="bada"},describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName()==="windows phone"},describe(){return{type:l.mobile,vendor:"Microsoft"}}},{test(r){const e=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&e>=3},describe(){return{type:l.tablet}}},{test(r){return r.getOSName(!0)==="android"},describe(){return{type:l.mobile}}},{test(r){return r.getOSName(!0)==="macos"},describe(){return{type:l.desktop,vendor:"Apple"}}},{test(r){return r.getOSName(!0)==="windows"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="linux"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="playstation 4"},describe(){return{type:l.tv}}},{test(r){return r.getOSName(!0)==="roku"},describe(){return{type:l.tv}}}],he=[{test(r){return r.getBrowserName(!0)==="microsoft edge"},describe(r){if(/\sedg\//i.test(r))return{name:w.Blink};const t=s.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:w.EdgeHTML,version:t}}},{test:[/trident/i],describe(r){const e={name:w.Trident},t=s.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.test(/presto/i)},describe(r){const e={name:w.Presto},t=s.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=r.test(/gecko/i),t=r.test(/like gecko/i);return e&&!t},describe(r){const e={name:w.Gecko},t=s.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:w.Blink}}},{test:[/(apple)?webkit/i],describe(r){const e={name:w.WebKit},t=s.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}}];class X{constructor(e,t=!1){if(e==null||e==="")throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},t!==!0&&this.parse()}getUA(){return this._ua}test(e){return e.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const e=s.find(ue,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.browser=e.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const e=s.find(le,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.os=e.describe(this.getUA())),this.parsedResult.os}getOSName(e){const{name:t}=this.getOS();return e?String(t).toLowerCase()||"":t||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(e=!1){const{type:t}=this.getPlatform();return e?String(t).toLowerCase()||"":t||""}parsePlatform(){this.parsedResult.platform={};const e=s.find(fe,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.platform=e.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const e=s.find(he,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.engine=e.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return s.assign({},this.parsedResult)}satisfies(e){const t={};let i=0;const n={};let o=0;if(Object.keys(e).forEach(d=>{const a=e[d];typeof a=="string"?(n[d]=a,o+=1):typeof a=="object"&&(t[d]=a,i+=1)}),i>0){const d=Object.keys(t),a=s.find(d,m=>this.isOS(m));if(a){const m=this.satisfies(t[a]);if(m!==void 0)return m}const f=s.find(d,m=>this.isPlatform(m));if(f){const m=this.satisfies(t[f]);if(m!==void 0)return m}}if(o>0){const d=Object.keys(n),a=s.find(d,f=>this.isBrowser(f,!0));if(a!==void 0)return this.compareVersion(n[a])}}isBrowser(e,t=!1){const i=this.getBrowserName().toLowerCase();let n=e.toLowerCase();const o=s.getBrowserTypeByAlias(n);return t&&o&&(n=o.toLowerCase()),n===i}compareVersion(e){let t=[0],i=e,n=!1;const o=this.getBrowserVersion();if(typeof o=="string")return e[0]===">"||e[0]==="<"?(i=e.substr(1),e[1]==="="?(n=!0,i=e.substr(2)):t=[],e[0]===">"?t.push(1):t.push(-1)):e[0]==="="?i=e.substr(1):e[0]==="~"&&(n=!0,i=e.substr(1)),t.indexOf(s.compareVersions(o,i,n))>-1}isOS(e){return this.getOSName(!0)===String(e).toLowerCase()}isPlatform(e){return this.getPlatformType(!0)===String(e).toLowerCase()}isEngine(e){return this.getEngineName(!0)===String(e).toLowerCase()}is(e,t=!1){return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}some(e=[]){return e.some(t=>this.is(t))}}/*!1 (function(){"use strict";var O,z=-1,v=function(r){addEventListener("pageshow",function(e){e.persisted&&(z=e.timeStamp,r(e))},!0)},P=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},S=function(){var r=P();return r&&r.activationStart||0},p=function(r,e){var t=P(),i="navigate";return z>=0?i="back-forward-cache":t&&(document.prerendering||S()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},M=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var i=new PerformanceObserver(function(n){Promise.resolve().then(function(){e(n.getEntries())})});return i.observe(Object.assign({type:r,buffered:!0},t||{})),i}}catch{}},g=function(r,e,t,i){var n,o;return function(c){e.value>=0&&(c||i)&&((o=e.value-(n||0))||n===void 0)&&(n=e.value,e.delta=o,e.rating=function(d,a){return d>a[1]?"poor":d>a[0]?"needs-improvement":"good"}(e.value,t),r(e))}},A=function(r){requestAnimationFrame(function(){return requestAnimationFrame(function(){return r()})})},B=function(r){document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()})},T=function(r){var e=!1;return function(){e||(r(),e=!0)}},y=-1,L=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},_=function(r){document.visibilityState==="hidden"&&y>-1&&(y=r.type==="visibilitychange"?r.timeStamp:0,$())},R=function(){addEventListener("visibilitychange",_,!0),addEventListener("prerenderingchange",_,!0)},$=function(){removeEventListener("visibilitychange",_,!0),removeEventListener("prerenderingchange",_,!0)},D=function(){return y<0&&(y=L(),R(),v(function(){setTimeout(function(){y=L(),R()},0)})),{get firstHiddenTime(){return y}}},F=function(r){document.prerendering?addEventListener("prerenderingchange",function(){return r()},!0):r()},V=[1800,3e3],W=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("FCP"),o=M("paint",function(c){c.forEach(function(d){d.name==="first-contentful-paint"&&(o.disconnect(),d.startTime<i.firstHiddenTime&&(n.value=Math.max(d.startTime-S(),0),n.entries.push(d),t(!0)))})});o&&(t=g(r,n,V,e.reportAllChanges),v(function(c){n=p("FCP"),t=g(r,n,V,e.reportAllChanges),A(function(){n.value=performance.now()-c.timeStamp,t(!0)})}))})},I=[.1,.25],q=function(r,e){e=e||{},W(T(function(){var t,i=p("CLS",0),n=0,o=[],c=function(a){a.forEach(function(f){if(!f.hadRecentInput){var m=o[0],x=o[o.length-1];n&&f.startTime-x.startTime<1e3&&f.startTime-m.startTime<5e3?(n+=f.value,o.push(f)):(n=f.value,o=[f])}}),n>i.value&&(i.value=n,i.entries=o,t())},d=M("layout-shift",c);d&&(t=g(r,i,I,e.reportAllChanges),B(function(){c(d.takeRecords()),t(!0)}),v(function(){n=0,i=p("CLS",0),t=g(r,i,I,e.reportAllChanges),A(function(){return t()})}),setTimeout(t,0))}))},j=0,N=1/0,k=0,ee=function(r){r.forEach(function(e){e.interactionId&&(N=Math.min(N,e.interactionId),k=Math.max(k,e.interactionId),j=k?(k-N)/7+1:0)})},G=function(){return O?j:performance.interactionCount||0},te=function(){"interactionCount"in performance||O||(O=M("event",ee,{type:"event",buffered:!0,durationThreshold:0}))},b=[],E=new Map,Q=0,re=function(){var r=Math.min(b.length-1,Math.floor((G()-Q)/50));return b[r]},ie=[],se=function(r){if(ie.forEach(function(n){return n(r)}),r.interactionId||r.entryType==="first-input"){var e=b[b.length-1],t=E.get(r.interactionId);if(t||b.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else{var i={id:r.interactionId,latency:r.duration,entries:[r]};E.set(i.id,i),b.push(i)}b.sort(function(n,o){return o.latency-n.latency}),b.length>10&&b.splice(10).forEach(function(n){return E.delete(n.id)})}}},H=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=T(r),document.visibilityState==="hidden"?r():(t=e(r),B(r)),t},U=[200,500],ne=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},F(function(){var t;te();var i,n=p("INP"),o=function(d){H(function(){d.forEach(se);var a=re();a&&a.latency!==n.value&&(n.value=a.latency,n.entries=a.entries,i())})},c=M("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=g(r,n,U,e.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),B(function(){o(c.takeRecords()),i(!0)}),v(function(){Q=G(),b.length=0,E.clear(),n=p("INP"),i=g(r,n,U,e.reportAllChanges)}))}))},K=[2500,4e3],C={},oe=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("LCP"),o=function(a){e.reportAllChanges||(a=a.slice(-1)),a.forEach(function(f){f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-S(),0),n.entries=[f],t())})},c=M("largest-contentful-paint",o);if(c){t=g(r,n,K,e.reportAllChanges);var d=T(function(){C[n.id]||(o(c.takeRecords()),c.disconnect(),C[n.id]=!0,t(!0))});["keydown","click"].forEach(function(a){addEventListener(a,function(){return H(d)},{once:!0,capture:!0})}),B(d),v(function(a){n=p("LCP"),t=g(r,n,K,e.reportAllChanges),A(function(){n.value=performance.now()-a.timeStamp,C[n.id]=!0,t(!0)})})}})},J=[800,1800],ae=function r(e){document.prerendering?F(function(){return r(e)}):document.readyState!=="complete"?addEventListener("load",function(){return r(e)},!0):setTimeout(e,0)},ce=function(r,e){e=e||{};var t=p("TTFB"),i=g(r,t,J,e.reportAllChanges);ae(function(){var n=P();n&&(t.value=Math.max(n.responseStart-S(),0),t.entries=[n],i(!0),v(function(){t=p("TTFB",0),(i=g(r,t,J,e.reportAllChanges))(!0)}))})};const de={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},l={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},h={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},w={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class s{static getFirstMatch(e,t){const i=t.match(e);return i&&i.length>0&&i[1]||""}static getSecondMatch(e,t){const i=t.match(e);return i&&i.length>1&&i[2]||""}static matchAndReturnConst(e,t,i){if(e.test(t))return i}static getWindowsVersionName(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),t[0]===10)switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),!(t[0]===1&&t[1]<5)){if(t[0]===1&&t[1]<6)return"Cupcake";if(t[0]===1&&t[1]>=6)return"Donut";if(t[0]===2&&t[1]<2)return"Eclair";if(t[0]===2&&t[1]===2)return"Froyo";if(t[0]===2&&t[1]>2)return"Gingerbread";if(t[0]===3)return"Honeycomb";if(t[0]===4&&t[1]<1)return"Ice Cream Sandwich";if(t[0]===4&&t[1]<4)return"Jelly Bean";if(t[0]===4&&t[1]>=4)return"KitKat";if(t[0]===5)return"Lollipop";if(t[0]===6)return"Marshmallow";if(t[0]===7)return"Nougat";if(t[0]===8)return"Oreo";if(t[0]===9)return"Pie"}}static getVersionPrecision(e){return e.split(".").length}static compareVersions(e,t,i=!1){const n=s.getVersionPrecision(e),o=s.getVersionPrecision(t);let c=Math.max(n,o),d=0;const a=s.map([e,t],f=>{const m=c-s.getVersionPrecision(f),x=f+new Array(m+1).join(".0");return s.map(x.split("."),Y=>new Array(20-Y.length).join("0")+Y).reverse()});for(i&&(d=c-Math.min(n,o)),c-=1;c>=d;){if(a[0][c]>a[1][c])return 1;if(a[0][c]===a[1][c]){if(c===d)return 0;c-=1}else if(a[0][c]<a[1][c])return-1}}static map(e,t){const i=[];let n;if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n<e.length;n+=1)i.push(t(e[n]));return i}static find(e,t){let i,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(i=0,n=e.length;i<n;i+=1){const o=e[i];if(t(o,i))return o}}static assign(e,...t){const i=e;let n,o;if(Object.assign)return Object.assign(e,...t);for(n=0,o=t.length;n<o;n+=1){const c=t[n];typeof c=="object"&&c!==null&&Object.keys(c).forEach(a=>{i[a]=c[a]})}return e}static getBrowserAlias(e){return de[e]}static getBrowserTypeByAlias(e){return Z[e]||""}}const u=/version\/(\d+(\.?_?\d+)+)/i,ue=[{test:[/googlebot/i],describe(r){const e={name:"Googlebot"},t=s.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/opera/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opr\/|opios/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/SamsungBrowser/i],describe(r){const e={name:"Samsung Internet for Android"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Whale/i],describe(r){const e={name:"NAVER Whale Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MZBrowser/i],describe(r){const e={name:"MZ Browser"},t=s.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/focus/i],describe(r){const e={name:"Focus"},t=s.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/swing/i],describe(r){const e={name:"Swing"},t=s.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/coast/i],describe(r){const e={name:"Opera Coast"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(r){const e={name:"Opera Touch"},t=s.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/yabrowser/i],describe(r){const e={name:"Yandex Browser"},t=s.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/ucbrowser/i],describe(r){const e={name:"UC Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Maxthon|mxios/i],describe(r){const e={name:"Maxthon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/epiphany/i],describe(r){const e={name:"Epiphany"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/puffin/i],describe(r){const e={name:"Puffin"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sleipnir/i],describe(r){const e={name:"Sleipnir"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/k-meleon/i],describe(r){const e={name:"K-Meleon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/micromessenger/i],describe(r){const e={name:"WeChat"},t=s.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qqbrowser/i],describe(r){const e={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},t=s.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/msie|trident/i],describe(r){const e={name:"Internet Explorer"},t=s.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/\sedg\//i],describe(r){const e={name:"Microsoft Edge"},t=s.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/edg([ea]|ios)/i],describe(r){const e={name:"Microsoft Edge"},t=s.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/vivaldi/i],describe(r){const e={name:"Vivaldi"},t=s.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/seamonkey/i],describe(r){const e={name:"SeaMonkey"},t=s.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sailfish/i],describe(r){const e={name:"Sailfish"},t=s.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return t&&(e.version=t),e}},{test:[/silk/i],describe(r){const e={name:"Amazon Silk"},t=s.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/phantom/i],describe(r){const e={name:"PhantomJS"},t=s.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/slimerjs/i],describe(r){const e={name:"SlimerJS"},t=s.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e={name:"BlackBerry"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(web|hpw)[o0]s/i],describe(r){const e={name:"WebOS Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/bada/i],describe(r){const e={name:"Bada"},t=s.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/tizen/i],describe(r){const e={name:"Tizen"},t=s.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qupzilla/i],describe(r){const e={name:"QupZilla"},t=s.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/firefox|iceweasel|fxios/i],describe(r){const e={name:"Firefox"},t=s.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/electron/i],describe(r){const e={name:"Electron"},t=s.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MiuiBrowser/i],describe(r){const e={name:"Miui"},t=s.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/chromium/i],describe(r){const e={name:"Chromium"},t=s.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/chrome|crios|crmo/i],describe(r){const e={name:"Chrome"},t=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/GSA/i],describe(r){const e={name:"Google Search"},t=s.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e={name:"Android Browser"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/playstation 4/i],describe(r){const e={name:"PlayStation 4"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/safari|applewebkit/i],describe(r){const e={name:"Safari"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/.*/i],describe(r){const e=/^(.*)\/(.*) /,t=/^(.*)\/(.*)[ \t]\((.*)/,n=r.search("\\(")!==-1?t:e;return{name:s.getFirstMatch(n,r),version:s.getSecondMatch(n,r)}}}],le=[{test:[/Roku\/DVP/],describe(r){const e=s.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:h.Roku,version:e}}},{test:[/windows phone/i],describe(r){const e=s.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:h.WindowsPhone,version:e}}},{test:[/windows /i],describe(r){const e=s.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),t=s.getWindowsVersionName(e);return{name:h.Windows,version:e,versionName:t}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(r){const e={name:h.iOS},t=s.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return t&&(e.version=t),e}},{test:[/macintosh/i],describe(r){const e=s.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),t=s.getMacOSVersionName(e),i={name:h.MacOS,version:e};return t&&(i.versionName=t),i}},{test:[/(ipod|iphone|ipad)/i],describe(r){const e=s.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:h.iOS,version:e}}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e=s.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),t=s.getAndroidVersionName(e),i={name:h.Android,version:e};return t&&(i.versionName=t),i}},{test:[/(web|hpw)[o0]s/i],describe(r){const e=s.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),t={name:h.WebOS};return e&&e.length&&(t.version=e),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e=s.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||s.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||s.getFirstMatch(/\bbb(\d+)/i,r);return{name:h.BlackBerry,version:e}}},{test:[/bada/i],describe(r){const e=s.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:h.Bada,version:e}}},{test:[/tizen/i],describe(r){const e=s.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:h.Tizen,version:e}}},{test:[/linux/i],describe(){return{name:h.Linux}}},{test:[/CrOS/],describe(){return{name:h.ChromeOS}}},{test:[/PlayStation 4/],describe(r){const e=s.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:h.PlayStation4,version:e}}}],fe=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(r){const e=s.getFirstMatch(/(can-l01)/i,r)&&"Nova",t={type:l.mobile,vendor:"Huawei"};return e&&(t.model=e),t}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:l.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:l.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:l.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:l.tablet}}},{test(r){const e=r.test(/ipod|iphone/i),t=r.test(/like (ipod|iphone)/i);return e&&!t},describe(r){const e=s.getFirstMatch(/(ipod|iphone)/i,r);return{type:l.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:l.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName(!0)==="blackberry"},describe(){return{type:l.mobile,vendor:"BlackBerry"}}},{test(r){return r.getBrowserName(!0)==="bada"},describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName()==="windows phone"},describe(){return{type:l.mobile,vendor:"Microsoft"}}},{test(r){const e=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&e>=3},describe(){return{type:l.tablet}}},{test(r){return r.getOSName(!0)==="android"},describe(){return{type:l.mobile}}},{test(r){return r.getOSName(!0)==="macos"},describe(){return{type:l.desktop,vendor:"Apple"}}},{test(r){return r.getOSName(!0)==="windows"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="linux"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="playstation 4"},describe(){return{type:l.tv}}},{test(r){return r.getOSName(!0)==="roku"},describe(){return{type:l.tv}}}],he=[{test(r){return r.getBrowserName(!0)==="microsoft edge"},describe(r){if(/\sedg\//i.test(r))return{name:w.Blink};const t=s.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:w.EdgeHTML,version:t}}},{test:[/trident/i],describe(r){const e={name:w.Trident},t=s.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.test(/presto/i)},describe(r){const e={name:w.Presto},t=s.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=r.test(/gecko/i),t=r.test(/like gecko/i);return e&&!t},describe(r){const e={name:w.Gecko},t=s.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:w.Blink}}},{test:[/(apple)?webkit/i],describe(r){const e={name:w.WebKit},t=s.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}}];class X{constructor(e,t=!1){if(e==null||e==="")throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},t!==!0&&this.parse()}getUA(){return this._ua}test(e){return e.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const e=s.find(ue,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.browser=e.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const e=s.find(le,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.os=e.describe(this.getUA())),this.parsedResult.os}getOSName(e){const{name:t}=this.getOS();return e?String(t).toLowerCase()||"":t||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(e=!1){const{type:t}=this.getPlatform();return e?String(t).toLowerCase()||"":t||""}parsePlatform(){this.parsedResult.platform={};const e=s.find(fe,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.platform=e.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const e=s.find(he,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.engine=e.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return s.assign({},this.parsedResult)}satisfies(e){const t={};let i=0;const n={};let o=0;if(Object.keys(e).forEach(d=>{const a=e[d];typeof a=="string"?(n[d]=a,o+=1):typeof a=="object"&&(t[d]=a,i+=1)}),i>0){const d=Object.keys(t),a=s.find(d,m=>this.isOS(m));if(a){const m=this.satisfies(t[a]);if(m!==void 0)return m}const f=s.find(d,m=>this.isPlatform(m));if(f){const m=this.satisfies(t[f]);if(m!==void 0)return m}}if(o>0){const d=Object.keys(n),a=s.find(d,f=>this.isBrowser(f,!0));if(a!==void 0)return this.compareVersion(n[a])}}isBrowser(e,t=!1){const i=this.getBrowserName().toLowerCase();let n=e.toLowerCase();const o=s.getBrowserTypeByAlias(n);return t&&o&&(n=o.toLowerCase()),n===i}compareVersion(e){let t=[0],i=e,n=!1;const o=this.getBrowserVersion();if(typeof o=="string")return e[0]===">"||e[0]==="<"?(i=e.substr(1),e[1]==="="?(n=!0,i=e.substr(2)):t=[],e[0]===">"?t.push(1):t.push(-1)):e[0]==="="?i=e.substr(1):e[0]==="~"&&(n=!0,i=e.substr(1)),t.indexOf(s.compareVersions(o,i,n))>-1}isOS(e){return this.getOSName(!0)===String(e).toLowerCase()}isPlatform(e){return this.getPlatformType(!0)===String(e).toLowerCase()}isEngine(e){return this.getEngineName(!0)===String(e).toLowerCase()}is(e,t=!1){return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}some(e=[]){return e.some(t=>this.is(t))}}/*! 2 2 * Bowser - a browser detector 3 3 * https://github.com/lancedikson/bowser 4 4 * MIT License | (c) Dustin Diaz 2012-2015 5 5 * MIT License | (c) Denis Demchenko 2015-2019 6 */class me{static getParser(e,t=!1){if(typeof e!="string")throw new Error("UserAgent should be a string");return new X(e,t)}static parse(e){return new X(e).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return w}static get OS_MAP(){return h}static get PLATFORMS_MAP(){return l}}class pe{constructor(e){this.beaconSent=!1,this.config=e,this.sessionStart=performance.now(),this.timestamp_ms=Math.floor(Date.now()),this.queue=new Set,this.shouldSendBeacon()&&(this.initBrowserMetrics(),addEventListener("visibilitychange",()=>this.sendBeacon()))}shouldSendBeacon(){const e=Number(this.config.sample_rate);return e<0||e>1?(console.warn("DebugHawk: Invalid sampling rate, defaulting to sending metrics"),!0):e===1?!0:e===0?!1:Math.random()<e}sendBeacon(){if(this.beaconSent||typeof window.DebugHawk>"u"||document.visibilityState==="visible")return;const e=this.preparePayload(),t=JSON.stringify(e);this.shouldUseBeaconApi()?(navigator.sendBeacon(this.config.endpoint,t),this.beaconSent=!0):fetch(this.config.endpoint,{method:"POST",body:t,keepalive:!0,headers:{"Content-Type":"application/json"}}).then(()=>{this.beaconSent=!0}).catch(i=>{console.warn("DebugHawk: Fetch error",i)})}shouldUseBeaconApi(){return this.isBraveBrowser()?!1:"sendBeacon"in navigator}isBraveBrowser(){return"brave"in navigator}preparePayload(){return{server:window.DebugHawk,browser:this.getBrowserMetrics(),user:this.getUserInfo()}}getBrowserMetrics(){let e={title:document.title,requests:this.processNetworkRequests(),timestamp_ms:this.timestamp_ms};return this.queue.forEach(t=>{const i=t.name.toLowerCase();if(i!=="cls"?e[i+"_ms"]=this.roundToDecimals(t.value):e[i]=this.roundToDecimals(t.value,5),i==="ttfb"&&t.entries[0]){const n=this.calculateTtfbMetrics(t.entries[0]);Object.assign(e,n)}}),e}calculateTtfbMetrics(e){let t={};return e.domainLookupStart&&e.connectStart&&(t.dns_ms=this.roundToDecimals(e.connectStart-e.domainLookupStart)),e.connectStart&&e.connectEnd&&(t.connect_ms=this.roundToDecimals(e.connectEnd-e.connectStart)),e.decodedBodySize&&(t.html_body_size=e.decodedBodySize),e.encodedBodySize&&(t.html_transfer_size=e.encodedBodySize),t}processNetworkRequests(){const e=new Set;performance.getEntriesByType("navigation").forEach(i=>e.add(this.processPerformanceEntry(i))),performance.getEntriesByType("resource").forEach(i=>e.add(this.processPerformanceEntry(i)));let t={count:e.size,total_body_size:0,total_transfer_size:0,by_type:{},by_domain:{},by_component:{}};return e.forEach(i=>{t.total_body_size+=i.body_size||0,t.total_transfer_size+=i.transfer_size||0,t.by_type[i.type]||(t.by_type[i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_type[i.type].count++,t.by_type[i.type].body_size+=i.body_size||0,t.by_type[i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_type[i.type].blocking++;const n=this.getDomainFromUrl(i.url);if(t.by_domain[n]||(t.by_domain[n]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_domain[n].count++,t.by_domain[n].body_size+=i.body_size||0,t.by_domain[n].transfer_size+=i.transfer_size||0,i.blocking&&t.by_domain[n].blocking++,!i.url.startsWith(this.config.urls.home)||i.type==="html"||i.type==="other"||i.type==="xhr")return;const o=this.getComponentFromNetworkRequest(i);t.by_component[o]||(t.by_component[o]={}),t.by_component[o][i.type]||(t.by_component[o][i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_component[o][i.type].count++,t.by_component[o][i.type].body_size+=i.body_size||0,t.by_component[o][i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_component[o][i.type].blocking++}),t}processPerformanceEntry(e){return{url:e.name,type:this.getTypeFromPerformanceEntry(e),body_size:e.decodedBodySize,transfer_size:e.encodedBodySize,blocking:e.renderBlockingStatus==="blocking",status:e.responseStatus}}getComponentFromNetworkRequest(e){return e.url.startsWith(this.config.urls.plugin)?`plugin:${e.url.slice(this.config.urls.plugin.length).split("/")[0]}`:e.url.startsWith(this.config.urls.theme)?`theme:${e.url.slice(this.config.urls.theme.length).split("/")[0]}`:e.url.startsWith(this.config.urls.admin)||e.url.startsWith(this.config.urls.includes)?"core":e.url.startsWith(this.config.urls.uploads)?"upload":"other"}getDomainFromUrl(e){try{return new URL(e).hostname}catch{return"unknown"}}get TypeFromPerformanceEntry(e){if(e.initiatorType==="navigation"||e.initiatorType==="iframe")return"html";if(e.initiatorType==="script")return"js";if(e.initiatorType==="img")return"img";if(e.initiatorType==="fetch"||e.initiatorType==="xmlhttprequest")return"xhr";const i=e.name.replace(/\?.*$/,"").match(/\.([^.]+)$/),n=i?i[1].toLowerCase():"";return{css:"css",js:"js",mjs:"js",woff:"font",woff2:"font",ttf:"font",otf:"font",eot:"font",png:"img",jpg:"img",jpeg:"img",gif:"img",svg:"img",webp:"img",ico:"img",avif:"img",mp4:"media",webm:"media",ogv:"media",mp3:"media",ogg:"media",wav:"media",flac:"media"}[n]||"other"}getUserInfo(){var i,n;const e=me.getParser(window.navigator.userAgent),t=performance.now();return{browser:{name:this.isBraveBrowser()?"Brave":e.getBrowserName(),version:this.isBraveBrowser()?null:e.getBrowserVersion(),viewport:{width:((i=window.visualViewport)==null?void 0:i.width)??null,height:((n=window.visualViewport)==null?void 0:n.height)??null}},os:{name:e.getOSName(),version:e.getOSVersion()},platform:e.getPlatformType(),session_duration_ms:this.roundToDecimals(t-this.sessionStart)}}addToQueue(e){this.queue.add(e)}initBrowserMetrics(){const e=this.addToQueue.bind(this);q(e),W(e),ne(e),oe(e),ce(e)}roundToDecimals(e,t=1){const i=Math.pow(10,t);return Math.round(e*i)/i}}typeof window.DebugHawkConfig<"u"&&new pe(window.DebugHawkConfig)})();6 */class me{static getParser(e,t=!1){if(typeof e!="string")throw new Error("UserAgent should be a string");return new X(e,t)}static parse(e){return new X(e).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return w}static get OS_MAP(){return h}static get PLATFORMS_MAP(){return l}}class pe{constructor(e){this.beaconSent=!1,this.config=e,this.sessionStart=performance.now(),this.timestamp_ms=Math.floor(Date.now()),this.queue=new Set,this.shouldSendBeacon()&&(this.initBrowserMetrics(),addEventListener("visibilitychange",()=>this.sendBeacon()))}shouldSendBeacon(){const e=Number(this.config.sample_rate);return e<0||e>1?(console.warn("DebugHawk: Invalid sampling rate, defaulting to sending metrics"),!0):e===1?!0:e===0?!1:Math.random()<e}sendBeacon(){if(this.beaconSent||typeof window.DebugHawk>"u"||document.visibilityState==="visible")return;const e=this.preparePayload(),t=JSON.stringify(e);this.shouldUseBeaconApi()?(navigator.sendBeacon(this.config.endpoint,t),this.beaconSent=!0):fetch(this.config.endpoint,{method:"POST",body:t,keepalive:!0,headers:{"Content-Type":"application/json"}}).then(()=>{this.beaconSent=!0}).catch(i=>{console.warn("DebugHawk: Fetch error",i)})}shouldUseBeaconApi(){return this.isBraveBrowser()?!1:"sendBeacon"in navigator}isBraveBrowser(){return"brave"in navigator}preparePayload(){return{server:window.DebugHawk,browser:this.getBrowserMetrics(),user:this.getUserInfo()}}getBrowserMetrics(){let e={title:document.title,requests:this.processNetworkRequests(),timestamp_ms:this.timestamp_ms};return this.queue.forEach(t=>{const i=t.name.toLowerCase();if(i!=="cls"?e[i+"_ms"]=this.roundToDecimals(t.value):e[i]=this.roundToDecimals(t.value,5),i==="ttfb"&&t.entries[0]){const n=this.calculateTtfbMetrics(t.entries[0]);Object.assign(e,n)}}),e}calculateTtfbMetrics(e){let t={};return e.domainLookupStart&&e.connectStart&&(t.dns_ms=this.roundToDecimals(e.connectStart-e.domainLookupStart)),e.connectStart&&e.connectEnd&&(t.connect_ms=this.roundToDecimals(e.connectEnd-e.connectStart)),e.decodedBodySize&&(t.html_body_size=e.decodedBodySize),e.encodedBodySize&&(t.html_transfer_size=e.encodedBodySize),t}processNetworkRequests(){const e=new Set;performance.getEntriesByType("navigation").forEach(i=>e.add(this.processPerformanceEntry(i))),performance.getEntriesByType("resource").forEach(i=>e.add(this.processPerformanceEntry(i)));let t={count:e.size,total_body_size:0,total_transfer_size:0,by_type:{},by_domain:{},by_component:{}};return e.forEach(i=>{t.total_body_size+=i.body_size||0,t.total_transfer_size+=i.transfer_size||0,t.by_type[i.type]||(t.by_type[i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_type[i.type].count++,t.by_type[i.type].body_size+=i.body_size||0,t.by_type[i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_type[i.type].blocking++;const n=this.getDomainFromUrl(i.url);if(t.by_domain[n]||(t.by_domain[n]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_domain[n].count++,t.by_domain[n].body_size+=i.body_size||0,t.by_domain[n].transfer_size+=i.transfer_size||0,i.blocking&&t.by_domain[n].blocking++,!i.url.startsWith(this.config.urls.home)||i.type==="html"||i.type==="other"||i.type==="xhr")return;const o=this.getComponentFromNetworkRequest(i);t.by_component[o]||(t.by_component[o]={}),t.by_component[o][i.type]||(t.by_component[o][i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_component[o][i.type].count++,t.by_component[o][i.type].body_size+=i.body_size||0,t.by_component[o][i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_component[o][i.type].blocking++}),t}processPerformanceEntry(e){return{url:e.name,type:this.getTypeFromPerformanceEntry(e),body_size:e.decodedBodySize,transfer_size:e.encodedBodySize,blocking:e.renderBlockingStatus==="blocking",status:e.responseStatus}}getComponentFromNetworkRequest(e){return e.url.startsWith(this.config.urls.plugin)?`plugin:${e.url.slice(this.config.urls.plugin.length).split("/")[0]}`:e.url.startsWith(this.config.urls.theme)?`theme:${e.url.slice(this.config.urls.theme.length).split("/")[0]}`:e.url.startsWith(this.config.urls.admin)||e.url.startsWith(this.config.urls.includes)?"core":e.url.startsWith(this.config.urls.uploads)?"upload":"other"}getDomainFromUrl(e){try{return new URL(e).hostname}catch{return"unknown"}}getFileExtensionFromUrl(e){try{const i=new URL(e).pathname,n=i.lastIndexOf(".");if(n===-1||n===i.length-1)return"";const o=i.substring(n+1);return o.includes("/")?"":o.toLowerCase()}catch{return""}}getTypeFromPerformanceEntry(e){if(e.initiatorType==="navigation"||e.initiatorType==="iframe")return"html";if(e.initiatorType==="script")return"js";if(e.initiatorType==="img")return"img";if(e.initiatorType==="fetch"||e.initiatorType==="xmlhttprequest")return"xhr";const t=this.getFileExtensionFromUrl(e.name);return{css:"css",js:"js",mjs:"js",woff:"font",woff2:"font",ttf:"font",otf:"font",eot:"font",png:"img",jpg:"img",jpeg:"img",gif:"img",svg:"img",webp:"img",ico:"img",avif:"img",mp4:"media",webm:"media",ogv:"media",mp3:"media",ogg:"media",wav:"media",flac:"media"}[t]||"other"}getUserInfo(){var i,n;const e=me.getParser(window.navigator.userAgent),t=performance.now();return{browser:{name:this.isBraveBrowser()?"Brave":e.getBrowserName(),version:this.isBraveBrowser()?null:e.getBrowserVersion(),viewport:{width:((i=window.visualViewport)==null?void 0:i.width)??null,height:((n=window.visualViewport)==null?void 0:n.height)??null}},os:{name:e.getOSName(),version:e.getOSVersion()},platform:e.getPlatformType(),session_duration_ms:this.roundToDecimals(t-this.sessionStart)}}addToQueue(e){this.queue.add(e)}initBrowserMetrics(){const e=this.addToQueue.bind(this);q(e),W(e),ne(e),oe(e),ce(e)}roundToDecimals(e,t=1){const i=Math.pow(10,t);return Math.round(e*i)/i}}typeof window.DebugHawkConfig<"u"&&new pe(window.DebugHawkConfig)})(); -
debughawk/tags/1.1.0/resources/src/beacon.ts
r3358840 r3372612 276 276 } 277 277 278 private getFileExtensionFromUrl(url: string): string { 279 try { 280 const urlObj = new URL(url); 281 const pathname = urlObj.pathname; 282 const lastDotIndex = pathname.lastIndexOf('.'); 283 284 if (lastDotIndex === -1 || lastDotIndex === pathname.length - 1) { 285 return ''; 286 } 287 288 const extension = pathname.substring(lastDotIndex + 1); 289 290 if (extension.includes('/')) { 291 return ''; 292 } 293 294 return extension.toLowerCase(); 295 } catch (e) { 296 return ''; 297 } 298 } 299 278 300 private getTypeFromPerformanceEntry(entry: PerformanceNavigationTiming | PerformanceResourceTiming): string { 279 301 if (entry.initiatorType === 'navigation' || entry.initiatorType === 'iframe') { … … 293 315 } 294 316 295 const url = entry.name.replace(/\?.*$/, ''); 296 const match = url.match(/\.([^.]+)$/); 297 const ext = match ? match[1].toLowerCase() : ''; 317 const ext = this.getFileExtensionFromUrl(entry.name); 298 318 299 319 const types: { [key: string]: string } = { -
debughawk/tags/1.1.0/src/Collectors/WordpressCollector.php
r3318985 r3372612 10 10 11 11 return [ 12 'is_admin' => is_admin(), 13 'is_front_page' => is_front_page(), 14 'is_search' => is_search(), 15 'is_404' => is_404(), 16 'post_id' => is_singular() ? get_the_ID() : null, 17 'post_type' => is_singular() ? get_post_type() : null, 18 'user_id' => $user_id ?: null, 19 'version' => get_bloginfo( 'version' ), 12 'is_admin' => is_admin(), 13 'is_front_page' => is_front_page(), 14 'is_search' => is_search(), 15 'is_404' => is_404(), 16 'post_id' => is_singular() ? get_the_ID() : null, 17 'post_type' => is_singular() ? get_post_type() : null, 18 'user_id' => $user_id ?: null, 19 'version' => get_bloginfo( 'version' ), 20 'plugin_version' => $this->config->version, 20 21 ]; 21 22 } -
debughawk/tags/1.1.0/src/Config.php
r3318985 r3372612 6 6 * @property boolean $enabled 7 7 * @property string $endpoint 8 * @property string $script_url 8 9 * @property float $sample_rate 9 10 * @property string $secret … … 16 17 private const DEFAULT_CONFIG = [ 17 18 'enabled' => true, 19 'script_url' => 'https://cdn.debughawk.com/script.js', 18 20 'sample_rate' => 1, 19 21 'trace_admin_pages' => true, -
debughawk/tags/1.1.0/src/Dispatchers/BeaconDispatcher.php
r3318985 r3372612 45 45 46 46 public function enqueue_beacon(): void { 47 $src = plugins_url( 'resources/dist/beacon.js', $this->config->path ); 48 49 wp_enqueue_script( 'debughawk-beacon', $src, [], $this->config->version, [ 47 wp_enqueue_script( 'debughawk-beacon', $this->config->script_url, [], null, [ 50 48 'strategy' => 'async', 51 49 ] ); -
debughawk/tags/1.1.0/vendor/composer/installed.php
r3364835 r3372612 2 2 'root' => array( 3 3 'name' => 'debughawk/debughawk-plugin', 4 'pretty_version' => 'v1. 0.1',5 'version' => '1. 0.1.0',6 'reference' => ' 836254a322db0d24ef91f2f301cd6e2b94c10f42',4 'pretty_version' => 'v1.1.0', 5 'version' => '1.1.0.0', 6 'reference' => 'b832225d8d6fc338990943d1bd943c36eb52f663', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 12 12 'versions' => array( 13 13 'debughawk/debughawk-plugin' => array( 14 'pretty_version' => 'v1. 0.1',15 'version' => '1. 0.1.0',16 'reference' => ' 836254a322db0d24ef91f2f301cd6e2b94c10f42',14 'pretty_version' => 'v1.1.0', 15 'version' => '1.1.0.0', 16 'reference' => 'b832225d8d6fc338990943d1bd943c36eb52f663', 17 17 'type' => 'wordpress-plugin', 18 18 'install_path' => __DIR__ . '/../../', -
debughawk/tags/1.1.0/wp-content/db.php
r3364835 r3372612 5 5 * Description: Database drop-in for DebugHawk to capture database metrics and slow queries. 6 6 * Author: DebugHawk 7 * Version: 1. 0.17 * Version: 1.1.0 8 8 * Requires PHP: 7.4 9 9 * Requires WP: 6.3 -
debughawk/trunk/debughawk.php
r3364835 r3372612 5 5 * Description: WordPress performance debugging and monitoring, simplified. 6 6 * Author: DebugHawk 7 * Version: 1. 0.17 * Version: 1.1.0 8 8 * Requires PHP: 7.4 9 9 * Requires WP: 6.3 … … 24 24 25 25 $config = defined( 'DEBUGHAWK_CONFIG' ) ? DEBUGHAWK_CONFIG : []; 26 $version = '1. 0.1';26 $version = '1.1.0'; 27 27 28 28 ( new Plugin( -
debughawk/trunk/readme.txt
r3364835 r3372612 2 2 Contributors: A5hleyRich 3 3 Tags: performance, monitoring, debug, debugging, query monitor 4 Tested up to: 6.8. 25 Stable tag: 1. 0.14 Tested up to: 6.8.3 5 Stable tag: 1.1.0 6 6 Requires at least: 6.3 7 7 Requires PHP: 7.4 … … 51 51 == Changelog == 52 52 53 = 1.1.0 = 54 * Beacon script now served from global CDN instead of locally from WordPress 55 * Send DebugHawk plugin version as part of telemetry payload 56 53 57 = 1.0.1 = 54 58 * Only track redirects originating from the same domain -
debughawk/trunk/resources/dist/beacon.js
r3318982 r3372612 1 (function(){"use strict";var P,x=-1,v=function(r){addEventListener("pageshow",function(e){e.persisted&&(x=e.timeStamp,r(e))},!0)},A=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},S=function(){var r=A();return r&&r.activationStart||0},p=function(r,e){var t=A(),i="navigate";return x>=0?i="back-forward-cache":t&&(document.prerendering||S()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},M=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var i=new PerformanceObserver(function(n){Promise.resolve().then(function(){e(n.getEntries())})});return i.observe(Object.assign({type:r,buffered:!0},t||{})),i}}catch{}},g=function(r,e,t,i){var n,o;return function(c){e.value>=0&&(c||i)&&((o=e.value-(n||0))||n===void 0)&&(n=e.value,e.delta=o,e.rating=function(d,a){return d>a[1]?"poor":d>a[0]?"needs-improvement":"good"}(e.value,t),r(e))}},O=function(r){requestAnimationFrame(function(){return requestAnimationFrame(function(){return r()})})},B=function(r){document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()})},T=function(r){var e=!1;return function(){e||(r(),e=!0)}},y=-1,L=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},_=function(r){document.visibilityState==="hidden"&&y>-1&&(y=r.type==="visibilitychange"?r.timeStamp:0,$())},R=function(){addEventListener("visibilitychange",_,!0),addEventListener("prerenderingchange",_,!0)},$=function(){removeEventListener("visibilitychange",_,!0),removeEventListener("prerenderingchange",_,!0)},D=function(){return y<0&&(y=L(),R(),v(function(){setTimeout(function(){y=L(),R()},0)})),{get firstHiddenTime(){return y}}},F=function(r){document.prerendering?addEventListener("prerenderingchange",function(){return r()},!0):r()},V=[1800,3e3],W=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("FCP"),o=M("paint",function(c){c.forEach(function(d){d.name==="first-contentful-paint"&&(o.disconnect(),d.startTime<i.firstHiddenTime&&(n.value=Math.max(d.startTime-S(),0),n.entries.push(d),t(!0)))})});o&&(t=g(r,n,V,e.reportAllChanges),v(function(c){n=p("FCP"),t=g(r,n,V,e.reportAllChanges),O(function(){n.value=performance.now()-c.timeStamp,t(!0)})}))})},I=[.1,.25],q=function(r,e){e=e||{},W(T(function(){var t,i=p("CLS",0),n=0,o=[],c=function(a){a.forEach(function(f){if(!f.hadRecentInput){var m=o[0],z=o[o.length-1];n&&f.startTime-z.startTime<1e3&&f.startTime-m.startTime<5e3?(n+=f.value,o.push(f)):(n=f.value,o=[f])}}),n>i.value&&(i.value=n,i.entries=o,t())},d=M("layout-shift",c);d&&(t=g(r,i,I,e.reportAllChanges),B(function(){c(d.takeRecords()),t(!0)}),v(function(){n=0,i=p("CLS",0),t=g(r,i,I,e.reportAllChanges),O(function(){return t()})}),setTimeout(t,0))}))},j=0,N=1/0,k=0,ee=function(r){r.forEach(function(e){e.interactionId&&(N=Math.min(N,e.interactionId),k=Math.max(k,e.interactionId),j=k?(k-N)/7+1:0)})},G=function(){return P?j:performance.interactionCount||0},te=function(){"interactionCount"in performance||P||(P=M("event",ee,{type:"event",buffered:!0,durationThreshold:0}))},b=[],E=new Map,Q=0,re=function(){var r=Math.min(b.length-1,Math.floor((G()-Q)/50));return b[r]},ie=[],se=function(r){if(ie.forEach(function(n){return n(r)}),r.interactionId||r.entryType==="first-input"){var e=b[b.length-1],t=E.get(r.interactionId);if(t||b.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else{var i={id:r.interactionId,latency:r.duration,entries:[r]};E.set(i.id,i),b.push(i)}b.sort(function(n,o){return o.latency-n.latency}),b.length>10&&b.splice(10).forEach(function(n){return E.delete(n.id)})}}},H=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=T(r),document.visibilityState==="hidden"?r():(t=e(r),B(r)),t},K=[200,500],ne=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},F(function(){var t;te();var i,n=p("INP"),o=function(d){H(function(){d.forEach(se);var a=re();a&&a.latency!==n.value&&(n.value=a.latency,n.entries=a.entries,i())})},c=M("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=g(r,n,K,e.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),B(function(){o(c.takeRecords()),i(!0)}),v(function(){Q=G(),b.length=0,E.clear(),n=p("INP"),i=g(r,n,K,e.reportAllChanges)}))}))},U=[2500,4e3],C={},oe=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("LCP"),o=function(a){e.reportAllChanges||(a=a.slice(-1)),a.forEach(function(f){f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-S(),0),n.entries=[f],t())})},c=M("largest-contentful-paint",o);if(c){t=g(r,n,U,e.reportAllChanges);var d=T(function(){C[n.id]||(o(c.takeRecords()),c.disconnect(),C[n.id]=!0,t(!0))});["keydown","click"].forEach(function(a){addEventListener(a,function(){return H(d)},{once:!0,capture:!0})}),B(d),v(function(a){n=p("LCP"),t=g(r,n,U,e.reportAllChanges),O(function(){n.value=performance.now()-a.timeStamp,C[n.id]=!0,t(!0)})})}})},J=[800,1800],ae=function r(e){document.prerendering?F(function(){return r(e)}):document.readyState!=="complete"?addEventListener("load",function(){return r(e)},!0):setTimeout(e,0)},ce=function(r,e){e=e||{};var t=p("TTFB"),i=g(r,t,J,e.reportAllChanges);ae(function(){var n=A();n&&(t.value=Math.max(n.responseStart-S(),0),t.entries=[n],i(!0),v(function(){t=p("TTFB",0),(i=g(r,t,J,e.reportAllChanges))(!0)}))})};const de={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},l={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},h={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},w={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class s{static getFirstMatch(e,t){const i=t.match(e);return i&&i.length>0&&i[1]||""}static getSecondMatch(e,t){const i=t.match(e);return i&&i.length>1&&i[2]||""}static matchAndReturnConst(e,t,i){if(e.test(t))return i}static getWindowsVersionName(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),t[0]===10)switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),!(t[0]===1&&t[1]<5)){if(t[0]===1&&t[1]<6)return"Cupcake";if(t[0]===1&&t[1]>=6)return"Donut";if(t[0]===2&&t[1]<2)return"Eclair";if(t[0]===2&&t[1]===2)return"Froyo";if(t[0]===2&&t[1]>2)return"Gingerbread";if(t[0]===3)return"Honeycomb";if(t[0]===4&&t[1]<1)return"Ice Cream Sandwich";if(t[0]===4&&t[1]<4)return"Jelly Bean";if(t[0]===4&&t[1]>=4)return"KitKat";if(t[0]===5)return"Lollipop";if(t[0]===6)return"Marshmallow";if(t[0]===7)return"Nougat";if(t[0]===8)return"Oreo";if(t[0]===9)return"Pie"}}static getVersionPrecision(e){return e.split(".").length}static compareVersions(e,t,i=!1){const n=s.getVersionPrecision(e),o=s.getVersionPrecision(t);let c=Math.max(n,o),d=0;const a=s.map([e,t],f=>{const m=c-s.getVersionPrecision(f),z=f+new Array(m+1).join(".0");return s.map(z.split("."),Y=>new Array(20-Y.length).join("0")+Y).reverse()});for(i&&(d=c-Math.min(n,o)),c-=1;c>=d;){if(a[0][c]>a[1][c])return 1;if(a[0][c]===a[1][c]){if(c===d)return 0;c-=1}else if(a[0][c]<a[1][c])return-1}}static map(e,t){const i=[];let n;if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n<e.length;n+=1)i.push(t(e[n]));return i}static find(e,t){let i,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(i=0,n=e.length;i<n;i+=1){const o=e[i];if(t(o,i))return o}}static assign(e,...t){const i=e;let n,o;if(Object.assign)return Object.assign(e,...t);for(n=0,o=t.length;n<o;n+=1){const c=t[n];typeof c=="object"&&c!==null&&Object.keys(c).forEach(a=>{i[a]=c[a]})}return e}static getBrowserAlias(e){return de[e]}static getBrowserTypeByAlias(e){return Z[e]||""}}const u=/version\/(\d+(\.?_?\d+)+)/i,ue=[{test:[/googlebot/i],describe(r){const e={name:"Googlebot"},t=s.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/opera/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opr\/|opios/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/SamsungBrowser/i],describe(r){const e={name:"Samsung Internet for Android"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Whale/i],describe(r){const e={name:"NAVER Whale Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MZBrowser/i],describe(r){const e={name:"MZ Browser"},t=s.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/focus/i],describe(r){const e={name:"Focus"},t=s.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/swing/i],describe(r){const e={name:"Swing"},t=s.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/coast/i],describe(r){const e={name:"Opera Coast"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(r){const e={name:"Opera Touch"},t=s.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/yabrowser/i],describe(r){const e={name:"Yandex Browser"},t=s.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/ucbrowser/i],describe(r){const e={name:"UC Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Maxthon|mxios/i],describe(r){const e={name:"Maxthon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/epiphany/i],describe(r){const e={name:"Epiphany"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/puffin/i],describe(r){const e={name:"Puffin"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sleipnir/i],describe(r){const e={name:"Sleipnir"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/k-meleon/i],describe(r){const e={name:"K-Meleon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/micromessenger/i],describe(r){const e={name:"WeChat"},t=s.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qqbrowser/i],describe(r){const e={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},t=s.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/msie|trident/i],describe(r){const e={name:"Internet Explorer"},t=s.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/\sedg\//i],describe(r){const e={name:"Microsoft Edge"},t=s.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/edg([ea]|ios)/i],describe(r){const e={name:"Microsoft Edge"},t=s.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/vivaldi/i],describe(r){const e={name:"Vivaldi"},t=s.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/seamonkey/i],describe(r){const e={name:"SeaMonkey"},t=s.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sailfish/i],describe(r){const e={name:"Sailfish"},t=s.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return t&&(e.version=t),e}},{test:[/silk/i],describe(r){const e={name:"Amazon Silk"},t=s.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/phantom/i],describe(r){const e={name:"PhantomJS"},t=s.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/slimerjs/i],describe(r){const e={name:"SlimerJS"},t=s.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e={name:"BlackBerry"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(web|hpw)[o0]s/i],describe(r){const e={name:"WebOS Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/bada/i],describe(r){const e={name:"Bada"},t=s.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/tizen/i],describe(r){const e={name:"Tizen"},t=s.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qupzilla/i],describe(r){const e={name:"QupZilla"},t=s.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/firefox|iceweasel|fxios/i],describe(r){const e={name:"Firefox"},t=s.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/electron/i],describe(r){const e={name:"Electron"},t=s.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MiuiBrowser/i],describe(r){const e={name:"Miui"},t=s.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/chromium/i],describe(r){const e={name:"Chromium"},t=s.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/chrome|crios|crmo/i],describe(r){const e={name:"Chrome"},t=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/GSA/i],describe(r){const e={name:"Google Search"},t=s.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e={name:"Android Browser"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/playstation 4/i],describe(r){const e={name:"PlayStation 4"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/safari|applewebkit/i],describe(r){const e={name:"Safari"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/.*/i],describe(r){const e=/^(.*)\/(.*) /,t=/^(.*)\/(.*)[ \t]\((.*)/,n=r.search("\\(")!==-1?t:e;return{name:s.getFirstMatch(n,r),version:s.getSecondMatch(n,r)}}}],le=[{test:[/Roku\/DVP/],describe(r){const e=s.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:h.Roku,version:e}}},{test:[/windows phone/i],describe(r){const e=s.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:h.WindowsPhone,version:e}}},{test:[/windows /i],describe(r){const e=s.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),t=s.getWindowsVersionName(e);return{name:h.Windows,version:e,versionName:t}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(r){const e={name:h.iOS},t=s.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return t&&(e.version=t),e}},{test:[/macintosh/i],describe(r){const e=s.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),t=s.getMacOSVersionName(e),i={name:h.MacOS,version:e};return t&&(i.versionName=t),i}},{test:[/(ipod|iphone|ipad)/i],describe(r){const e=s.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:h.iOS,version:e}}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e=s.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),t=s.getAndroidVersionName(e),i={name:h.Android,version:e};return t&&(i.versionName=t),i}},{test:[/(web|hpw)[o0]s/i],describe(r){const e=s.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),t={name:h.WebOS};return e&&e.length&&(t.version=e),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e=s.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||s.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||s.getFirstMatch(/\bbb(\d+)/i,r);return{name:h.BlackBerry,version:e}}},{test:[/bada/i],describe(r){const e=s.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:h.Bada,version:e}}},{test:[/tizen/i],describe(r){const e=s.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:h.Tizen,version:e}}},{test:[/linux/i],describe(){return{name:h.Linux}}},{test:[/CrOS/],describe(){return{name:h.ChromeOS}}},{test:[/PlayStation 4/],describe(r){const e=s.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:h.PlayStation4,version:e}}}],fe=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(r){const e=s.getFirstMatch(/(can-l01)/i,r)&&"Nova",t={type:l.mobile,vendor:"Huawei"};return e&&(t.model=e),t}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:l.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:l.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:l.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:l.tablet}}},{test(r){const e=r.test(/ipod|iphone/i),t=r.test(/like (ipod|iphone)/i);return e&&!t},describe(r){const e=s.getFirstMatch(/(ipod|iphone)/i,r);return{type:l.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:l.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName(!0)==="blackberry"},describe(){return{type:l.mobile,vendor:"BlackBerry"}}},{test(r){return r.getBrowserName(!0)==="bada"},describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName()==="windows phone"},describe(){return{type:l.mobile,vendor:"Microsoft"}}},{test(r){const e=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&e>=3},describe(){return{type:l.tablet}}},{test(r){return r.getOSName(!0)==="android"},describe(){return{type:l.mobile}}},{test(r){return r.getOSName(!0)==="macos"},describe(){return{type:l.desktop,vendor:"Apple"}}},{test(r){return r.getOSName(!0)==="windows"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="linux"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="playstation 4"},describe(){return{type:l.tv}}},{test(r){return r.getOSName(!0)==="roku"},describe(){return{type:l.tv}}}],he=[{test(r){return r.getBrowserName(!0)==="microsoft edge"},describe(r){if(/\sedg\//i.test(r))return{name:w.Blink};const t=s.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:w.EdgeHTML,version:t}}},{test:[/trident/i],describe(r){const e={name:w.Trident},t=s.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.test(/presto/i)},describe(r){const e={name:w.Presto},t=s.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=r.test(/gecko/i),t=r.test(/like gecko/i);return e&&!t},describe(r){const e={name:w.Gecko},t=s.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:w.Blink}}},{test:[/(apple)?webkit/i],describe(r){const e={name:w.WebKit},t=s.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}}];class X{constructor(e,t=!1){if(e==null||e==="")throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},t!==!0&&this.parse()}getUA(){return this._ua}test(e){return e.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const e=s.find(ue,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.browser=e.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const e=s.find(le,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.os=e.describe(this.getUA())),this.parsedResult.os}getOSName(e){const{name:t}=this.getOS();return e?String(t).toLowerCase()||"":t||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(e=!1){const{type:t}=this.getPlatform();return e?String(t).toLowerCase()||"":t||""}parsePlatform(){this.parsedResult.platform={};const e=s.find(fe,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.platform=e.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const e=s.find(he,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.engine=e.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return s.assign({},this.parsedResult)}satisfies(e){const t={};let i=0;const n={};let o=0;if(Object.keys(e).forEach(d=>{const a=e[d];typeof a=="string"?(n[d]=a,o+=1):typeof a=="object"&&(t[d]=a,i+=1)}),i>0){const d=Object.keys(t),a=s.find(d,m=>this.isOS(m));if(a){const m=this.satisfies(t[a]);if(m!==void 0)return m}const f=s.find(d,m=>this.isPlatform(m));if(f){const m=this.satisfies(t[f]);if(m!==void 0)return m}}if(o>0){const d=Object.keys(n),a=s.find(d,f=>this.isBrowser(f,!0));if(a!==void 0)return this.compareVersion(n[a])}}isBrowser(e,t=!1){const i=this.getBrowserName().toLowerCase();let n=e.toLowerCase();const o=s.getBrowserTypeByAlias(n);return t&&o&&(n=o.toLowerCase()),n===i}compareVersion(e){let t=[0],i=e,n=!1;const o=this.getBrowserVersion();if(typeof o=="string")return e[0]===">"||e[0]==="<"?(i=e.substr(1),e[1]==="="?(n=!0,i=e.substr(2)):t=[],e[0]===">"?t.push(1):t.push(-1)):e[0]==="="?i=e.substr(1):e[0]==="~"&&(n=!0,i=e.substr(1)),t.indexOf(s.compareVersions(o,i,n))>-1}isOS(e){return this.getOSName(!0)===String(e).toLowerCase()}isPlatform(e){return this.getPlatformType(!0)===String(e).toLowerCase()}isEngine(e){return this.getEngineName(!0)===String(e).toLowerCase()}is(e,t=!1){return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}some(e=[]){return e.some(t=>this.is(t))}}/*!1 (function(){"use strict";var O,z=-1,v=function(r){addEventListener("pageshow",function(e){e.persisted&&(z=e.timeStamp,r(e))},!0)},P=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},S=function(){var r=P();return r&&r.activationStart||0},p=function(r,e){var t=P(),i="navigate";return z>=0?i="back-forward-cache":t&&(document.prerendering||S()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},M=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var i=new PerformanceObserver(function(n){Promise.resolve().then(function(){e(n.getEntries())})});return i.observe(Object.assign({type:r,buffered:!0},t||{})),i}}catch{}},g=function(r,e,t,i){var n,o;return function(c){e.value>=0&&(c||i)&&((o=e.value-(n||0))||n===void 0)&&(n=e.value,e.delta=o,e.rating=function(d,a){return d>a[1]?"poor":d>a[0]?"needs-improvement":"good"}(e.value,t),r(e))}},A=function(r){requestAnimationFrame(function(){return requestAnimationFrame(function(){return r()})})},B=function(r){document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&r()})},T=function(r){var e=!1;return function(){e||(r(),e=!0)}},y=-1,L=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},_=function(r){document.visibilityState==="hidden"&&y>-1&&(y=r.type==="visibilitychange"?r.timeStamp:0,$())},R=function(){addEventListener("visibilitychange",_,!0),addEventListener("prerenderingchange",_,!0)},$=function(){removeEventListener("visibilitychange",_,!0),removeEventListener("prerenderingchange",_,!0)},D=function(){return y<0&&(y=L(),R(),v(function(){setTimeout(function(){y=L(),R()},0)})),{get firstHiddenTime(){return y}}},F=function(r){document.prerendering?addEventListener("prerenderingchange",function(){return r()},!0):r()},V=[1800,3e3],W=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("FCP"),o=M("paint",function(c){c.forEach(function(d){d.name==="first-contentful-paint"&&(o.disconnect(),d.startTime<i.firstHiddenTime&&(n.value=Math.max(d.startTime-S(),0),n.entries.push(d),t(!0)))})});o&&(t=g(r,n,V,e.reportAllChanges),v(function(c){n=p("FCP"),t=g(r,n,V,e.reportAllChanges),A(function(){n.value=performance.now()-c.timeStamp,t(!0)})}))})},I=[.1,.25],q=function(r,e){e=e||{},W(T(function(){var t,i=p("CLS",0),n=0,o=[],c=function(a){a.forEach(function(f){if(!f.hadRecentInput){var m=o[0],x=o[o.length-1];n&&f.startTime-x.startTime<1e3&&f.startTime-m.startTime<5e3?(n+=f.value,o.push(f)):(n=f.value,o=[f])}}),n>i.value&&(i.value=n,i.entries=o,t())},d=M("layout-shift",c);d&&(t=g(r,i,I,e.reportAllChanges),B(function(){c(d.takeRecords()),t(!0)}),v(function(){n=0,i=p("CLS",0),t=g(r,i,I,e.reportAllChanges),A(function(){return t()})}),setTimeout(t,0))}))},j=0,N=1/0,k=0,ee=function(r){r.forEach(function(e){e.interactionId&&(N=Math.min(N,e.interactionId),k=Math.max(k,e.interactionId),j=k?(k-N)/7+1:0)})},G=function(){return O?j:performance.interactionCount||0},te=function(){"interactionCount"in performance||O||(O=M("event",ee,{type:"event",buffered:!0,durationThreshold:0}))},b=[],E=new Map,Q=0,re=function(){var r=Math.min(b.length-1,Math.floor((G()-Q)/50));return b[r]},ie=[],se=function(r){if(ie.forEach(function(n){return n(r)}),r.interactionId||r.entryType==="first-input"){var e=b[b.length-1],t=E.get(r.interactionId);if(t||b.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else{var i={id:r.interactionId,latency:r.duration,entries:[r]};E.set(i.id,i),b.push(i)}b.sort(function(n,o){return o.latency-n.latency}),b.length>10&&b.splice(10).forEach(function(n){return E.delete(n.id)})}}},H=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=T(r),document.visibilityState==="hidden"?r():(t=e(r),B(r)),t},U=[200,500],ne=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},F(function(){var t;te();var i,n=p("INP"),o=function(d){H(function(){d.forEach(se);var a=re();a&&a.latency!==n.value&&(n.value=a.latency,n.entries=a.entries,i())})},c=M("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=g(r,n,U,e.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),B(function(){o(c.takeRecords()),i(!0)}),v(function(){Q=G(),b.length=0,E.clear(),n=p("INP"),i=g(r,n,U,e.reportAllChanges)}))}))},K=[2500,4e3],C={},oe=function(r,e){e=e||{},F(function(){var t,i=D(),n=p("LCP"),o=function(a){e.reportAllChanges||(a=a.slice(-1)),a.forEach(function(f){f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-S(),0),n.entries=[f],t())})},c=M("largest-contentful-paint",o);if(c){t=g(r,n,K,e.reportAllChanges);var d=T(function(){C[n.id]||(o(c.takeRecords()),c.disconnect(),C[n.id]=!0,t(!0))});["keydown","click"].forEach(function(a){addEventListener(a,function(){return H(d)},{once:!0,capture:!0})}),B(d),v(function(a){n=p("LCP"),t=g(r,n,K,e.reportAllChanges),A(function(){n.value=performance.now()-a.timeStamp,C[n.id]=!0,t(!0)})})}})},J=[800,1800],ae=function r(e){document.prerendering?F(function(){return r(e)}):document.readyState!=="complete"?addEventListener("load",function(){return r(e)},!0):setTimeout(e,0)},ce=function(r,e){e=e||{};var t=p("TTFB"),i=g(r,t,J,e.reportAllChanges);ae(function(){var n=P();n&&(t.value=Math.max(n.responseStart-S(),0),t.entries=[n],i(!0),v(function(){t=p("TTFB",0),(i=g(r,t,J,e.reportAllChanges))(!0)}))})};const de={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},l={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},h={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},w={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class s{static getFirstMatch(e,t){const i=t.match(e);return i&&i.length>0&&i[1]||""}static getSecondMatch(e,t){const i=t.match(e);return i&&i.length>1&&i[2]||""}static matchAndReturnConst(e,t,i){if(e.test(t))return i}static getWindowsVersionName(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),t[0]===10)switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(e){const t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),!(t[0]===1&&t[1]<5)){if(t[0]===1&&t[1]<6)return"Cupcake";if(t[0]===1&&t[1]>=6)return"Donut";if(t[0]===2&&t[1]<2)return"Eclair";if(t[0]===2&&t[1]===2)return"Froyo";if(t[0]===2&&t[1]>2)return"Gingerbread";if(t[0]===3)return"Honeycomb";if(t[0]===4&&t[1]<1)return"Ice Cream Sandwich";if(t[0]===4&&t[1]<4)return"Jelly Bean";if(t[0]===4&&t[1]>=4)return"KitKat";if(t[0]===5)return"Lollipop";if(t[0]===6)return"Marshmallow";if(t[0]===7)return"Nougat";if(t[0]===8)return"Oreo";if(t[0]===9)return"Pie"}}static getVersionPrecision(e){return e.split(".").length}static compareVersions(e,t,i=!1){const n=s.getVersionPrecision(e),o=s.getVersionPrecision(t);let c=Math.max(n,o),d=0;const a=s.map([e,t],f=>{const m=c-s.getVersionPrecision(f),x=f+new Array(m+1).join(".0");return s.map(x.split("."),Y=>new Array(20-Y.length).join("0")+Y).reverse()});for(i&&(d=c-Math.min(n,o)),c-=1;c>=d;){if(a[0][c]>a[1][c])return 1;if(a[0][c]===a[1][c]){if(c===d)return 0;c-=1}else if(a[0][c]<a[1][c])return-1}}static map(e,t){const i=[];let n;if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n<e.length;n+=1)i.push(t(e[n]));return i}static find(e,t){let i,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(i=0,n=e.length;i<n;i+=1){const o=e[i];if(t(o,i))return o}}static assign(e,...t){const i=e;let n,o;if(Object.assign)return Object.assign(e,...t);for(n=0,o=t.length;n<o;n+=1){const c=t[n];typeof c=="object"&&c!==null&&Object.keys(c).forEach(a=>{i[a]=c[a]})}return e}static getBrowserAlias(e){return de[e]}static getBrowserTypeByAlias(e){return Z[e]||""}}const u=/version\/(\d+(\.?_?\d+)+)/i,ue=[{test:[/googlebot/i],describe(r){const e={name:"Googlebot"},t=s.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/opera/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opr\/|opios/i],describe(r){const e={name:"Opera"},t=s.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/SamsungBrowser/i],describe(r){const e={name:"Samsung Internet for Android"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Whale/i],describe(r){const e={name:"NAVER Whale Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MZBrowser/i],describe(r){const e={name:"MZ Browser"},t=s.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/focus/i],describe(r){const e={name:"Focus"},t=s.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/swing/i],describe(r){const e={name:"Swing"},t=s.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/coast/i],describe(r){const e={name:"Opera Coast"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(r){const e={name:"Opera Touch"},t=s.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/yabrowser/i],describe(r){const e={name:"Yandex Browser"},t=s.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/ucbrowser/i],describe(r){const e={name:"UC Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Maxthon|mxios/i],describe(r){const e={name:"Maxthon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/epiphany/i],describe(r){const e={name:"Epiphany"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/puffin/i],describe(r){const e={name:"Puffin"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sleipnir/i],describe(r){const e={name:"Sleipnir"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/k-meleon/i],describe(r){const e={name:"K-Meleon"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/micromessenger/i],describe(r){const e={name:"WeChat"},t=s.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qqbrowser/i],describe(r){const e={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},t=s.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/msie|trident/i],describe(r){const e={name:"Internet Explorer"},t=s.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/\sedg\//i],describe(r){const e={name:"Microsoft Edge"},t=s.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/edg([ea]|ios)/i],describe(r){const e={name:"Microsoft Edge"},t=s.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/vivaldi/i],describe(r){const e={name:"Vivaldi"},t=s.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/seamonkey/i],describe(r){const e={name:"SeaMonkey"},t=s.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sailfish/i],describe(r){const e={name:"Sailfish"},t=s.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return t&&(e.version=t),e}},{test:[/silk/i],describe(r){const e={name:"Amazon Silk"},t=s.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/phantom/i],describe(r){const e={name:"PhantomJS"},t=s.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/slimerjs/i],describe(r){const e={name:"SlimerJS"},t=s.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e={name:"BlackBerry"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(web|hpw)[o0]s/i],describe(r){const e={name:"WebOS Browser"},t=s.getFirstMatch(u,r)||s.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/bada/i],describe(r){const e={name:"Bada"},t=s.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/tizen/i],describe(r){const e={name:"Tizen"},t=s.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/qupzilla/i],describe(r){const e={name:"QupZilla"},t=s.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/firefox|iceweasel|fxios/i],describe(r){const e={name:"Firefox"},t=s.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/electron/i],describe(r){const e={name:"Electron"},t=s.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MiuiBrowser/i],describe(r){const e={name:"Miui"},t=s.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/chromium/i],describe(r){const e={name:"Chromium"},t=s.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/chrome|crios|crmo/i],describe(r){const e={name:"Chrome"},t=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/GSA/i],describe(r){const e={name:"Google Search"},t=s.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e={name:"Android Browser"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/playstation 4/i],describe(r){const e={name:"PlayStation 4"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/safari|applewebkit/i],describe(r){const e={name:"Safari"},t=s.getFirstMatch(u,r);return t&&(e.version=t),e}},{test:[/.*/i],describe(r){const e=/^(.*)\/(.*) /,t=/^(.*)\/(.*)[ \t]\((.*)/,n=r.search("\\(")!==-1?t:e;return{name:s.getFirstMatch(n,r),version:s.getSecondMatch(n,r)}}}],le=[{test:[/Roku\/DVP/],describe(r){const e=s.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:h.Roku,version:e}}},{test:[/windows phone/i],describe(r){const e=s.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:h.WindowsPhone,version:e}}},{test:[/windows /i],describe(r){const e=s.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),t=s.getWindowsVersionName(e);return{name:h.Windows,version:e,versionName:t}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(r){const e={name:h.iOS},t=s.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return t&&(e.version=t),e}},{test:[/macintosh/i],describe(r){const e=s.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),t=s.getMacOSVersionName(e),i={name:h.MacOS,version:e};return t&&(i.versionName=t),i}},{test:[/(ipod|iphone|ipad)/i],describe(r){const e=s.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:h.iOS,version:e}}},{test(r){const e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){const e=s.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),t=s.getAndroidVersionName(e),i={name:h.Android,version:e};return t&&(i.versionName=t),i}},{test:[/(web|hpw)[o0]s/i],describe(r){const e=s.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),t={name:h.WebOS};return e&&e.length&&(t.version=e),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){const e=s.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||s.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||s.getFirstMatch(/\bbb(\d+)/i,r);return{name:h.BlackBerry,version:e}}},{test:[/bada/i],describe(r){const e=s.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:h.Bada,version:e}}},{test:[/tizen/i],describe(r){const e=s.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:h.Tizen,version:e}}},{test:[/linux/i],describe(){return{name:h.Linux}}},{test:[/CrOS/],describe(){return{name:h.ChromeOS}}},{test:[/PlayStation 4/],describe(r){const e=s.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:h.PlayStation4,version:e}}}],fe=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(r){const e=s.getFirstMatch(/(can-l01)/i,r)&&"Nova",t={type:l.mobile,vendor:"Huawei"};return e&&(t.model=e),t}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:l.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:l.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:l.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:l.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:l.tablet}}},{test(r){const e=r.test(/ipod|iphone/i),t=r.test(/like (ipod|iphone)/i);return e&&!t},describe(r){const e=s.getFirstMatch(/(ipod|iphone)/i,r);return{type:l.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:l.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName(!0)==="blackberry"},describe(){return{type:l.mobile,vendor:"BlackBerry"}}},{test(r){return r.getBrowserName(!0)==="bada"},describe(){return{type:l.mobile}}},{test(r){return r.getBrowserName()==="windows phone"},describe(){return{type:l.mobile,vendor:"Microsoft"}}},{test(r){const e=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&e>=3},describe(){return{type:l.tablet}}},{test(r){return r.getOSName(!0)==="android"},describe(){return{type:l.mobile}}},{test(r){return r.getOSName(!0)==="macos"},describe(){return{type:l.desktop,vendor:"Apple"}}},{test(r){return r.getOSName(!0)==="windows"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="linux"},describe(){return{type:l.desktop}}},{test(r){return r.getOSName(!0)==="playstation 4"},describe(){return{type:l.tv}}},{test(r){return r.getOSName(!0)==="roku"},describe(){return{type:l.tv}}}],he=[{test(r){return r.getBrowserName(!0)==="microsoft edge"},describe(r){if(/\sedg\//i.test(r))return{name:w.Blink};const t=s.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:w.EdgeHTML,version:t}}},{test:[/trident/i],describe(r){const e={name:w.Trident},t=s.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.test(/presto/i)},describe(r){const e={name:w.Presto},t=s.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){const e=r.test(/gecko/i),t=r.test(/like gecko/i);return e&&!t},describe(r){const e={name:w.Gecko},t=s.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:w.Blink}}},{test:[/(apple)?webkit/i],describe(r){const e={name:w.WebKit},t=s.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}}];class X{constructor(e,t=!1){if(e==null||e==="")throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},t!==!0&&this.parse()}getUA(){return this._ua}test(e){return e.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const e=s.find(ue,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.browser=e.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const e=s.find(le,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.os=e.describe(this.getUA())),this.parsedResult.os}getOSName(e){const{name:t}=this.getOS();return e?String(t).toLowerCase()||"":t||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(e=!1){const{type:t}=this.getPlatform();return e?String(t).toLowerCase()||"":t||""}parsePlatform(){this.parsedResult.platform={};const e=s.find(fe,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.platform=e.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const e=s.find(he,t=>{if(typeof t.test=="function")return t.test(this);if(t.test instanceof Array)return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.engine=e.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return s.assign({},this.parsedResult)}satisfies(e){const t={};let i=0;const n={};let o=0;if(Object.keys(e).forEach(d=>{const a=e[d];typeof a=="string"?(n[d]=a,o+=1):typeof a=="object"&&(t[d]=a,i+=1)}),i>0){const d=Object.keys(t),a=s.find(d,m=>this.isOS(m));if(a){const m=this.satisfies(t[a]);if(m!==void 0)return m}const f=s.find(d,m=>this.isPlatform(m));if(f){const m=this.satisfies(t[f]);if(m!==void 0)return m}}if(o>0){const d=Object.keys(n),a=s.find(d,f=>this.isBrowser(f,!0));if(a!==void 0)return this.compareVersion(n[a])}}isBrowser(e,t=!1){const i=this.getBrowserName().toLowerCase();let n=e.toLowerCase();const o=s.getBrowserTypeByAlias(n);return t&&o&&(n=o.toLowerCase()),n===i}compareVersion(e){let t=[0],i=e,n=!1;const o=this.getBrowserVersion();if(typeof o=="string")return e[0]===">"||e[0]==="<"?(i=e.substr(1),e[1]==="="?(n=!0,i=e.substr(2)):t=[],e[0]===">"?t.push(1):t.push(-1)):e[0]==="="?i=e.substr(1):e[0]==="~"&&(n=!0,i=e.substr(1)),t.indexOf(s.compareVersions(o,i,n))>-1}isOS(e){return this.getOSName(!0)===String(e).toLowerCase()}isPlatform(e){return this.getPlatformType(!0)===String(e).toLowerCase()}isEngine(e){return this.getEngineName(!0)===String(e).toLowerCase()}is(e,t=!1){return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}some(e=[]){return e.some(t=>this.is(t))}}/*! 2 2 * Bowser - a browser detector 3 3 * https://github.com/lancedikson/bowser 4 4 * MIT License | (c) Dustin Diaz 2012-2015 5 5 * MIT License | (c) Denis Demchenko 2015-2019 6 */class me{static getParser(e,t=!1){if(typeof e!="string")throw new Error("UserAgent should be a string");return new X(e,t)}static parse(e){return new X(e).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return w}static get OS_MAP(){return h}static get PLATFORMS_MAP(){return l}}class pe{constructor(e){this.beaconSent=!1,this.config=e,this.sessionStart=performance.now(),this.timestamp_ms=Math.floor(Date.now()),this.queue=new Set,this.shouldSendBeacon()&&(this.initBrowserMetrics(),addEventListener("visibilitychange",()=>this.sendBeacon()))}shouldSendBeacon(){const e=Number(this.config.sample_rate);return e<0||e>1?(console.warn("DebugHawk: Invalid sampling rate, defaulting to sending metrics"),!0):e===1?!0:e===0?!1:Math.random()<e}sendBeacon(){if(this.beaconSent||typeof window.DebugHawk>"u"||document.visibilityState==="visible")return;const e=this.preparePayload(),t=JSON.stringify(e);this.shouldUseBeaconApi()?(navigator.sendBeacon(this.config.endpoint,t),this.beaconSent=!0):fetch(this.config.endpoint,{method:"POST",body:t,keepalive:!0,headers:{"Content-Type":"application/json"}}).then(()=>{this.beaconSent=!0}).catch(i=>{console.warn("DebugHawk: Fetch error",i)})}shouldUseBeaconApi(){return this.isBraveBrowser()?!1:"sendBeacon"in navigator}isBraveBrowser(){return"brave"in navigator}preparePayload(){return{server:window.DebugHawk,browser:this.getBrowserMetrics(),user:this.getUserInfo()}}getBrowserMetrics(){let e={title:document.title,requests:this.processNetworkRequests(),timestamp_ms:this.timestamp_ms};return this.queue.forEach(t=>{const i=t.name.toLowerCase();if(i!=="cls"?e[i+"_ms"]=this.roundToDecimals(t.value):e[i]=this.roundToDecimals(t.value,5),i==="ttfb"&&t.entries[0]){const n=this.calculateTtfbMetrics(t.entries[0]);Object.assign(e,n)}}),e}calculateTtfbMetrics(e){let t={};return e.domainLookupStart&&e.connectStart&&(t.dns_ms=this.roundToDecimals(e.connectStart-e.domainLookupStart)),e.connectStart&&e.connectEnd&&(t.connect_ms=this.roundToDecimals(e.connectEnd-e.connectStart)),e.decodedBodySize&&(t.html_body_size=e.decodedBodySize),e.encodedBodySize&&(t.html_transfer_size=e.encodedBodySize),t}processNetworkRequests(){const e=new Set;performance.getEntriesByType("navigation").forEach(i=>e.add(this.processPerformanceEntry(i))),performance.getEntriesByType("resource").forEach(i=>e.add(this.processPerformanceEntry(i)));let t={count:e.size,total_body_size:0,total_transfer_size:0,by_type:{},by_domain:{},by_component:{}};return e.forEach(i=>{t.total_body_size+=i.body_size||0,t.total_transfer_size+=i.transfer_size||0,t.by_type[i.type]||(t.by_type[i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_type[i.type].count++,t.by_type[i.type].body_size+=i.body_size||0,t.by_type[i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_type[i.type].blocking++;const n=this.getDomainFromUrl(i.url);if(t.by_domain[n]||(t.by_domain[n]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_domain[n].count++,t.by_domain[n].body_size+=i.body_size||0,t.by_domain[n].transfer_size+=i.transfer_size||0,i.blocking&&t.by_domain[n].blocking++,!i.url.startsWith(this.config.urls.home)||i.type==="html"||i.type==="other"||i.type==="xhr")return;const o=this.getComponentFromNetworkRequest(i);t.by_component[o]||(t.by_component[o]={}),t.by_component[o][i.type]||(t.by_component[o][i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_component[o][i.type].count++,t.by_component[o][i.type].body_size+=i.body_size||0,t.by_component[o][i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_component[o][i.type].blocking++}),t}processPerformanceEntry(e){return{url:e.name,type:this.getTypeFromPerformanceEntry(e),body_size:e.decodedBodySize,transfer_size:e.encodedBodySize,blocking:e.renderBlockingStatus==="blocking",status:e.responseStatus}}getComponentFromNetworkRequest(e){return e.url.startsWith(this.config.urls.plugin)?`plugin:${e.url.slice(this.config.urls.plugin.length).split("/")[0]}`:e.url.startsWith(this.config.urls.theme)?`theme:${e.url.slice(this.config.urls.theme.length).split("/")[0]}`:e.url.startsWith(this.config.urls.admin)||e.url.startsWith(this.config.urls.includes)?"core":e.url.startsWith(this.config.urls.uploads)?"upload":"other"}getDomainFromUrl(e){try{return new URL(e).hostname}catch{return"unknown"}}get TypeFromPerformanceEntry(e){if(e.initiatorType==="navigation"||e.initiatorType==="iframe")return"html";if(e.initiatorType==="script")return"js";if(e.initiatorType==="img")return"img";if(e.initiatorType==="fetch"||e.initiatorType==="xmlhttprequest")return"xhr";const i=e.name.replace(/\?.*$/,"").match(/\.([^.]+)$/),n=i?i[1].toLowerCase():"";return{css:"css",js:"js",mjs:"js",woff:"font",woff2:"font",ttf:"font",otf:"font",eot:"font",png:"img",jpg:"img",jpeg:"img",gif:"img",svg:"img",webp:"img",ico:"img",avif:"img",mp4:"media",webm:"media",ogv:"media",mp3:"media",ogg:"media",wav:"media",flac:"media"}[n]||"other"}getUserInfo(){var i,n;const e=me.getParser(window.navigator.userAgent),t=performance.now();return{browser:{name:this.isBraveBrowser()?"Brave":e.getBrowserName(),version:this.isBraveBrowser()?null:e.getBrowserVersion(),viewport:{width:((i=window.visualViewport)==null?void 0:i.width)??null,height:((n=window.visualViewport)==null?void 0:n.height)??null}},os:{name:e.getOSName(),version:e.getOSVersion()},platform:e.getPlatformType(),session_duration_ms:this.roundToDecimals(t-this.sessionStart)}}addToQueue(e){this.queue.add(e)}initBrowserMetrics(){const e=this.addToQueue.bind(this);q(e),W(e),ne(e),oe(e),ce(e)}roundToDecimals(e,t=1){const i=Math.pow(10,t);return Math.round(e*i)/i}}typeof window.DebugHawkConfig<"u"&&new pe(window.DebugHawkConfig)})();6 */class me{static getParser(e,t=!1){if(typeof e!="string")throw new Error("UserAgent should be a string");return new X(e,t)}static parse(e){return new X(e).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return w}static get OS_MAP(){return h}static get PLATFORMS_MAP(){return l}}class pe{constructor(e){this.beaconSent=!1,this.config=e,this.sessionStart=performance.now(),this.timestamp_ms=Math.floor(Date.now()),this.queue=new Set,this.shouldSendBeacon()&&(this.initBrowserMetrics(),addEventListener("visibilitychange",()=>this.sendBeacon()))}shouldSendBeacon(){const e=Number(this.config.sample_rate);return e<0||e>1?(console.warn("DebugHawk: Invalid sampling rate, defaulting to sending metrics"),!0):e===1?!0:e===0?!1:Math.random()<e}sendBeacon(){if(this.beaconSent||typeof window.DebugHawk>"u"||document.visibilityState==="visible")return;const e=this.preparePayload(),t=JSON.stringify(e);this.shouldUseBeaconApi()?(navigator.sendBeacon(this.config.endpoint,t),this.beaconSent=!0):fetch(this.config.endpoint,{method:"POST",body:t,keepalive:!0,headers:{"Content-Type":"application/json"}}).then(()=>{this.beaconSent=!0}).catch(i=>{console.warn("DebugHawk: Fetch error",i)})}shouldUseBeaconApi(){return this.isBraveBrowser()?!1:"sendBeacon"in navigator}isBraveBrowser(){return"brave"in navigator}preparePayload(){return{server:window.DebugHawk,browser:this.getBrowserMetrics(),user:this.getUserInfo()}}getBrowserMetrics(){let e={title:document.title,requests:this.processNetworkRequests(),timestamp_ms:this.timestamp_ms};return this.queue.forEach(t=>{const i=t.name.toLowerCase();if(i!=="cls"?e[i+"_ms"]=this.roundToDecimals(t.value):e[i]=this.roundToDecimals(t.value,5),i==="ttfb"&&t.entries[0]){const n=this.calculateTtfbMetrics(t.entries[0]);Object.assign(e,n)}}),e}calculateTtfbMetrics(e){let t={};return e.domainLookupStart&&e.connectStart&&(t.dns_ms=this.roundToDecimals(e.connectStart-e.domainLookupStart)),e.connectStart&&e.connectEnd&&(t.connect_ms=this.roundToDecimals(e.connectEnd-e.connectStart)),e.decodedBodySize&&(t.html_body_size=e.decodedBodySize),e.encodedBodySize&&(t.html_transfer_size=e.encodedBodySize),t}processNetworkRequests(){const e=new Set;performance.getEntriesByType("navigation").forEach(i=>e.add(this.processPerformanceEntry(i))),performance.getEntriesByType("resource").forEach(i=>e.add(this.processPerformanceEntry(i)));let t={count:e.size,total_body_size:0,total_transfer_size:0,by_type:{},by_domain:{},by_component:{}};return e.forEach(i=>{t.total_body_size+=i.body_size||0,t.total_transfer_size+=i.transfer_size||0,t.by_type[i.type]||(t.by_type[i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_type[i.type].count++,t.by_type[i.type].body_size+=i.body_size||0,t.by_type[i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_type[i.type].blocking++;const n=this.getDomainFromUrl(i.url);if(t.by_domain[n]||(t.by_domain[n]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_domain[n].count++,t.by_domain[n].body_size+=i.body_size||0,t.by_domain[n].transfer_size+=i.transfer_size||0,i.blocking&&t.by_domain[n].blocking++,!i.url.startsWith(this.config.urls.home)||i.type==="html"||i.type==="other"||i.type==="xhr")return;const o=this.getComponentFromNetworkRequest(i);t.by_component[o]||(t.by_component[o]={}),t.by_component[o][i.type]||(t.by_component[o][i.type]={count:0,blocking:0,body_size:0,transfer_size:0}),t.by_component[o][i.type].count++,t.by_component[o][i.type].body_size+=i.body_size||0,t.by_component[o][i.type].transfer_size+=i.transfer_size||0,i.blocking&&t.by_component[o][i.type].blocking++}),t}processPerformanceEntry(e){return{url:e.name,type:this.getTypeFromPerformanceEntry(e),body_size:e.decodedBodySize,transfer_size:e.encodedBodySize,blocking:e.renderBlockingStatus==="blocking",status:e.responseStatus}}getComponentFromNetworkRequest(e){return e.url.startsWith(this.config.urls.plugin)?`plugin:${e.url.slice(this.config.urls.plugin.length).split("/")[0]}`:e.url.startsWith(this.config.urls.theme)?`theme:${e.url.slice(this.config.urls.theme.length).split("/")[0]}`:e.url.startsWith(this.config.urls.admin)||e.url.startsWith(this.config.urls.includes)?"core":e.url.startsWith(this.config.urls.uploads)?"upload":"other"}getDomainFromUrl(e){try{return new URL(e).hostname}catch{return"unknown"}}getFileExtensionFromUrl(e){try{const i=new URL(e).pathname,n=i.lastIndexOf(".");if(n===-1||n===i.length-1)return"";const o=i.substring(n+1);return o.includes("/")?"":o.toLowerCase()}catch{return""}}getTypeFromPerformanceEntry(e){if(e.initiatorType==="navigation"||e.initiatorType==="iframe")return"html";if(e.initiatorType==="script")return"js";if(e.initiatorType==="img")return"img";if(e.initiatorType==="fetch"||e.initiatorType==="xmlhttprequest")return"xhr";const t=this.getFileExtensionFromUrl(e.name);return{css:"css",js:"js",mjs:"js",woff:"font",woff2:"font",ttf:"font",otf:"font",eot:"font",png:"img",jpg:"img",jpeg:"img",gif:"img",svg:"img",webp:"img",ico:"img",avif:"img",mp4:"media",webm:"media",ogv:"media",mp3:"media",ogg:"media",wav:"media",flac:"media"}[t]||"other"}getUserInfo(){var i,n;const e=me.getParser(window.navigator.userAgent),t=performance.now();return{browser:{name:this.isBraveBrowser()?"Brave":e.getBrowserName(),version:this.isBraveBrowser()?null:e.getBrowserVersion(),viewport:{width:((i=window.visualViewport)==null?void 0:i.width)??null,height:((n=window.visualViewport)==null?void 0:n.height)??null}},os:{name:e.getOSName(),version:e.getOSVersion()},platform:e.getPlatformType(),session_duration_ms:this.roundToDecimals(t-this.sessionStart)}}addToQueue(e){this.queue.add(e)}initBrowserMetrics(){const e=this.addToQueue.bind(this);q(e),W(e),ne(e),oe(e),ce(e)}roundToDecimals(e,t=1){const i=Math.pow(10,t);return Math.round(e*i)/i}}typeof window.DebugHawkConfig<"u"&&new pe(window.DebugHawkConfig)})(); -
debughawk/trunk/resources/src/beacon.ts
r3358840 r3372612 276 276 } 277 277 278 private getFileExtensionFromUrl(url: string): string { 279 try { 280 const urlObj = new URL(url); 281 const pathname = urlObj.pathname; 282 const lastDotIndex = pathname.lastIndexOf('.'); 283 284 if (lastDotIndex === -1 || lastDotIndex === pathname.length - 1) { 285 return ''; 286 } 287 288 const extension = pathname.substring(lastDotIndex + 1); 289 290 if (extension.includes('/')) { 291 return ''; 292 } 293 294 return extension.toLowerCase(); 295 } catch (e) { 296 return ''; 297 } 298 } 299 278 300 private getTypeFromPerformanceEntry(entry: PerformanceNavigationTiming | PerformanceResourceTiming): string { 279 301 if (entry.initiatorType === 'navigation' || entry.initiatorType === 'iframe') { … … 293 315 } 294 316 295 const url = entry.name.replace(/\?.*$/, ''); 296 const match = url.match(/\.([^.]+)$/); 297 const ext = match ? match[1].toLowerCase() : ''; 317 const ext = this.getFileExtensionFromUrl(entry.name); 298 318 299 319 const types: { [key: string]: string } = { -
debughawk/trunk/src/Collectors/WordpressCollector.php
r3318985 r3372612 10 10 11 11 return [ 12 'is_admin' => is_admin(), 13 'is_front_page' => is_front_page(), 14 'is_search' => is_search(), 15 'is_404' => is_404(), 16 'post_id' => is_singular() ? get_the_ID() : null, 17 'post_type' => is_singular() ? get_post_type() : null, 18 'user_id' => $user_id ?: null, 19 'version' => get_bloginfo( 'version' ), 12 'is_admin' => is_admin(), 13 'is_front_page' => is_front_page(), 14 'is_search' => is_search(), 15 'is_404' => is_404(), 16 'post_id' => is_singular() ? get_the_ID() : null, 17 'post_type' => is_singular() ? get_post_type() : null, 18 'user_id' => $user_id ?: null, 19 'version' => get_bloginfo( 'version' ), 20 'plugin_version' => $this->config->version, 20 21 ]; 21 22 } -
debughawk/trunk/src/Config.php
r3318985 r3372612 6 6 * @property boolean $enabled 7 7 * @property string $endpoint 8 * @property string $script_url 8 9 * @property float $sample_rate 9 10 * @property string $secret … … 16 17 private const DEFAULT_CONFIG = [ 17 18 'enabled' => true, 19 'script_url' => 'https://cdn.debughawk.com/script.js', 18 20 'sample_rate' => 1, 19 21 'trace_admin_pages' => true, -
debughawk/trunk/src/Dispatchers/BeaconDispatcher.php
r3318985 r3372612 45 45 46 46 public function enqueue_beacon(): void { 47 $src = plugins_url( 'resources/dist/beacon.js', $this->config->path ); 48 49 wp_enqueue_script( 'debughawk-beacon', $src, [], $this->config->version, [ 47 wp_enqueue_script( 'debughawk-beacon', $this->config->script_url, [], null, [ 50 48 'strategy' => 'async', 51 49 ] ); -
debughawk/trunk/vendor/composer/installed.php
r3364835 r3372612 2 2 'root' => array( 3 3 'name' => 'debughawk/debughawk-plugin', 4 'pretty_version' => 'v1. 0.1',5 'version' => '1. 0.1.0',6 'reference' => ' 836254a322db0d24ef91f2f301cd6e2b94c10f42',4 'pretty_version' => 'v1.1.0', 5 'version' => '1.1.0.0', 6 'reference' => 'b832225d8d6fc338990943d1bd943c36eb52f663', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 12 12 'versions' => array( 13 13 'debughawk/debughawk-plugin' => array( 14 'pretty_version' => 'v1. 0.1',15 'version' => '1. 0.1.0',16 'reference' => ' 836254a322db0d24ef91f2f301cd6e2b94c10f42',14 'pretty_version' => 'v1.1.0', 15 'version' => '1.1.0.0', 16 'reference' => 'b832225d8d6fc338990943d1bd943c36eb52f663', 17 17 'type' => 'wordpress-plugin', 18 18 'install_path' => __DIR__ . '/../../', -
debughawk/trunk/wp-content/db.php
r3364835 r3372612 5 5 * Description: Database drop-in for DebugHawk to capture database metrics and slow queries. 6 6 * Author: DebugHawk 7 * Version: 1. 0.17 * Version: 1.1.0 8 8 * Requires PHP: 7.4 9 9 * Requires WP: 6.3
Note: See TracChangeset
for help on using the changeset viewer.