Digital Experience Layer (Vodafone Greece)
I have been the backend Chapter Lead of Vodafone Greece's Digital eXperience Layer, a Kubernetes-based middleware.
During my employment, I set up a team of 30+ developers, introduced radically new technologies, and restructured the DXL in a way that would prove to be 60% more efficient in terms of resources and raw performance of Microservices. Using the DXL middleware, user operations from the mobile and web app that originally took 10+ seconds now only require a few milliseconds.
For this, I had to lead the rewrite of the entire infrastructure with which the team developed Microservices, and set up new company processes and new software architecture. I designed systems widely adopted by Vodafone Operators outside of Greece, as well.
Worldwide Recognition
- May 2023: Co-presented a Devoxx presentation: “Battle of the frameworks : Quarkus vs SpringBoot by Giorgos Andrianakis & Christos Sotiriou”, in front of a global audience. Recording here: https://www.youtube.com/watch?v=Cq_YiZQRh9E
- April 2021: I was featured in The New Stack, in an article about how I led the team to transform their entire stack: How Vodafone Greece Built 80 Java Microservices in Quarkus
- January 2021: I was invited along with a colleague of mine to talk about how we use Quarkus at Vodafone at Quarkus Insights Episode 33
- June 25 2020: I was featured as a presenter in Unisystem's June event regarding Red Hat's Quarkus (link)
- June 10, 2020: I had a fireside chat with Red Hat's engineering Manager about how we Migrated from Spring to Quarkus at Vodafone Greece
- June 2, 2020: I gave an interview about the work done in DXL in InformationWeek.
- April 28-29 2020: I was invited to the Red Hat Summit 2020 as a speaker about our migration journey from Spring to Quarkus.
- November 13 2019: I gave an interview about Vodafone Greece's Quarkus adoption for the Quarkus Blog.
Links to media:
How Vodafone Greece Built 80 Java Microservices in Quarkus
Tossed into a Java world – can you make it back to reactive, event-driven environments and scalable containers?
Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus | InformationWeek
Changing gears to another framework helped reduce boot times and resource usage, especially during traffic spikes.
Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus | InformationWeek<style type="text/css">.gptHideContent { opacity: 1!important; }</style> var isTargetingCookieSetPrev = false; var isInitialLoading = true; function OptanonWrapper() { var isTargetingCookieSet = /,C0004,/.test(OnetrustActiveGroups) if (isTargetingCookieSetPrev === isTargetingCookieSet) { isInitialLoading = false; return } isTargetingCookieSetPrev = isTargetingCookieSet if (isInitialLoading) { isInitialLoading = false; return } googletag.cmd.push(function(){ googletag.pubads().setRequestNonPersonalizedAds(isTargetingCookieSet ? 0 : 1) googletag.pubads().refresh() }) } function showMainContent() { document.documentElement.classList.remove('gptHideContent'); console.log("showMainContent"); } (function() { if (window.isAdBlocked) { window.welcomeAdWaitTimeout = true; showMainContent(); } else { setTimeout(function(){ window.welcomeAdWaitTimeout = true; showMainContent(); }, 2000); } })(); window.NREUM||(NREUM={});NREUM.info = {"agent":"","beacon":"bam.eu01.nr-data.net","errorBeacon":"bam.eu01.nr-data.net","licenseKey":"NRJS-26ae6a3b09493bbcc87","applicationID":"514059305","agentToken":null,"applicationTime":136.541129,"transactionName":"MhBSZQoZWEEDU0ZaXgtadUkIClNBEVpBHHYgIR8eUg==","queueTime":0,"ttGuid":"6e24d5f80215dbde"}; (window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.eu01.nr-data.net"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:"538480682",accountID:"3936348",trustKey:"3288925",xpid:"Vw8EV1VXABAFVVVSAggEVlE=",licenseKey:"NRJS-26ae6a3b09493bbcc87",applicationID:"514059305"};;/*! For license information please see nr-loader-spa-1.241.0.min.js.LICENSE.txt */
(()=>{"use strict";var e,t,r={5763:(e,t,r)=>{r.d(t,{P_:()=>h,Mt:()=>g,C5:()=>s,DL:()=>b,OP:()=>T,lF:()=>S,Yu:()=>A,Dg:()=>p,CX:()=>c,GE:()=>y,sU:()=>D});var n=r(8632),i=r(9567);const o={beacon:n.ce.beacon,errorBeacon:n.ce.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function c(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.D)(t,o),(0,n.Qy)(e,a[e],"info")}var u=r(7056);const d=()=>{const e={block_selector:"[data-nr-block]",mask_input_options:{password:!0}};return{proxy:{assets:void 0,beacon:void 0},privacy:{cookies_enabled:!0},ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},session:{domain:void 0,expiresMs:u.oD,inactiveMs:u.Hb},ssl:void 0,obfuscate:void 0,jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},metrics:{enabled:!0,autoStart:!0},page_action:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,long_task:!1,autoStart:!0},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},harvest:{tooManyRequestsDelay:60},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,sampling_rate:50,error_sampling_rate:50,mask_text_selector:"*",mask_all_inputs:!0,get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){e.block_selector+=",".concat(t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){e.mask_input_options={...t,password:!0}}},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0}}},l={},f="All configuration objects require an agent identifier!";function h(e){if(!e)throw new Error(f);if(!l[e])throw new Error("Configuration for ".concat(e," was never set"));return l[e]}function p(e,t){if(!e)throw new Error(f);l[e]=(0,i.D)(t,d()),(0,n.Qy)(e,l[e],"config")}function g(e,t){if(!e)throw new Error(f);var r=h(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}const m={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},v={};function b(e){if(!e)throw new Error("All loader-config objects require an agent identifier!");if(!v[e])throw new Error("LoaderConfig for ".concat(e," was never set"));return v[e]}function y(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");v[e]=(0,i.D)(t,m),(0,n.Qy)(e,v[e],"loader_config")}const A=(0,n.mF)().o;var w=r(385),x=r(6818);const E={buildEnv:x.Re,customTransaction:void 0,disabled:!1,distMethod:x.gF,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,offset:Math.floor(w._A?.performance?.timeOrigin||w._A?.performance?.timing?.navigationStart||Date.now()),onerror:void 0,origin:""+w._A.location,ptid:void 0,releaseIds:{},session:void 0,xhrWrappable:"function"==typeof w._A.XMLHttpRequest?.prototype?.addEventListener,version:x.q4,denyList:void 0},_={};function T(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!_[e])throw new Error("Runtime for ".concat(e," was never set"));return _[e]}function D(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");_[e]=(0,i.D)(t,E),(0,n.Qy)(e,_[e],"runtime")}function S(e){return function(e){try{const t=s(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}(e)}},9567:(e,t,r)=>{r.d(t,{D:()=>i});var n=r(50);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.Z)("Setting a Configurable requires an object as input");if(!t||"object"!=typeof t)return(0,n.Z)("Setting a Configurable requires a model to set its initial properties");const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.Z)("An error occurred while setting a property of a Configurable",e)}return r}catch(e){(0,n.Z)("An error occured while setting a Configurable",e)}}},6818:(e,t,r)=>{r.d(t,{Re:()=>i,gF:()=>o,q4:()=>n});const n="1.241.0",i="PROD",o="CDN"},385:(e,t,r)=>{r.d(t,{FN:()=>s,IF:()=>d,Nk:()=>f,Tt:()=>c,_A:()=>o,cv:()=>h,iS:()=>a,il:()=>n,ux:()=>u,v6:()=>i,w1:()=>l});const n="undefined"!=typeof window&&!!window.document,i="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),o=n?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),a=Boolean("hidden"===o?.document?.visibilityState),s=""+o?.location,c=/iPad|iPhone|iPod/.test(o.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,d=(()=>{const e=o.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),l=Boolean(n&&window.document.documentMode),f=!!o.navigator?.sendBeacon,h=Math.floor(o?.performance?.timeOrigin||o?.performance?.timing?.navigationStart||Date.now())},1117:(e,t,r)=>{r.d(t,{w:()=>o});var n=r(50);const i={agentIdentifier:"",ee:void 0};class o{constructor(e){try{if("object"!=typeof e)return(0,n.Z)("shared context requires an object as input");this.sharedContext={},Object.assign(this.sharedContext,i),Object.entries(e).forEach((e=>{let[t,r]=e;Object.keys(i).includes(t)&&(this.sharedContext[t]=r)}))}catch(e){(0,n.Z)("An error occured while setting SharedContext",e)}}}},8e3:(e,t,r)=>{r.d(t,{L:()=>d,R:()=>c});var n=r(8325),i=r(1284),o=r(4322),a=r(3325);const s={};function c(e,t){const r={staged:!1,priority:a.p[t]||0};u(e),s[e].get(t)||s[e].set(t,r)}function u(e){e&&(s[e]||(s[e]=new Map))}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"feature";if(u(e),!e||!s[e].get(t))return a(t);s[e].get(t).staged=!0;const r=[...s[e]];function a(t){const r=e?n.ee.get(e):n.ee,a=o.X.handlers;if(r.backlog&&a){var s=r.backlog[t],c=a[t];if(c){for(var u=0;s&&u<s.length;++u)l(s[u],c);(0,i.D)(c,(function(e,t){(0,i.D)(t,(function(t,r){r[0].on(e,r[1])}))}))}delete a[t],r.backlog[t]=null,r.emit("drain-"+t,[])}}r.every((e=>{let[t,r]=e;return r.staged}))&&(r.sort(((e,t)=>e[1].priority-t[1].priority)),r.forEach((t=>{let[r]=t;s[e].delete(r),a(r)})))}function l(e,t){var r=e[1];(0,i.D)(t[r],(function(t,r){var n=e[0];if(r[0]===n){var i=r[1],o=e[3],a=e[2];i.apply(o,a)}}))}},8325:(e,t,r)=>{r.d(t,{A:()=>c,ee:()=>u});var n=r(8632),i=r(2210),o=r(5763);class a{constructor(e){this.contextId=e}}var s=r(3117);const c="nr@context:".concat(s.a),u=function e(t,r){var n={},s={},d={},f=!1;try{f=16===r.length&&(0,o.OP)(r).isolatedBacklog}catch(e){}var h={on:g,addEventListener:g,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=p(n),c=m(e),d=c.length,l=0;l<d;l++)c[l].apply(a,r);var f=b()[s[e]];f&&f.push([h,e,r,a]);return a},get:v,listeners:m,context:p,buffer:function(e,t){const r=b();if(t=t||"feature",h.aborted)return;Object.entries(e||{}).forEach((e=>{let[n,i]=e;s[i]=t,t in r||(r[t]=[])}))},abort:l,aborted:!1,isBuffering:function(e){return!!b()[s[e]]},debugId:r,backlog:f?{}:t&&"object"==typeof t.backlog?t.backlog:{}};return h;function p(e){return e&&e instanceof a?e:e?(0,i.X)(e,c,(()=>new a(c))):new a(c)}function g(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function v(t){return d[t]=d[t]||e(h,t)}function b(){return h.backlog}}(void 0,"globalEE"),d=(0,n.fP)();function l(){u.aborted=!0,u.backlog={}}d.ee||(d.ee=u)},5546:(e,t,r)=>{r.d(t,{E:()=>n,p:()=>i});var n=r(8325).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},4322:(e,t,r)=>{r.d(t,{X:()=>o});var n=r(5546);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.E,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.E);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3239:(e,t,r)=>{r.d(t,{bP:()=>s,iz:()=>c,m$:()=>a});var n=r(385);let i=!1,o=!1;try{const e={get passive(){return i=!0,!1},get signal(){return o=!0,!1}};n._A.addEventListener("test",null,e),n._A.removeEventListener("test",null,e)}catch(e){}function a(e,t){return i||o?{capture:!!e,passive:i,signal:t}:!!e}function s(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3?arguments[3]:void 0;window.addEventListener(e,t,a(r,n))}function c(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3?arguments[3]:void 0;document.addEventListener(e,t,a(r,n))}},3117:(e,t,r)=>{r.d(t,{a:()=>n});const n=(0,r(4402).Rl)()},4402:(e,t,r)=>{r.d(t,{Ht:()=>u,M:()=>c,Rl:()=>a,ky:()=>s});var n=r(385);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n._A?.crypto||n._A?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(31))),i.split("").map((e=>"x"===e?o(t,++r).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n._A?.crypto||n._A?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(31)));const a=[];for(var s=0;s<e;s++)a.push(o(r,++i).toString(16));return a.join("")}function c(){return s(16)}function u(){return s(32)}},7056:(e,t,r)=>{r.d(t,{Bq:()=>n,Hb:()=>o,oD:()=>i});const n="NRBA",i=144e5,o=18e5},7894:(e,t,r)=>{function n(){return Math.round(performance.now())}r.d(t,{z:()=>n})},7243:(e,t,r)=>{r.d(t,{e:()=>o});var n=r(385),i={};function o(e){if(e in i)return i[e];if(0===(e||"").indexOf("data:"))return{protocol:"data"};let t;var r=n._A?.location,o={};if(n.il)t=document.createElement("a"),t.href=e;else try{t=new URL(e,r.href)}catch(e){return o}o.port=t.port;var a=t.href.split("://");!o.port&&a[1]&&(o.port=a[1].split("/")[0].split("@").pop().split(":")[1]),o.port&&"0"!==o.port||(o.port="https"===a[0]?"443":"80"),o.hostname=t.hostname||r.hostname,o.pathname=t.pathname,o.protocol=a[0],"/"!==o.pathname.charAt(0)&&(o.pathname="/"+o.pathname);var s=!t.protocol||":"===t.protocol||t.protocol===r.protocol,c=t.hostname===r.hostname&&t.port===r.port;return o.sameOrigin=s&&(!t.hostname||c),"/"===o.pathname&&(i[e]=o),o}},50:(e,t,r)=>{function n(e,t){"function"==typeof console.warn&&(console.warn("New Relic: ".concat(e)),t&&console.warn(t))}r.d(t,{Z:()=>n})},2587:(e,t,r)=>{r.d(t,{N:()=>c,T:()=>u});var n=r(8325),i=r(5546),o=r(3325);const a={stn:[o.D.sessionTrace],err:[o.D.jserrors,o.D.metrics],ins:[o.D.pageAction],spa:[o.D.spa],sr:[o.D.sessionReplay,o.D.sessionTrace]},s=new Set;function c(e,t){const r=n.ee.get(t);e&&"object"==typeof e&&(s.has(t)||Object.entries(e).forEach((e=>{let[t,n]=e;a[t]?a[t].forEach((e=>{n?(0,i.p)("feat-"+t,[],void 0,e,r):(0,i.p)("block-"+t,[],void 0,e,r),(0,i.p)("rumresp-"+t,[Boolean(n)],void 0,e,r)})):n&&(0,i.p)("feat-"+t,[],void 0,void 0,r),u[t]=Boolean(n)})),Object.keys(a).forEach((e=>{void 0===u[e]&&(a[e]?.forEach((t=>(0,i.p)("rumresp-"+e,[!1],void 0,t,r))),u[e]=!1)})),s.add(t))}const u={}},2210:(e,t,r)=>{r.d(t,{X:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},1284:(e,t,r)=>{r.d(t,{D:()=>n});const n=(e,t)=>Object.entries(e||{}).map((e=>{let[r,n]=e;return t(r,n)}))},4351:(e,t,r)=>{r.d(t,{P:()=>o});var n=r(8325);const i=()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}}}},3960:(e,t,r)=>{r.d(t,{K:()=>a,b:()=>o});var n=r(3239);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.bP)("load",e,t)}function a(e){if(i())return e();(0,n.iz)("DOMContentLoaded",e)}},8632:(e,t,r)=>{r.d(t,{EZ:()=>u,Qy:()=>c,ce:()=>o,fP:()=>a,gG:()=>d,mF:()=>s});var n=r(7894),i=r(385);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return i._A.NREUM||(i._A.NREUM={}),void 0===i._A.newrelic&&(i._A.newrelic=i._A.NREUM),i._A.NREUM}function s(){let e=a();return e.o||(e.o={ST:i._A.setTimeout,SI:i._A.setImmediate,CT:i._A.clearTimeout,XHR:i._A.XMLHttpRequest,REQ:i._A.Request,EV:i._A.Event,PR:i._A.Promise,MO:i._A.MutationObserver,FETCH:i._A.fetch}),e}function c(e,t,r){let i=a();const o=i.initializedAgents||{},s=o[e]||{};return Object.keys(s).length||(s.initializedAt={ms:(0,n.z)(),date:new Date}),i.initializedAgents={...o,[e]:{...s,[r]:t}},i}function u(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},7956:(e,t,r)=>{r.d(t,{N:()=>i});var n=r(3239);function i(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;(0,n.iz)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},1214:(e,t,r)=>{r.d(t,{em:()=>b,u5:()=>S,QU:()=>C,_L:()=>I,Gm:()=>H,Lg:()=>L,BV:()=>G,Kf:()=>K});var n=r(8325),i=r(3117);const o="nr@original:".concat(i.a);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];d(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return d(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,d,l;try{a=this,o=[...arguments],d="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],d],e)}i(r+"start",[o,a,s],d,c);try{return l=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],d,c),e}finally{i(r+"end",[o,a,l],d,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function d(e){return!(e&&e instanceof Function&&e.apply&&!e[o])}var l=r(2210),f=r(385);const h={},p=f._A.XMLHttpRequest,g="addEventListener",m="removeEventListener",v="nr@wrapped:".concat(n.A);function b(e){var t=function(e){return(e||n.ee).get("events")}(e);if(h[t.debugId]++)return t;h[t.debugId]=1;var r=c(t,!0);function i(e){r.inPlace(e,[g,m],"-",o)}function o(e,t){return e[1]}return"getPrototypeOf"in Object&&(f.il&&y(document,i),y(f._A,i),y(p.prototype,i)),t.on(g+"-start",(function(e,t){var n=e[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var i=(0,l.X)(n,v,(function(){var e={object:function(){if("function"!=typeof n.handleEvent)return;return n.handleEvent.apply(n,arguments)},function:n}[typeof n];return e?r(e,"fn-",null,e.name||"anonymous"):n}));this.wrapped=e[1]=i}})),t.on(m+"-start",(function(e){e[1]=this.wrapped||e[1]})),t}function y(e,t){let r=e;for(;"object"==typeof r&&!Object.prototype.hasOwnProperty.call(r,g);)r=Object.getPrototypeOf(r);for(var n=arguments.length,i=new Array(n>2?n-2:0),o=2;o<n;o++)i[o-2]=arguments[o];r&&t(r,...i)}var A="fetch-",w=A+"body-",x=["arrayBuffer","blob","json","text","formData"],E=f._A.Request,_=f._A.Response,T="prototype";const D={};function S(e){const t=function(e){return(e||n.ee).get("fetch")}(e);if(!(E&&_&&f._A.fetch))return t;if(D[t.debugId]++)return t;function r(e,r,i){var o=e[r];"function"==typeof o&&(e[r]=function(){var e,r=[...arguments],a={};t.emit(i+"before-start",[r],a),a[n.A]&&a[n.A].dt&&(e=a[n.A].dt);var s=o.apply(this,r);return t.emit(i+"start",[r,e],s),s.then((function(e){return t.emit(i+"end",[null,e],s),e}),(function(e){throw t.emit(i+"end",[e],s),e}))})}return D[t.debugId]=1,x.forEach((e=>{r(E[T],e,w),r(_[T],e,w)})),r(f._A,"fetch",A),t.on(A+"end",(function(e,r){var n=this;if(r){var i=r.headers.get("content-length");null!==i&&(n.rxSize=i),t.emit(A+"done",[null,r],n)}else t.emit(A+"done",[e],n)})),t}const j={},N=["pushState","replaceState"];function C(e){const t=function(e){return(e||n.ee).get("history")}(e);return!f.il||j[t.debugId]++||(j[t.debugId]=1,c(t).inPlace(window.history,N,"-")),t}var O=r(3239);const P={},R=["appendChild","insertBefore","replaceChild"];function I(e){const t=function(e){return(e||n.ee).get("jsonp")}(e);if(!f.il||P[t.debugId])return t;P[t.debugId]=!0;var r=c(t),i=/[?&](?:callback|cb)=([^&#]+)/,o=/(.*)\.([^.]+)/,a=/^(\w+)(\.|$)(.*)$/;function s(e,t){if(!e)return t;const r=e.match(a),n=r[1];return s(r[3],t[n])}return r.inPlace(Node.prototype,R,"dom-"),t.on("dom-start",(function(e){!function(e){if(!e||"string"!=typeof e.nodeName||"script"!==e.nodeName.toLowerCase())return;if("function"!=typeof e.addEventListener)return;var n=(a=e.src,c=a.match(i),c?c[1]:null);var a,c;if(!n)return;var u=function(e){var t=e.match(o);if(t&&t.length>=3)return{key:t[2],parent:s(t[1],window)};return{key:e,parent:window}}(n);if("function"!=typeof u.parent[u.key])return;var d={};function l(){t.emit("jsonp-end",[],d),e.removeEventListener("load",l,(0,O.m$)(!1)),e.removeEventListener("error",f,(0,O.m$)(!1))}function f(){t.emit("jsonp-error",[],d),t.emit("jsonp-end",[],d),e.removeEventListener("load",l,(0,O.m$)(!1)),e.removeEventListener("error",f,(0,O.m$)(!1))}r.inPlace(u.parent,[u.key],"cb-",d),e.addEventListener("load",l,(0,O.m$)(!1)),e.addEventListener("error",f,(0,O.m$)(!1)),t.emit("new-jsonp",[e.src],d)}(e[0])})),t}const k={};function H(e){const t=function(e){return(e||n.ee).get("mutation")}(e);if(!f.il||k[t.debugId])return t;k[t.debugId]=!0;var r=c(t),i=f._A.MutationObserver;return i&&(window.MutationObserver=function(e){return this instanceof i?new i(r(e,"fn-")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype),t}const z={};function L(e){const t=function(e){return(e||n.ee).get("promise")}(e);if(z[t.debugId])return t;z[t.debugId]=!0;var r=t.context,i=c(t),a=f._A.Promise;return a&&function(){function e(r){var n=t.context(),o=i(r,"executor-",n,null,!1);const s=Reflect.construct(a,[o],e);return t.context(s).getCtx=function(){return n},s}f._A.Promise=e,Object.defineProperty(e,"name",{value:"Promise"}),e.toString=function(){return a.toString()},Object.setPrototypeOf(e,a),["all","race"].forEach((function(r){const n=a[r];e[r]=function(e){let i=!1;[...e||[]].forEach((e=>{this.resolve(e).then(a("all"===r),a(!1))}));const o=n.apply(this,arguments);return o;function a(e){return function(){t.emit("propagate",[null,!i],o,!1,!1),i=i||!e}}}})),["resolve","reject"].forEach((function(r){const n=a[r];e[r]=function(e){const r=n.apply(this,arguments);return e!==r&&t.emit("propagate",[e,!0],r,!1,!1),r}})),e.prototype=a.prototype;const n=a.prototype.then;a.prototype.then=function(){var e=this,o=r(e);o.promise=e;for(var a=arguments.length,s=new Array(a),c=0;c<a;c++)s[c]=arguments[c];s[0]=i(s[0],"cb-",o,null,!1),s[1]=i(s[1],"cb-",o,null,!1);const u=n.apply(this,s);return o.nextPromise=u,t.emit("propagate",[e,!0],u,!1,!1),u},a.prototype.then[o]=n,t.on("executor-start",(function(e){e[0]=i(e[0],"resolve-",this,null,!1),e[1]=i(e[1],"resolve-",this,null,!1)})),t.on("executor-err",(function(e,t,r){e[1](r)})),t.on("cb-end",(function(e,r,n){t.emit("propagate",[n,!0],this.nextPromise,!1,!1)})),t.on("propagate",(function(e,r,n){this.getCtx&&!r||(this.getCtx=function(){if(e instanceof Promise)var r=t.context(e);return r&&r.getCtx?r.getCtx():this})}))}(),t}const M={},B="setTimeout",F="setInterval",U="clearTimeout",Z="-start",V="-",q=[B,"setImmediate",F,U,"clearImmediate"];function G(e){const t=function(e){return(e||n.ee).get("timer")}(e);if(M[t.debugId]++)return t;M[t.debugId]=1;var r=c(t);return r.inPlace(f._A,q.slice(0,2),B+V),r.inPlace(f._A,q.slice(2,3),F+V),r.inPlace(f._A,q.slice(3),U+V),t.on(F+Z,(function(e,t,n){e[0]=r(e[0],"fn-",null,n)})),t.on(B+Z,(function(e,t,n){this.method=n,this.timerDuration=isNaN(e[1])?0:+e[1],e[0]=r(e[0],"fn-",this,n)})),t}var W=r(50);const X={},Q=["open","send"];function K(e){var t=e||n.ee;const r=function(e){return(e||n.ee).get("xhr")}(t);if(X[r.debugId]++)return r;X[r.debugId]=1,b(t);var i=c(r),o=f._A.XMLHttpRequest,a=f._A.MutationObserver,s=f._A.Promise,u=f._A.setInterval,d="readystatechange",l=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],h=[],p=f._A.XMLHttpRequest=function(e){const t=new o(e),n=r.context(t);try{r.emit("new-xhr",[t],n),t.addEventListener(d,(a=n,function(){var e=this;e.readyState>3&&!a.resolved&&(a.resolved=!0,r.emit("xhr-resolved",[],e)),i.inPlace(e,l,"fn-",w)}),(0,O.m$)(!1))}catch(e){(0,W.Z)("An error occurred while intercepting XHR",e);try{r.emit("internal-error",[e])}catch(e){}}var a;return t};function g(e,t){i.inPlace(t,["onreadystatechange"],"fn-",w)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,p),p.prototype=o.prototype,i.inPlace(p.prototype,Q,"-xhr-",w),r.on("send-xhr-start",(function(e,t){g(e,t),function(e){h.push(e),a&&(m?m.then(A):u?u(A):(v=-v,y.data=v))}(t)})),r.on("open-xhr-start",g),a){var m=s&&s.resolve();if(!u&&!s){var v=1,y=document.createTextNode(v);new a(A).observe(y,{characterData:!0})}}else t.on("fn-end",(function(e){e[0]&&e[0].type===d||A()}));function A(){for(var e=0;e<h.length;e++)g(0,h[e]);h.length&&(h=[])}function w(e,t){return t}return r}},7825:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.ajax},6660:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.jserrors},3081:(e,t,r)=>{r.d(t,{gF:()=>o,mY:()=>i,t9:()=>n,vz:()=>s,xS:()=>a});const n=r(3325).D.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},4649:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.pageAction},7633:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.pageViewEvent},9251:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.pageViewTiming},7144:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.sessionReplay},3614:(e,t,r)=>{r.d(t,{BST_RESOURCE:()=>i,END:()=>s,FEATURE_NAME:()=>n,FN_END:()=>u,FN_START:()=>c,PUSH_STATE:()=>d,RESOURCE:()=>o,START:()=>a});const n=r(3325).D.sessionTrace,i="bstResource",o="resource",a="-start",s="-end",c="fn"+a,u="fn"+s,d="pushState"},7836:(e,t,r)=>{r.d(t,{BODY:()=>x,CB_END:()=>E,CB_START:()=>u,END:()=>w,FEATURE_NAME:()=>i,FETCH:()=>T,FETCH_BODY:()=>v,FETCH_DONE:()=>m,FETCH_START:()=>g,FN_END:()=>c,FN_START:()=>s,INTERACTION:()=>f,INTERACTION_API:()=>d,INTERACTION_EVENTS:()=>o,JSONP_END:()=>b,JSONP_NODE:()=>p,JS_TIME:()=>_,MAX_TIMER_BUDGET:()=>a,REMAINING:()=>l,SPA_NODE:()=>h,START:()=>A,originalSetTimeout:()=>y});var n=r(5763);const i=r(3325).D.spa,o=["click","submit","keypress","keydown","keyup","change"],a=999,s="fn-start",c="fn-end",u="cb-start",d="api-ixn-",l="remaining",f="interaction",h="spaNode",p="jsonpNode",g="fetch-start",m="fetch-done",v="fetch-body-",b="jsonp-end",y=n.Yu.ST,A="-start",w="-end",x="-body",E="cb"+w,_="jsTime",T="fetch"},5938:(e,t,r)=>{r.d(t,{W:()=>o});var n=r(5763),i=r(8325);class o{constructor(e,t,r){this.agentIdentifier=e,this.aggregator=t,this.ee=i.ee.get(e,(0,n.OP)(this.agentIdentifier).isolatedBacklog),this.featureName=r,this.blocked=!1}}},7530:(e,t,r)=>{r.d(t,{j:()=>b});var n=r(3325),i=r(5763),o=r(5546),a=r(8325),s=r(7894),c=r(8e3),u=r(3960),d=r(385),l=r(50),f=r(3081),h=r(8632);function p(){const e=(0,h.gG)();["setErrorHandler","finished","addToTrace","inlineHit","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start"].forEach((t=>{e[t]=function(){for(var r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];return function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i<r;i++)n[i-1]=arguments[i];let o=[];return Object.values(e.initializedAgents).forEach((e=>{e.exposed&&e.api[t]&&o.push(e.api[t](...n))})),o.length>1?o:o[0]}(t,...n)}}))}var g=r(2587);const m=e=>{r.p=e};let v=!1;function b(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},b=arguments.length>2?arguments[2]:void 0,y=arguments.length>3?arguments[3]:void 0,{init:A,info:w,loader_config:x,runtime:E={loaderType:b},exposed:_=!0}=t;const T=(0,h.gG)();w||(A=T.init,w=T.info,x=T.loader_config),(0,i.Dg)(e,A||{}),(0,i.GE)(e,x||{}),w.jsAttributes??={},d.v6&&(w.jsAttributes.isWorker=!0),(0,i.CX)(e,w);const D=(0,i.P_)(e),S=[w.beacon,w.errorBeacon];v||(v=!0,D.proxy.assets&&(m(D.proxy.assets+"/"),S.push(D.proxy.assets)),D.proxy.beacon&&S.push(D.proxy.beacon)),E.denyList=[...D.ajax.deny_list||[],...D.ajax.block_internal?S:[]],(0,i.sU)(e,E),p();const j=function(e,t){t||(0,c.R)(e,"api");const h={};var p=a.ee.get(e),g=p.get("tracer"),m="api-",v=m+"ixn-";function b(t,r,n,o){const a=(0,i.C5)(e);return null===r?delete a.jsAttributes[t]:(0,i.CX)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),w(m,n,!0,o||null===r?"session":void 0)(t,r)}function y(){}["setErrorHandler","finished","addToTrace","inlineHit","addRelease"].forEach((e=>{h[e]=w(m,e,!0,"api")})),h.addPageAction=w(m,"addPageAction",!0,n.D.pageAction),h.setCurrentRouteName=w(m,"routeName",!0,n.D.spa),h.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,i.OP)(e).customTransaction=(r||"http://custom.transaction")+t,w(m,"setPageViewName",!0)()},h.setCustomAttribute=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"==typeof e){if(["string","number"].includes(typeof t)||null===t)return b(e,t,"setCustomAttribute",r);(0,l.Z)("Failed to execute setCustomAttribute.\nNon-null value must be a string or number type, but a type of <".concat(typeof t,"> was provided."))}else(0,l.Z)("Failed to execute setCustomAttribute.\nName must be a string type, but a type of <".concat(typeof e,"> was provided."))},h.setUserId=function(e){if("string"==typeof e||null===e)return b("enduser.id",e,"setUserId",!0);(0,l.Z)("Failed to execute setUserId.\nNon-null value must be a string type, but a type of <".concat(typeof e,"> was provided."))},h.setApplicationVersion=function(e){if("string"==typeof e||null===e)return b("application.version",e,"setApplicationVersion",!1);(0,l.Z)("Failed to execute setApplicationVersion. Expected <String | null>, but got <".concat(typeof e,">."))},h.start=e=>{try{const t=e?"defined":"undefined";(0,o.p)(f.xS,["API/start/".concat(t,"/called")],void 0,n.D.metrics,p);const r=Object.values(n.D);if(void 0===e)e=r;else{if((e=Array.isArray(e)&&e.length?e:[e]).some((e=>!r.includes(e))))return(0,l.Z)("Invalid feature name supplied. Acceptable feature names are: ".concat(r));e.includes(n.D.pageViewEvent)||e.push(n.D.pageViewEvent)}e.forEach((e=>{p.emit("".concat(e,"-opt-in"))}))}catch(e){(0,l.Z)("An unexpected issue occurred",e)}},h.interaction=function(){return(new y).get()};var A=y.prototype={createTracer:function(e,t){var r={},i=this,a="function"==typeof t;return(0,o.p)(v+"tracer",[(0,s.z)(),e,r],i,n.D.spa,p),function(){if(g.emit((a?"":"no-")+"fn-start",[(0,s.z)(),i,a],r),a)try{return t.apply(this,arguments)}catch(e){throw g.emit("fn-err",[arguments,this,e],r),e}finally{g.emit("fn-end",[(0,s.z)()],r)}}}};function w(e,t,r,i){return function(){return(0,o.p)(f.xS,["API/"+t+"/called"],void 0,n.D.metrics,p),i&&(0,o.p)(e+t,[(0,s.z)(),...arguments],r?null:this,i,p),r?void 0:this}}function x(){r.e(111).then(r.bind(r,7438)).then((t=>{let{setAPI:r}=t;r(e),(0,c.L)(e,"api")})).catch((()=>(0,l.Z)("Downloading runtime APIs failed...")))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{A[e]=w(v,e,void 0,n.D.spa)})),h.noticeError=function(e,t){"string"==typeof e&&(e=new Error(e)),(0,o.p)(f.xS,["API/noticeError/called"],void 0,n.D.metrics,p),(0,o.p)("err",[e,(0,s.z)(),!1,t],void 0,n.D.jserrors,p)},d.il?(0,u.b)((()=>x()),!0):x(),h}(e,y);return(0,h.Qy)(e,j,"api"),(0,h.Qy)(e,_,"exposed"),(0,h.EZ)("activatedFeatures",g.T),j}},3325:(e,t,r)=>{r.d(t,{D:()=>n,p:()=>i});const n={ajax:"ajax",jserrors:"jserrors",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.ajax]:5,[n.sessionTrace]:6,[n.pageAction]:7,[n.spa]:8,[n.sessionReplay]:9}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>({111:"nr-spa",164:"nr-spa-compressor",433:"nr-spa-recorder"}[e]+"-1.241.0.min.js"),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.241.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var l=u[d];if(l.getAttribute("src")==r||l.getAttribute("data-webpack")==t+o){s=l;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r),e[r]=[n];var f=(t,n)=>{s.onerror=s.onload=null,clearTimeout(h);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=f.bind(null,s.onerror),s.onload=f.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={801:0,92:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.241.0.PROD"]=self["webpackChunk:NRBA-1.241.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{var e=i(50);class t{addPageAction(t,r){(0,e.Z)("Call to agent api addPageAction failed. The session trace feature is not currently initialized.")}setPageViewName(t,r){(0,e.Z)("Call to agent api setPageViewName failed. The page view feature is not currently initialized.")}setCustomAttribute(t,r,n){(0,e.Z)("Call to agent api setCustomAttribute failed. The js errors feature is not currently initialized.")}noticeError(t,r){(0,e.Z)("Call to agent api noticeError failed. The js errors feature is not currently initialized.")}setUserId(t){(0,e.Z)("Call to agent api setUserId failed. The js errors feature is not currently initialized.")}setApplicationVersion(t){(0,e.Z)("Call to agent api setApplicationVersion failed. The agent is not currently initialized.")}setErrorHandler(t){(0,e.Z)("Call to agent api setErrorHandler failed. The js errors feature is not currently initialized.")}finished(t){(0,e.Z)("Call to agent api finished failed. The page action feature is not currently initialized.")}addRelease(t,r){(0,e.Z)("Call to agent api addRelease failed. The agent is not currently initialized.")}start(t){(0,e.Z)("Call to agent api addRelease failed. The agent is not currently initialized.")}}var r=i(3325),n=i(5763);const o=Object.values(r.D);function a(e){const t={};return o.forEach((r=>{t[r]=function(e,t){return!1!==(0,n.Mt)(t,"".concat(e,".enabled"))}(r,e)})),t}var s=i(7530);var c=i(8e3),u=i(5938),d=i(3960),l=i(385);class f extends u.W{constructor(e,t,r){let i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];super(e,t,r),this.auto=i,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===(0,n.Mt)(this.agentIdentifier,"".concat(this.featureName,".autoStart"))&&(this.auto=!1),this.auto&&(0,c.R)(e,r)}importAggregator(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.featAggregate)return;if(!this.auto)return void this.ee.on("".concat(this.featureName,"-opt-in"),(()=>{(0,c.R)(this.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator()}));const r=l.il&&!0===(0,n.Mt)(this.agentIdentifier,"privacy.cookies_enabled");let o;this.onAggregateImported=new Promise((e=>{o=e}));const a=async()=>{let n;try{if(r){const{setupAgentSession:e}=await i.e(111).then(i.bind(i,3228));n=e(this.agentIdentifier)}}catch(t){(0,e.Z)("A problem occurred when starting up session manager. This page will not start or extend any session.",t)}try{if(!this.shouldImportAgg(this.featureName,n))return(0,c.L)(this.agentIdentifier,this.featureName),void o(!1);const{lazyFeatureLoader:e}=await i.e(111).then(i.bind(i,8582)),{Aggregate:r}=await e(this.featureName,"aggregate");this.featAggregate=new r(this.agentIdentifier,this.aggregator,t),o(!0)}catch(t){(0,e.Z)("Downloading and initializing ".concat(this.featureName," failed..."),t),this.abortHandler?.(),o(!1)}};l.il?(0,d.b)((()=>a()),!0):a()}shouldImportAgg(e,t){return e!==r.D.sessionReplay||!!n.Yu.MO&&(!1!==(0,n.Mt)(this.agentIdentifier,"session_trace.enabled")&&(!!t?.isNew||!!t?.state.sessionReplay))}}var h=i(7633);class p extends f{static featureName=h.t;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,h.t,r),this.importAggregator()}}var g=i(1117),m=i(1284);class v extends g.w{constructor(e){super(e),this.aggregatedData={}}store(e,t,r,n,i){var o=this.getBucket(e,t,r,i);return o.metrics=function(e,t){t||(t={count:0});return t.count+=1,(0,m.D)(e,(function(e,r){t[e]=b(r,t[e])})),t}(n,o.metrics),o}merge(e,t,r,n,i){var o=this.getBucket(e,t,n,i);if(o.metrics){var a=o.metrics;a.count+=r.count,(0,m.D)(r,(function(e,t){if("count"!==e){var n=a[e],i=r[e];i&&!i.c?a[e]=b(i.t,n):a[e]=function(e,t){if(!t)return e;t.c||(t=y(t.t));return t.min=Math.min(e.min,t.min),t.max=Math.max(e.max,t.max),t.t+=e.t,t.sos+=e.sos,t.c+=e.c,t}(i,a[e])}}))}else o.metrics=r}storeMetric(e,t,r,n){var i=this.getBucket(e,t,r);return i.stats=b(n,i.stats),i}getBucket(e,t,r,n){this.aggregatedData[e]||(this.aggregatedData[e]={});var i=this.aggregatedData[e][t];return i||(i=this.aggregatedData[e][t]={params:r||{}},n&&(i.custom=n)),i}get(e,t){return t?this.aggregatedData[e]&&this.aggregatedData[e][t]:this.aggregatedData[e]}take(e){for(var t={},r="",n=!1,i=0;i<e.length;i++)t[r=e[i]]=A(this.aggregatedData[r]),t[r].length&&(n=!0),delete this.aggregatedData[r];return n?t:null}}function b(e,t){return null==e?function(e){e?e.c++:e={c:1};return e}(t):t?(t.c||(t=y(t.t)),t.c+=1,t.t+=e,t.sos+=e*e,e>t.max&&(t.max=e),e<t.min&&(t.min=e),t):{t:e}}function y(e){return{t:e,min:e,max:e,sos:e*e,c:1}}function A(e){return"object"!=typeof e?[]:(0,m.D)(e,w)}function w(e,t){return t}var x=i(8632),E=i(4402),_=i(4351);var T=i(5546),D=i(7956),S=i(3239),j=i(7894),N=i(9251);class C extends f{static featureName=N.t;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,N.t,r),l.il&&((0,D.N)((()=>(0,T.p)("docHidden",[(0,j.z)()],void 0,N.t,this.ee)),!0),(0,S.bP)("pagehide",(()=>(0,T.p)("winPagehide",[(0,j.z)()],void 0,N.t,this.ee))),this.importAggregator())}}var O=i(3081);class P extends f{static featureName=O.t9;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,O.t9,r),this.importAggregator()}}var R=i(6660);class I{constructor(e,t,r,n){this.name="UncaughtError",this.message=e,this.sourceURL=t,this.line=r,this.column=n}}class k extends f{static featureName=R.t;#e=new Set;constructor(e,t){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,R.t,n);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on("fn-err",((e,t,n)=>{this.abortHandler&&!this.#e.has(n)&&(this.#e.add(n),(0,T.p)("err",[this.#t(n),(0,j.z)()],void 0,r.D.jserrors,this.ee))})),this.ee.on("internal-error",(e=>{this.abortHandler&&(0,T.p)("ierr",[this.#t(e),(0,j.z)(),!0],void 0,r.D.jserrors,this.ee)})),l._A.addEventListener("unhandledrejection",(e=>{this.abortHandler&&(0,T.p)("err",[this.#r(e),(0,j.z)(),!1,{unhandledPromiseRejection:1}],void 0,r.D.jserrors,this.ee)}),(0,S.m$)(!1,this.removeOnAbort?.signal)),l._A.addEventListener("error",(e=>{this.abortHandler&&(this.#e.has(e.error)?this.#e.delete(e.error):(0,T.p)("err",[this.#n(e),(0,j.z)()],void 0,r.D.jserrors,this.ee))}),(0,S.m$)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#i,this.importAggregator()}#i(){this.removeOnAbort?.abort(),this.#e.clear(),this.abortHandler=void 0}#t(e){return e instanceof Error?e:void 0!==e?.message?new I(e.message,e.filename||e.sourceURL,e.lineno||e.line,e.colno||e.col):new I("string"==typeof e?e:(0,_.P)(e))}#r(e){let t="Unhandled Promise Rejection: ";if(e?.reason instanceof Error)try{return e.reason.message=t+e.reason.message,e.reason}catch(t){return e.reason}if(void 0===e.reason)return new I(t);const r=this.#t(e.reason);return r.message=t+r.message,r}#n(e){return e.error instanceof Error?e.error:new I(e.message,e.filename,e.lineno,e.colno)}}var H=i(2210);let z=1;const L="nr@id";function M(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===l._A?0:(0,H.X)(e,L,(function(){return z++}))}function B(e){if("string"==typeof e&&e.length)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,_.P)(e).length}catch(e){return}}}var F=i(1214),U=i(7243);class Z{constructor(e){this.agentIdentifier=e}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var t=(0,n.DL)(this.agentIdentifier);if(!t)return null;var r=(t.accountID||"").toString()||null,i=(t.agentID||"").toString()||null,o=(t.trustKey||"").toString()||null;if(!r||!i)return null;var a=(0,E.M)(),s=(0,E.Ht)(),c=Date.now(),u={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(u.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),u.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,r,i,o)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(u.newrelicHeader=this.generateTraceHeader(a,s,c,r,i,o)),u}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,o){if(!("function"==typeof l._A?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return o&&n!==o&&(a.d.tk=o),btoa((0,_.P)(a))}shouldGenerateTrace(e){return this.isDtEnabled()&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1,r={};if((0,n.Mt)(this.agentIdentifier,"distributed_tracing")&&(r=(0,n.P_)(this.agentIdentifier).distributed_tracing),e.sameOrigin)t=!0;else if(r.allowed_origins instanceof Array)for(var i=0;i<r.allowed_origins.length;i++){var o=(0,U.e)(r.allowed_origins[i]);if(e.hostname===o.hostname&&e.protocol===o.protocol&&e.port===o.port){t=!0;break}}return t}isDtEnabled(){var e=(0,n.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.enabled}excludeNewrelicHeader(){var e=(0,n.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=(0,n.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=(0,n.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.cors_use_tracecontext_headers}}var V=i(7825),q=["load","error","abort","timeout"],G=q.length,W=n.Yu.REQ,X=n.Yu.XHR;class Q extends f{static featureName=V.t;constructor(e,t){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(super(e,t,V.t,i),(0,n.OP)(e).xhrWrappable){this.dt=new Z(e),this.handler=(e,t,r,n)=>(0,T.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:"xhr",fetch:"fetch",beacon:"beacon"};l._A?.performance?.getEntriesByType("resource").forEach((t=>{if(t.initiatorType in e&&0!==t.responseStatus){const n={status:t.responseStatus},i={rxSize:t.transferSize,duration:Math.floor(t.duration),cbTime:0};K(n,t.name),this.handler("xhr",[n,i,t.startTime,t.responseEnd,e[t.initiatorType]],void 0,r.D.ajax)}}))}catch(e){}(0,F.u5)(this.ee),(0,F.Kf)(this.ee),function(e,t,i,o){function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=x,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener("load",(function(r){E(t,e)}),(0,S.m$)(!1)),l.IF||e.addEventListener("progress",(function(e){t.lastSize=e.loaded}),(0,S.m$)(!1))}function s(e){this.params={method:e[0]},K(this,e[1]),this.metrics={}}function c(t,r){var i=(0,n.DL)(e);i.xpid&&this.sameOrigin&&r.setRequestHeader("X-NewRelic-ID",i.xpid);var a=o.generateTracePayload(this.parsedOrigin);if(a){var s=!1;a.newrelicHeader&&(r.setRequestHeader("newrelic",a.newrelicHeader),s=!0),a.traceContextParentHeader&&(r.setRequestHeader("traceparent",a.traceContextParentHeader),a.traceContextStateHeader&&r.setRequestHeader("tracestate",a.traceContextStateHeader),s=!0),s&&(this.dt=a)}}function u(e,r){var n=this.metrics,i=e[0],o=this;if(n&&i){var a=B(i);a&&(n.txSize=a)}this.startTime=(0,j.z)(),this.listener=function(e){try{"abort"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==e.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof r.onload)&&"function"==typeof o.end)&&o.end(r)}catch(e){try{t.emit("internal-error",[e])}catch(e){}}};for(var s=0;s<G;s++)r.addEventListener(q[s],this.listener,(0,S.m$)(!1))}function d(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function f(e,t){var r=""+M(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function h(e,t){var r=""+M(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function p(){this.endTime=(0,j.z)()}function g(e,r){r instanceof X&&"load"===e[0]&&t.emit("xhr-load-added",[e[1],e[2]],r)}function m(e,r){r instanceof X&&"load"===e[0]&&t.emit("xhr-load-removed",[e[1],e[2]],r)}function v(e,t,r){t instanceof X&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,j.z)()))}function b(e,r){this.xhrCbStart&&t.emit("xhr-cb-time",[(0,j.z)()-this.xhrCbStart,this.onload,r],r)}function y(e){var t,r=e[1]||{};if("string"==typeof e[0]?0===(t=e[0]).length&&l.il&&(t=""+l._A.location.href):e[0]&&e[0].url?t=e[0].url:l._A?.URL&&e[0]&&e[0]instanceof URL?t=e[0].href:"function"==typeof e[0].toString&&(t=e[0].toString()),"string"==typeof t&&0!==t.length){t&&(this.parsedOrigin=(0,U.e)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var n=o.generateTracePayload(this.parsedOrigin);if(n&&(n.newrelicHeader||n.traceContextParentHeader))if(e[0]&&e[0].headers)s(e[0].headers,n)&&(this.dt=n);else{var i={};for(var a in r)i[a]=r[a];i.headers=new Headers(r.headers||{}),s(i.headers,n)&&(this.dt=n),e.length>1?e[1]=i:e.push(i)}}function s(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function A(e,t){this.params={},this.metrics={},this.startTime=(0,j.z)(),this.dt=t,e.length>=1&&(this.target=e[0]),e.length>=2&&(this.opts=e[1]);var r,n=this.opts||{},i=this.target;"string"==typeof i?r=i:"object"==typeof i&&i instanceof W?r=i.url:l._A?.URL&&"object"==typeof i&&i instanceof URL&&(r=i.href),K(this,r);var o=(""+(i&&i instanceof W&&i.method||n.method||"GET")).toUpperCase();this.params.method=o,this.txSize=B(n.body)||0}function w(e,t){var n;this.endTime=(0,j.z)(),this.params||(this.params={}),this.params.status=t?t.status:0,"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);var o={txSize:this.txSize,rxSize:n,duration:(0,j.z)()-this.startTime};i("xhr",[this.params,o,this.startTime,this.endTime,"fetch"],this,r.D.ajax)}function x(e){var t=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var o=0;o<G;o++)e.removeEventListener(q[o],this.listener,!1);t.aborted||(n.duration=(0,j.z)()-this.startTime,this.loadCaptureCalled||4!==e.readyState?null==t.status&&(t.status=0):E(this,e),n.cbTime=this.cbTime,i("xhr",[t,n,this.startTime,this.endTime,"xhr"],this,r.D.ajax))}}function E(e,t){e.params.status=t.status;var r=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?B(e.response):"text"===r||""===r||void 0===r?B(e.responseText):void 0}(t,e.lastSize);if(r&&(e.metrics.rxSize=r),e.sameOrigin){var n=t.getResponseHeader("X-NewRelic-App-Data");n&&(e.params.cat=n.split(", ").pop())}e.loadCaptureCalled=!0}t.on("new-xhr",a),t.on("open-xhr-start",s),t.on("open-xhr-end",c),t.on("send-xhr-start",u),t.on("xhr-cb-time",d),t.on("xhr-load-added",f),t.on("xhr-load-removed",h),t.on("xhr-resolved",p),t.on("addEventListener-end",g),t.on("removeEventListener-end",m),t.on("fn-end",b),t.on("fetch-before-start",y),t.on("fetch-start",A),t.on("fn-start",v),t.on("fetch-done",w)}(e,this.ee,this.handler,this.dt),this.importAggregator()}}}function K(e,t){var r=(0,U.e)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}var Y=i(3614);const{BST_RESOURCE:J,RESOURCE:ee,START:te,END:re,FEATURE_NAME:ne,FN_END:ie,FN_START:oe,PUSH_STATE:ae}=Y;var se=i(7144);class ce extends f{static featureName=se.t;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,se.t,r),this.importAggregator()}}var ue=i(7836);const{FEATURE_NAME:de,START:le,END:fe,BODY:he,CB_END:pe,JS_TIME:ge,FETCH:me,FN_START:ve,CB_START:be,FN_END:ye}=ue;var Ae=i(4649);class we extends f{static featureName=Ae.t;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,Ae.t,r),this.importAggregator()}}new class extends t{constructor(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,E.ky)(16);super(),l._A?(this.agentIdentifier=r,this.sharedAggregator=new v({agentIdentifier:this.agentIdentifier}),this.features={},this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(p),Object.assign(this,(0,s.j)(this.agentIdentifier,t,t.loaderType||"agent")),this.run()):(0,e.Z)("Failed to initial the agent. Could not determine the runtime environment.")}get config(){return{info:(0,n.C5)(this.agentIdentifier),init:(0,n.P_)(this.agentIdentifier),loader_config:(0,n.DL)(this.agentIdentifier),runtime:(0,n.OP)(this.agentIdentifier)}}run(){const t="features";try{const n=a(this.agentIdentifier),i=[...this.desiredFeatures];i.sort(((e,t)=>r.p[e.featureName]-r.p[t.featureName])),i.forEach((t=>{if(n[t.featureName]||t.featureName===r.D.pageViewEvent){const i=function(e){switch(e){case r.D.ajax:return[r.D.jserrors];case r.D.sessionTrace:return[r.D.ajax,r.D.pageViewEvent];case r.D.sessionReplay:return[r.D.sessionTrace];case r.D.pageViewTiming:return[r.D.pageViewEvent];default:return[]}}(t.featureName);i.every((e=>n[e]))||(0,e.Z)("".concat(t.featureName," is enabled but one or more dependent features has been disabled (").concat((0,_.P)(i),"). This may cause unintended consequences or missing data...")),this.features[t.featureName]=new t(this.agentIdentifier,this.sharedAggregator)}})),(0,x.Qy)(this.agentIdentifier,this.features,t)}catch(r){(0,e.Z)("Failed to initialize all enabled instrument classes (agent aborted) -",r);for(const e in this.features)this.features[e].abortHandler?.();const n=(0,x.fP)();return delete n.initializedAgents[this.agentIdentifier]?.api,delete n.initializedAgents[this.agentIdentifier]?.[t],delete this.sharedAggregator,n.ee?.abort(),delete n.ee?.get(this.agentIdentifier),!1}}addToTrace(t){(0,e.Z)("Call to agent api addToTrace failed. The page action feature is not currently initialized.")}setCurrentRouteName(t){(0,e.Z)("Call to agent api setCurrentRouteName failed. The spa feature is not currently initialized.")}interaction(){(0,e.Z)("Call to agent api interaction failed. The spa feature is not currently initialized.")}}({features:[Q,p,C,class extends f{static featureName=ne;constructor(e,t){if(super(e,t,ne,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!l.il)return;const n=this.ee;let i;(0,F.QU)(n),this.eventsEE=(0,F.em)(n),this.eventsEE.on(oe,(function(e,t){this.bstStart=(0,j.z)()})),this.eventsEE.on(ie,(function(e,t){(0,T.p)("bst",[e[0],t,this.bstStart,(0,j.z)()],void 0,r.D.sessionTrace,n)})),n.on(ae+te,(function(e){this.time=(0,j.z)(),this.startPath=location.pathname+location.hash})),n.on(ae+re,(function(e){(0,T.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,r.D.sessionTrace,n)}));try{i=new PerformanceObserver((e=>{const t=e.getEntries();(0,T.p)(J,[t],void 0,r.D.sessionTrace,n)})),i.observe({type:ee,buffered:!0})}catch(e){}this.importAggregator({resourceObserver:i})}},ce,P,we,k,class extends f{static featureName=de;constructor(e,t){if(super(e,t,de,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!l.il)return;if(!(0,n.OP)(e).xhrWrappable)return;try{this.removeOnAbort=new AbortController}catch(e){}let r,i=0;const o=this.ee.get("tracer"),a=(0,F._L)(this.ee),s=(0,F.Lg)(this.ee),c=(0,F.BV)(this.ee),u=(0,F.Kf)(this.ee),d=this.ee.get("events"),f=(0,F.u5)(this.ee),h=(0,F.QU)(this.ee),p=(0,F.Gm)(this.ee);function g(e,t){h.emit("newURL",[""+window.location,t])}function m(){i++,r=window.location.hash,this[ve]=(0,j.z)()}function v(){i--,window.location.hash!==r&&g(0,!0);var e=(0,j.z)();this[ge]=~~this[ge]+e-this[ve],this[ye]=e}function b(e,t){e.on(t,(function(){this[t]=(0,j.z)()}))}this.ee.on(ve,m),s.on(be,m),a.on(be,m),this.ee.on(ye,v),s.on(pe,v),a.on(pe,v),this.ee.buffer([ve,ye,"xhr-resolved"],this.featureName),d.buffer([ve],this.featureName),c.buffer(["setTimeout"+fe,"clearTimeout"+le,ve],this.featureName),u.buffer([ve,"new-xhr","send-xhr"+le],this.featureName),f.buffer([me+le,me+"-done",me+he+le,me+he+fe],this.featureName),h.buffer(["newURL"],this.featureName),p.buffer([ve],this.featureName),s.buffer(["propagate",be,pe,"executor-err","resolve"+le],this.featureName),o.buffer([ve,"no-"+ve],this.featureName),a.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"],this.featureName),b(f,me+le),b(f,me+"-done"),b(a,"new-jsonp"),b(a,"jsonp-end"),b(a,"cb-start"),h.on("pushState-end",g),h.on("replaceState-end",g),window.addEventListener("hashchange",g,(0,S.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("load",g,(0,S.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("popstate",(function(){g(0,i>1)}),(0,S.m$)(!0,this.removeOnAbort?.signal)),this.abortHandler=this.#i,this.importAggregator()}#i(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}],loaderType:"spa"})})()})(); (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true; j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.append(j); })(window,document,'script','dataLayer',"GTM-5523ZCM"); (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true; j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.append(j); })(window,document,'script','dataLayer',"GTM-MTN2X7K"); <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5523ZCM" height="0" width="0" style="display:none;visibility:hidden"></iframe><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MTN2X7K" height="0" width="0" style="display:none;visibility:hidden"></iframe>InformationWeek is part of the Informa Tech Division of Informa PLCInforma PLC|ABOUT US|INVESTOR RELATIONS|TALENTThis site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.ReportsOnline EventsAdvertiseAboutNewsletter Sign-UpNewsletter Sign-UpLeadershipRelated TopicsDigital TransformationIT Staffing & CareersIT ManagementIT StrategyRecent in LeadershipSee Allsilhouettes of business leadersIT LeadershipRedefining IT’s Organizational InfluenceRedefining IT’s Organizational InfluencebyJeremy RafuseSep 22, 20234 Min ReadGreen Balloon about to be burst by a needle held by a businessman's hand in a pinstripe sleeve.IT LeadershipTech Company Layoffs: The COVID Tech Bubble BurstsTech Company Layoffs: The COVID Tech Bubble BurstsbyBrandon Taylor, Jessica DavisSep 22, 20231h 10m ReadResilienceRelated TopicsCybersecurityRisk ManagementIncident ResponseRecent in ResilienceSee AllthumbnailCyber ResilienceFast Chat: Redefining Trust and Risk in a Modern Digital MarketplaceFast Chat: Redefining Trust and Risk in a Modern Digital MarketplaceSep 25, 202319 Min ViewCyber security, hacking and data analytics employee, tired from working on it, software engineering glitch.Cyber ResilienceWhat Are the Biggest Lessons from the MGM Ransomware Attack?What Are the Biggest Lessons from the MGM Ransomware Attack?byCarrie PallardySep 22, 20235 Min ReadML & AIRelated TopicsResponsible AIIT AutomationAI InnovationsRecent in ML & AISee AllBusiness woman, AI and laptop with hologram, UX and networking for forex trading icon in office using virtual platform.Machine Learning & AIDialing Down AI Risks While Getting Smarter About Its UsesDialing Down AI Risks While Getting Smarter About Its UsesbySamuel GreengardSep 21, 20235 Min Readpeople and a robot on different sides of a seesaw depicting the balance of artificial intelligence and societyMachine Learning & AIWeighing the AI Threat By Incident ReportsWeighing the AI Threat By Incident ReportsbyPam BakerSep 20, 20235 Min ReadDataRelated TopicsData PrivacyData GovernanceRecent in DataSee AllGoogle office building, Kings Cross, London, UK.Data ManagementCould the DOJ’s Antitrust Trial vs Google Drive More Innovation?Could the DOJ’s Antitrust Trial vs Google Drive More Innovation?byJoao-Pierre S. RuthSep 20, 20236 Min ReadthumbnailData ManagementKeeping Up With Data Privacy Compliance: A GuideKeeping Up With Data Privacy Compliance: A GuidebyInformationWeek StaffSep 19, 20231 Min ReadSustainabilityRelated TopicsGreen ITESGRecent in SustainabilitySee AllBusiness chart on a concrete wall and leaves. Impact Investing concept.SustainabilityCFOs Navigate ESG Reporting ChallengesCFOs Navigate ESG Reporting ChallengesbyNathan EddySep 22, 20234 Min ReadDigital, tablet and future with man on farm for sustainability, agriculture and planning.SustainabilityHow AgTech Could Help Save the WorldHow AgTech Could Help Save the WorldbyJohn EdwardsSep 18, 20235 Min ReadInfrastructureRelated TopicsData CentersCloud ComputingRecent in InfrastructureSee AllCisco logo seen during an event.IT InfrastructureCisco Will Buy Splunk for $28B in Huge AI Cybersecurity PlayCisco Will Buy Splunk for $28B in Huge AI Cybersecurity PlaybyShane Snider Sep 21, 20233 Min ReadClose-up view of a new semiconductor microchip in the gloved hand of computer scientist.IT InfrastructureAre We in a Chips Crisis?Are We in a Chips Crisis?byInformationWeek StaffSep 19, 20231 Min ReadSoftwareRelated TopicsDevOpsSoftware PlatformsOperating SystemsRecent in SoftwareSee AllthumbnailSoftware & ServicesGBS Rides New Technology and New Leadership to a Fast-Growing RoleGBS Rides New Technology and New Leadership to a Fast-Growing RolebySonal BhagiaSep 21, 20234 Min Readwrecking ball shattering a white wallSoftware & ServicesTake a Wrecking Ball to Your Tech Debt WallTake a Wrecking Ball to Your Tech Debt WallbyJason Byrd, Chad DoironSep 20, 20237 Min ReadMoreRelated TopicsNewslettersReports/ResearchOnline EventsLive EventsPodcastsWhite PapersAdvertise With UsAbout UsIT SectorsSee all resourcesSponsored ByMachine Learning & AIWhy Vodafone Greece Devs Migrated to Red Hat’s QuarkusWhy Vodafone Greece Devs Migrated to Red Hat’s QuarkusChanging gears to another framework helped reduce boot times and resource usage, especially during traffic spikes.Joao-Pierre S. RuthJune 2, 20205 Min ReadImage: joyfotoliakid - stock.adobe.comThe team at Vodafone Greece kept trying to make do with its legacy systems but the need for a nimbler option became impossible to ignore. Christos Sotiriou, backend chapter lead at Vodafone Greece, says they wanted to better serve requests and increasing demand on services such as distant payment solutions and mobile applications. He says they had been using a monolithic service architecture that was in place for decades. A newer option emerged when Quarkus came on the scene.In 2019, Red Hat rolled out its build of Quarkus, a container-first, next-generation Kubernetes-native Java stack. It is billed as a more cloud-oriented option for app development that spoke to the needs at Vodafone Greece.At the time, Vodafone Greece was dealing with long development cycles that needed to be trimmed down to be more reactive, Sotiriou says. “In order to push a new feature, no matter how small, it required two or three months of development.” The volume of people developing on the same architecture became a problem, he says, along with delays in aggregation to present information to users.That led to Vodafone introducing a digital experience layer, based on Kubernetes and comprised of microservices that sit between the front-end channels, including web and mobile applications, and backend systems. “In this Kubernetes cluster, we have developed 80 microservices,” Sotiriou says. The goal is to develop up to 300 microservices, he says, when the full scope of the digital experience layer is realized.Sotiriou says his team worked with the Spring Boot framework when they began developing microservices. Though he says Spring Boot is widely used, his team had concerns. “We became increasingly worried about resource consumption that Spring Boot was having while being deployed on the Kubernetes cluster,” Sotiriou says. For example, they faced slow boot times when a microservice was deployed because systems needed to be aggregated before it could come online.Vodafone Greece was eventually able to decrease boot times of about 2 minutes to around 60 seconds, Sotiriou says, but a search began to find alternatives. “It became increasingly cumbersome to find ways to circumvent the methodology we were using just to squeeze ever little bit of performance out of Spring Boot,” he says.Delays in booting, especially during traffic spikes, can cause headaches with microservices and result in an unhealthy cluster, Sotiriou says. “If booting of a new microservice takes too long it means that the old microservice that is already running is going to be killed because of heavy load.”The development of Quarkus was a response to the need to alleviate overhead and better serve modern ecosystems, says Rich Sharples, senior director of product management at Red Hat. “Java was designed for a very, very different era of computing with big honking, mainframe-class Solaris servers running for years and decades,” he says. “That’s not the world we live in.”Now in a containerized world, the resources that applications have access to are much smaller, Sharples says. In extreme cases, he says, such as functions-as-a-service, applications may only get enough memory and CPU to run a function one time. “That’s what we are trying to change with Quarkus,” Sharples says, “to move a lot of that processing into the compilation stage so it doesn’t affect your startup time and to lower the significant memory overhead that Java comes with.”Sotiriou says his team considered options that included Node.js and Golang but went with Quarkus because of the ecosystem and programming language choice. In March 2019, he says his team began writing their entire stack toward Quarkus. “Not only were we beginning to write microservices using Quarkus, we also had a plethora of common libraries, shared libraries across the whole ecosystem we needed to rewrite as well.” That included common business cases that the microservices were using such as customized database connectivity and authorization authentication.
Christos SotiriouImage: Vodafone Greece
Vodafone Greece entered into a staggered migration, Sotiriou says, where the team initially tried to keep older applications running as they moved Spring Boot into maintenance phase while newer applications were written in Quarkus. The need to accelerate that migration became apparent earlier this year.In January, Vodafone Greece released a new version of the My Vodafone application. Sotiriou says it was the first time the digital experience layer was used to draw the main screen for the app. “The main screen had so much information that we needed to aggregate information from three or four or five microservices at the same time,” Sotiriou says. When this version of the app was rolled out to about 30% of Vodafone Greece users, problems emerged. “The microservices the main screen used were written in Spring Boot, so it nearly tore down our cluster,” he says.With increased traffic spikes, there were long boot times of about 40 seconds, Sotiriou says. The app was rewritten in Quarkus to rectify the issues, using half the resources. He says using Quarkus in JVM (Java Virtual Machine) mode without compiling to native led to boot times of about 14 seconds, a 60% performance increase. “That was the breaking point for us,” Sotiriou says. “We decide to migrate even more microservices from Spring Boot to Quarkus.” Vodafone Greece now has 40 microservices written in Quarkus, with another 20 microservices in the pipeline, he says. For more information on DevOps and Cloud, read these articles:Modern App Dev: An Enterprise GuideKubernetes Advantage: Considerations for a Multi-Cloud WorldSearching For a Cloud-Native App Strategy Amid the ChaosAbout the Author(s)Joao-Pierre S. RuthSenior WriterJoao-Pierre S. Ruth has spent his career immersed in business and technology journalism first covering local industries in New Jersey, later as the New York editor for Xconomy delving into the city's tech startup community, and then as a freelancer for such outlets as TheStreet, Investopedia, and Street Fight. Joao-Pierre earned his bachelor's in English from Rutgers University. Follow him on Twitter: @jpruth.See more from Joao-Pierre S. RuthNever Miss a Beat: Get a snapshot of the issues affecting the IT industry straight to your inbox.SIGN-UPYou May Also LikeMore InsightsWebinarsUnlocking Maximum Productivity: AI-Powered Document Redaction & GenAI InnovationAug 30, 2023Evolution in ITSM: Navigating the New HorizonSep 12, 2023Cloud Crisis ManagementAug 30, 2023[Virtual Event] DevSecOps Essentials That Enable Efficient SecuritySep 14, 2023More WebinarsReportsYou've Been Attacked Now What?The New Frontier of Cyber Security: Securing the Network Edge2022 Retrospective: The Emergence of the Next Gen of Wi-Fi2022 State of Network Management2022 State of ITOps and SecOpsMore ReportsEditor's ChoiceCyber security, hacking and data analytics employee, tired from working on it, software engineering glitch.Cyber ResilienceWhat Are the Biggest Lessons from the MGM Ransomware Attack?What Are the Biggest Lessons from the MGM Ransomware Attack?byCarrie PallardySep 22, 20235 Min ReadCisco logo seen during an event.IT InfrastructureCisco Will Buy Splunk for $28B in Huge AI Cybersecurity PlayCisco Will Buy Splunk for $28B byShane Snider Sep 21, 20233 Min ReadMicrosoft corporation brand logo on high rise glass building exterior through exotic green palm leaves summertime photo.Cyber ResilienceMicrosoft’s 38TB Leak: How IT Leaders Should RespondMicrosoft’s 38TB Leak: How IT Leaders Should RespondbyShane Snider Sep 19, 20233 Min ReadPen filling out paper form with the question: "Are you at risk for cyberattacks?"Cyber Resilience2023 Cyber Risk and Resiliency Report: How CIOs Are Dueling Disaster in 2023Cyber Risk and Resiliency Report: How CIOs Are Dueling DisasterbyInformationWeek StaffSep 19, 20231 Min ReadWebinarsUnlocking Maximum Productivity: AI-Powered Document Redaction & GenAI InnovationAug 30, 2023Evolution in ITSM: Navigating the New HorizonSep 12, 2023Cloud Crisis ManagementAug 30, 2023[Virtual Event] DevSecOps Essentials That Enable Efficient SecuritySep 14, 2023More WebinarsWhite PapersBuyer's Guide: Essential tips for finding your ideal ITSM solutionEKC Group Customer StorySmart Service ManagementOklahoma City Shows Their Love for ITSM Platform; Adoption HighCyberthreats Racing Ahead of Your Defenses? Secure Networking Can Put a Stop to ThatMore White PapersLive EventsForrester - Security & Risk / Nov. 14-15 - Washington DC & DigitalNov 14, 2023[Virtual Event] DevSecOps Essentials That Enable Efficient SecurityOct 19, 2023ICMI Contact Center Expo, October 16-19, 2023Oct 16, 2023More Live EventsReportsYou've Been Attacked Now What?The New Frontier of Cyber Security: Securing the Network Edge2022 Retrospective: The Emergence of the Next Gen of Wi-Fi2022 State of Network Management2022 State of ITOps and SecOpsMore ReportsDiscover MoreOmdiaNetwork ComputingITPro TodayData Center KnowledgeData Center World Working With UsAbout UsReprintsAdvertiseContact UsJoin UsNewsletter Sign-UpFollow Us Copyright © 2023. All rights reserved. Informa Tech, a trading division of Informa PLC.Home|CCPA: Do not sell my personal info|Cookie Policy|Privacy|Terms of Use(STORAGE_KEY => { if (!window.history.state || !window.history.state.key) { let key = Math.random().toString(32).slice(2); window.history.replaceState({ key }, ""); } try { let positions = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || "{}"); let storedY = positions[window.history.state.key]; if (typeof storedY === "number") { window.scrollTo(0, storedY); } } catch (error) { console.error(error); sessionStorage.removeItem(STORAGE_KEY); } })("positions")window.__remixContext = {"appState":{"trackBoundaries":true,"trackCatchBoundaries":true,"catchBoundaryRouteId":null,"renderBoundaryRouteId":null,"loaderBoundaryRouteId":null},"matches":[{"params":{"topic":"machine-learning-ai","slug":"why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},"pathname":"/","route":{"id":"root","path":"","module":"/build/root-LTDT356C.js","imports":["/build/_shared/chunk-WPY7Y2LO.js","/build/_shared/chunk-YYYB7ILW.js","/build/_shared/chunk-37YBFP5U.js","/build/_shared/chunk-DT7XKV3C.js","/build/_shared/chunk-QF2327UI.js","/build/_shared/chunk-2MQOLYJ6.js","/build/_shared/chunk-Y4DXPFO4.js","/build/_shared/chunk-ORTDXJPJ.js","/build/_shared/chunk-EJDXW353.js","/build/_shared/chunk-RDZ3VF3I.js","/build/_shared/chunk-RDLSLAFP.js","/build/_shared/chunk-FJUG4WWT.js","/build/_shared/chunk-J56IETE6.js","/build/_shared/chunk-R53HVH6E.js","/build/_shared/chunk-NYVDH3MD.js","/build/_shared/chunk-KPFOZW7N.js","/build/_shared/chunk-BGVAJVIT.js","/build/_shared/chunk-RV3JR3RD.js","/build/_shared/chunk-U4RHUKDM.js","/build/_shared/chunk-WDD67XQQ.js","/build/_shared/chunk-5NMQUOV4.js","/build/_shared/chunk-AEBM4IWQ.js","/build/_shared/chunk-BLJPWPB4.js"],"hasAction":false,"hasLoader":true,"hasCatchBoundary":false,"hasErrorBoundary":true}},{"params":{"topic":"machine-learning-ai","slug":"why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},"pathname":"/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","route":{"id":"routes/$topic.$slug","parentId":"root","path":":topic/:slug","module":"/build/routes/$topic.$slug-2NZ3KYE6.js","imports":["/build/_shared/chunk-GFRINHDY.js","/build/_shared/chunk-OOQ6IZJ2.js","/build/_shared/chunk-EQ6VKRVM.js","/build/_shared/chunk-SAD7KBCB.js","/build/_shared/chunk-EJZUGXE2.js","/build/_shared/chunk-WUZFNWM3.js","/build/_shared/chunk-425FABRT.js","/build/_shared/chunk-YB2PZH4U.js","/build/_shared/chunk-7BDXNLM4.js","/build/_shared/chunk-GY4YSMUY.js","/build/_shared/chunk-UBO4WCRS.js","/build/_shared/chunk-KFRXMGJ3.js","/build/_shared/chunk-Y5JRLGUN.js","/build/_shared/chunk-ZW7LLLJE.js","/build/_shared/chunk-66IVGUKJ.js","/build/_shared/chunk-324RFIST.js","/build/_shared/chunk-QJXTJ75T.js","/build/_shared/chunk-6A2GLJQM.js","/build/_shared/chunk-YRYOCUDQ.js","/build/_shared/chunk-4E5IQGYR.js","/build/_shared/chunk-3MS3TJ6I.js","/build/_shared/chunk-ULQDBY5Y.js"],"hasAction":false,"hasLoader":true,"hasCatchBoundary":true,"hasErrorBoundary":false}}],"routeData":{"root":{"brand":"informationweek","domain":"http://www.informationweek.com","siteName":"Information Week","ads":{"networkId":3834,"parentAdUnit":"informationweek.home","enabledAds":"all","checkClientIP":false},"isDctsTurnOn":false,"unbounce":{"url":"https://iw-resources.informationweek.com/free/w_ingg126/prgm.cgi?a=1"},"oneTrust":{"siteId":"db797727-a266-409f-983d-f30f1926b3fb"},"brightcoveAccountId":"1568176135","gtmIds":{"primary":"GTM-5523ZCM","secondary":"GTM-MTN2X7K"},"ui":{"brand":"informationweek","theme":"theme1","font":{"primary":{"name":"Montserrat","url":"https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700\u0026display=swap"},"secondary":{"name":"Montserrat","url":"https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700\u0026display=swap"}}},"environment":"prod","featureToggles":{"elnNewsletter":false,"iirisAuthentication":true,"subBrand":false,"useSettingsRedirectAPIVersion1":true},"layout":{"socialLinks":[{"title":"Linked In","url":"https://www.linkedin.com/company/informationweek/","openInNewTab":true,"logoAlt":"LinkedIn Icon","logoUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blta6673457ef891796/64c7c7d7ae93de683ab08767/theme1_social_linkedin-in.png"},{"title":"Twitter","url":"https://twitter.com/InformationWeek","openInNewTab":true,"logoAlt":"Twitter Icon","logoUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt727f3a8761606a1f/64c7d2498b503819babe7288/theme1_social_twitter.png"},{"title":"Facebook","url":"https://www.facebook.com/informationweek","openInNewTab":true,"logoAlt":"Facebook Icon","logoUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt1eb07ce60eeba9cf/64c7d2aa1abba43464e5fade/theme1_social_facebook.png"},{"title":"RSS","url":"https://informationweek.com/rss.xml","openInNewTab":true,"logoAlt":"RSS Icon","logoUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt1a508ddafa052978/64c7d33420ad4a612102bebd/theme1_rss.png"}],"informaBar":{"enabled":true,"leftSection":{"description":"InformationWeek is part of the Informa Tech Division of Informa PLC","subMenu":[{"title":"Informa PLC","url":"https://www.informa.com/"},{"title":"ABOUT US","url":"https://www.informa.com/about-us/"},{"title":"INVESTOR RELATIONS","url":"https://www.informa.com/investors/"},{"title":"TALENT","url":"https://www.informa.com/talent/"}]},"rightSection":{"description":"This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726."}},"nav":{"mainMenuItems":[{"title":"Leadership","url":"/it-leadership","seeAllLink":"See All","seeAllLinkUrl":"/it-leadership","hasSubMenu":true,"subMenu":[{"title":"Digital Transformation","url":"/it-leadership/digital-transformation"},{"title":"IT Staffing \u0026 Careers","url":"/it-leadership/it-staffing-careers"},{"title":"IT Management","url":"/it-leadership/it-management"},{"title":"IT Strategy","url":"/it-leadership/it-strategy"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt3aa164914c1507a1/650b345377b78c0ddec5901a/leadership-Federico_Caputo_-alamy.jpg","alt":"silhouettes of business leaders"},"articleName":"Redefining IT’s Organizational Influence","mobileHeadline":"Redefining IT’s Organizational Influence","articleSummary":"New ways of working have put IT in the spotlight and raised stakes when it comes to cybersecurity. It’s time to give CIOs a prime seat at the decision table.","articleUrl":"/it-leadership/redefining-it-s-organizational-influence","listPageUrl":"","date":"2023-09-22T10:30:00.000Z","categoryName":"IT Leadership","categoryUrl":"/it-leadership","contentType":"Article","contributors":[{"name":"Jeremy Rafuse","link":"/author/jeremy-rafuse","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltbfa967518a68bb97/64caeb368513ed83f7fdb346/Jeremy_Rafuse-goto.jpg"}],"timeRead":4,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb3df84796cad2417/64bf5c359a29085d4414da31/BubbleBurst-Brian_Jackson-CFMK07-CP.jpg","alt":"Green Balloon about to be burst by a needle held by a businessman's hand in a pinstripe sleeve."},"articleName":"Tech Company Layoffs: The COVID Tech Bubble Bursts","mobileHeadline":"Tech Company Layoffs: The COVID Tech Bubble Bursts","articleSummary":"UPDATED September 22, 2023 -- As COVID drove everyone online, tech companies hired like crazy. Now we are hitting the COVID tech bust as tech giants shed jobs by the thousands. Check back regularly for updates to our IT job layoffs tracker.","articleUrl":"/it-leadership/tech-company-layoffs-the-covid-tech-bubble-bursts-sep-14","listPageUrl":"","date":"2023-09-22T09:30:00.000Z","categoryName":"IT Leadership","categoryUrl":"/it-leadership","contentType":"Article","contributors":[{"name":"Brandon Taylor","link":"/author/brandon-taylor","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt15232db5d2321c39/64bf5c007b352808e9c5a64e/BrandonTaylorHeadshot1.jpg"},{"name":"Jessica Davis","link":"/author/jessica-davis","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte17e46d01a58d768/64bf65b2e7200e514c22fb6c/JessicaDavisHeadshot012020croppedsquare.jpg"}],"timeRead":70,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"Resilience","url":"/cyber-resilience","seeAllLink":"See All","seeAllLinkUrl":"/cyber-resilience","hasSubMenu":true,"subMenu":[{"title":"Cybersecurity","url":"/cyber-resilience/cybersecurity"},{"title":"Risk Management","url":"/cyber-resilience/risk-management"},{"title":"Incident Response","url":"/cyber-resilience/incident-response"}],"recentContents":[{"thumbnail":{"src":"","alt":""},"articleName":"Fast Chat: Redefining Trust and Risk in a Modern Digital Marketplace","mobileHeadline":"Fast Chat: Redefining Trust and Risk in a Modern Digital Marketplace","articleSummary":"Kristi Melani, Chief Marketing and GTM Strategy Officer at Telesign, discusses how market leaders can assess the risk of every interaction and respond to the signals.","articleUrl":"/cyber-resilience/redefining-trust-and-risk-in-a-modern-digital-marketplace","listPageUrl":"/videos","date":"2023-09-25T04:00:00.000Z","categoryName":"Cyber Resilience","categoryUrl":"/cyber-resilience","contentType":"Video","contributors":[],"timeRead":19,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt668108162d490cae/650c8d6388945437603ed168/computerhacked_PantherMedia-Alamy.jpg","alt":"Cyber security, hacking and data analytics employee, tired from working on it, software engineering glitch."},"articleName":"What Are the Biggest Lessons from the MGM Ransomware Attack?","mobileHeadline":"What Are the Biggest Lessons from the MGM Ransomware Attack?","articleSummary":"Scattered Spider and ALPHV were behind the ransomware attack that caused major operational disruptions for MGM resorts.","articleUrl":"/cyber-resilience/what-are-the-biggest-lessons-from-the-mgm-ransomware-attack-","listPageUrl":"","date":"2023-09-22T12:00:00.000Z","categoryName":"Cyber Resilience","categoryUrl":"/cyber-resilience","contentType":"Article","contributors":[{"name":"Carrie Pallardy","link":"/author/carrie-pallardy","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blta2ac0cf507deba77/64bf49006c654daed172bbba/CarriePallardy_Head_Shot.gif"}],"timeRead":5,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"ML \u0026 AI","url":"/machine-learning-ai","seeAllLink":"See All","seeAllLinkUrl":"/machine-learning-ai","hasSubMenu":true,"subMenu":[{"title":"Responsible AI","url":"/machine-learning-ai/responsible-ai"},{"title":"IT Automation","url":"/machine-learning-ai/it-automation"},{"title":"AI Innovations","url":"/machine-learning-ai/ai-innovations"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt2ec7e6ca7d996c7e/6509b73afa283fda938b9ac6/AI_businesswoman-YuriArcurs_AlamyStockPhoto.jpg","alt":"Business woman, AI and laptop with hologram, UX and networking for forex trading icon in office using virtual platform."},"articleName":"Dialing Down AI Risks While Getting Smarter About Its Uses","mobileHeadline":"Dialing Down AI Risks While Getting Smarter About Its Uses","articleSummary":"Although AI delivers remarkable opportunities, it also introduces substantial business risks.","articleUrl":"/machine-learning-ai/dialing-down-ai-risks","listPageUrl":"","date":"2023-09-21T12:00:00.000Z","categoryName":"Machine Learning \u0026 AI","categoryUrl":"/machine-learning-ai","contentType":"Article","contributors":[{"name":"Samuel Greengard","link":"/author/samuel-greengard","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blta46adbc209cbfe28/64bf47853034810f1966247d/Sam_Greengard_New-Headshot-Spain.jpg"}],"timeRead":5,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf1f87762a90ead48/6509b4c8e81b88baef73573c/AI_threat-Fanatic_Studio_Gary_Waters-alamy.jpg","alt":"people and a robot on different sides of a seesaw depicting the balance of artificial intelligence and society"},"articleName":"Weighing the AI Threat By Incident Reports","mobileHeadline":"Weighing the AI Threat By Incident Reports","articleSummary":"Yes, artificial intelligence can be a threat. But probably not in the way you most expected. ","articleUrl":"/machine-learning-ai/weighing-the-ai-threat-by-incident-reports","listPageUrl":"","date":"2023-09-20T12:00:00.000Z","categoryName":"Machine Learning \u0026 AI","categoryUrl":"/machine-learning-ai","contentType":"Article","contributors":[{"name":"Pam Baker","link":"/author/pam-baker","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blta2c974464f9d8086/64bc0833691b1233dc5fefd2/Pam-Baker.png"}],"timeRead":5,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"Data","url":"/data-management","seeAllLink":"See All","seeAllLinkUrl":"/data-management","hasSubMenu":true,"subMenu":[{"title":"Data Privacy","url":"/data-management/data-privacy"},{"title":"Data Governance","url":"data-management/data-governance"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt7d96df15266a790f/6509f24eec1b6f7abd5cc852/Google_offices-Bailey-CooperPhotography-AlamyStockPhoto.jpg","alt":"Google office building, Kings Cross, London, UK."},"articleName":"Could the DOJ’s Antitrust Trial vs Google Drive More Innovation?","mobileHeadline":"Could the DOJ’s Antitrust Trial vs Google Drive More Innovation?","articleSummary":"Google’s ad tech will also face antitrust claims in court -- will this signal limits on big tech that allow for more competition?","articleUrl":"/data-management/could-the-doj-s-antitrust-trial-vs-google-drive-more-innovation-","listPageUrl":"","date":"2023-09-20T12:15:00.000Z","categoryName":"Data Management","categoryUrl":"/data-management","contentType":"Article","contributors":[{"name":"Joao-Pierre S. Ruth","link":"/author/joao-pierre-s-ruth","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt7f004b6f174043df/64bfdc879bc48c25c32d4ad9/Joao-Pierre-S-Ruth.png"}],"timeRead":6,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt061d6e07e40670fe/6509c18b8590b41991011ad8/2PH8352.jpg","alt":""},"articleName":"Keeping Up With Data Privacy Compliance: A Guide","mobileHeadline":"Keeping Up With Data Privacy Compliance: A Guide","articleSummary":"In this Tech Insight Report, we explore how pivotal moments in data privacy history inform the future of compliance and offer expert tips to keep up with data management best practices.","articleUrl":"/data-management/keeping-up-with-data-privacy-compliance-a-guide","listPageUrl":"/documents","date":"2023-09-19T04:00:00.000Z","categoryName":"Data Management","categoryUrl":"/data-management","contentType":"Document","contributors":[{"name":"InformationWeek Staff","link":"/author/informationweek-staff","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf6866111140df5bb/644914fcbec1154bea815853/250503_IWK23_Graphics_GooglePublishingCentre_Assets_1000x1000.png"}],"timeRead":1,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"Sustainability","url":"/sustainability","seeAllLink":"See All","seeAllLinkUrl":"/sustainability","hasSubMenu":true,"subMenu":[{"title":"Green IT","url":"/sustainability/green-it"},{"title":"ESG","url":"/sustainability/esg"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltc56856fe7f1b9fec/6509d0bea335db3afacb7d82/ESG_measuring-designer491_-alamy.jpg","alt":"Business chart on a concrete wall and leaves. Impact Investing concept."},"articleName":"CFOs Navigate ESG Reporting Challenges","mobileHeadline":"CFOs Navigate ESG Reporting Challenges","articleSummary":"The benefit of curbing emissions goes beyond just satisfying regulatory requirements -- it’s a license to do business for years to come.","articleUrl":"/sustainability/cfos-navigate-esg-reporting-challenges","listPageUrl":"","date":"2023-09-22T11:00:00.000Z","categoryName":"Sustainability","categoryUrl":"/sustainability","contentType":"Article","contributors":[{"name":"Nathan Eddy","link":"/author/nathan-eddy","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltffb02052df0e7c0f/64bf3f85d8102a1de1f9b9a4/nathan-eddy-new.jpg"}],"timeRead":4,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt3af6baf66783076e/650969dbdd8a5e16cd9e9b02/AgTech-Yuri_Arcurs_-alamy.jpg","alt":"Digital, tablet and future with man on farm for sustainability, agriculture and planning."},"articleName":"How AgTech Could Help Save the World","mobileHeadline":"How AgTech Could Help Save the World","articleSummary":"What’s new down on the farm? How about emerging technologies that promise to revolutionize agriculture?","articleUrl":"/sustainability/how-agtech-could-help-save-the-world","listPageUrl":"","date":"2023-09-18T23:00:00.000Z","categoryName":"Sustainability","categoryUrl":"/sustainability","contentType":"Article","contributors":[{"name":"John Edwards","link":"/author/john-edwards","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte185e89eb327a1c3/64bbfbd29a2908fafb14d71d/John-Edwards-125x125.jpg"}],"timeRead":5,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"Infrastructure","url":"/it-infrastructure","seeAllLink":"See All","seeAllLinkUrl":"/it-infrastructure","hasSubMenu":true,"subMenu":[{"title":"Data Centers","url":"/it-infrastructure/data-centers"},{"title":"Cloud Computing","url":"/it-infrastructure/cloud-computing"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf4110c3eecd331e3/650c504fd22093e73dae8ee3/Cisco_M614XT.jpg","alt":"Cisco logo seen during an event."},"articleName":"Cisco Will Buy Splunk for $28B in Huge AI Cybersecurity Play","mobileHeadline":"Cisco Will Buy Splunk for $28B in Huge AI Cybersecurity Play","articleSummary":"The companies will combine efforts to offer more software solutions aimed at AI cyber resilience and observability.","articleUrl":"/it-infrastructure/cisco-will-buy-splunk-for-28b-in-huge-ai-cybersecurity-play","listPageUrl":"","date":"2023-09-21T15:00:00.000Z","categoryName":"IT Infrastructure","categoryUrl":"/it-infrastructure","contentType":"Article","contributors":[{"name":"Shane Snider ","link":"/author/shane-snider","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf4de7e5784b276a0/650d8d5ffac8e1d4a1f21f76/Shane_Snider_Profile.jpg"}],"timeRead":3,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt557a389382897d8f/650a0a95cf5e05e53e598ff3/2D5T952.jpg","alt":"Close-up view of a new semiconductor microchip in the gloved hand of computer scientist."},"articleName":"Are We in a Chips Crisis?","mobileHeadline":"Are We in a Chips Crisis?","articleSummary":"We break down the chips-related issues that could impact your business in the coming years.","articleUrl":"/it-infrastructure/are-we-in-a-chips-crisis","listPageUrl":"/documents","date":"2023-09-19T12:00:00.000Z","categoryName":"IT Infrastructure","categoryUrl":"/it-infrastructure","contentType":"Document","contributors":[{"name":"InformationWeek Staff","link":"/author/informationweek-staff","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf6866111140df5bb/644914fcbec1154bea815853/250503_IWK23_Graphics_GooglePublishingCentre_Assets_1000x1000.png"}],"timeRead":1,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"Software","url":"/software-services","seeAllLink":"See All","seeAllLinkUrl":"/software-services","hasSubMenu":true,"subMenu":[{"title":"DevOps","url":"/software-services/devops"},{"title":"Software Platforms","url":"/software-services/software-platforms"},{"title":"Operating Systems","url":"/software-services/operating-systems"}],"recentContents":[{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltbeb4ca4d8bf84c5a/650c8f9887faa8c4e75171a5/Deloitte_Main_Image_for_IW.jpg","alt":""},"articleName":"GBS Rides New Technology and New Leadership to a Fast-Growing Role","mobileHeadline":"GBS Rides New Technology and New Leadership to a Fast-Growing Role","articleSummary":"For shared services organizations, it’s all coming together. (SPONSORED)","articleUrl":"/software-services/gbs-rides-new-technology-and-new-leadership-to-a-fast-growing-role","listPageUrl":"","date":"2023-09-21T18:30:00.000Z","categoryName":"Software \u0026 Services","categoryUrl":"/software-services","contentType":"Article","contributors":[{"name":"Sonal Bhagia","link":"/author/sonal-bhagia","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb590bdfbae8c9df9/650c8e3afc057e8339fd7293/Sonal_Bhagia_-deloitte.jpg"}],"timeRead":4,"variant":"card-vertical","layoutVariant":"vertical"},{"thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt1f5e9af0ff93ae97/6509dc9e87faa8a537516ced/wreckingball-Konstantin_Shaklein_-alamy.jpg","alt":"wrecking ball shattering a white wall"},"articleName":"Take a Wrecking Ball to Your Tech Debt Wall","mobileHeadline":"Take a Wrecking Ball to Your Tech Debt Wall","articleSummary":"Once just a CIO headache, tech debt is now a challenge for the whole board. Read how you can clear the decks and stop spending new tech money on old tech debt.","articleUrl":"/software-services/take-a-wrecking-ball-to-your-tech-debt-wall-","listPageUrl":"","date":"2023-09-20T11:00:00.000Z","categoryName":"Software \u0026 Services","categoryUrl":"/software-services","contentType":"Article","contributors":[{"name":"Jason Byrd","link":"/author/jason-byrd","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt5d67c1418c054702/6509daf2a335dbfd5fcb7d8b/Jason_Byrd_-accenture.jpg"},{"name":"Chad Doiron","link":"/author/chad-doiron","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt684449e088b13532/6509d958c5f99512d5fce1b6/Chad-doiron-accenture.jpg"}],"timeRead":7,"variant":"card-vertical","layoutVariant":"vertical"}]},{"title":"More","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk","seeAllLink":"See all resources","seeAllLinkUrl":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk","hasSubMenu":true,"subMenu":[{"title":"Newsletters","url":"https://iw-resources.informationweek.com/free/w_ingg126/prgm.cgi?a=1"},{"title":"Reports/Research","url":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk"},{"title":"Online Events","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Live Events","url":"/events"},{"title":"Podcasts","url":"/podcasts"},{"title":"White Papers","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Advertise With Us","url":"/advertise"},{"title":"About Us","url":"/about-us"},{"title":"IT Sectors","url":"/it-sectors"}],"recentContents":[]}],"secondaryMenu":[{"title":"Reports","url":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk"},{"title":"Online Events","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Advertise","url":"/advertise"},{"title":"About","url":"/about-us"}]},"megaMenu":{"largeMenu":[{"title":"Leadership","url":"/it-leadership","subMenu":[{"title":"Digital Transformation","url":"/it-leadership/digital-transformation"},{"title":"IT Staffing \u0026 Careers","url":"/it-leadership/it-staffing-careers"},{"title":"IT Management","url":"/it-leadership/it-management"},{"title":"IT Strategy","url":"/it-leadership/it-strategy"}],"seeAllLink":"See All","seeAllLinkUrl":"/it-leadership"},{"title":"Resilience","url":"/cyber-resilience","subMenu":[{"title":"Cybersecurity","url":"/cyber-resilience/cybersecurity"},{"title":"Risk Management","url":"/cyber-resilience/risk-management"},{"title":"Incident Response","url":"/cyber-resilience/incident-response"}],"seeAllLink":"See All","seeAllLinkUrl":"/cyber-resilience"},{"title":"ML \u0026 AI","url":"/machine-learning-ai","subMenu":[{"title":"Responsible AI","url":"/machine-learning-ai/responsible-ai"},{"title":"IT Automation","url":"/machine-learning-ai/it-automation"},{"title":"AI Innovations","url":"/machine-learning-ai/ai-innovations"}],"seeAllLink":"See All","seeAllLinkUrl":"/machine-learning-ai"},{"title":"Data","url":"/data-management","subMenu":[{"title":"Data Privacy","url":"/data-management/data-privacy"},{"title":"Data Governance","url":"data-management/data-governance"}],"seeAllLink":"See All","seeAllLinkUrl":"/data-management"},{"title":"Sustainability","url":"/sustainability","subMenu":[{"title":"Green IT","url":"/sustainability/green-it"},{"title":"ESG","url":"/sustainability/esg"}],"seeAllLink":"See All","seeAllLinkUrl":"/sustainability"},{"title":"Infrastructure","url":"/it-infrastructure","subMenu":[{"title":"Data Centers","url":"/it-infrastructure/data-centers"},{"title":"Cloud Computing","url":"/it-infrastructure/cloud-computing"}],"seeAllLink":"See All","seeAllLinkUrl":"/it-infrastructure"},{"title":"Software","url":"/software-services","subMenu":[{"title":"DevOps","url":"/software-services/devops"},{"title":"Software Platforms","url":"/software-services/software-platforms"},{"title":"Operating Systems","url":"/software-services/operating-systems"}],"seeAllLink":"See All","seeAllLinkUrl":"/software-services"},{"title":"More","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk","subMenu":[{"title":"Newsletters","url":"https://iw-resources.informationweek.com/free/w_ingg126/prgm.cgi?a=1"},{"title":"Reports/Research","url":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk"},{"title":"Online Events","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Live Events","url":"/events"},{"title":"Podcasts","url":"/podcasts"},{"title":"White Papers","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Advertise With Us","url":"/advertise"},{"title":"About Us","url":"/about-us"},{"title":"IT Sectors","url":"/it-sectors"}],"seeAllLink":"See all resources","seeAllLinkUrl":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"}],"smallMenu":[{"title":"Browse","url":"","subMenu":[{"title":"Reports/Research","url":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk"},{"title":"Online Events","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=megamenu"},{"title":"White Papers","url":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkheadtllnk"},{"title":"Podcasts","url":"/podcasts"},{"title":"Upcoming Events","url":"/events"}]},{"title":"Advertise","url":"","subMenu":[{"title":"Explore Marketing Solutions","url":"/advertise"}]},{"title":"IT Sectors","url":"","subMenu":[{"title":"Agriculture","url":"/it-sectors/agriculture"},{"title":"Education","url":"/it-sectors/education"},{"title":"Energy","url":"/it-sectors/energy"},{"title":"Fintech","url":"/it-sectors/fintech"},{"title":"Government","url":"/it-sectors/government"},{"title":"Healthcare","url":"/it-sectors/healthcare"},{"title":"Manufacturing","url":"/it-sectors/manufacturing"},{"title":"Sports/Entertainment","url":"/it-sectors/sports-entertainment"}]}],"sideNavSections":[{"title":"Communicate","url":"","subMenu":[{"title":"About Us","url":"/about-us"},{"title":"Contact Us","url":"/contact-us"}],"seeAllLink":"","seeAllLinkUrl":""}]},"navBase":{"logo":{"url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt610f1382a6ead9c3/64b854bd7f10ca354fa97a15/178206_IWK22_Logo_RGB.svg","altText":"InformationWeek"}},"footer":{"logo":{"url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte28ded54d12e0ac0/644913f2d2002548587a2a5e/InformationWeek-Logo.png","altText":"Information Week Logo"},"linkSections":[{"links":[{"image":{"altText":"","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt6ac71116800a46bf/64babac96bef06569b0668ee/OMDIA_LOGO_BLACK_2_with_extra_height.png"},"openInNewTab":true,"title":"Omdia","url":"https://omdia.tech.informa.com/"},{"image":{"altText":"Network Computing Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt40fbedd2eb2df482/643d354fbf535e7c079bb364/Network_Computing_logo.png"},"openInNewTab":true,"title":"Network Computing","url":"https://www.networkcomputing.com/"},{"image":{"altText":"IT Pro Today Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf8425441a9bb7395/643d3589d465e31028d41abe/IT_Pro_Today_Logo.png"},"openInNewTab":true,"title":"ITPro Today","url":"https://www.itprotoday.com/"},{"image":{"altText":"Data Center Knowledge Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt4b847636ba215910/643d35d937023c7ed8e9d6a6/Data_Center_Knowledge_Logo.png"},"openInNewTab":true,"title":"Data Center Knowledge","url":"https://www.datacenterknowledge.com/"},{"image":{"altText":"Data Center World Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte6d1f0c534c109a8/643d36703381c910e4384762/Data_Center_World_Logo.png"},"openInNewTab":true,"title":"Data Center World ","url":"https://datacenterworld.com/"}],"title":"Discover More","type":"1"},{"links":[{"image":{"altText":"InformationWeek Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte28ded54d12e0ac0/644913f2d2002548587a2a5e/InformationWeek-Logo.png"},"openInNewTab":true,"title":"About Us","url":"/about-us"},{"image":{"altText":"InformationWeek Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte28ded54d12e0ac0/644913f2d2002548587a2a5e/InformationWeek-Logo.png"},"openInNewTab":true,"title":"Reprints","url":"https://info.wrightsmedia.com/informa-licensing-reprints-request"},{"image":{"altText":"InformationWeek Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte28ded54d12e0ac0/644913f2d2002548587a2a5e/InformationWeek-Logo.png"},"openInNewTab":true,"title":"Advertise","url":"/advertise"},{"image":{"altText":"InformationWeek Logo","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte28ded54d12e0ac0/644913f2d2002548587a2a5e/InformationWeek-Logo.png"},"openInNewTab":true,"title":"Contact Us","url":"/contact-us"}],"title":"Working With Us","type":"1"}],"brandLinks":[],"copyright":{"businessUnit":{"url":"https://www.informatech.com","name":"Informa Tech","logoUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb60310a8e8e4737f/643d330afd160d1fb09a967a/InformaTechBTYB_240x60.webp"},"links":[{"image":{"altText":"Home","url":"https://www.informatech.com/"},"openInNewTab":false,"title":"Home","url":"https://www.informatech.com/"},{"image":{"altText":"CCPA: Do not sell my personal info","url":"https://privacyportal-eu-cdn.onetrust.com/dsarwebform/c1f53e84-9f05-4169-a854-85052b63c50b/5f26b553-52cc-4973-a761-295d5634a6b6.html"},"openInNewTab":true,"title":"CCPA: Do not sell my personal info","url":"https://privacyportal-eu-cdn.onetrust.com/dsarwebform/c1f53e84-9f05-4169-a854-85052b63c50b/5f26b553-52cc-4973-a761-295d5634a6b6.html"},{"image":{"altText":"Cookie Policy","url":"https://www.informationweek.com/cookie-policy"},"openInNewTab":true,"title":"Cookie Policy","url":"https://www.informationweek.com/cookie-policy"},{"image":{"altText":"Privacy","url":"https://www.informa.com/privacy-policy/"},"openInNewTab":true,"title":"Privacy","url":"https://www.informa.com/privacy-policy/"},{"image":{"altText":"Terms of Use","url":"https://www.informatech.com/terms-and-conditions/"},"openInNewTab":true,"title":"Terms of Use","url":"https://www.informatech.com/terms-and-conditions/"}],"title":". All rights reserved. Informa Tech, a trading division of Informa PLC."}},"isAuthenticated":false},"newRelicJs":"window.NREUM||(NREUM={});NREUM.info = {\"agent\":\"\",\"beacon\":\"bam.eu01.nr-data.net\",\"errorBeacon\":\"bam.eu01.nr-data.net\",\"licenseKey\":\"NRJS-26ae6a3b09493bbcc87\",\"applicationID\":\"514059305\",\"agentToken\":null,\"applicationTime\":136.541129,\"transactionName\":\"MhBSZQoZWEEDU0ZaXgtadUkIClNBEVpBHHYgIR8eUg==\",\"queueTime\":0,\"ttGuid\":\"6e24d5f80215dbde\"}; (window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:[\"bam.eu01.nr-data.net\"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:\"538480682\",accountID:\"3936348\",trustKey:\"3288925\",xpid:\"Vw8EV1VXABAFVVVSAggEVlE=\",licenseKey:\"NRJS-26ae6a3b09493bbcc87\",applicationID:\"514059305\"};;/*! For license information please see nr-loader-spa-1.241.0.min.js.LICENSE.txt */\n(()=\u003e{\"use strict\";var e,t,r={5763:(e,t,r)=\u003e{r.d(t,{P_:()=\u003eh,Mt:()=\u003eg,C5:()=\u003es,DL:()=\u003eb,OP:()=\u003eT,lF:()=\u003eS,Yu:()=\u003eA,Dg:()=\u003ep,CX:()=\u003ec,GE:()=\u003ey,sU:()=\u003eD});var n=r(8632),i=r(9567);const o={beacon:n.ce.beacon,errorBeacon:n.ce.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){if(!e)throw new Error(\"All info objects require an agent identifier!\");if(!a[e])throw new Error(\"Info for \".concat(e,\" was never set\"));return a[e]}function c(e,t){if(!e)throw new Error(\"All info objects require an agent identifier!\");a[e]=(0,i.D)(t,o),(0,n.Qy)(e,a[e],\"info\")}var u=r(7056);const d=()=\u003e{const e={block_selector:\"[data-nr-block]\",mask_input_options:{password:!0}};return{proxy:{assets:void 0,beacon:void 0},privacy:{cookies_enabled:!0},ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},session:{domain:void 0,expiresMs:u.oD,inactiveMs:u.Hb},ssl:void 0,obfuscate:void 0,jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},metrics:{enabled:!0,autoStart:!0},page_action:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,long_task:!1,autoStart:!0},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},harvest:{tooManyRequestsDelay:60},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,sampling_rate:50,error_sampling_rate:50,mask_text_selector:\"*\",mask_all_inputs:!0,get block_class(){return\"nr-block\"},get ignore_class(){return\"nr-ignore\"},get mask_text_class(){return\"nr-mask\"},get block_selector(){return e.block_selector},set block_selector(t){e.block_selector+=\",\".concat(t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){e.mask_input_options={...t,password:!0}}},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0}}},l={},f=\"All configuration objects require an agent identifier!\";function h(e){if(!e)throw new Error(f);if(!l[e])throw new Error(\"Configuration for \".concat(e,\" was never set\"));return l[e]}function p(e,t){if(!e)throw new Error(f);l[e]=(0,i.D)(t,d()),(0,n.Qy)(e,l[e],\"config\")}function g(e,t){if(!e)throw new Error(f);var r=h(e);if(r){for(var n=t.split(\".\"),i=0;i\u003cn.length-1;i++)if(\"object\"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}const m={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},v={};function b(e){if(!e)throw new Error(\"All loader-config objects require an agent identifier!\");if(!v[e])throw new Error(\"LoaderConfig for \".concat(e,\" was never set\"));return v[e]}function y(e,t){if(!e)throw new Error(\"All loader-config objects require an agent identifier!\");v[e]=(0,i.D)(t,m),(0,n.Qy)(e,v[e],\"loader_config\")}const A=(0,n.mF)().o;var w=r(385),x=r(6818);const E={buildEnv:x.Re,customTransaction:void 0,disabled:!1,distMethod:x.gF,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,offset:Math.floor(w._A?.performance?.timeOrigin||w._A?.performance?.timing?.navigationStart||Date.now()),onerror:void 0,origin:\"\"+w._A.location,ptid:void 0,releaseIds:{},session:void 0,xhrWrappable:\"function\"==typeof w._A.XMLHttpRequest?.prototype?.addEventListener,version:x.q4,denyList:void 0},_={};function T(e){if(!e)throw new Error(\"All runtime objects require an agent identifier!\");if(!_[e])throw new Error(\"Runtime for \".concat(e,\" was never set\"));return _[e]}function D(e,t){if(!e)throw new Error(\"All runtime objects require an agent identifier!\");_[e]=(0,i.D)(t,E),(0,n.Qy)(e,_[e],\"runtime\")}function S(e){return function(e){try{const t=s(e);return!!t.licenseKey\u0026\u0026!!t.errorBeacon\u0026\u0026!!t.applicationID}catch(e){return!1}}(e)}},9567:(e,t,r)=\u003e{r.d(t,{D:()=\u003ei});var n=r(50);function i(e,t){try{if(!e||\"object\"!=typeof e)return(0,n.Z)(\"Setting a Configurable requires an object as input\");if(!t||\"object\"!=typeof t)return(0,n.Z)(\"Setting a Configurable requires a model to set its initial properties\");const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{\"object\"==typeof e[a]\u0026\u0026\"object\"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.Z)(\"An error occurred while setting a property of a Configurable\",e)}return r}catch(e){(0,n.Z)(\"An error occured while setting a Configurable\",e)}}},6818:(e,t,r)=\u003e{r.d(t,{Re:()=\u003ei,gF:()=\u003eo,q4:()=\u003en});const n=\"1.241.0\",i=\"PROD\",o=\"CDN\"},385:(e,t,r)=\u003e{r.d(t,{FN:()=\u003es,IF:()=\u003ed,Nk:()=\u003ef,Tt:()=\u003ec,_A:()=\u003eo,cv:()=\u003eh,iS:()=\u003ea,il:()=\u003en,ux:()=\u003eu,v6:()=\u003ei,w1:()=\u003el});const n=\"undefined\"!=typeof window\u0026\u0026!!window.document,i=\"undefined\"!=typeof WorkerGlobalScope\u0026\u0026(\"undefined\"!=typeof self\u0026\u0026self instanceof WorkerGlobalScope\u0026\u0026self.navigator instanceof WorkerNavigator||\"undefined\"!=typeof globalThis\u0026\u0026globalThis instanceof WorkerGlobalScope\u0026\u0026globalThis.navigator instanceof WorkerNavigator),o=n?window:\"undefined\"!=typeof WorkerGlobalScope\u0026\u0026(\"undefined\"!=typeof self\u0026\u0026self instanceof WorkerGlobalScope\u0026\u0026self||\"undefined\"!=typeof globalThis\u0026\u0026globalThis instanceof WorkerGlobalScope\u0026\u0026globalThis),a=Boolean(\"hidden\"===o?.document?.visibilityState),s=\"\"+o?.location,c=/iPad|iPhone|iPod/.test(o.navigator?.userAgent),u=c\u0026\u0026\"undefined\"==typeof SharedWorker,d=(()=\u003e{const e=o.navigator?.userAgent?.match(/Firefox[/\\s](\\d+\\.\\d+)/);return Array.isArray(e)\u0026\u0026e.length\u003e=2?+e[1]:0})(),l=Boolean(n\u0026\u0026window.document.documentMode),f=!!o.navigator?.sendBeacon,h=Math.floor(o?.performance?.timeOrigin||o?.performance?.timing?.navigationStart||Date.now())},1117:(e,t,r)=\u003e{r.d(t,{w:()=\u003eo});var n=r(50);const i={agentIdentifier:\"\",ee:void 0};class o{constructor(e){try{if(\"object\"!=typeof e)return(0,n.Z)(\"shared context requires an object as input\");this.sharedContext={},Object.assign(this.sharedContext,i),Object.entries(e).forEach((e=\u003e{let[t,r]=e;Object.keys(i).includes(t)\u0026\u0026(this.sharedContext[t]=r)}))}catch(e){(0,n.Z)(\"An error occured while setting SharedContext\",e)}}}},8e3:(e,t,r)=\u003e{r.d(t,{L:()=\u003ed,R:()=\u003ec});var n=r(8325),i=r(1284),o=r(4322),a=r(3325);const s={};function c(e,t){const r={staged:!1,priority:a.p[t]||0};u(e),s[e].get(t)||s[e].set(t,r)}function u(e){e\u0026\u0026(s[e]||(s[e]=new Map))}function d(){let e=arguments.length\u003e0\u0026\u0026void 0!==arguments[0]?arguments[0]:\"\",t=arguments.length\u003e1\u0026\u0026void 0!==arguments[1]?arguments[1]:\"feature\";if(u(e),!e||!s[e].get(t))return a(t);s[e].get(t).staged=!0;const r=[...s[e]];function a(t){const r=e?n.ee.get(e):n.ee,a=o.X.handlers;if(r.backlog\u0026\u0026a){var s=r.backlog[t],c=a[t];if(c){for(var u=0;s\u0026\u0026u\u003cs.length;++u)l(s[u],c);(0,i.D)(c,(function(e,t){(0,i.D)(t,(function(t,r){r[0].on(e,r[1])}))}))}delete a[t],r.backlog[t]=null,r.emit(\"drain-\"+t,[])}}r.every((e=\u003e{let[t,r]=e;return r.staged}))\u0026\u0026(r.sort(((e,t)=\u003ee[1].priority-t[1].priority)),r.forEach((t=\u003e{let[r]=t;s[e].delete(r),a(r)})))}function l(e,t){var r=e[1];(0,i.D)(t[r],(function(t,r){var n=e[0];if(r[0]===n){var i=r[1],o=e[3],a=e[2];i.apply(o,a)}}))}},8325:(e,t,r)=\u003e{r.d(t,{A:()=\u003ec,ee:()=\u003eu});var n=r(8632),i=r(2210),o=r(5763);class a{constructor(e){this.contextId=e}}var s=r(3117);const c=\"nr@context:\".concat(s.a),u=function e(t,r){var n={},s={},d={},f=!1;try{f=16===r.length\u0026\u0026(0,o.OP)(r).isolatedBacklog}catch(e){}var h={on:g,addEventListener:g,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i\u003cr.length;i++)r[i]===t\u0026\u0026r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o\u0026\u0026(o=!0);if(u.aborted\u0026\u0026!i)return;t\u0026\u0026o\u0026\u0026t.emit(e,r,n);for(var a=p(n),c=m(e),d=c.length,l=0;l\u003cd;l++)c[l].apply(a,r);var f=b()[s[e]];f\u0026\u0026f.push([h,e,r,a]);return a},get:v,listeners:m,context:p,buffer:function(e,t){const r=b();if(t=t||\"feature\",h.aborted)return;Object.entries(e||{}).forEach((e=\u003e{let[n,i]=e;s[i]=t,t in r||(r[t]=[])}))},abort:l,aborted:!1,isBuffering:function(e){return!!b()[s[e]]},debugId:r,backlog:f?{}:t\u0026\u0026\"object\"==typeof t.backlog?t.backlog:{}};return h;function p(e){return e\u0026\u0026e instanceof a?e:e?(0,i.X)(e,c,(()=\u003enew a(c))):new a(c)}function g(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function v(t){return d[t]=d[t]||e(h,t)}function b(){return h.backlog}}(void 0,\"globalEE\"),d=(0,n.fP)();function l(){u.aborted=!0,u.backlog={}}d.ee||(d.ee=u)},5546:(e,t,r)=\u003e{r.d(t,{E:()=\u003en,p:()=\u003ei});var n=r(8325).ee.get(\"handle\");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},4322:(e,t,r)=\u003e{r.d(t,{X:()=\u003eo});var n=r(5546);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.E,i,e,t,r)}function a(e,t,r,i,o){o||(o=\"feature\"),e||(e=n.E);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3239:(e,t,r)=\u003e{r.d(t,{bP:()=\u003es,iz:()=\u003ec,m$:()=\u003ea});var n=r(385);let i=!1,o=!1;try{const e={get passive(){return i=!0,!1},get signal(){return o=!0,!1}};n._A.addEventListener(\"test\",null,e),n._A.removeEventListener(\"test\",null,e)}catch(e){}function a(e,t){return i||o?{capture:!!e,passive:i,signal:t}:!!e}function s(e,t){let r=arguments.length\u003e2\u0026\u0026void 0!==arguments[2]\u0026\u0026arguments[2],n=arguments.length\u003e3?arguments[3]:void 0;window.addEventListener(e,t,a(r,n))}function c(e,t){let r=arguments.length\u003e2\u0026\u0026void 0!==arguments[2]\u0026\u0026arguments[2],n=arguments.length\u003e3?arguments[3]:void 0;document.addEventListener(e,t,a(r,n))}},3117:(e,t,r)=\u003e{r.d(t,{a:()=\u003en});const n=(0,r(4402).Rl)()},4402:(e,t,r)=\u003e{r.d(t,{Ht:()=\u003eu,M:()=\u003ec,Rl:()=\u003ea,ky:()=\u003es});var n=r(385);const i=\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";function o(e,t){return e?15\u0026e[t]:16*Math.random()|0}function a(){const e=n._A?.crypto||n._A?.msCrypto;let t,r=0;return e\u0026\u0026e.getRandomValues\u0026\u0026(t=e.getRandomValues(new Uint8Array(31))),i.split(\"\").map((e=\u003e\"x\"===e?o(t,++r).toString(16):\"y\"===e?(3\u0026o()|8).toString(16):e)).join(\"\")}function s(e){const t=n._A?.crypto||n._A?.msCrypto;let r,i=0;t\u0026\u0026t.getRandomValues\u0026\u0026(r=t.getRandomValues(new Uint8Array(31)));const a=[];for(var s=0;s\u003ce;s++)a.push(o(r,++i).toString(16));return a.join(\"\")}function c(){return s(16)}function u(){return s(32)}},7056:(e,t,r)=\u003e{r.d(t,{Bq:()=\u003en,Hb:()=\u003eo,oD:()=\u003ei});const n=\"NRBA\",i=144e5,o=18e5},7894:(e,t,r)=\u003e{function n(){return Math.round(performance.now())}r.d(t,{z:()=\u003en})},7243:(e,t,r)=\u003e{r.d(t,{e:()=\u003eo});var n=r(385),i={};function o(e){if(e in i)return i[e];if(0===(e||\"\").indexOf(\"data:\"))return{protocol:\"data\"};let t;var r=n._A?.location,o={};if(n.il)t=document.createElement(\"a\"),t.href=e;else try{t=new URL(e,r.href)}catch(e){return o}o.port=t.port;var a=t.href.split(\"://\");!o.port\u0026\u0026a[1]\u0026\u0026(o.port=a[1].split(\"/\")[0].split(\"@\").pop().split(\":\")[1]),o.port\u0026\u0026\"0\"!==o.port||(o.port=\"https\"===a[0]?\"443\":\"80\"),o.hostname=t.hostname||r.hostname,o.pathname=t.pathname,o.protocol=a[0],\"/\"!==o.pathname.charAt(0)\u0026\u0026(o.pathname=\"/\"+o.pathname);var s=!t.protocol||\":\"===t.protocol||t.protocol===r.protocol,c=t.hostname===r.hostname\u0026\u0026t.port===r.port;return o.sameOrigin=s\u0026\u0026(!t.hostname||c),\"/\"===o.pathname\u0026\u0026(i[e]=o),o}},50:(e,t,r)=\u003e{function n(e,t){\"function\"==typeof console.warn\u0026\u0026(console.warn(\"New Relic: \".concat(e)),t\u0026\u0026console.warn(t))}r.d(t,{Z:()=\u003en})},2587:(e,t,r)=\u003e{r.d(t,{N:()=\u003ec,T:()=\u003eu});var n=r(8325),i=r(5546),o=r(3325);const a={stn:[o.D.sessionTrace],err:[o.D.jserrors,o.D.metrics],ins:[o.D.pageAction],spa:[o.D.spa],sr:[o.D.sessionReplay,o.D.sessionTrace]},s=new Set;function c(e,t){const r=n.ee.get(t);e\u0026\u0026\"object\"==typeof e\u0026\u0026(s.has(t)||Object.entries(e).forEach((e=\u003e{let[t,n]=e;a[t]?a[t].forEach((e=\u003e{n?(0,i.p)(\"feat-\"+t,[],void 0,e,r):(0,i.p)(\"block-\"+t,[],void 0,e,r),(0,i.p)(\"rumresp-\"+t,[Boolean(n)],void 0,e,r)})):n\u0026\u0026(0,i.p)(\"feat-\"+t,[],void 0,void 0,r),u[t]=Boolean(n)})),Object.keys(a).forEach((e=\u003e{void 0===u[e]\u0026\u0026(a[e]?.forEach((t=\u003e(0,i.p)(\"rumresp-\"+e,[!1],void 0,t,r))),u[e]=!1)})),s.add(t))}const u={}},2210:(e,t,r)=\u003e{r.d(t,{X:()=\u003ei});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty\u0026\u0026Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},1284:(e,t,r)=\u003e{r.d(t,{D:()=\u003en});const n=(e,t)=\u003eObject.entries(e||{}).map((e=\u003e{let[r,n]=e;return t(r,n)}))},4351:(e,t,r)=\u003e{r.d(t,{P:()=\u003eo});var n=r(8325);const i=()=\u003e{const e=new WeakSet;return(t,r)=\u003e{if(\"object\"==typeof r\u0026\u0026null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())}catch(e){try{n.ee.emit(\"internal-error\",[e])}catch(e){}}}},3960:(e,t,r)=\u003e{r.d(t,{K:()=\u003ea,b:()=\u003eo});var n=r(3239);function i(){return\"undefined\"==typeof document||\"complete\"===document.readyState}function o(e,t){if(i())return e();(0,n.bP)(\"load\",e,t)}function a(e){if(i())return e();(0,n.iz)(\"DOMContentLoaded\",e)}},8632:(e,t,r)=\u003e{r.d(t,{EZ:()=\u003eu,Qy:()=\u003ec,ce:()=\u003eo,fP:()=\u003ea,gG:()=\u003ed,mF:()=\u003es});var n=r(7894),i=r(385);const o={beacon:\"bam.nr-data.net\",errorBeacon:\"bam.nr-data.net\"};function a(){return i._A.NREUM||(i._A.NREUM={}),void 0===i._A.newrelic\u0026\u0026(i._A.newrelic=i._A.NREUM),i._A.NREUM}function s(){let e=a();return e.o||(e.o={ST:i._A.setTimeout,SI:i._A.setImmediate,CT:i._A.clearTimeout,XHR:i._A.XMLHttpRequest,REQ:i._A.Request,EV:i._A.Event,PR:i._A.Promise,MO:i._A.MutationObserver,FETCH:i._A.fetch}),e}function c(e,t,r){let i=a();const o=i.initializedAgents||{},s=o[e]||{};return Object.keys(s).length||(s.initializedAt={ms:(0,n.z)(),date:new Date}),i.initializedAgents={...o,[e]:{...s,[r]:t}},i}function u(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},7956:(e,t,r)=\u003e{r.d(t,{N:()=\u003ei});var n=r(3239);function i(e){let t=arguments.length\u003e1\u0026\u0026void 0!==arguments[1]\u0026\u0026arguments[1],r=arguments.length\u003e2?arguments[2]:void 0,i=arguments.length\u003e3?arguments[3]:void 0;(0,n.iz)(\"visibilitychange\",(function(){if(t)return void(\"hidden\"===document.visibilityState\u0026\u0026e());e(document.visibilityState)}),r,i)}},1214:(e,t,r)=\u003e{r.d(t,{em:()=\u003eb,u5:()=\u003eS,QU:()=\u003eC,_L:()=\u003eI,Gm:()=\u003eH,Lg:()=\u003eL,BV:()=\u003eG,Kf:()=\u003eK});var n=r(8325),i=r(3117);const o=\"nr@original:\".concat(i.a);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n=\"\");const a=\"-\"===n.charAt(0);for(let s=0;s\u003ct.length;s++){const c=t[s],u=e[c];d(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return d(t)?t:(r||(r=\"\"),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty\u0026\u0026Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)\u0026\u0026(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,d,l;try{a=this,o=[...arguments],d=\"function\"==typeof n?n(o,a):n||{}}catch(t){u([t,\"\",[o,a,s],d],e)}i(r+\"start\",[o,a,s],d,c);try{return l=t.apply(a,o)}catch(e){throw i(r+\"err\",[o,a,e],d,c),e}finally{i(r+\"end\",[o,a,l],d,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit(\"internal-error\",e)}catch(e){}}function d(e){return!(e\u0026\u0026e instanceof Function\u0026\u0026e.apply\u0026\u0026!e[o])}var l=r(2210),f=r(385);const h={},p=f._A.XMLHttpRequest,g=\"addEventListener\",m=\"removeEventListener\",v=\"nr@wrapped:\".concat(n.A);function b(e){var t=function(e){return(e||n.ee).get(\"events\")}(e);if(h[t.debugId]++)return t;h[t.debugId]=1;var r=c(t,!0);function i(e){r.inPlace(e,[g,m],\"-\",o)}function o(e,t){return e[1]}return\"getPrototypeOf\"in Object\u0026\u0026(f.il\u0026\u0026y(document,i),y(f._A,i),y(p.prototype,i)),t.on(g+\"-start\",(function(e,t){var n=e[1];if(null!==n\u0026\u0026(\"function\"==typeof n||\"object\"==typeof n)){var i=(0,l.X)(n,v,(function(){var e={object:function(){if(\"function\"!=typeof n.handleEvent)return;return n.handleEvent.apply(n,arguments)},function:n}[typeof n];return e?r(e,\"fn-\",null,e.name||\"anonymous\"):n}));this.wrapped=e[1]=i}})),t.on(m+\"-start\",(function(e){e[1]=this.wrapped||e[1]})),t}function y(e,t){let r=e;for(;\"object\"==typeof r\u0026\u0026!Object.prototype.hasOwnProperty.call(r,g);)r=Object.getPrototypeOf(r);for(var n=arguments.length,i=new Array(n\u003e2?n-2:0),o=2;o\u003cn;o++)i[o-2]=arguments[o];r\u0026\u0026t(r,...i)}var A=\"fetch-\",w=A+\"body-\",x=[\"arrayBuffer\",\"blob\",\"json\",\"text\",\"formData\"],E=f._A.Request,_=f._A.Response,T=\"prototype\";const D={};function S(e){const t=function(e){return(e||n.ee).get(\"fetch\")}(e);if(!(E\u0026\u0026_\u0026\u0026f._A.fetch))return t;if(D[t.debugId]++)return t;function r(e,r,i){var o=e[r];\"function\"==typeof o\u0026\u0026(e[r]=function(){var e,r=[...arguments],a={};t.emit(i+\"before-start\",[r],a),a[n.A]\u0026\u0026a[n.A].dt\u0026\u0026(e=a[n.A].dt);var s=o.apply(this,r);return t.emit(i+\"start\",[r,e],s),s.then((function(e){return t.emit(i+\"end\",[null,e],s),e}),(function(e){throw t.emit(i+\"end\",[e],s),e}))})}return D[t.debugId]=1,x.forEach((e=\u003e{r(E[T],e,w),r(_[T],e,w)})),r(f._A,\"fetch\",A),t.on(A+\"end\",(function(e,r){var n=this;if(r){var i=r.headers.get(\"content-length\");null!==i\u0026\u0026(n.rxSize=i),t.emit(A+\"done\",[null,r],n)}else t.emit(A+\"done\",[e],n)})),t}const j={},N=[\"pushState\",\"replaceState\"];function C(e){const t=function(e){return(e||n.ee).get(\"history\")}(e);return!f.il||j[t.debugId]++||(j[t.debugId]=1,c(t).inPlace(window.history,N,\"-\")),t}var O=r(3239);const P={},R=[\"appendChild\",\"insertBefore\",\"replaceChild\"];function I(e){const t=function(e){return(e||n.ee).get(\"jsonp\")}(e);if(!f.il||P[t.debugId])return t;P[t.debugId]=!0;var r=c(t),i=/[?\u0026](?:callback|cb)=([^\u0026#]+)/,o=/(.*)\\.([^.]+)/,a=/^(\\w+)(\\.|$)(.*)$/;function s(e,t){if(!e)return t;const r=e.match(a),n=r[1];return s(r[3],t[n])}return r.inPlace(Node.prototype,R,\"dom-\"),t.on(\"dom-start\",(function(e){!function(e){if(!e||\"string\"!=typeof e.nodeName||\"script\"!==e.nodeName.toLowerCase())return;if(\"function\"!=typeof e.addEventListener)return;var n=(a=e.src,c=a.match(i),c?c[1]:null);var a,c;if(!n)return;var u=function(e){var t=e.match(o);if(t\u0026\u0026t.length\u003e=3)return{key:t[2],parent:s(t[1],window)};return{key:e,parent:window}}(n);if(\"function\"!=typeof u.parent[u.key])return;var d={};function l(){t.emit(\"jsonp-end\",[],d),e.removeEventListener(\"load\",l,(0,O.m$)(!1)),e.removeEventListener(\"error\",f,(0,O.m$)(!1))}function f(){t.emit(\"jsonp-error\",[],d),t.emit(\"jsonp-end\",[],d),e.removeEventListener(\"load\",l,(0,O.m$)(!1)),e.removeEventListener(\"error\",f,(0,O.m$)(!1))}r.inPlace(u.parent,[u.key],\"cb-\",d),e.addEventListener(\"load\",l,(0,O.m$)(!1)),e.addEventListener(\"error\",f,(0,O.m$)(!1)),t.emit(\"new-jsonp\",[e.src],d)}(e[0])})),t}const k={};function H(e){const t=function(e){return(e||n.ee).get(\"mutation\")}(e);if(!f.il||k[t.debugId])return t;k[t.debugId]=!0;var r=c(t),i=f._A.MutationObserver;return i\u0026\u0026(window.MutationObserver=function(e){return this instanceof i?new i(r(e,\"fn-\")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype),t}const z={};function L(e){const t=function(e){return(e||n.ee).get(\"promise\")}(e);if(z[t.debugId])return t;z[t.debugId]=!0;var r=t.context,i=c(t),a=f._A.Promise;return a\u0026\u0026function(){function e(r){var n=t.context(),o=i(r,\"executor-\",n,null,!1);const s=Reflect.construct(a,[o],e);return t.context(s).getCtx=function(){return n},s}f._A.Promise=e,Object.defineProperty(e,\"name\",{value:\"Promise\"}),e.toString=function(){return a.toString()},Object.setPrototypeOf(e,a),[\"all\",\"race\"].forEach((function(r){const n=a[r];e[r]=function(e){let i=!1;[...e||[]].forEach((e=\u003e{this.resolve(e).then(a(\"all\"===r),a(!1))}));const o=n.apply(this,arguments);return o;function a(e){return function(){t.emit(\"propagate\",[null,!i],o,!1,!1),i=i||!e}}}})),[\"resolve\",\"reject\"].forEach((function(r){const n=a[r];e[r]=function(e){const r=n.apply(this,arguments);return e!==r\u0026\u0026t.emit(\"propagate\",[e,!0],r,!1,!1),r}})),e.prototype=a.prototype;const n=a.prototype.then;a.prototype.then=function(){var e=this,o=r(e);o.promise=e;for(var a=arguments.length,s=new Array(a),c=0;c\u003ca;c++)s[c]=arguments[c];s[0]=i(s[0],\"cb-\",o,null,!1),s[1]=i(s[1],\"cb-\",o,null,!1);const u=n.apply(this,s);return o.nextPromise=u,t.emit(\"propagate\",[e,!0],u,!1,!1),u},a.prototype.then[o]=n,t.on(\"executor-start\",(function(e){e[0]=i(e[0],\"resolve-\",this,null,!1),e[1]=i(e[1],\"resolve-\",this,null,!1)})),t.on(\"executor-err\",(function(e,t,r){e[1](r)})),t.on(\"cb-end\",(function(e,r,n){t.emit(\"propagate\",[n,!0],this.nextPromise,!1,!1)})),t.on(\"propagate\",(function(e,r,n){this.getCtx\u0026\u0026!r||(this.getCtx=function(){if(e instanceof Promise)var r=t.context(e);return r\u0026\u0026r.getCtx?r.getCtx():this})}))}(),t}const M={},B=\"setTimeout\",F=\"setInterval\",U=\"clearTimeout\",Z=\"-start\",V=\"-\",q=[B,\"setImmediate\",F,U,\"clearImmediate\"];function G(e){const t=function(e){return(e||n.ee).get(\"timer\")}(e);if(M[t.debugId]++)return t;M[t.debugId]=1;var r=c(t);return r.inPlace(f._A,q.slice(0,2),B+V),r.inPlace(f._A,q.slice(2,3),F+V),r.inPlace(f._A,q.slice(3),U+V),t.on(F+Z,(function(e,t,n){e[0]=r(e[0],\"fn-\",null,n)})),t.on(B+Z,(function(e,t,n){this.method=n,this.timerDuration=isNaN(e[1])?0:+e[1],e[0]=r(e[0],\"fn-\",this,n)})),t}var W=r(50);const X={},Q=[\"open\",\"send\"];function K(e){var t=e||n.ee;const r=function(e){return(e||n.ee).get(\"xhr\")}(t);if(X[r.debugId]++)return r;X[r.debugId]=1,b(t);var i=c(r),o=f._A.XMLHttpRequest,a=f._A.MutationObserver,s=f._A.Promise,u=f._A.setInterval,d=\"readystatechange\",l=[\"onload\",\"onerror\",\"onabort\",\"onloadstart\",\"onloadend\",\"onprogress\",\"ontimeout\"],h=[],p=f._A.XMLHttpRequest=function(e){const t=new o(e),n=r.context(t);try{r.emit(\"new-xhr\",[t],n),t.addEventListener(d,(a=n,function(){var e=this;e.readyState\u003e3\u0026\u0026!a.resolved\u0026\u0026(a.resolved=!0,r.emit(\"xhr-resolved\",[],e)),i.inPlace(e,l,\"fn-\",w)}),(0,O.m$)(!1))}catch(e){(0,W.Z)(\"An error occurred while intercepting XHR\",e);try{r.emit(\"internal-error\",[e])}catch(e){}}var a;return t};function g(e,t){i.inPlace(t,[\"onreadystatechange\"],\"fn-\",w)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,p),p.prototype=o.prototype,i.inPlace(p.prototype,Q,\"-xhr-\",w),r.on(\"send-xhr-start\",(function(e,t){g(e,t),function(e){h.push(e),a\u0026\u0026(m?m.then(A):u?u(A):(v=-v,y.data=v))}(t)})),r.on(\"open-xhr-start\",g),a){var m=s\u0026\u0026s.resolve();if(!u\u0026\u0026!s){var v=1,y=document.createTextNode(v);new a(A).observe(y,{characterData:!0})}}else t.on(\"fn-end\",(function(e){e[0]\u0026\u0026e[0].type===d||A()}));function A(){for(var e=0;e\u003ch.length;e++)g(0,h[e]);h.length\u0026\u0026(h=[])}function w(e,t){return t}return r}},7825:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.ajax},6660:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.jserrors},3081:(e,t,r)=\u003e{r.d(t,{gF:()=\u003eo,mY:()=\u003ei,t9:()=\u003en,vz:()=\u003es,xS:()=\u003ea});const n=r(3325).D.metrics,i=\"sm\",o=\"cm\",a=\"storeSupportabilityMetrics\",s=\"storeEventMetrics\"},4649:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.pageAction},7633:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.pageViewEvent},9251:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.pageViewTiming},7144:(e,t,r)=\u003e{r.d(t,{t:()=\u003en});const n=r(3325).D.sessionReplay},3614:(e,t,r)=\u003e{r.d(t,{BST_RESOURCE:()=\u003ei,END:()=\u003es,FEATURE_NAME:()=\u003en,FN_END:()=\u003eu,FN_START:()=\u003ec,PUSH_STATE:()=\u003ed,RESOURCE:()=\u003eo,START:()=\u003ea});const n=r(3325).D.sessionTrace,i=\"bstResource\",o=\"resource\",a=\"-start\",s=\"-end\",c=\"fn\"+a,u=\"fn\"+s,d=\"pushState\"},7836:(e,t,r)=\u003e{r.d(t,{BODY:()=\u003ex,CB_END:()=\u003eE,CB_START:()=\u003eu,END:()=\u003ew,FEATURE_NAME:()=\u003ei,FETCH:()=\u003eT,FETCH_BODY:()=\u003ev,FETCH_DONE:()=\u003em,FETCH_START:()=\u003eg,FN_END:()=\u003ec,FN_START:()=\u003es,INTERACTION:()=\u003ef,INTERACTION_API:()=\u003ed,INTERACTION_EVENTS:()=\u003eo,JSONP_END:()=\u003eb,JSONP_NODE:()=\u003ep,JS_TIME:()=\u003e_,MAX_TIMER_BUDGET:()=\u003ea,REMAINING:()=\u003el,SPA_NODE:()=\u003eh,START:()=\u003eA,originalSetTimeout:()=\u003ey});var n=r(5763);const i=r(3325).D.spa,o=[\"click\",\"submit\",\"keypress\",\"keydown\",\"keyup\",\"change\"],a=999,s=\"fn-start\",c=\"fn-end\",u=\"cb-start\",d=\"api-ixn-\",l=\"remaining\",f=\"interaction\",h=\"spaNode\",p=\"jsonpNode\",g=\"fetch-start\",m=\"fetch-done\",v=\"fetch-body-\",b=\"jsonp-end\",y=n.Yu.ST,A=\"-start\",w=\"-end\",x=\"-body\",E=\"cb\"+w,_=\"jsTime\",T=\"fetch\"},5938:(e,t,r)=\u003e{r.d(t,{W:()=\u003eo});var n=r(5763),i=r(8325);class o{constructor(e,t,r){this.agentIdentifier=e,this.aggregator=t,this.ee=i.ee.get(e,(0,n.OP)(this.agentIdentifier).isolatedBacklog),this.featureName=r,this.blocked=!1}}},7530:(e,t,r)=\u003e{r.d(t,{j:()=\u003eb});var n=r(3325),i=r(5763),o=r(5546),a=r(8325),s=r(7894),c=r(8e3),u=r(3960),d=r(385),l=r(50),f=r(3081),h=r(8632);function p(){const e=(0,h.gG)();[\"setErrorHandler\",\"finished\",\"addToTrace\",\"inlineHit\",\"addRelease\",\"addPageAction\",\"setCurrentRouteName\",\"setPageViewName\",\"setCustomAttribute\",\"interaction\",\"noticeError\",\"setUserId\",\"setApplicationVersion\",\"start\"].forEach((t=\u003e{e[t]=function(){for(var r=arguments.length,n=new Array(r),i=0;i\u003cr;i++)n[i]=arguments[i];return function(t){for(var r=arguments.length,n=new Array(r\u003e1?r-1:0),i=1;i\u003cr;i++)n[i-1]=arguments[i];let o=[];return Object.values(e.initializedAgents).forEach((e=\u003e{e.exposed\u0026\u0026e.api[t]\u0026\u0026o.push(e.api[t](...n))})),o.length\u003e1?o:o[0]}(t,...n)}}))}var g=r(2587);const m=e=\u003e{r.p=e};let v=!1;function b(e){let t=arguments.length\u003e1\u0026\u0026void 0!==arguments[1]?arguments[1]:{},b=arguments.length\u003e2?arguments[2]:void 0,y=arguments.length\u003e3?arguments[3]:void 0,{init:A,info:w,loader_config:x,runtime:E={loaderType:b},exposed:_=!0}=t;const T=(0,h.gG)();w||(A=T.init,w=T.info,x=T.loader_config),(0,i.Dg)(e,A||{}),(0,i.GE)(e,x||{}),w.jsAttributes??={},d.v6\u0026\u0026(w.jsAttributes.isWorker=!0),(0,i.CX)(e,w);const D=(0,i.P_)(e),S=[w.beacon,w.errorBeacon];v||(v=!0,D.proxy.assets\u0026\u0026(m(D.proxy.assets+\"/\"),S.push(D.proxy.assets)),D.proxy.beacon\u0026\u0026S.push(D.proxy.beacon)),E.denyList=[...D.ajax.deny_list||[],...D.ajax.block_internal?S:[]],(0,i.sU)(e,E),p();const j=function(e,t){t||(0,c.R)(e,\"api\");const h={};var p=a.ee.get(e),g=p.get(\"tracer\"),m=\"api-\",v=m+\"ixn-\";function b(t,r,n,o){const a=(0,i.C5)(e);return null===r?delete a.jsAttributes[t]:(0,i.CX)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),w(m,n,!0,o||null===r?\"session\":void 0)(t,r)}function y(){}[\"setErrorHandler\",\"finished\",\"addToTrace\",\"inlineHit\",\"addRelease\"].forEach((e=\u003e{h[e]=w(m,e,!0,\"api\")})),h.addPageAction=w(m,\"addPageAction\",!0,n.D.pageAction),h.setCurrentRouteName=w(m,\"routeName\",!0,n.D.spa),h.setPageViewName=function(t,r){if(\"string\"==typeof t)return\"/\"!==t.charAt(0)\u0026\u0026(t=\"/\"+t),(0,i.OP)(e).customTransaction=(r||\"http://custom.transaction\")+t,w(m,\"setPageViewName\",!0)()},h.setCustomAttribute=function(e,t){let r=arguments.length\u003e2\u0026\u0026void 0!==arguments[2]\u0026\u0026arguments[2];if(\"string\"==typeof e){if([\"string\",\"number\"].includes(typeof t)||null===t)return b(e,t,\"setCustomAttribute\",r);(0,l.Z)(\"Failed to execute setCustomAttribute.\\nNon-null value must be a string or number type, but a type of \u003c\".concat(typeof t,\"\u003e was provided.\"))}else(0,l.Z)(\"Failed to execute setCustomAttribute.\\nName must be a string type, but a type of \u003c\".concat(typeof e,\"\u003e was provided.\"))},h.setUserId=function(e){if(\"string\"==typeof e||null===e)return b(\"enduser.id\",e,\"setUserId\",!0);(0,l.Z)(\"Failed to execute setUserId.\\nNon-null value must be a string type, but a type of \u003c\".concat(typeof e,\"\u003e was provided.\"))},h.setApplicationVersion=function(e){if(\"string\"==typeof e||null===e)return b(\"application.version\",e,\"setApplicationVersion\",!1);(0,l.Z)(\"Failed to execute setApplicationVersion. Expected \u003cString | null\u003e, but got \u003c\".concat(typeof e,\"\u003e.\"))},h.start=e=\u003e{try{const t=e?\"defined\":\"undefined\";(0,o.p)(f.xS,[\"API/start/\".concat(t,\"/called\")],void 0,n.D.metrics,p);const r=Object.values(n.D);if(void 0===e)e=r;else{if((e=Array.isArray(e)\u0026\u0026e.length?e:[e]).some((e=\u003e!r.includes(e))))return(0,l.Z)(\"Invalid feature name supplied. Acceptable feature names are: \".concat(r));e.includes(n.D.pageViewEvent)||e.push(n.D.pageViewEvent)}e.forEach((e=\u003e{p.emit(\"\".concat(e,\"-opt-in\"))}))}catch(e){(0,l.Z)(\"An unexpected issue occurred\",e)}},h.interaction=function(){return(new y).get()};var A=y.prototype={createTracer:function(e,t){var r={},i=this,a=\"function\"==typeof t;return(0,o.p)(v+\"tracer\",[(0,s.z)(),e,r],i,n.D.spa,p),function(){if(g.emit((a?\"\":\"no-\")+\"fn-start\",[(0,s.z)(),i,a],r),a)try{return t.apply(this,arguments)}catch(e){throw g.emit(\"fn-err\",[arguments,this,e],r),e}finally{g.emit(\"fn-end\",[(0,s.z)()],r)}}}};function w(e,t,r,i){return function(){return(0,o.p)(f.xS,[\"API/\"+t+\"/called\"],void 0,n.D.metrics,p),i\u0026\u0026(0,o.p)(e+t,[(0,s.z)(),...arguments],r?null:this,i,p),r?void 0:this}}function x(){r.e(111).then(r.bind(r,7438)).then((t=\u003e{let{setAPI:r}=t;r(e),(0,c.L)(e,\"api\")})).catch((()=\u003e(0,l.Z)(\"Downloading runtime APIs failed...\")))}return[\"actionText\",\"setName\",\"setAttribute\",\"save\",\"ignore\",\"onEnd\",\"getContext\",\"end\",\"get\"].forEach((e=\u003e{A[e]=w(v,e,void 0,n.D.spa)})),h.noticeError=function(e,t){\"string\"==typeof e\u0026\u0026(e=new Error(e)),(0,o.p)(f.xS,[\"API/noticeError/called\"],void 0,n.D.metrics,p),(0,o.p)(\"err\",[e,(0,s.z)(),!1,t],void 0,n.D.jserrors,p)},d.il?(0,u.b)((()=\u003ex()),!0):x(),h}(e,y);return(0,h.Qy)(e,j,\"api\"),(0,h.Qy)(e,_,\"exposed\"),(0,h.EZ)(\"activatedFeatures\",g.T),j}},3325:(e,t,r)=\u003e{r.d(t,{D:()=\u003en,p:()=\u003ei});const n={ajax:\"ajax\",jserrors:\"jserrors\",metrics:\"metrics\",pageAction:\"page_action\",pageViewEvent:\"page_view_event\",pageViewTiming:\"page_view_timing\",sessionReplay:\"session_replay\",sessionTrace:\"session_trace\",spa:\"spa\"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.ajax]:5,[n.sessionTrace]:6,[n.pageAction]:7,[n.spa]:8,[n.sessionReplay]:9}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=\u003e{for(var r in t)i.o(t,r)\u0026\u0026!i.o(e,r)\u0026\u0026Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=\u003ePromise.all(Object.keys(i.f).reduce(((t,r)=\u003e(i.f[r](e,t),t)),[])),i.u=e=\u003e({111:\"nr-spa\",164:\"nr-spa-compressor\",433:\"nr-spa-recorder\"}[e]+\"-1.241.0.min.js\"),i.o=(e,t)=\u003eObject.prototype.hasOwnProperty.call(e,t),e={},t=\"NRBA-1.241.0.PROD:\",i.l=(r,n,o,a)=\u003e{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName(\"script\"),d=0;d\u003cu.length;d++){var l=u[d];if(l.getAttribute(\"src\")==r||l.getAttribute(\"data-webpack\")==t+o){s=l;break}}s||(c=!0,(s=document.createElement(\"script\")).charset=\"utf-8\",s.timeout=120,i.nc\u0026\u0026s.setAttribute(\"nonce\",i.nc),s.setAttribute(\"data-webpack\",t+o),s.src=r),e[r]=[n];var f=(t,n)=\u003e{s.onerror=s.onload=null,clearTimeout(h);var i=e[r];if(delete e[r],s.parentNode\u0026\u0026s.parentNode.removeChild(s),i\u0026\u0026i.forEach((e=\u003ee(n))),t)return t(n)},h=setTimeout(f.bind(null,void 0,{type:\"timeout\",target:s}),12e4);s.onerror=f.bind(null,s.onerror),s.onload=f.bind(null,s.onload),c\u0026\u0026document.head.appendChild(s)}},i.r=e=\u003e{\"undefined\"!=typeof Symbol\u0026\u0026Symbol.toStringTag\u0026\u0026Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},i.p=\"https://js-agent.newrelic.com/\",(()=\u003e{var e={801:0,92:0};i.f.j=(t,r)=\u003e{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=\u003en=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=\u003e{if(i.o(e,t)\u0026\u0026(0!==(n=e[t])\u0026\u0026(e[t]=void 0),n)){var o=r\u0026\u0026(\"load\"===r.type?\"missing\":r.type),a=r\u0026\u0026r.target\u0026\u0026r.target.src;s.message=\"Loading chunk \"+t+\" failed.\\n(\"+o+\": \"+a+\")\",s.name=\"ChunkLoadError\",s.type=o,s.request=a,n[1](s)}}),\"chunk-\"+t,t)}};var t=(t,r)=\u003e{var n,o,[a,s,c]=r,u=0;if(a.some((t=\u003e0!==e[t]))){for(n in s)i.o(s,n)\u0026\u0026(i.m[n]=s[n]);if(c)c(i)}for(t\u0026\u0026t(r);u\u003ca.length;u++)o=a[u],i.o(e,o)\u0026\u0026e[o]\u0026\u0026e[o][0](),e[o]=0},r=self[\"webpackChunk:NRBA-1.241.0.PROD\"]=self[\"webpackChunk:NRBA-1.241.0.PROD\"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=\u003e{var e=i(50);class t{addPageAction(t,r){(0,e.Z)(\"Call to agent api addPageAction failed. The session trace feature is not currently initialized.\")}setPageViewName(t,r){(0,e.Z)(\"Call to agent api setPageViewName failed. The page view feature is not currently initialized.\")}setCustomAttribute(t,r,n){(0,e.Z)(\"Call to agent api setCustomAttribute failed. The js errors feature is not currently initialized.\")}noticeError(t,r){(0,e.Z)(\"Call to agent api noticeError failed. The js errors feature is not currently initialized.\")}setUserId(t){(0,e.Z)(\"Call to agent api setUserId failed. The js errors feature is not currently initialized.\")}setApplicationVersion(t){(0,e.Z)(\"Call to agent api setApplicationVersion failed. The agent is not currently initialized.\")}setErrorHandler(t){(0,e.Z)(\"Call to agent api setErrorHandler failed. The js errors feature is not currently initialized.\")}finished(t){(0,e.Z)(\"Call to agent api finished failed. The page action feature is not currently initialized.\")}addRelease(t,r){(0,e.Z)(\"Call to agent api addRelease failed. The agent is not currently initialized.\")}start(t){(0,e.Z)(\"Call to agent api addRelease failed. The agent is not currently initialized.\")}}var r=i(3325),n=i(5763);const o=Object.values(r.D);function a(e){const t={};return o.forEach((r=\u003e{t[r]=function(e,t){return!1!==(0,n.Mt)(t,\"\".concat(e,\".enabled\"))}(r,e)})),t}var s=i(7530);var c=i(8e3),u=i(5938),d=i(3960),l=i(385);class f extends u.W{constructor(e,t,r){let i=!(arguments.length\u003e3\u0026\u0026void 0!==arguments[3])||arguments[3];super(e,t,r),this.auto=i,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===(0,n.Mt)(this.agentIdentifier,\"\".concat(this.featureName,\".autoStart\"))\u0026\u0026(this.auto=!1),this.auto\u0026\u0026(0,c.R)(e,r)}importAggregator(){let t=arguments.length\u003e0\u0026\u0026void 0!==arguments[0]?arguments[0]:{};if(this.featAggregate)return;if(!this.auto)return void this.ee.on(\"\".concat(this.featureName,\"-opt-in\"),(()=\u003e{(0,c.R)(this.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator()}));const r=l.il\u0026\u0026!0===(0,n.Mt)(this.agentIdentifier,\"privacy.cookies_enabled\");let o;this.onAggregateImported=new Promise((e=\u003e{o=e}));const a=async()=\u003e{let n;try{if(r){const{setupAgentSession:e}=await i.e(111).then(i.bind(i,3228));n=e(this.agentIdentifier)}}catch(t){(0,e.Z)(\"A problem occurred when starting up session manager. This page will not start or extend any session.\",t)}try{if(!this.shouldImportAgg(this.featureName,n))return(0,c.L)(this.agentIdentifier,this.featureName),void o(!1);const{lazyFeatureLoader:e}=await i.e(111).then(i.bind(i,8582)),{Aggregate:r}=await e(this.featureName,\"aggregate\");this.featAggregate=new r(this.agentIdentifier,this.aggregator,t),o(!0)}catch(t){(0,e.Z)(\"Downloading and initializing \".concat(this.featureName,\" failed...\"),t),this.abortHandler?.(),o(!1)}};l.il?(0,d.b)((()=\u003ea()),!0):a()}shouldImportAgg(e,t){return e!==r.D.sessionReplay||!!n.Yu.MO\u0026\u0026(!1!==(0,n.Mt)(this.agentIdentifier,\"session_trace.enabled\")\u0026\u0026(!!t?.isNew||!!t?.state.sessionReplay))}}var h=i(7633);class p extends f{static featureName=h.t;constructor(e,t){let r=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,h.t,r),this.importAggregator()}}var g=i(1117),m=i(1284);class v extends g.w{constructor(e){super(e),this.aggregatedData={}}store(e,t,r,n,i){var o=this.getBucket(e,t,r,i);return o.metrics=function(e,t){t||(t={count:0});return t.count+=1,(0,m.D)(e,(function(e,r){t[e]=b(r,t[e])})),t}(n,o.metrics),o}merge(e,t,r,n,i){var o=this.getBucket(e,t,n,i);if(o.metrics){var a=o.metrics;a.count+=r.count,(0,m.D)(r,(function(e,t){if(\"count\"!==e){var n=a[e],i=r[e];i\u0026\u0026!i.c?a[e]=b(i.t,n):a[e]=function(e,t){if(!t)return e;t.c||(t=y(t.t));return t.min=Math.min(e.min,t.min),t.max=Math.max(e.max,t.max),t.t+=e.t,t.sos+=e.sos,t.c+=e.c,t}(i,a[e])}}))}else o.metrics=r}storeMetric(e,t,r,n){var i=this.getBucket(e,t,r);return i.stats=b(n,i.stats),i}getBucket(e,t,r,n){this.aggregatedData[e]||(this.aggregatedData[e]={});var i=this.aggregatedData[e][t];return i||(i=this.aggregatedData[e][t]={params:r||{}},n\u0026\u0026(i.custom=n)),i}get(e,t){return t?this.aggregatedData[e]\u0026\u0026this.aggregatedData[e][t]:this.aggregatedData[e]}take(e){for(var t={},r=\"\",n=!1,i=0;i\u003ce.length;i++)t[r=e[i]]=A(this.aggregatedData[r]),t[r].length\u0026\u0026(n=!0),delete this.aggregatedData[r];return n?t:null}}function b(e,t){return null==e?function(e){e?e.c++:e={c:1};return e}(t):t?(t.c||(t=y(t.t)),t.c+=1,t.t+=e,t.sos+=e*e,e\u003et.max\u0026\u0026(t.max=e),e\u003ct.min\u0026\u0026(t.min=e),t):{t:e}}function y(e){return{t:e,min:e,max:e,sos:e*e,c:1}}function A(e){return\"object\"!=typeof e?[]:(0,m.D)(e,w)}function w(e,t){return t}var x=i(8632),E=i(4402),_=i(4351);var T=i(5546),D=i(7956),S=i(3239),j=i(7894),N=i(9251);class C extends f{static featureName=N.t;constructor(e,t){let r=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,N.t,r),l.il\u0026\u0026((0,D.N)((()=\u003e(0,T.p)(\"docHidden\",[(0,j.z)()],void 0,N.t,this.ee)),!0),(0,S.bP)(\"pagehide\",(()=\u003e(0,T.p)(\"winPagehide\",[(0,j.z)()],void 0,N.t,this.ee))),this.importAggregator())}}var O=i(3081);class P extends f{static featureName=O.t9;constructor(e,t){let r=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,O.t9,r),this.importAggregator()}}var R=i(6660);class I{constructor(e,t,r,n){this.name=\"UncaughtError\",this.message=e,this.sourceURL=t,this.line=r,this.column=n}}class k extends f{static featureName=R.t;#e=new Set;constructor(e,t){let n=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,R.t,n);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on(\"fn-err\",((e,t,n)=\u003e{this.abortHandler\u0026\u0026!this.#e.has(n)\u0026\u0026(this.#e.add(n),(0,T.p)(\"err\",[this.#t(n),(0,j.z)()],void 0,r.D.jserrors,this.ee))})),this.ee.on(\"internal-error\",(e=\u003e{this.abortHandler\u0026\u0026(0,T.p)(\"ierr\",[this.#t(e),(0,j.z)(),!0],void 0,r.D.jserrors,this.ee)})),l._A.addEventListener(\"unhandledrejection\",(e=\u003e{this.abortHandler\u0026\u0026(0,T.p)(\"err\",[this.#r(e),(0,j.z)(),!1,{unhandledPromiseRejection:1}],void 0,r.D.jserrors,this.ee)}),(0,S.m$)(!1,this.removeOnAbort?.signal)),l._A.addEventListener(\"error\",(e=\u003e{this.abortHandler\u0026\u0026(this.#e.has(e.error)?this.#e.delete(e.error):(0,T.p)(\"err\",[this.#n(e),(0,j.z)()],void 0,r.D.jserrors,this.ee))}),(0,S.m$)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#i,this.importAggregator()}#i(){this.removeOnAbort?.abort(),this.#e.clear(),this.abortHandler=void 0}#t(e){return e instanceof Error?e:void 0!==e?.message?new I(e.message,e.filename||e.sourceURL,e.lineno||e.line,e.colno||e.col):new I(\"string\"==typeof e?e:(0,_.P)(e))}#r(e){let t=\"Unhandled Promise Rejection: \";if(e?.reason instanceof Error)try{return e.reason.message=t+e.reason.message,e.reason}catch(t){return e.reason}if(void 0===e.reason)return new I(t);const r=this.#t(e.reason);return r.message=t+r.message,r}#n(e){return e.error instanceof Error?e.error:new I(e.message,e.filename,e.lineno,e.colno)}}var H=i(2210);let z=1;const L=\"nr@id\";function M(e){const t=typeof e;return!e||\"object\"!==t\u0026\u0026\"function\"!==t?-1:e===l._A?0:(0,H.X)(e,L,(function(){return z++}))}function B(e){if(\"string\"==typeof e\u0026\u0026e.length)return e.length;if(\"object\"==typeof e){if(\"undefined\"!=typeof ArrayBuffer\u0026\u0026e instanceof ArrayBuffer\u0026\u0026e.byteLength)return e.byteLength;if(\"undefined\"!=typeof Blob\u0026\u0026e instanceof Blob\u0026\u0026e.size)return e.size;if(!(\"undefined\"!=typeof FormData\u0026\u0026e instanceof FormData))try{return(0,_.P)(e).length}catch(e){return}}}var F=i(1214),U=i(7243);class Z{constructor(e){this.agentIdentifier=e}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var t=(0,n.DL)(this.agentIdentifier);if(!t)return null;var r=(t.accountID||\"\").toString()||null,i=(t.agentID||\"\").toString()||null,o=(t.trustKey||\"\").toString()||null;if(!r||!i)return null;var a=(0,E.M)(),s=(0,E.Ht)(),c=Date.now(),u={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)\u0026\u0026this.useTraceContextHeadersForCors())\u0026\u0026(u.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),u.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,r,i,o)),(e.sameOrigin\u0026\u0026!this.excludeNewrelicHeader()||!e.sameOrigin\u0026\u0026this.isAllowedOrigin(e)\u0026\u0026this.useNewrelicHeaderForCors())\u0026\u0026(u.newrelicHeader=this.generateTraceHeader(a,s,c,r,i,o)),u}generateTraceContextParentHeader(e,t){return\"00-\"+t+\"-\"+e+\"-01\"}generateTraceContextStateHeader(e,t,r,n,i){return i+\"@nr=0-1-\"+r+\"-\"+n+\"-\"+e+\"----\"+t}generateTraceHeader(e,t,r,n,i,o){if(!(\"function\"==typeof l._A?.btoa))return null;var a={v:[0,1],d:{ty:\"Browser\",ac:n,ap:i,id:e,tr:t,ti:r}};return o\u0026\u0026n!==o\u0026\u0026(a.d.tk=o),btoa((0,_.P)(a))}shouldGenerateTrace(e){return this.isDtEnabled()\u0026\u0026this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1,r={};if((0,n.Mt)(this.agentIdentifier,\"distributed_tracing\")\u0026\u0026(r=(0,n.P_)(this.agentIdentifier).distributed_tracing),e.sameOrigin)t=!0;else if(r.allowed_origins instanceof Array)for(var i=0;i\u003cr.allowed_origins.length;i++){var o=(0,U.e)(r.allowed_origins[i]);if(e.hostname===o.hostname\u0026\u0026e.protocol===o.protocol\u0026\u0026e.port===o.port){t=!0;break}}return t}isDtEnabled(){var e=(0,n.Mt)(this.agentIdentifier,\"distributed_tracing\");return!!e\u0026\u0026!!e.enabled}excludeNewrelicHeader(){var e=(0,n.Mt)(this.agentIdentifier,\"distributed_tracing\");return!!e\u0026\u0026!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=(0,n.Mt)(this.agentIdentifier,\"distributed_tracing\");return!!e\u0026\u0026!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=(0,n.Mt)(this.agentIdentifier,\"distributed_tracing\");return!!e\u0026\u0026!!e.cors_use_tracecontext_headers}}var V=i(7825),q=[\"load\",\"error\",\"abort\",\"timeout\"],G=q.length,W=n.Yu.REQ,X=n.Yu.XHR;class Q extends f{static featureName=V.t;constructor(e,t){let i=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];if(super(e,t,V.t,i),(0,n.OP)(e).xhrWrappable){this.dt=new Z(e),this.handler=(e,t,r,n)=\u003e(0,T.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:\"xhr\",fetch:\"fetch\",beacon:\"beacon\"};l._A?.performance?.getEntriesByType(\"resource\").forEach((t=\u003e{if(t.initiatorType in e\u0026\u00260!==t.responseStatus){const n={status:t.responseStatus},i={rxSize:t.transferSize,duration:Math.floor(t.duration),cbTime:0};K(n,t.name),this.handler(\"xhr\",[n,i,t.startTime,t.responseEnd,e[t.initiatorType]],void 0,r.D.ajax)}}))}catch(e){}(0,F.u5)(this.ee),(0,F.Kf)(this.ee),function(e,t,i,o){function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=x,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener(\"load\",(function(r){E(t,e)}),(0,S.m$)(!1)),l.IF||e.addEventListener(\"progress\",(function(e){t.lastSize=e.loaded}),(0,S.m$)(!1))}function s(e){this.params={method:e[0]},K(this,e[1]),this.metrics={}}function c(t,r){var i=(0,n.DL)(e);i.xpid\u0026\u0026this.sameOrigin\u0026\u0026r.setRequestHeader(\"X-NewRelic-ID\",i.xpid);var a=o.generateTracePayload(this.parsedOrigin);if(a){var s=!1;a.newrelicHeader\u0026\u0026(r.setRequestHeader(\"newrelic\",a.newrelicHeader),s=!0),a.traceContextParentHeader\u0026\u0026(r.setRequestHeader(\"traceparent\",a.traceContextParentHeader),a.traceContextStateHeader\u0026\u0026r.setRequestHeader(\"tracestate\",a.traceContextStateHeader),s=!0),s\u0026\u0026(this.dt=a)}}function u(e,r){var n=this.metrics,i=e[0],o=this;if(n\u0026\u0026i){var a=B(i);a\u0026\u0026(n.txSize=a)}this.startTime=(0,j.z)(),this.listener=function(e){try{\"abort\"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),(\"load\"!==e.type||o.called===o.totalCbs\u0026\u0026(o.onloadCalled||\"function\"!=typeof r.onload)\u0026\u0026\"function\"==typeof o.end)\u0026\u0026o.end(r)}catch(e){try{t.emit(\"internal-error\",[e])}catch(e){}}};for(var s=0;s\u003cG;s++)r.addEventListener(q[s],this.listener,(0,S.m$)(!1))}function d(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled\u0026\u0026\"function\"==typeof r.onload||\"function\"!=typeof this.end||this.end(r)}function f(e,t){var r=\"\"+M(e)+!!t;this.xhrGuids\u0026\u0026!this.xhrGuids[r]\u0026\u0026(this.xhrGuids[r]=!0,this.totalCbs+=1)}function h(e,t){var r=\"\"+M(e)+!!t;this.xhrGuids\u0026\u0026this.xhrGuids[r]\u0026\u0026(delete this.xhrGuids[r],this.totalCbs-=1)}function p(){this.endTime=(0,j.z)()}function g(e,r){r instanceof X\u0026\u0026\"load\"===e[0]\u0026\u0026t.emit(\"xhr-load-added\",[e[1],e[2]],r)}function m(e,r){r instanceof X\u0026\u0026\"load\"===e[0]\u0026\u0026t.emit(\"xhr-load-removed\",[e[1],e[2]],r)}function v(e,t,r){t instanceof X\u0026\u0026(\"onload\"===r\u0026\u0026(this.onload=!0),(\"load\"===(e[0]\u0026\u0026e[0].type)||this.onload)\u0026\u0026(this.xhrCbStart=(0,j.z)()))}function b(e,r){this.xhrCbStart\u0026\u0026t.emit(\"xhr-cb-time\",[(0,j.z)()-this.xhrCbStart,this.onload,r],r)}function y(e){var t,r=e[1]||{};if(\"string\"==typeof e[0]?0===(t=e[0]).length\u0026\u0026l.il\u0026\u0026(t=\"\"+l._A.location.href):e[0]\u0026\u0026e[0].url?t=e[0].url:l._A?.URL\u0026\u0026e[0]\u0026\u0026e[0]instanceof URL?t=e[0].href:\"function\"==typeof e[0].toString\u0026\u0026(t=e[0].toString()),\"string\"==typeof t\u0026\u00260!==t.length){t\u0026\u0026(this.parsedOrigin=(0,U.e)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var n=o.generateTracePayload(this.parsedOrigin);if(n\u0026\u0026(n.newrelicHeader||n.traceContextParentHeader))if(e[0]\u0026\u0026e[0].headers)s(e[0].headers,n)\u0026\u0026(this.dt=n);else{var i={};for(var a in r)i[a]=r[a];i.headers=new Headers(r.headers||{}),s(i.headers,n)\u0026\u0026(this.dt=n),e.length\u003e1?e[1]=i:e.push(i)}}function s(e,t){var r=!1;return t.newrelicHeader\u0026\u0026(e.set(\"newrelic\",t.newrelicHeader),r=!0),t.traceContextParentHeader\u0026\u0026(e.set(\"traceparent\",t.traceContextParentHeader),t.traceContextStateHeader\u0026\u0026e.set(\"tracestate\",t.traceContextStateHeader),r=!0),r}}function A(e,t){this.params={},this.metrics={},this.startTime=(0,j.z)(),this.dt=t,e.length\u003e=1\u0026\u0026(this.target=e[0]),e.length\u003e=2\u0026\u0026(this.opts=e[1]);var r,n=this.opts||{},i=this.target;\"string\"==typeof i?r=i:\"object\"==typeof i\u0026\u0026i instanceof W?r=i.url:l._A?.URL\u0026\u0026\"object\"==typeof i\u0026\u0026i instanceof URL\u0026\u0026(r=i.href),K(this,r);var o=(\"\"+(i\u0026\u0026i instanceof W\u0026\u0026i.method||n.method||\"GET\")).toUpperCase();this.params.method=o,this.txSize=B(n.body)||0}function w(e,t){var n;this.endTime=(0,j.z)(),this.params||(this.params={}),this.params.status=t?t.status:0,\"string\"==typeof this.rxSize\u0026\u0026this.rxSize.length\u003e0\u0026\u0026(n=+this.rxSize);var o={txSize:this.txSize,rxSize:n,duration:(0,j.z)()-this.startTime};i(\"xhr\",[this.params,o,this.startTime,this.endTime,\"fetch\"],this,r.D.ajax)}function x(e){var t=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var o=0;o\u003cG;o++)e.removeEventListener(q[o],this.listener,!1);t.aborted||(n.duration=(0,j.z)()-this.startTime,this.loadCaptureCalled||4!==e.readyState?null==t.status\u0026\u0026(t.status=0):E(this,e),n.cbTime=this.cbTime,i(\"xhr\",[t,n,this.startTime,this.endTime,\"xhr\"],this,r.D.ajax))}}function E(e,t){e.params.status=t.status;var r=function(e,t){var r=e.responseType;return\"json\"===r\u0026\u0026null!==t?t:\"arraybuffer\"===r||\"blob\"===r||\"json\"===r?B(e.response):\"text\"===r||\"\"===r||void 0===r?B(e.responseText):void 0}(t,e.lastSize);if(r\u0026\u0026(e.metrics.rxSize=r),e.sameOrigin){var n=t.getResponseHeader(\"X-NewRelic-App-Data\");n\u0026\u0026(e.params.cat=n.split(\", \").pop())}e.loadCaptureCalled=!0}t.on(\"new-xhr\",a),t.on(\"open-xhr-start\",s),t.on(\"open-xhr-end\",c),t.on(\"send-xhr-start\",u),t.on(\"xhr-cb-time\",d),t.on(\"xhr-load-added\",f),t.on(\"xhr-load-removed\",h),t.on(\"xhr-resolved\",p),t.on(\"addEventListener-end\",g),t.on(\"removeEventListener-end\",m),t.on(\"fn-end\",b),t.on(\"fetch-before-start\",y),t.on(\"fetch-start\",A),t.on(\"fn-start\",v),t.on(\"fetch-done\",w)}(e,this.ee,this.handler,this.dt),this.importAggregator()}}}function K(e,t){var r=(0,U.e)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+\":\"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}var Y=i(3614);const{BST_RESOURCE:J,RESOURCE:ee,START:te,END:re,FEATURE_NAME:ne,FN_END:ie,FN_START:oe,PUSH_STATE:ae}=Y;var se=i(7144);class ce extends f{static featureName=se.t;constructor(e,t){let r=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,se.t,r),this.importAggregator()}}var ue=i(7836);const{FEATURE_NAME:de,START:le,END:fe,BODY:he,CB_END:pe,JS_TIME:ge,FETCH:me,FN_START:ve,CB_START:be,FN_END:ye}=ue;var Ae=i(4649);class we extends f{static featureName=Ae.t;constructor(e,t){let r=!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2];super(e,t,Ae.t,r),this.importAggregator()}}new class extends t{constructor(t){let r=arguments.length\u003e1\u0026\u0026void 0!==arguments[1]?arguments[1]:(0,E.ky)(16);super(),l._A?(this.agentIdentifier=r,this.sharedAggregator=new v({agentIdentifier:this.agentIdentifier}),this.features={},this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(p),Object.assign(this,(0,s.j)(this.agentIdentifier,t,t.loaderType||\"agent\")),this.run()):(0,e.Z)(\"Failed to initial the agent. Could not determine the runtime environment.\")}get config(){return{info:(0,n.C5)(this.agentIdentifier),init:(0,n.P_)(this.agentIdentifier),loader_config:(0,n.DL)(this.agentIdentifier),runtime:(0,n.OP)(this.agentIdentifier)}}run(){const t=\"features\";try{const n=a(this.agentIdentifier),i=[...this.desiredFeatures];i.sort(((e,t)=\u003er.p[e.featureName]-r.p[t.featureName])),i.forEach((t=\u003e{if(n[t.featureName]||t.featureName===r.D.pageViewEvent){const i=function(e){switch(e){case r.D.ajax:return[r.D.jserrors];case r.D.sessionTrace:return[r.D.ajax,r.D.pageViewEvent];case r.D.sessionReplay:return[r.D.sessionTrace];case r.D.pageViewTiming:return[r.D.pageViewEvent];default:return[]}}(t.featureName);i.every((e=\u003en[e]))||(0,e.Z)(\"\".concat(t.featureName,\" is enabled but one or more dependent features has been disabled (\").concat((0,_.P)(i),\"). This may cause unintended consequences or missing data...\")),this.features[t.featureName]=new t(this.agentIdentifier,this.sharedAggregator)}})),(0,x.Qy)(this.agentIdentifier,this.features,t)}catch(r){(0,e.Z)(\"Failed to initialize all enabled instrument classes (agent aborted) -\",r);for(const e in this.features)this.features[e].abortHandler?.();const n=(0,x.fP)();return delete n.initializedAgents[this.agentIdentifier]?.api,delete n.initializedAgents[this.agentIdentifier]?.[t],delete this.sharedAggregator,n.ee?.abort(),delete n.ee?.get(this.agentIdentifier),!1}}addToTrace(t){(0,e.Z)(\"Call to agent api addToTrace failed. The page action feature is not currently initialized.\")}setCurrentRouteName(t){(0,e.Z)(\"Call to agent api setCurrentRouteName failed. The spa feature is not currently initialized.\")}interaction(){(0,e.Z)(\"Call to agent api interaction failed. The spa feature is not currently initialized.\")}}({features:[Q,p,C,class extends f{static featureName=ne;constructor(e,t){if(super(e,t,ne,!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2]),!l.il)return;const n=this.ee;let i;(0,F.QU)(n),this.eventsEE=(0,F.em)(n),this.eventsEE.on(oe,(function(e,t){this.bstStart=(0,j.z)()})),this.eventsEE.on(ie,(function(e,t){(0,T.p)(\"bst\",[e[0],t,this.bstStart,(0,j.z)()],void 0,r.D.sessionTrace,n)})),n.on(ae+te,(function(e){this.time=(0,j.z)(),this.startPath=location.pathname+location.hash})),n.on(ae+re,(function(e){(0,T.p)(\"bstHist\",[location.pathname+location.hash,this.startPath,this.time],void 0,r.D.sessionTrace,n)}));try{i=new PerformanceObserver((e=\u003e{const t=e.getEntries();(0,T.p)(J,[t],void 0,r.D.sessionTrace,n)})),i.observe({type:ee,buffered:!0})}catch(e){}this.importAggregator({resourceObserver:i})}},ce,P,we,k,class extends f{static featureName=de;constructor(e,t){if(super(e,t,de,!(arguments.length\u003e2\u0026\u0026void 0!==arguments[2])||arguments[2]),!l.il)return;if(!(0,n.OP)(e).xhrWrappable)return;try{this.removeOnAbort=new AbortController}catch(e){}let r,i=0;const o=this.ee.get(\"tracer\"),a=(0,F._L)(this.ee),s=(0,F.Lg)(this.ee),c=(0,F.BV)(this.ee),u=(0,F.Kf)(this.ee),d=this.ee.get(\"events\"),f=(0,F.u5)(this.ee),h=(0,F.QU)(this.ee),p=(0,F.Gm)(this.ee);function g(e,t){h.emit(\"newURL\",[\"\"+window.location,t])}function m(){i++,r=window.location.hash,this[ve]=(0,j.z)()}function v(){i--,window.location.hash!==r\u0026\u0026g(0,!0);var e=(0,j.z)();this[ge]=~~this[ge]+e-this[ve],this[ye]=e}function b(e,t){e.on(t,(function(){this[t]=(0,j.z)()}))}this.ee.on(ve,m),s.on(be,m),a.on(be,m),this.ee.on(ye,v),s.on(pe,v),a.on(pe,v),this.ee.buffer([ve,ye,\"xhr-resolved\"],this.featureName),d.buffer([ve],this.featureName),c.buffer([\"setTimeout\"+fe,\"clearTimeout\"+le,ve],this.featureName),u.buffer([ve,\"new-xhr\",\"send-xhr\"+le],this.featureName),f.buffer([me+le,me+\"-done\",me+he+le,me+he+fe],this.featureName),h.buffer([\"newURL\"],this.featureName),p.buffer([ve],this.featureName),s.buffer([\"propagate\",be,pe,\"executor-err\",\"resolve\"+le],this.featureName),o.buffer([ve,\"no-\"+ve],this.featureName),a.buffer([\"new-jsonp\",\"cb-start\",\"jsonp-error\",\"jsonp-end\"],this.featureName),b(f,me+le),b(f,me+\"-done\"),b(a,\"new-jsonp\"),b(a,\"jsonp-end\"),b(a,\"cb-start\"),h.on(\"pushState-end\",g),h.on(\"replaceState-end\",g),window.addEventListener(\"hashchange\",g,(0,S.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener(\"load\",g,(0,S.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener(\"popstate\",(function(){g(0,i\u003e1)}),(0,S.m$)(!0,this.removeOnAbort?.signal)),this.abortHandler=this.#i,this.importAggregator()}#i(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}],loaderType:\"spa\"})})()})();","siteSetting":{"placeholderImages":{"brand":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltc0182b2356ae8eed/64b83949410a1b4c0bd7459b/IW_generic_image.png","contributor":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltd227769938aa3739/64b55d4d33298f5b051a72d5/Contributor_Avatar.png"}},"isAuthenticated":false},"routes/$topic.$slug":{"metadata":{"type":"article","uid":"blt8cf7926c5c04e820","aid":"773282","reg":"anonymous"},"template":{"breadcrumbs":[{"url":"/","title":"Home"},{"url":"/machine-learning-ai","title":"Machine Learning \u0026 AI"}],"topics":[{"__typename":"TopicPrimary","title":"Machine Learning \u0026 AI","url":"/machine-learning-ai"}],"subBrand":null,"searchParams":{},"summary":"Changing gears to another framework helped reduce boot times and resource usage, especially during traffic spikes.","title":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus","mobileHeadline":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus","authoredBy":"","authoredOn":"","oldUrl":"/devops/programming-languages/why-vodafone-greece-devs-migrated-to-red-hats-quarkus/a/d-id/1337956","buyersJourney":"","contributors":[{"title":"Joao-Pierre S. Ruth 2","name":"Joao-Pierre S. Ruth","companyName":"","role":"Senior Writer","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltdb36f6beba04e853/64bc07dcbbe99b2ac436a250/Joao-Pierre-Ruth.png","link":"/author/joao-pierre-s-ruth-2","tagLine":"Senior Writer","summary":[{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Joao-Pierre S. Ruth has spent his career immersed in business and technology journalism first covering local industries in New Jersey, later as the New York editor for Xconomy delving into the city's tech startup community, and then as a freelancer for such outlets as TheStreet, Investopedia, and Street Fight. Joao-Pierre earned his bachelor's in English from Rutgers University. Follow him on Twitter: @jpruth."}]}]}],"readTime":5,"newsletterSignUpPromo":{"title":"Never Miss a Beat: Get a snapshot of the issues affecting the IT industry straight to your inbox.","message":"","newsletterId":"blt8d3a84e50fd3381c","buttonText":"SIGN-UP","variant":"vertical","mode":"light"},"resourcesModule":{"title":"More Insights","linkLists":[{"listOption":"External Feed","listTitle":"Webinars","icon":"ChalkBoard","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=5\u0026article_type=upcoming_webinars","ctaButton":{"ctaButtonLink":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkmorewebinars","ctaButtonText":"More Webinars"},"openInNewTab":true,"articles":[{"title":"Unlocking Maximum Productivity: AI-Powered Document Redaction \u0026 GenAI Innovation","publishedDate":"Aug 30, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_defa4950\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001337\u0026_mc=_upcoming_webinars_8.500001337"},{"title":"Evolution in ITSM: Navigating the New Horizon","publishedDate":"Sep 12, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_tean155\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001341\u0026_mc=_upcoming_webinars_8.500001341"},{"title":"Cloud Crisis Management","publishedDate":"Aug 30, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_forq238\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001336\u0026_mc=_upcoming_webinars_8.500001336"},{"title":"[Virtual Event] DevSecOps Essentials That Enable Efficient Security","publishedDate":"Sep 14, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_defa5029\u0026ch=iwksbx\u0026cid=_upcoming_webinars_8.500001342\u0026_mc=_upcoming_webinars_8.500001342"}]},{"listOption":"External Feed","listTitle":"Reports","icon":"Document","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=5\u0026article_type=analytics","ctaButton":{"ctaButtonLink":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk","ctaButtonText":"More Reports"},"openInNewTab":true,"articles":[{"title":"You've Been Attacked Now What?","publishedDate":"","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_ingg68\u0026ch=sbx\u0026cid=_analytics_7.300005995\u0026_mc=_analytics_7.300005995"},{"title":"The New Frontier of Cyber Security: Securing the Network Edge","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_forq236\u0026ch=sbx\u0026cid=_analytics_7.300005993\u0026_mc=_analytics_7.300005993"},{"title":"2022 Retrospective: The Emergence of the Next Gen of Wi-Fi","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_neua33\u0026ch=sbx\u0026cid=_analytics_7.300005976\u0026_mc=_analytics_7.300005976"},{"title":"2022 State of Network Management","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_neua16\u0026ch=sbx\u0026cid=_analytics_7.300005942\u0026_mc=_analytics_7.300005942"},{"title":"2022 State of ITOps and SecOps","publishedDate":"","url":"https://informationweek.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_ingg40\u0026ch=sbx\u0026cid=_analytics_7.300005937\u0026_mc=_analytics_7.300005937"}]}]},"socialShare":[{"type":"Linkedin","url":"https://www.linkedin.com/sharing/share-offsite/?url=https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},{"type":"Facebook","url":"http://www.facebook.com/sharer/sharer.php?u=https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},{"type":"Twitter","url":"http://www.twitter.com/intent/tweet?url=https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},{"type":"Email","url":"mailto:?subject=Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus\u0026body=I%20thought%20the%20following%20from%20informationweek%20might%20interest%20you.%0D%0A%0D%0A%20Why%20Vodafone%20Greece%20Devs%20Migrated%20to%20Red%20Hat%E2%80%99s%20Quarkus%0D%0Ahttps%3A%2F%2Fwww.informationweek.com%2Fmachine-learning-ai%2Fwhy-vodafone-greece-devs-migrated-to-red-hat-s-quarkus"},{"type":"Reddit","url":"https://www.reddit.com/submit?url=https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus\u0026title=Why%20Vodafone%20Greece%20Devs%20Migrated%20to%20Red%20Hat%E2%80%99s%20Quarkus"}],"publishedDate":"2020-06-02T08:00:00.000Z","keywords":[],"atAGlance":[],"bodyJson":[{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"The team at Vodafone Greece kept trying to make do with its legacy systems but the need for a nimbler option became impossible to ignore. Christos Sotiriou, backend chapter lead at Vodafone Greece, says they wanted to better serve requests and increasing demand on services such as distant payment solutions and mobile applications. He says they had been using a monolithic service architecture that was in place for decades. A newer option emerged when Quarkus came on the scene."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"In 2019, Red Hat rolled out its build of "},{"type":"text","marks":[{"type":"link","attrs":{"href":"https://developers.redhat.com/blog/2019/03/07/quarkus-next-generation-kubernetes-native-java-framework/","target":"_blank","class":null}}],"text":"Quarkus"},{"type":"text","text":", a container-first, next-generation Kubernetes-native Java stack. It is billed as a more cloud-oriented option for app development that spoke to the needs at Vodafone Greece."}]},{"type":"ad","pos":"300_1v_article"},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"At the time, Vodafone Greece was dealing with long development cycles that needed to be trimmed down to be more reactive, Sotiriou says. “In order to push a new feature, no matter how small, it required two or three months of development.” The volume of people developing on the same architecture became a problem, he says, along with delays in aggregation to present information to users."}]},{"type":"ad","pos":"native_1v"},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"That led to Vodafone introducing a digital experience layer, based on Kubernetes and comprised of microservices that sit between the front-end channels, including web and mobile applications, and backend systems. “In this Kubernetes cluster, we have developed 80 microservices,” Sotiriou says. The goal is to develop up to 300 microservices, he says, when the full scope of the digital experience layer is realized."}]},{"type":"ad","pos":"video_v"},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Sotiriou says his team worked with the Spring Boot framework when they began developing microservices. Though he says Spring Boot is widely used, his team had concerns. “We became increasingly worried about resource consumption that Spring Boot was having while being deployed on the Kubernetes cluster,” Sotiriou says. For example, they faced slow boot times when a microservice was deployed because systems needed to be aggregated before it could come online."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Vodafone Greece was eventually able to decrease boot times of about 2 minutes to around 60 seconds, Sotiriou says, but a search began to find alternatives. “It became increasingly cumbersome to find ways to circumvent the methodology we were using just to squeeze ever little bit of performance out of Spring Boot,” he says."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Delays in booting, especially during traffic spikes, can cause headaches with microservices and result in an unhealthy cluster, Sotiriou says. “If booting of a new microservice takes too long it means that the old microservice that is already running is going to be killed because of heavy load.”"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"The development of Quarkus was a response to the need to alleviate overhead and better serve modern ecosystems, says Rich Sharples, senior director of product management at Red Hat. “Java was designed for a very, very different era of computing with big honking, mainframe-class Solaris servers running for years and decades,” he says. “That’s not the world we live in.”"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Now in a containerized world, the resources that applications have access to are much smaller, Sharples says. In extreme cases, he says, such as functions-as-a-service, applications may only get enough memory and CPU to run a function one time. “That’s what we are trying to change with Quarkus,” Sharples says, “to move a lot of that processing into the compilation stage so it doesn’t affect your startup time and to lower the significant memory overhead that Java comes with.”"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Sotiriou says his team considered options that included Node.js and Golang but went with Quarkus because of the ecosystem and programming language choice. In March 2019, he says his team began writing their entire stack toward Quarkus. “Not only were we beginning to write microservices using Quarkus, we also had a plethora of common libraries, shared libraries across the whole ecosystem we needed to rewrite as well.” That included common business cases that the microservices were using such as customized database connectivity and authorization authentication."}]},{"type":"ad","pos":"native_2v"},{"type":"figure","attrs":{"figcaption":"\n Christos SotiriouImage: Vodafone Greece\n \n "},"content":[{"type":"image","attrs":{"textAlign":"left","src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blte9c980b53656f122/646806b1f916723a09e8c36c/Christos_Sotiriou-VodafoneGreece.jpg","alt":"Christos_Sotiriou-VodafoneGreece.jpg","title":null,"style":{"width":"100%"}}},{"type":"text","text":" Christos SotiriouImage: Vodafone Greece"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"Vodafone Greece entered into a staggered migration, Sotiriou says, where the team initially tried to keep older applications running as they moved Spring Boot into maintenance phase while newer applications were written in Quarkus. The need to accelerate that migration became apparent earlier this year."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"In January, Vodafone Greece released a new version of the My Vodafone application. Sotiriou says it was the first time the digital experience layer was used to draw the main screen for the app. “The main screen had so much information that we needed to aggregate information from three or four or five microservices at the same time,” Sotiriou says. When this version of the app was rolled out to about 30% of Vodafone Greece users, problems emerged. “The microservices the main screen used were written in Spring Boot, so it nearly tore down our cluster,” he says."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":"With increased traffic spikes, there were long boot times of about 40 seconds, Sotiriou says. The app was rewritten in Quarkus to rectify the issues, using half the resources. He says using Quarkus in JVM (Java Virtual Machine) mode without compiling to native led to boot times of about 14 seconds, a 60% performance increase. “That was the breaking point for us,” Sotiriou says. “We decide to migrate even more microservices from Spring Boot to Quarkus.” Vodafone Greece now has 40 microservices written in Quarkus, with another 20 microservices in the pipeline, he says."}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","marks":[{"type":"bold"},{"type":"italic"}],"text":"For more information on DevOps and Cloud, read these articles:"}]},{"type":"ad","pos":"300_2v_article"},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","marks":[{"type":"link","attrs":{"href":"https://www.informationweek.com/devops/modern-app-dev-an-enterprise-guide/a/d-id/1336623","target":"_blank","class":null}}],"text":"Modern App Dev: An Enterprise Guide"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","marks":[{"type":"link","attrs":{"href":"https://www.informationweek.com/kubernetes-advantage-considerations-for-a-multi-cloud-world/a/d-id/1334879","target":"_blank","class":null}}],"text":"Kubernetes Advantage: Considerations for a Multi-Cloud World"}]},{"type":"paragraph","attrs":{"textAlign":"left"},"content":[{"type":"text","marks":[{"type":"link","attrs":{"href":"https://www.informationweek.com/cloud/searching-for-a-cloud-native-app-strategy-amid-the-chaos/a/d-id/1333898","target":"_blank","class":null}}],"text":"Searching For a Cloud-Native App Strategy Amid the Chaos"}]}],"contentType":"Article","uid":"blt8cf7926c5c04e820","sponsored":{"logoUrl":"","url":"","alt":"","title":"","campaignURL":"","isSponsored":false,"gateWithSiteReg":false,"gateWithExternalForm":"None","externalFormID":""},"featuredImage":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb03e5112c0df5772/64cb1bda3f945b6f16729666/developer_joyfotoliakid-AdobeStock.jpg","alt":"","caption":"","creditTo":"Image: joyfotoliakid - stock.adobe.com"},"contentFormat":{"title":"Commentary"},"seriesTaxonomy":[],"programTaxonomy":[],"sidebarModules":[{"type":"module_content_cards","data":{"title":"Editor's Choice","variant":"column","contents":[{"type":"contentPreview","data":{"contentType":"Article","variant":"card-vertical","thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt668108162d490cae/650c8d6388945437603ed168/computerhacked_PantherMedia-Alamy.jpg","alt":"Cyber security, hacking and data analytics employee, tired from working on it, software engineering glitch."},"articleName":"What Are the Biggest Lessons from the MGM Ransomware Attack?","mobileHeadline":"What Are the Biggest Lessons from the MGM Ransomware Attack?","articleUrl":"/cyber-resilience/what-are-the-biggest-lessons-from-the-mgm-ransomware-attack-","listPageUrl":"","date":"Sep 22, 2023","categoryName":"Cyber Resilience","categoryUrl":"/cyber-resilience","contributors":[{"name":"Carrie Pallardy","link":"/author/carrie-pallardy","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blta2ac0cf507deba77/64bf49006c654daed172bbba/CarriePallardy_Head_Shot.gif"}],"timeRead":5}},{"type":"contentPreview","data":{"contentType":"Article","variant":"card-vertical","thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf4110c3eecd331e3/650c504fd22093e73dae8ee3/Cisco_M614XT.jpg","alt":"Cisco logo seen during an event."},"articleName":"Cisco Will Buy Splunk for $28B in Huge AI Cybersecurity Play","mobileHeadline":"Cisco Will Buy Splunk for $28B ","articleUrl":"/it-infrastructure/cisco-will-buy-splunk-for-28b-in-huge-ai-cybersecurity-play","listPageUrl":"","date":"Sep 21, 2023","categoryName":"IT Infrastructure","categoryUrl":"/it-infrastructure","contributors":[{"name":"Shane Snider ","link":"/author/shane-snider","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf4de7e5784b276a0/650d8d5ffac8e1d4a1f21f76/Shane_Snider_Profile.jpg"}],"timeRead":3}},{"type":"contentPreview","data":{"contentType":"Article","variant":"card-vertical","thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt6f2abf716b3d5459/6509ec7c42f08df948ca60f4/Microsoft_Leak_2PJ5EF0.jpg","alt":"Microsoft corporation brand logo on high rise glass building exterior through exotic green palm leaves summertime photo."},"articleName":"Microsoft’s 38TB Leak: How IT Leaders Should Respond","mobileHeadline":"Microsoft’s 38TB Leak: How IT Leaders Should Respond","articleUrl":"/cyber-resilience/microsoft-s-38tb-leak-how-it-leaders-should-respond","listPageUrl":"","date":"Sep 19, 2023","categoryName":"Cyber Resilience","categoryUrl":"/cyber-resilience","contributors":[{"name":"Shane Snider ","link":"/author/shane-snider","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf4de7e5784b276a0/650d8d5ffac8e1d4a1f21f76/Shane_Snider_Profile.jpg"}],"timeRead":3}},{"type":"contentPreview","data":{"contentType":"Document","variant":"card-vertical","thumbnail":{"src":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/blt0e87dcf2e2cc5e9a/6509d14fbf8bb01d9f39d94d/2D6JRP3.jpg","alt":"Pen filling out paper form with the question: \"Are you at risk for cyberattacks?\""},"articleName":"2023 Cyber Risk and Resiliency Report: How CIOs Are Dueling Disaster in 2023","mobileHeadline":"Cyber Risk and Resiliency Report: How CIOs Are Dueling Disaster","articleUrl":"/cyber-resilience/cyber-risk-and-resiliency-report-how-cios-are-dueling-disaster-in-2023","listPageUrl":"/documents","date":"Sep 19, 2023","categoryName":"Cyber Resilience","categoryUrl":"/cyber-resilience","contributors":[{"name":"InformationWeek Staff","link":"/author/informationweek-staff","avatar":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltf6866111140df5bb/644914fcbec1154bea815853/250503_IWK23_Graphics_GooglePublishingCentre_Assets_1000x1000.png"}],"timeRead":1}}]},"adConfig":{"nativeAdOption":false}},{"type":"module_link_list","data":{"listOption":"External Feed","listTitle":"Webinars","icon":"ChalkBoard","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=5\u0026article_type=upcoming_webinars","ctaButton":{"ctaButtonLink":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkmorewebinars","ctaButtonText":"More Webinars"},"openInNewTab":true,"articles":[{"title":"Unlocking Maximum Productivity: AI-Powered Document Redaction \u0026 GenAI Innovation","publishedDate":"Aug 30, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_defa4950\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001337\u0026_mc=_upcoming_webinars_8.500001337"},{"title":"Evolution in ITSM: Navigating the New Horizon","publishedDate":"Sep 12, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_tean155\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001341\u0026_mc=_upcoming_webinars_8.500001341"},{"title":"Cloud Crisis Management","publishedDate":"Aug 30, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_forq238\u0026ch=SBX\u0026cid=_upcoming_webinars_8.500001336\u0026_mc=_upcoming_webinars_8.500001336"},{"title":"[Virtual Event] DevSecOps Essentials That Enable Efficient Security","publishedDate":"Sep 14, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_defa5029\u0026ch=iwksbx\u0026cid=_upcoming_webinars_8.500001342\u0026_mc=_upcoming_webinars_8.500001342"}]}},{"type":"module_link_list","data":{"listOption":"External Feed","listTitle":"White Papers","icon":"Document","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=\u0026article_type=whitepaper","ctaButton":{"ctaButtonLink":"https://iw-resources.informationweek.com/?pt=dir\u0026page=iw-resources\u0026ch=iwkmorewps","ctaButtonText":"More White Papers"},"openInNewTab":true,"articles":[{"title":"Buyer's Guide: Essential tips for finding your ideal ITSM solution","publishedDate":"","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_defa4667\u0026ch=SBX\u0026cid=_whitepaper_14.500005429\u0026_mc=_whitepaper_14.500005429"},{"title":"EKC Group Customer Story","publishedDate":"","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_defa4666\u0026ch=SBX\u0026cid=_whitepaper_14.500005428\u0026_mc=_whitepaper_14.500005428"},{"title":"Smart Service Management","publishedDate":"","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_tean116\u0026ch=SBX\u0026cid=_whitepaper_14.500005420\u0026_mc=_whitepaper_14.500005420"},{"title":"Oklahoma City Shows Their Love for ITSM Platform; Adoption High","publishedDate":"","url":"https://informationweek.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_tean99\u0026ch=SBX\u0026cid=_whitepaper_14.500005415\u0026_mc=_whitepaper_14.500005415"},{"title":"Cyberthreats Racing Ahead of Your Defenses? Secure Networking Can Put a Stop to That","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_forq217\u0026ch=\u0026cid=_whitepaper_14.500005404\u0026_mc=_whitepaper_14.500005404"}]}},{"type":"module_link_list","data":{"listOption":"External Feed","listTitle":"Live Events","icon":"Date","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=3\u0026article_type=session","ctaButton":{"ctaButtonLink":"https://www.informationweek.com/upcoming-events","ctaButtonText":"More Live Events"},"openInNewTab":true,"articles":[{"title":"Forrester - Security \u0026 Risk / Nov. 14-15 - Washington DC \u0026 Digital","publishedDate":"Nov 14, 2023","url":"https://www.forrester.com/event/security-risk/?utm_source=informationweek\u0026utm_medium=web\u0026utm_campaign=sr23na\u0026cid=_session_16.500309\u0026_mc=_session_16.500309"},{"title":"[Virtual Event] DevSecOps Essentials That Enable Efficient Security","publishedDate":"Oct 19, 2023","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_defa5029\u0026ch=iwksbx\u0026cid=_session_16.500307\u0026_mc=_session_16.500307"},{"title":"ICMI Contact Center Expo, October 16-19, 2023","publishedDate":"Oct 16, 2023","url":"https://secure.icmi.com/expo/2023/registrations/Attendee?_mc=pr_icmix_pr_x_le_x_pressrelease_2023\u0026utm_source=email\u0026utm_medium=pr_\u0026utm_campaign=pressrelease\u0026utm_content=le_\u0026utm_id=actvatn\u0026cid=_session_16.500300"}]}},{"type":"module_link_list","data":{"listOption":"External Feed","listTitle":"Reports","icon":"Document","externalFeed":"https://smartbox.techweb.com/smartbox/externalsmartbox?site_id=300001\u0026taxonomy_ids=\u0026num_display=5\u0026article_type=analytics","ctaButton":{"ctaButtonLink":"https://iw-resources.informationweek.com/?pt=adv\u0026page=InformationWeek\u0026ch=iwkheadtllnk","ctaButtonText":"More Reports"},"openInNewTab":true,"articles":[{"title":"You've Been Attacked Now What?","publishedDate":"","url":"https://iw-resources.informationweek.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_ingg68\u0026ch=sbx\u0026cid=_analytics_7.300005995\u0026_mc=_analytics_7.300005995"},{"title":"The New Frontier of Cyber Security: Securing the Network Edge","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026pc=w_forq236\u0026ch=sbx\u0026cid=_analytics_7.300005993\u0026_mc=_analytics_7.300005993"},{"title":"2022 Retrospective: The Emergence of the Next Gen of Wi-Fi","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_neua33\u0026ch=sbx\u0026cid=_analytics_7.300005976\u0026_mc=_analytics_7.300005976"},{"title":"2022 State of Network Management","publishedDate":"","url":"https://networkcomputing.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_neua16\u0026ch=sbx\u0026cid=_analytics_7.300005942\u0026_mc=_analytics_7.300005942"},{"title":"2022 State of ITOps and SecOps","publishedDate":"","url":"https://informationweek.tradepub.com/c/pubRD.mpl?secure=1\u0026sr=pp\u0026_t=pp:\u0026qf=w_ingg40\u0026ch=sbx\u0026cid=_analytics_7.300005937\u0026_mc=_analytics_7.300005937"}]}}],"relatedEvents":[],"topicSelector":{"mainTopic":{"type":"TopicPrimary","title":"Machine Learning \u0026 AI","url":"/machine-learning-ai"},"additionalTopics":[]},"print":true},"schema":[{"@context":"https://schema.org","@type":"Article","datePublished":"2020-06-02T08:00:00.000Z","dateModified":"2023-08-23T06:36:07.070Z","headline":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus","mainEntityOfPage":"https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","image":{"@type":"ImageObject","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb03e5112c0df5772/64cb1bda3f945b6f16729666/developer_joyfotoliakid-AdobeStock.jpg","caption":"","creditText":"Image: joyfotoliakid - stock.adobe.com"},"author":[{"@type":"Person","name":"Joao-Pierre S. Ruth","image":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltdb36f6beba04e853/64bc07dcbbe99b2ac436a250/Joao-Pierre-Ruth.png","url":"https://www.informationweek.com/author/joao-pierre-s-ruth-2"}]},{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.informationweek.com"},{"@type":"ListItem","position":2,"name":"Machine Learning \u0026 AI","item":"https://www.informationweek.com/machine-learning-ai"}]}],"seo":{"canonicalUrl":"https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","metaDescription":"Changing gears to another framework helped reduce boot times and resource usage, especially during traffic spikes.","metaTitle":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus | InformationWeek","noIndex":false,"imageUrl":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb03e5112c0df5772/64cb1bda3f945b6f16729666/developer_joyfotoliakid-AdobeStock.jpg?disable=upscale\u0026width=1200\u0026height=630\u0026fit=crop","keywords":"Machine Learning \u0026 AI"},"isAuthenticated":false,"iirisRecommendationConfig":{"id":"widget-1689347359875","division":"it","brandFamily":"enterpriseit","entityTagBackground":"#333333BF","dateFormat":"Month DD, YYYY","showBy":"","showTime":"","borderRadius":"5","imageWidth":"324","imageHeight":"182","dateTimeBgcolor":"#ffffff","dateTimeFontColor":"#767676","imagePosition":"vertical","dropShadow":"","dateTimeFontsize":"12","entityTagBorderColor":"#333333BF","borderColor":"#e6e6e6","showdate":""},"gtm":{"loadEvent":{"attributes":{"events":[],"subBrand":"","seo":{"canonicalURL":"https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","hideFromSearchEngines":false},"sponsored":{"name":"","campaignURL":"","isSponsored":false,"gateWithSiteReg":false,"gateWithExternalForm":"None","externalFormID":""},"legacy":{"destinationPath":"/devops/programming-languages/why-vodafone-greece-devs-migrated-to-red-hats-quarkus/a/d-id/1337956","issueDate":"","contributor":""}},"category":{"buyerJourney":"","contentFormat":"Commentary","pageType":"article","keyword":[],"series":[],"primaryTerm":{"parent":"Machine Learning \u0026 AI","child":"","grandchild":""},"secondaryTerm":[]},"pageInfo":{"pageID":"blt8cf7926c5c04e820","pageName":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus","destinationURL":"https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","issueDate":"Jun 02, 2020","contributor":[{"companyName":"","displayName":"Joao-Pierre S. Ruth","jobTitle":"Senior Writer","name":"Joao-Pierre S. Ruth 2"}]}}},"siteSetting":{"placeholderImages":{"brand":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltc0182b2356ae8eed/64b83949410a1b4c0bd7459b/IW_generic_image.png","contributor":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltd227769938aa3739/64b55d4d33298f5b051a72d5/Contributor_Avatar.png"}}}}};import "/build/manifest-55EE296F.js";
import * as route0 from "/build/root-LTDT356C.js";
import "/build/manifest-55EE296F.js";
import * as route1 from "/build/routes/$topic.$slug-2NZ3KYE6.js";
window.__remixRouteModules = {"root":route0,"routes/$topic.$slug":route1}; import("/build/entry.client-VOU2QAI4.js");[{"@context":"https://schema.org","@type":"Article","datePublished":"2020-06-02T08:00:00.000Z","dateModified":"2023-08-23T06:36:07.070Z","headline":"Why Vodafone Greece Devs Migrated to Red Hat’s Quarkus","mainEntityOfPage":"https://www.informationweek.com/machine-learning-ai/why-vodafone-greece-devs-migrated-to-red-hat-s-quarkus","image":{"@type":"ImageObject","url":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltb03e5112c0df5772/64cb1bda3f945b6f16729666/developer_joyfotoliakid-AdobeStock.jpg","caption":"","creditText":"Image: joyfotoliakid - stock.adobe.com"},"author":[{"@type":"Person","name":"Joao-Pierre S. Ruth","image":"https://eu-images.contentstack.com/v3/assets/blt69509c9116440be8/bltdb36f6beba04e853/64bc07dcbbe99b2ac436a250/Joao-Pierre-Ruth.png","url":"https://www.informationweek.com/author/joao-pierre-s-ruth-2"}]},{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.informationweek.com"},{"@type":"ListItem","position":2,"name":"Machine Learning & AI","item":"https://www.informationweek.com/machine-learning-ai"}]}]Joao-Pierre S. Ruth
Red Hat Summit 2023
Join us for Red Hat Summit, which will feature virtual and in-person events that are designed to fit your open source journey.
Vodafone Greece replaces Spring Boot with Quarkus
Quarkus: Supersonic Subatomic Java