The scenes from the time just before Gilead have always struck me as The Handmaid’s Tale’s most powerful. Those glimpses of the sudden slide from democracy to sheer hell: when June’s credit cards were cut off, or when she laid in bed with Hannah as the Capitol Building imploded, or tried to protest with Moira only to face a hail of bullets. They are the next steps in a dissolution that some of us worry could happen right now (and that is happening at our border), that a woman’s rights could erode until she’s again nothing more than a piece of property, liable to be penned up and shuffled along with no recourse to exercise even an iota of your birth-determined freedoms.
So it’s fitting, and wrenching, that this season finale opens with June in the dark, behind those tentacles of plastic used in commercial refrigeration, lights flashing in her eyes, screams bouncing off the walls, as she stands frozen in the first moments after she’s been taken into custody and Gilead has her in its zealous, self-satisfied jaws.
If you’re wondering what footage of entry into Auschwitz might have looked like — or how refugees are treated when they cross our borders now — I imagine it would be something like this. Guards are ripping walkers away and tossing them into piles like those heaps of shoes and dolls and suitcases that line the halls of the Holocaust Museum and Dachau’s memorial site. Naked women are prodded, their flesh pushed open for examination. Gates and bars erected all around them keep the women moving straight, into funnels, cattle going to slaughter. First Gilead will take their independence, then their will to live, and finally, use of their ovaries. The male guards, meanwhile, are relishing all of it. (“Move it, bitch!”) They aren’t simply following orders; this is sport for them, a release of the pent-up indignation they so righteously claim is deserved. “Where does it come from, this talent for ruthlessness? Seems so easy for them, for these men, for men like these. It’s all they want, I suppose,” June reflects in her voice-over. “It isn’t about being right, or having the people or God on your side. It isn’t anything that grandiose. In the end, victory goes to the hardest heart.”
Except the ruthlessness June is describing isn’t limited to those male guards, ignoring her pleas for help and cramming groups of women into cargo trucks. June, too, has turned ruthless — in pursuit of justice, sure, but she wavers on the edge of self-aggrandizement throughout this finale. The plan to get these children out of Gilead has turned into June’s raison d’être, so much so that when a 10-year-old girl nearly runs away out of fear, June pulls a gun on her. Her firm righteousness is by turns inspiring (when she tells Lawrence that the house is really no longer his) and worrying. It’s a laudable direction to nudge the character, a woman whom Aunt Lydia points out “the other girls look up to,” whose powerlessness has sent her psyche swerving as far into confidence as it can handle, who sees no way out except a blaze of glory.
In the Toronto luxury ryokan/prison complex, Fred Waterford is playing his last hand, too. Serena is biding her time, it seems, until the authorities release her and she is reunited with Nichole. “I didn’t surrender my rights,” she insists. “I traded them for my daughter.” Will she have full custody? Visitation? Did the international community really promise a primary founder of Gilead the rights to a child born to a sex-trafficking victim who was kept hostage in her home? That much is unclear, and Luke and Moira seem left out of the equation.
What is certain is that Fred is pissed, and out of sheer spite he turns on Serena. But when Tuello strolls out into the fenced-in courtyard where Serena sits holding Nichole and showing her the stars and lights of the city, I wondered what crimes he could possibly charge her with. As it turns out, Tuello charges her with “crimes against humanity, sexual slavery, the rape of June Osborne,” all things Serena insists (in a bit of great physical acting from Yvonne Strahovski, who leans and lunges toward Nichole) that she was forced to do upon threat of execution herself. But the catch, Tuello explains, is that the one thing she did on her own, setting up Nick and June together so she could “claim the resulting child,” isn’t covered under any immunity clause.
It’s a fitting trap for Serena, a character whose greatest allure lies in the nebulous space she occupies. Both villain and victim, she’s slipped cleanly up and down the spectrum so many times that viewers have (wonderfully) never known whether she was about to hustle June to freedom or push her off a roof. Now she’ll go down for the one crime that, in a way, she didn’t commit. It’s true, of course, that she encouraged June and Nick to have sex, to create the child that she knew her husband’s low-energy sperm couldn’t. But their love affair did bloom of its own accord; that resulting child, we assume, was a product of their own agency.
So Serena must endure what June and all the other handmaids went through: “Her child” is taken from her arms and she’s propelled into a vast, faceless system. They might never see each other again.
Back in Gilead, there has never been a montage of domestic drudgery that zinged with so much spirit and promise. June struts through town as Alma, Janine, and a bevy of other handmaids drop bars of soap in her net shopping bag to signal that they’re in on the plan. Like a Real Simple article come to life, these crafty women have devised an innocuous signal with dual uses — June melts down that soap and uses it to smudge the windows and disguise what’s going on inside the house. They’re packing lunches, greasing the gate hinges, putting a red light in the window (a signal oddly reminiscent of a bordello) to let the incoming Marthas know they’ve found the right place.
But any good escape tale has a hitch thrown into its plans. In this case, a little girl and her Martha show up far earlier than June and Beth expected, standing in the bushes in broad daylight and risking exposure. They’ve walked from Lexington, a journey of about ten miles, after the Martha knocked out the Missus and fled in fear. The child is cowed, whether by the arduous nature of the journey or the crowd of unfamiliar women, but alone with June she finally asks a question, about what it’s like “out.” If June felt weighted with an important task before, her conversation with the little girl further pushes the point that it’s vital to get these children away from Gilead — many of them don’t remember a shred of American life, and they’re now programmed to wonder if God will still love them if they aren’t part of the Gileadean fold. The child is about Hannah’s age, June must realize. Too young to fully remember life with their real families, but now growing into the next generation of women who will be shackled to the Lord’s Cause.
From then on the drama only heightens. The Martha finally flees, fearful, and June pulls her gun. Lawrence returns home and tells June that they need to call off the whole expedition, that the Martha and girl were spotted earlier and road blocks have gone up. Perhaps it’s just because the show is finally blasting off with some sorely needed momentum, but every moment of June and Lawrence’s power struggle felt riveting, like the entire battle over women’s subjugation had been distilled down into this one interlude over the dining-room table. (I made a note for myself to come back and rewatch the scene — and I’ve done so, three times.) To the bitter end Lawrence sees himself as in charge, even though June has a gun pointed at his chest. “You’re still in my house, young lady,” he declares, as if she were 15 and came home with a septum piercing. But June, emboldened by her plot, by her weapon, by the surge of adrenaline that must be coursing through her, offers a response I now want tattooed on my forearm: “Men. Fucking pathological. You are not in charge. I am.”
From there the handmaids and Marthas must chart a new path to the airport (clearly the 800-person van that Lawrence was renting from Hertz will no longer do). So out into the woods they go, conveniently pre-torn sheet strips in hand, to create a path to the airport that the children and Marthas can follow.
On their return the light is out, a bad omen. But as they creep in they hear the sounds of Lawrence reading Treasure Island aloud to the far more than 52 kids that stand around his candle, kept silent and still by the tale of adventure. I think we’re meant to fall over in a faint for Lawrence at this point, to believe so fully in his redemption because he thinks of an activity for all those children and then selflessly refuses to hop aboard the plane himself. Instead, I was perplexed. How exactly does Lawrence plan to “clean up his mess” from inside Gilead, a place that will wrap his neck in rope faster than you can say treason? What does staying behind do, besides get him killed? And should we really sit in thrall to the man who invented the Colonies, just because he’s “redeemed” himself by trying to save his own neck? I love me some Bradley Whitford and his brilliant white beard, but there is no free pass for the desecration of an entire gender just because he played children’s librarian for a few hours.
The good news is that these children have been trained to be silent and get in lines. The bad news is that after a harrowing five-mile journey into gullies and through ravines, June, Janine, Rita, Beth, and the other handmaids arrive at the airport only to discover that a set of bolt cutters would have gone a long way.
And then it’s time, yet again, for a season-ending decision for June. And, yet again, she chooses to stay, to sacrifice herself, to not get the hell out of Dodge. How many times can one woman come so close to freedom and then change her damn mind? How much more can the showrunners milk out of this narrative of a trapped woman and her rebellious schemes?
Admittedly, the resulting scene — of the other handmaids and Marthas following June into the woods to launch a guerilla-style rock attack on the Guardians patrolling the airport’s fence line — is exhilarating and brilliantly paced. Hidden by the darkness of the woods, the women can torpedo the Guardians and take cover from the machine gun fire in a true David and Goliath–style battle. But June needs to take her heroism one step further, to lead the remaining Guardian away from the airport and give the plane time to take off without him whistling for help.
In the moment after June is shot, when she pulls the gun from her boot and aims it at the Guardian’s head, directing him to radio his unit with an “all clear,” I thought she’d been faking the gunshot wound, that it had missed her and she’d used the opportunity to her advantage. But then, after she blows his head off and stays on the ground, watching the plane soar off overhead, it slowly sank in that the wound was real. June isn’t going anywhere.
Why exactly were Moira and Luke and Emily all present for the arrival of this plane in Canada? I don’t know. I don’t think anyone knows. Yes, Moira works with refugees. Yes, Emily is a research scientist and therefore a kinda-sorta doctor. But should Moira really be first aboard that plane? Should Emily be manning the medical table? Should Luke just stand around so uselessly?
Whatever. After a minute or so I tossed my cynicism overboard because this reunion of little Rebecca and her father had big fat tears reaching my chin. And Luke’s desperate, whispered hope that one of the pink-clad little girls shuffling down the stairs might be Hannah only sent me further around the bend. After so much awful and so few victories, Rita’s embrace of Emily and Luke, her cry of “June did this,” did counteract some of this season’s more half-baked narrative moves.
So what now? The handmaids gather around June, sweeping her up onto a cloak and carrying her from the forest like a queen from a Bavarian fairy tale. Meanwhile, June slips into daydreams of Luke and Hannah — her light, perhaps, at the end of this long, grim tunnel. Janine and Alma and Brianna, women who were with her on that first day of Gilead, lean over her fluttering eyes. Once they’ve closed we don’t know if it’s for good. That’s the cliffhanger the show’s writers promised — an all-too-predictable question of whether June is dead or alive.
I, for one, hope she’s gone, that The Handmaid’s Tale can now veer off into a surprising new direction. But June’s troubles are, like a woman’s work, never done. So don’t be surprised to see those eyes shoot back open at the start of next season.
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()}});
}, {"3":3,"6":6,"17":17,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(17),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(3),appendLandingPageParams=require(135),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 i=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||i.classList.remove("open")})}function gtmSendReport(e,n,t){let i={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(i.eventLabel=n.href),gtm.reportNow(i)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const i=t.split("?"),o=new URLSearchParams(i[1]);for(let e of n.entries())o.set(e[0],e[1]);t=`${i[0]}?${o.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()||auth.isMobileAppRequest())&&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;
}, {"3":3,"4":4,"17":17,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),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(406),_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,"406":406,"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","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.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();
// ]]