ByRoxana Hadadi,
a Vulture TV critic who also covers film and pop culture
Idris Elba’s Sam Nelson is a corporate negotiator pulled into the most stressful pro bono gig of all time.
Photo: Aidan Monaghan/Apple TV
Summer is the time to give yourself over to a TV series that’s as silly as it is engrossing, as soapy as it is immersive — think the bombastic, sweaty, and sexy Rap Sh!t, returning in August; the thematically lighter, MILF-ranking second season of And Just Like That …; Lee Pace towering against the grand sci-fi backdrop of Foundation. You know, the kind of viewing experience that encourages you to dive into a sometimes-ludicrous world and not think too hard about whatever is happening on screen. But only one such“it’s too hot, turn on the TV” series has Idris Elba in authoritarian mode (reassuring!) quietly standing up to a team of hijackers who are not Muslim (refreshing!): Hijack.
Or, if you want to be precise — Idris would want you to be precise — H/JACK. That name stylization is one of the series’ affectations; the suggestion that its seven episodes are occurring in real time is another. That’s not really true, since Hijack has moments when the timing of people traveling offscreen doesn’t match the amount of time that’s passed onscreen, but it’s a good way to add urgency to the various subplots: the tension and violence occurring on hijacked Kingdom Airlines Flight 29, the mysterious motivations of a group of assassins killing people in Dubai, the confused reactions of air-traffic controllers in different countries along the plane’s route, and the desperation of British government employees trying to figure out what the hijackers want and how many of the plane’s 216 passengers they’ve killed.
Now five episodes in, Hijack is rapidly cycling through these storylines, adding in new characters and concerns as its story expands and exhibiting all the hallmarks of your next entertainingly pulpy summer watch. Simply give yourself over to its ever-shifting array of welcome, weird, and occasionally wild elements.
Spoilers follow for the first five episodes of the Apple TV+ series Hijack.
WELCOME: Idris Elba subtly telling people they’re stupid. The man is great at this. Elba’s filmography is full of roles in which he either exudes low-level irritation at other people’s nonsensical decisions (The Wire, Luther, Prometheus) or steps into a leadership role while trying to wrangle people into line (28 Weeks Later, Pacific Rim, Prometheus again), and he gets to do both throughout Hijack. A high-level corporate negotiator who knows how to read and manipulate people, Elba’s Sam Nelson toys with the hijackers, convincing them he’s on their side as he steadily works against them. Those scenes are subtle and effective. But he also can’t entirely hide his disdain for them, or for the other passengers who try to grab heroic glory for themselves; a scene in which he calls the rich white guy in first class a fool for trying to stir up rebellion in other parts of the plane is sold totally by Elba’s withering contempt. It’s a downbeat performance, but a good one, especially if you’re into watching Elba bark out commands. (Who isn’t?)
WEIRD: Why waste Archie Panjabi? Hijack’s promotional materials single out two actors: Elba and Archie Panjabi, in her second TV role about someone investigating shenanigans with an airplane (the first was Departure). Panjabi plays counterterrorism officer Zahra Gahfoor, who helps pull together a task force and liaises with British foreign secretary Louise Aitchison (Hattie Morahan) and the British home secretary (Neil Stuke). But the Zahra character takes a backseat to Louise, who has more decision-making power, and to Detective Daniel O’Farrell (Max Beesley), who has a history with Zahra, is currently dating Sam’s estranged wife, and becomes the investigation’s man on the street. For the most part, Zahra just sits around conference rooms listening to Louise worry and fielding phone calls from Daniel.
She needs more to do!
Photo: Apple TV
WILD: First class! Kingdom Airlines doesn’t exist, but because it flies out of Dubai, we can assume it’s Hijack’s stand-in for Emirates. A one-way Emirates first-class ticket from Dubai to London can cost about $8,000, and this is when I wonder if the orcas attacking boats would like to evolve, take to the air, and destroy the social stratification of our skies.
WEIRD: Is that Gucci product placement? We learn at the beginning of Hijack that Sam and his physics professor wife, Marsha (Christine Adams), are on the outs and that she doesn’t want him to return from Dubai — probably because she’s already moved on with Detective Daniel. But Sam gets on the plane back to London anyway, armed with a gift: a Gucci bracelet for Marsha. This show has no other noticeable product placement, and this is how I learned that Elba starred in a Gucci watch campaign last year. Get those cross-promotional dollars, sir!
WILD: Pilot-on-pilot violence! Early on, the hijackers attempt to divide up the pilots by somehow knowing that the male pilot is having an affair with one of the flight attendants and forcing him to beat up the female pilot in order to keep his lover safe. It’s a jarring, borderline-nonsensical moment, but one that effectively underscores that the hijackers aren’t messing around, and it creates a solid enmity between the two pilots that pays off in future episodes.
WELCOME: Baddies who aren’t Muslim or Middle Eastern. This is rare in a political-thriller show, okay? My eyes still hurt from rolling so often during The Diplomat. Hijack feints in the expected direction in its first couple of episodes, with the airplane’s passengers freaking out upon hearing Arabic and planning to take on the hijackers “if they’re Arab or something like that.” But Sam quickly snuffs out that chest thumping, pointing out that of course one of the hijackers would speak Arabic because a plane leaving Dubai would have Arabic-speaking passengers. As the episodes continue, Hijack not only solidifies the intricately nefarious aims of a team of nearly all white hijackers, led by Stuart (Neil Maskell), but also presents some of the plane’s brown travelers and the Dubai airport’s employees as would-be heroes.
Staring intensely? Lead hijacker Stuart Atterton (Neil Maskell) does it a lot.
Photo: Apple TV
WEIRD: Why the resistance to calling the hijackers “terrorists”? Hijack is otherwise so thoughtful with its Middle Eastern characters, so why can’t the seriestake the next step in properly labeling the hijackers who kill and cause terror among the passengers of KA29? Zahra says, “It’s not a counterterrorism issue”; Louise says, “It’s not terrorism”; and when the home secretary dares to call them terrorists, Louise argues they’re just “an organized crime group, a proficient one.” Excuse me, what’s the difference at this point? Maybe the British government won’t divorce the idea of terrorism from religious or political gains, but Hijack could have made such semantic discussions far more interesting by prodding at these distinctions and emphasizing how anyone who creates terror is, in fact, a terrorist.
WILD: A parent losing track of their child on the hijacked plane! Somehow, a mother and father with two children whose loud tablet games are driving the other hijacked passengers to madness briefly stop paying attention to said kids, and one of them disappears to another part of the plane. This is literally what seatbelts are for. Read the cabin, kid, and stay in your seat! Do you want Will Forte stalking you in the future?
WEIRD: Marsha talking about Schrödinger’s cat? In third episode “Draw a Blank,” we spend a lot of time with Marsha at a university where she’s giving a speech about quantum theory, Schrödinger’s cat, and how “more than one thing could be true.” This scene is clearly meant to make us question what’s going on with KA29 and reassess our assumptions about what the hijackers are doing. But who has the patience for a thought experiment when hundreds of people’s lives are in danger? The Good Place already exists, Hijack! You don’t need to be that show!
WELCOME: A hijacking that’s actually stressful. In fourth episode “Not Responding,” NATO aircraft sent by Romania’s interior minister flank the plane and threaten to shoot it down; it’s pretty unsettling as the passengers realize “we’re what they’re protecting people from.” The hijackers make them pull down all the window blinds and it gets very dark and claustrophobic! Good stuff.
Co-pilot Anna Kovacs (Kaisa Hammarlund) can do it all: fly a plane, take a beating from a colleague, and, in a fifth-episode twist, speak Hungarian.
Photo: Apple TV
WILD: Oh, hey, an emergency cricothyrotomy! You may be familiar with this last-resort medical procedure, in which a pen, straw, or other cylindrical tube is used to create an airway, from other movies and TV such as M*A*S*H, Grey’s Anatomy, and ER. Hijack gets its own version in “Not Responding” when one of the hijackers is stabbed by a passenger with a tiny pair of scissors and is so injured that he starts choking on his own blood; ever-resourceful Sam uses the chaos to both make a surreptitious phone call using the hijacker’s phone and stab a pen in his chest to give him a way to breathe. A clever and gory example of how smart Hijack is when it comes to integrating brutality to keep us on edge, though, of course, our pop-culture understanding of the cricothyrotomy isbasically wrong.
WELCOME: Simon McBurney shows up. Admittedly, it takes a little while for Hijack to reveal what the hijackers actually want; that finally occurs in the fourth episode. But after the British government investigators on the ground realize that they are working with an internationally organized crime entity, things move very quickly in fifth episode “Less Than an Hour.” We learn that two men named Edgar Janssen (Simon McBurney) and John Bailey-Brown (Ian Burfield) are the masterminds are behind the hijacking; we learn that their gang is made up of transportation experts who move drugs, sex-trafficking victims, and weapons all around Europe; we learn that they’re willing to kill as many people on the plane — and off — as necessary to get their demands met. And when Hijack reveals character actor McBurney, who has been a baddie in Jane Eyre, The Manchurian Candidate, and Mission: Impossible — Rogue Nation, as one of its main villains, it immediately raises the stakes. McBurney is an actor capable of both menace and pomposity, and the prospect of him facing off against Elba is quite tantalizing. Give us the stare-off we’re waiting for, Hijack.
WILD: The sprawl of that organized-crime group! Waiting until more than midway through its season to clarify who the baddies are was a gamble for Hijack, but “Less Than an Hour” drives home their iron grip with a sequence in which Daniel (who isn’t that great at his job, honestly) loses sight of Elaine Atterton (Ruth Sheen), who is related to the hijackers. She’s explained that her family is being coerced by organized-crime leaders Edgar and John and that they’ll kill anyone they need to keep their business going. Zahra tells Daniel to take her hostage as a bargaining tool, but suddenly Elaine sneaks out of her house, outruns him through her backyard, wanders through woods in her robe, and sprints toward a busy highway. Elaine would rather kill herself by walking into traffic than cross Edgar and John, and that shocking cliffhanger is Hijack, with only two episodes to go, clicking into another gear. Idris, take the wheel!
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]