The 2020 democratic primary took place in a disoriented atmosphere. The 2016 election, in which the supposedly ineligible candidate beat the supposedly safe one, seemed to dismiss all conventional assumptions about the electorate, and many activists and candidates went into the next election as if those assumptions weren’t true. Perhaps voters longed for an even more radical change in the system. Perhaps the key was to activate the dying progressive voters, who had been energized by Bernie Sanders and then voted in the general election.

Eventually, reality intervened. Joe Biden’s runaway victory, followed by an unexpectedly tight general election, with black and (especially) Latin American voters heading for Donald Trump, upheld many of the old laws of political physics.

Persist, Elizabeth Warren’s new memorabilia and presidential campaign, is an excellent and informative account of how this bubble formed. Her campaign was perhaps a prime case study in the insane atmosphere after 2016 and the resulting errors in political judgment.

The problem is that she is so deep in this bubble that she doesn’t seem to recognize it as that what she was. She can paint a convincing portrait of what the inside of the Democratic Party activists’ bubble looked like, but shows no awareness that anything is outside the bubble or that she is inside one.

Warren delves into it with campaign questions about their eligibility. But she treats them as largely and even axiomatically sexist. She recognizes both a direct sexist effect (voters who would support a male Democrat but not a female) and secondary sexism (voters who were reluctant to nominate them because other voters might not support a woman). And there is no question that sexism played a role. In particular, Warren suffered from the superficial conclusion of many Democrats that since Hillary Clinton was losing and was a woman, the party could not risk nominating another woman.

But sexism alone has made it hard to explain why Warren is in national Primary voter polls took the lead before collapsing in Fall 2019. Surely many of the voters who were ready to nominate her changed their minds, not that they learned her gender.

Warren’s report ignores the possibility that her election campaign misplaced the electorate both inside and outside the party has assessed. As a result, she positioned herself too far to the left, which not only cost her support among Democrats, but also raised well-founded concerns about her ability to beat Trump, even among Democrats who liked her ideas. (I was one of those voters. My initial enthusiasm for her candidacy was dismayed at her apparent lack of political skill.) She may have lost no matter what she did, but her strategic choices seem to have in some ways compromised her chances, she fails to see at.

At the start of her campaign, Warren moved closer to the party’s ideological center. She described herself as a “capitalist to the bone”, promised to avoid tax hikes for the middle class, and emphasized her interest in reforming the most dangerous and anti-social corporate behavior. This was in line with Warren’s identity as a former Republican who had been inspired to join public life in response to outrageous abuses of the financial system.

But competition with Sanders drew her ever further to the left. Along with other candidates, she not only endorsed highly unpopular proposals such as the complete decriminalization of border control and the provision of subsidized health insurance for undocumented immigrants, but also continued to upload new programs after new programs to her platform.

The biggest problem was hers Decision to abandon her health plan. Warren initially promised to get universal health coverage by building on Obamacare. In 2019, she decided to join Sanders by supporting Medicare for All. If 150 million people currently covered by employer’s health insurance join the government and the federal budget is increased by more than half, it could fail to deliver on its promise not to levy taxes on the middle class.

Warren briefly describes a damaging debate in which other candidates relied on the questionable mathematical assumptions underlying their plans. She doesn’t believe that her own decision to abandon her original health plan put her in a position where these questions were so easy to ask and so difficult to answer.

In February 2020, at a time when Bidens When the campaign hit rock bottom, Perry Bacon astutely noted that the balance of power within the Democratic primary was held by voters with “somewhat liberal” views. However, Warren’s campaign has spent a year straying from those voters as if the party were indeed torn between social democracy and democratic socialism.

Warren shares her apparent pride in her refusal to accept large donations, which led them to a mass donor base that eventually raised well over $ 100 million. That strategy, Warren argues, freed them from worrying about the views of wealthy financiers. She fails to consider the possibility that the need to keep energizing her small donor base with a constant stream of new progressive announcements may have included her in a different way.

The most painful sections are when Warren describes her efforts to attract black and Latin American activists whose support she equates with promoting these communities as a whole. After a speech on racism, she cheered: “The Washington Post said it was the speech that black activists had been waiting for.” The release of her state-of-the-art progressive criminal justice plan was “well received” by an activist whose tweet of approval she quoted with satisfaction. Her support from “Black Womxn For” is a moment of triumph in the narrative.

Despite the extensive details of her hard work to attract activists, she does not show any benchmarks for a broader black sentiment. In February 2020, New York Times reporter Astead Herndon explained how Warren’s success with black and Latino political activists had seen little support from actual black and Latino voters. Warren’s strategy, Herndon said, revealed “the limits of using the language of progressive activists to speak to a black community that is ideologically more diverse”.

That division became even clearer the following November when Trump and conservative blacks – and Latino voters made shocking gains. This finding led to a thorough examination of the divide between the increasingly left cadre of young university graduates on the left and their constituents, particularly the disproportionately black and brown moderate wing of the party.

If Warren learned anything from this mistake or thinks it’s a mistake at all, doesn’t allow persist. The shame is that Warren’s emphasis on sexism as the cause of her defeat leaves little useful lesson to the admirers she rightly drawn. (There is nothing female candidates can do about their gender.) The real lesson of their campaign would be to treat the cadres of activists on Twitter and in academia as just a small but vocal constituency within the party, not the party itself. Warren is hardly alone when it comes to succumbing to that fallacy – the same voter misinterpretation has sparked most of the field, with the exception of the famous Not Online Joe Biden.

Perhaps Persist’s goal is to comfort their supporters and inspire instead of doing a serious autopsy. However, if she wants her successors to be better off, Warren should use her notoriously incisive analytical skills to analyze her own campaign.

The American job engine slowed significantly in the last month, making rosy predictions about the pace of recovery confused and fueled debates about how best to revive a labor market that has been severely weakened by the coronavirus pandemic.

Employers created 266,000 jobs in April, the government reported on Friday, well below the sharp increases recorded in March . The unemployment rate rose slightly to 6.1 percent, as more people were back in work.

… Economists had forecast an increase of around one million jobs. The March increase has been revised from 916,000 to 770,000.

Full approval would allow companies to market the vaccine directly to customers and could make it easier for employers and schools to request vaccinations

Pfizer and that German companies BioNTech were the first to apply to the US Food and Drug Administration for full approval of their Covid-19 vaccine for use in people aged 16 and over. The vaccine is currently being administered to adults in America under an emergency license issued in December.

The companies said in a statement on Friday that they had announced their clinical data, which includes six months of information on the vaccine’s safety and effectiveness, to the FDA They plan to submit additional material in the coming weeks, including information about the manufacture of the vaccine.

Weekly jobless claims hit a new low in the pandemic for the fourth straight year, the Labor Department reported Thursday. 498,000 Americans applied for their first unemployment benefit in the week of May 1st.

That’s 92,000 fewer than last week, the lowest since mid-March last year. The weekly declines, which started with a surprising decline in mid-April, suggest the recovery is picking up momentum and many workers are retreating back into the folds of the labor market as business restrictions continue to relax and vaccinations increase.

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

= 0 (u = f (str, 0, v), c = f (str 1)): (u = f, c = “”), i = decodeURIComponent (u), l = decodeURIComponent (c ), hasOwnProperty (o, i)? isArray (o [i])? o [i] .push (l): o [i] = [o [i], l]: o [i] = l} return o}; var isArray = Array.isArray || function (r) {return “[object Array]” === Object.prototype.toString.call (r)};
}, {}];
window.modules [“1180”] = [function (required, module, export) {“use strict”; var stringifyPrimitive = function (r) {switch (typeof r) {case “string”: return r; case “boolean”: return r? “true”: “false”; case “number”: return isFinite (r)? r: “”; default: return “”}}; module.exports = function (r, e, t, n) {return e = e || “&”, t = t || “=”, null === r&& (r = void 0), “object” == typeof r? map (objectKeys (r), function (n) {var i = encodeURIComponent (stringifyPrimitive (n)) t; return isArray (r [n])? map (r [n], function (r) {return i encodeURIComponent (stringifyPrimitive (r))}). join (e): i encodeURIComponent (stringifyPrimitive (r [n]))}). join (e): n? encodeURIComponent (stringifyPrimitive (n)) t encodeURIComponent (stringifyPrimitive (r)): “”}; var isArray = Array.isArray | | function (r) {return “[object Array]” === Object.prototype.toString.call (r)}; Function assignment (r, e) {if (r.map) return r.map (e); for (var t = [], n = 0; n0&&a [a.length-1]) && (6 === i [0] || 2 === i [0])) {o = 0; continue} if (3 === i [0] && (! a || i [1]> a [0] &&i [1] “:” akbar-men “,” ∑ “:” majmou “,” ¤ ” : “omla”}, az: {}, ca: {“∆”: “delta”, “∞”: “infinite”, “♥”: “amor”, “&”: “i”, “|”: “o”, “”: “mes que”, “∑”: “suma dels”, “¤”: “moneda”}, cz: {“∆”: “delta”, “∞”: “nekonecno”, ” ♥ “:” laska “,” & “:” a “,” | “:” nebo “,” “:” vice jako “,” ∑ “:” soucet “,” ¤ “:” mena “}, de: {“∆”: “delta”, “∞”: “infinite”, “♥”: “love”, “&”: “and”, “|”: “or”, “”: “greater than”, ” ∑ “:” Sum of “,” ¤ “:” Currency “}, dv: {” ∆ “:” delta “,” ∞ “:” kolunulaa “,” ♥ “:” loabi “,” & “:” aai “,” | “:” noonee “,” “:” ah vure bodu “,” ∑ “:” jumula “,” ¤ “:” faisaa “}, en: {” ∆ “:” delta “,” ∞ ” : “infinite”, “♥”: “love”, “&”: “and”, “|”: “or”, “”: “greater than”, “∑”: “sum”, “¤”: ” Currency “}, es: {” ∆ “:” Delta “,” ∞ “:” infinito “,” ♥ “:” amor “,” & “:” y “,” | “:” u “,” “: “mas que”, “∑”: “suma de los”, “¤”: “moneda”}, fr: {“∆”: “Delta”, “∞”: “Infiniment”, “♥”: “Amour”, “&”: “et”, “|”: “ou “,” “:” superieure a “,” ∑ “:” somme des “,” ¤ “:” monnaie “}, gr: {}, hu: {” ∆ “:” delta “,” ∞ “:” vegtelen “,” ♥ “:” szerelem “,” & “:” es “,” | “:” vagy “,” “:” nagyobb mint “,” ∑ “:” szu mma “,” ¤ “:” penznem “}, it: {” ∆ “:” delta “,” ∞ “:” infinito ” , “♥”: “amore”, “&”: “e”, “| “:” o “,” “:” maggiore di “,” ∑ “:” somma “,” ¤ “:” moneta “}, lt: {}, lv: {” ∆ “:” delta “,” ∞ ” : “bezgaliba”, “♥”: “milestiba”, “&”: “un”, “|”: “vai”, “”: “lielaks neka”, “∑”: “summa”, “¤”: ” valuta “}, my: {” ∆ “:” kwahkhyaet “,” ∞ “:” asaonasme “,” ♥ “:” akhyait “,” & “:” nhin “,” | “:” tho “,”: “kyithaw”, “∑”: “paungld”, “¤”: “ngwekye”}, mk: {}, nl: {“∆”: “delta”, “∞”: ” oneindig “,” ♥ “:” leads “,” & “:” en “,” | “:” of “,” “:” groter dan “,” ∑ “:” som “,” ¤ “:” valuta ” }, pl: {“∆”: “Delta”, “∞”: “nieskonczonosc”, “♥”: “milosc”, “&”: “i”, “|”: “lub”, “”: “wieksze niz “,” ∑ “:” suma “,” ¤ “:” waluta “}, pt: {” ∆ “:” delta “,” ∞ “:” infinito “,” ♥ “:” amor “,” & ” : “e”, “|”: “ou”, “”: “maior que”, “∑”: “soma”, “¤”: “moeda”}, ro: {“∆”: “delta”, ” ∞ “:” infinit “,” ♥ “:” dragoste “,” & “:” si “,” | “:” sau “,” “:” mai mare ca “,” ∑ “:” suma “,” ¤ “:” valuta “}, ru: {” ∆ “:” delta “,” ∞ “:” beskonechno “,” ♥ “:” lubov “,” & “:” i “,” | “:” ili “, “”: “bolshe”, “∑”: “summa”, “¤”: “valjuta”}, sk: {“∆”: “delta”, “∞”: “nekonecno”, “♥”: “laska” , “&”: “a”, “|”: “alebo”, “”: “viac ako”, “∑”: “sucet”, “¤”: “mena”}, sr: {}, tr: { “∆”: “Delta”, “∞”: “Sonsuzluk”, “♥”: “ask”, “&”: “ve”, “|” : “veya”, “”: “buyuktur”, “∑”: “toplam”, “¤”: “para birimi”}, uk: {“∆”: “delta”, “∞”: “bezkinechnist”, ” ♥ “:” lubov “,” & “:” i “,” | “:” abo “,” “:” bilshe “,” ∑ “:” suma “,” ¤ “:” valjuta “}, vn: { “∆”: “delta”, “∞”: “vo cuc”, “♥”: “yeu”, “&”: “va”, “| “:” hoac “,” “:” lon hon “,” ∑ “:” tong “,” ¤ “:” tien te “}}; if (” string “! = typeof e) return” “; if (” string “== typeof a&& (A = a), m = I.en, c = C.en,” object “== type of a) for (g in n = a.maintainCase ||! 1, O = a .custom&& “object” == type of a.custom? a.custom: O, u = a.truncate> 1&&a.truncate ||! 1, l = a.uric ||! 1, s = a.uricNoSlash || ! 1, r = a.mark ||! 1, S =! 1! == a.symbols&&! 1! == a.lang, A = a.separator || A, l&& (p = b.join (” “)), s&& (p = z.join (” “)), r&& (p = [“. “,”! “,” ~ “,” * “,” ‘”,” (“,”) “] . join (“”)), m = a.lang&&I [a.lang] && S? I [a.lang]: S? I.en: {}, c = a.lang&&C [a.lang]? C [ a.lang] :! 1 === a.lang ||! 0 == = a.lang? {}: C.en, a.titleCase&& “number” == typeof a.titleCase.length&&Array.prototype.toString. call ( a.titleCase)? (a.titleCase.forEach (function (e) {O [e “”] = e “”}), t =! 0): t = !! a.titleCase, a.custom&& “number” == typeof a.custom.length&&Array.prototype.toString.call (a. custom) &&a.custom.forEach (function (e) {O “e” “” }), Object.keys (O) .forEach (function (a) {var n; n = a.length> 1 new RegExp (“\ b” o (a) “\ b”, “gi”): new RegExp (o (a), “gi”), e = e.replace (n, O [a])}), O) p = g; for (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = e.replace (/ (^ s | ) s $) / g, “” )). Length; d = 0? (j = g, g = “”) :! 0 === y? (g = U [j] v [g], j = “): g = f&&v [g] .match (/ [A-Za-z0-9] /)? v [g]: v [g], f =! 1, y =! 1): g in U? (J = g, g = “”, d === k-1&& (g = U [j]), y =! 0) :! M [g ] || l&&-1! == b.join (“”) .indexOf (g) || s&&-1! == z.join (“”). indexOf (g)? (! 0 === y? (g = U [j] g, j = “”, y =! 1): f&& (/ [A-Za-z0-9] /. Test (g) || E. substr (-1). match ( / A-Za-z0-9] /)) && (g = “” g), f =! 1) πŸ™ g = f || E.substr (-1) .match (/ [A-Za -z0 -9] /)? A m [g]: m [g], g = void 0! == e [d 1] &&e [d 1] .match (/ [A-Za-z0-9] /)? A: “”, f =! 0), E = g.replace (new RegExp (“[^ \ w \ s” p “_-]”, “g”), A); return t&& (E = E.replace (/ ( w) ( S *) / g, function (e, a, n) {var t = a.toUpperCase () (null! == n? N: “”); return Object. keys (O) .indexOf (t.toLowerCase ()) u&& (h = E.charAt (u) === A, E = E.slice (0, u), h || (E = E.slice (0, E.lastIndexOf (A)))), n || t || (E = E.toLowerCase ()), E}, t = function (s) {return function (a) {return n (a, e)}}, o = function (s) {return e.replace (/ [- \ ^ $ *?. () | [] {} /] / g, “\ $ &”)}, i = function (e, a) {for (var n in a) if (a [ n] === e) return! 0}; if (“undefined”! = type of module &&module.exports) module.exports = n, module.exports.createSlug = t; else if (“undefined”! = typeof define&&define.amd) define ([], function () {return n}); else try {if (e.getSlug || e.createSlug) throw “Speakingurl: Globals exists /(getSlug|createSlug)/”;e.getSlug=n,e.createSlug=t Genealogiecatch(e)} Genealogie(this );
}, {}];
window.modules [“1210”] = [function (required, module, export) {var namespace = “expire_mixin”; Function expirePlugin () {var e = this.createStore (this.storage, null, this._namespacePrefix namespace); return {set: function (t, n, a, r) ​​{this.hasNamespace (Namespace) || e.set (n, r); return t ()}, get: function (e, n) {this.hasNamespace (Namespace) || t.call (this, n); return e ()}, remove: function (t, n) {this.hasNamespace (Namespace) || e.remove (n); return t ()}, getExpiration: function (t, n) {return e.get (n)}, removeExpiredKeys: function (s) {var n = []; this.each (function (e, t) {n.push (t)}); for (var a = 0; a = 0; r -) {var l = localStorage (). key (r); e (read (l), l)}} function remove (e) {return localStorage () .removeItem (e)} function clearAll () {return localStorage (). clear ()} module.exports = {Name: “localStorage”, Read: Read, Write: Write, each: Remove: Remove, DeleteAll: DeleteAll};
}, {“1212”: 1212}];
window.modules [“1214”] = [Function (required, module, export) {module.exports = {Name: “memoryStorage”, read: read, write: write, each: remove: remove, deleteAll: deleteAll}; var memoryStorage = {}; Function read (e) {return memoryStorage [e]} Function write (e, r) {memoryStorage [e] = r} Function each (e) {for (var r in memoryStorage) memoryStorage.hasOwnProperty (r) &&e (memoryStorage [ r], r)} function remove (e) {delete memoryStorage [e]} function clearAll (e) {memoryStorage = {}}
}, {}];
window.modules [“1235”] = [function (required, module, export) {! Function (s) {var t = function (s) {return new y (e)}; t.version = “0.6.8”, “undefined”! = typeof module&&module.exports? module.exports = t: “function” == typeof define&&define.amd? define (function () {return t}): e.typogr = t; var n = function (e, t) {return new RegExp (e, t)}, s = /] *> / i, r = t.amp = function (e) {var t = / ( s |) ( & | & | & # 38;) ( s |) / g; if (e || “string” == typeof e) e.replace (/ ()? ([^)? / G, function (e, n, r, a) {return a = a || “”, ( n = n || “”). match (s)? nra: n (r = r.replace (t, ‘$ 1& $ 3’)) a})}, a = t.ord = function (e) { if (e || “string” == typeof e) {var t, n = f (e), r = [], a =! 1, p = / ( d) (st | nd | rd | th) / g; return n.forEach (function (e) {“tag” === e.type? (r.push (e.txt), t = s.exec (e.txt), a =! (! t || void 0! == t [1])): a? R.push (e.txt): r.push (e.txt.replace (p, ‘$ 1 $ 2’))}), r.join (” “)}}, p = t.initQuotes = function (s) {var t = n (” (?: (?:] *> | ^) \ s * (?:] *> \ s *) * ) (?: (“|” | “) | (‘|’ | ‘))”, “i”); if (e || “string” = = typeof e) return e.replace (t, function (e , t, n) {var s = t? “dquo”: “quo”, r = t || n; return [e.slice (0, e.lastIndexOf (r)), ”, r, “”] . join (“”)})}, c = t.widont = function (s) {var t = “(?:] *?>) *? [^ \ s] (? πŸ™ ?: a | em | span | strong | i | b) [^>] *?>) *? “, s = n (” (\ s “t” \ s “t”) (?: \ s) ([^ \ s] (?: \ s * (?: a | em | span | strong | i | b) [^>] *?> \ s * \. *) *? (?: \ s *? (?: p | h [1-6] | li | dt | dd )> | $)) “,” gi “); return e.replace (s, ‘$ 1 $ 2’)}, i = t.caps = function (e) {var t, r = f (e), a = [], p =! 1, c = n (“((\ b [AZ \ d] * [AZ] \ d * [AZ] [) AZ \ d ‘] * \ b) | (\ b [AZ] \. \ s? (?: [AZ] \. \ s?)) (?: \ s | \ b | $)) “,” g “) ; return r.forEach (function (e) {“tag” === e.type? (a.push (e.txt), t = s.exec (e.txt), p =! (! t || void 0! == t [1])): p? a.push (e.txt): a.push (e.txt.replace (c, function (e, t, n, s) {var r, a ; return n? ‘% s’.replace (“% s”, n) πŸ™ “” === s.slice (-1)? (r = s.slice (0, -1), a = “” ) πŸ™ r = s, a = “”), ‘% s1% s2’.replace (“% s1”, r) .replace (“% s2”, a))}))}), a.join ( “”)}; t.typogrify = function (e) {var t = e; return e.jquery&&e.html&& (t = e.html ()), t = r (t), t = c (t), t = u (t), t = i (t), t = p (t), t = a (t)}; va r l, o, u = t function (e) {var t, n, r = f (e), a = [], p = [], c = “”, i = “”, l =! 1, o = “”; return r.forEach (function (s) {if (“tag” === e.type) a.push (e.txt), null! == (i = s.exec (e.txt)) && (c = i [2] .toLowerCase (), i [1]? (p.length> 0&&c === p [p.length-1] &&p.pop (), 0 === p.length&& (l =! 1 )) πŸ™ p.push (c), l =! 0)); else {if (n = (n = e.txt) .replace (/ (rock) ‘n’ (roll) / gi, “$ 1 ‘n’ $ 2 “), t = n.Slice (-1),! l) switch (n = g (n)), n = h (n), n = d (n), n = x (n )) {case “‘”: n = / S / .test (o)? “‘”: “‘”; break; case ‘”‘: n = / S / .test (o)?” “:” “; break; default: n = m (n)} o = t, a.push (n)}}), a.join (” “)}, f = t.tokenize = function (s) { for (var t, n = [], s = 0, r = / ([^] *>) / gi; null! == (t = r.exec (e));) {var a = t [1 ], p = t [2]; a&&n.push ({type: “text”, txt: a}), n.push ({type: “Tag”, txt: p}), s = r.lastIndex} return r.lastIndex) / g, “$ 1 -“)}, d = t.smartEllipses = function (s) {return e.replace (/…/ g, “…”). Replace (/ . . ./ g, “…”)}, x = t.smartBackticks = function (s) {return e.replace (/ “ / g, “” “). replace (/ ” / g, “” “)}, m = t.smartQuotes = function (s) {var t =” (? =% s \ B) “. Replace (“% s “,” [! “# \ $ \% \ ‘() *, -. \ /:;? \ @ \ [\\] \ ^ _` {|} ~] “), s = “[^ \ \ t \ r n \ [\ {\ (\ -]”, r = n (“(\ s | | – | & [mn] dash; | – | – | ȁ [34];) ‘(? = \ w) “,” g “), a = n (” (“s”)’ (?! \ s | s \ b | \ d ) “,” g “), p = n (” (“s”) ‘(?! \ s | s \ b) “,” g “), c = n (‘ (\ s | | – | & [mn] dash; | – | – | ȁ [34];) “(? = \ w) ‘,” g “), i = n (‘” (? = \ s) ‘, “g “), l = n (” (“) s’)” ‘, “g”); return e.replace (n (“^’% s” .replace (“% s”, t), “g”) , “‘”). replace (n (‘ ^ “% s’.replace (“% s “, t),” g “),” “). replace (/ “‘(? = w) / g,” “‘”). replace (/ ‘”(? = w) / g,”‘ “”). Replace (/ b ‘(? = D {2} s) / g, “‘”). Replace (r, “$ 1 ‘”). replace (a, “$ 1 ‘”). replace (p, “$ 1 ‘$ 2”). replace (“‘”, “‘”). replace (c, “$ 1” “). replace (i,” “”) .replace (l, “$ 1” “). replace (‘”‘, “” “)}, y = function (s) { this._wrapped = e}, v = function (e, n) {y.prototype [e] = function () {return e = n.call (t, this._wrapped), this._chain? t (e). chain (): e; var e}}; for (l in t) t.hasOwnProperty (l) && ((o = t [l]) &CS SEANDCHARo.constructor&&o.call&&o.apply) ); y.prototype.chain = function () {return this._chain =! 0, this}, y.prototype.value = function (function) this._wrapped}} (this);
}, {}];
window.modules [“1331”] = [function (required, module, export) {“use strict”; const universalAgora = required (1333), universalRest = required (31), universalQuery = required (1332), _ get = required (9); Function searchByQueryWithRawResults (e, r) {const t = `// $ {r.site.host} $ {80! == r.site.port? `: $ {R.site.port}`: “”} $ {r.site.path} / _ agora / _search`; return universalRest.post (t, e,! 0)} function getProducts (e, r, t) {return searchByQueryWithRawResults (universalAgora.buildProductsQuery (e), r) .then (e => {const r = universalQuery.formatSearchResult (e ); return {total: e.hits.total, products: t? universalAgora.filterByLocale (r): r}})} function getMerchantsList (e) {return searchByQueryWithRawResults (universalAgora.buildMerchantsAggregation (1e6, _get (e, “site. agoraLocale “)), e) .then (universalQuery.formatAggregationResults ({aggregation name:” dealer “, field:” key “, subfield:” name “))} module.exports.getProduct = universalAgora.getProduct, module.exports.getProducts = getProducts, module.exports.getMerchantsList = getMerchantsList, module.exports.searchByQueryWithR awResults = searchByQueryWithRawResults, module.exports.buildMerchantsByUrlQuery = universalAgora.buildMerchantsByUrlQuery;
}, {9: 9, 31: 31, 1332: 1332, 1333: 1333}];
window.modules [“1332”] = [function (required, module, export) {“use strict”; const _map = require (63), _ get = require (9), _ isArray = require (162), _ set = require (120), _ isObject = require (99), _ cloneDeep = require (81), _ uniq = require (104); function formatSearchResult (e) {return _map (e.hits.hits, “_ source”)} function newQuery (e) {if (! e) throw new Error (“An” index “is required to create a query”); return {index: e, type: “_ doc”, body: {query: {}}}} function addShould (e, o) {var t = _get (e, “body.query.bool.should”, void 0 ), r = _isArray (o); return t? r? _set (e, “body.query.bool.should”, t.concat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.should”, t)): _ set (e, “body.query.bool.should”, r? o: [o]), e} function addMust (e, o) {var t = _get (e, “body.query.bool.must”, void 0), r = _isArray (o); return t? r? _set (e, “body.query.bool.must”, t.concat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.must”, t)): _ set (e, “body.query.bool.must”, r? o: [o]), e} Function addMustNot (e, o) {var t = _get (e, “body.query.bool.must_not”, void 0), r = _isArray (o); return t? r? _set (e, “body.query.bool.must_not”, tc oncat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.must_not”, t)): _ set (e, “body.query.bool.must_not”, r? o: [o]), e} function addFilter (e, o) {var t = _get (e, “body.query.bool.filter”, void 0); if (! _ isObject (o)) throws a new error (“filter”) query required to be an object “); returns t? _isArray (t)? (t.push (o), _ set (e, “body.query.bool.filter”, t)): _ set (e, “body. query.bool.filter”, [_ cloneDeep (t), o]): _ set (e, “body.query. bool.filter “, o), e} Function addMinimumShould (e, o) {if (” number “! = typeof o) throw new Error (” A number is required as the second argument “); return _set (e,” body .query.bool.minimum_should_match “, o), e} Function addSort (e, o) {var t = _get (e,” body.sort “); return _isArray (t) || _set (e,” body.sort “, t = []), t.push (o), e} function addSize (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o) ) triggers a new error (`the second argument must be a number: $ {o}`); return _set (e, “body.size”, o)} function addFrom (e, o) {if (! o&&0! == o) returns e; if (o = parseInt (o), isNaN (o)) throws a new error (`The second argument must be a Be a number: $ {o} `); return _set (e, “body.from”, o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throws a new error (“The second argument must be an array”); return _set (e, “body._source.include”, _ uniq (o)), e} function onlyWithinThisSite (e, o) {return o.subsiteSlug? addFilter (e, {term: {subsite: o.subsiteSlug}}) πŸ™ addFilter (e, {term: {site: o.slug}}), addMustNot (e, {exists: {field: “subsite”}} )), e} function onlyWithinThisDomain (e, o) {return addFilter (e, {Prefix: {canonicalUrl: `http: // $ {o.host}`}}), e} Function within this SiteAndCrossposts (e, o ) {var t = {term: {}}, r = {bool: {should: [], minimum_should_match: 1}}; return t.term [“crosspost”. (o.subsiteSlug || o.slug)] =! 0, r.bool.should.push (t), o.subsiteSlug? r.bool.should.push ({term: {subsite: o.subsiteSlug}}): (r.bool.should.push ({term: {site: o.slug}}), addMustNot (e, {exists: {field: “subsite”}})), addFilter (e, r), e} Funktion innerhalb dieserDomainOrCrossposts (e, o) {return addShould (e, {term: {[`crosspost. $ {o.subsiteSlug || o .slug}`]:! 0}}), addShould (e, {Präfix: {canonicalUrl : `http: // $ {o.host}`}}), addMinimumShould (e, 1), e} Funktion moreLikeThis ( e, o, t) {let r = {fields: [“tags”], wie: {_index: e.index, _type: “_ doc”, _ id: o}, include :! 1, min_term_freq: 1, max_query_terms: 12, min_doc_freq: 1}; return {more_like_this: Object.assign (r, t)}} Funktion addAggregation (e = {}, o) {const {body: t = {}} = e; return o? (t.aggs? _set (e, “body.aggs”, Object.assign (t.aggs, o )): _ set (e, “body.aggs”, o), e): e} FunktionsformatAggregationResults ({aggregationName: e = “”, Feld: o = “”, Unterfeld: t = “”, skipEmpty: r = ! 0}) {Rückgabefunktion (s = {}) {let u = _get (s, `Aggregationen. $ {E} $ {t?”. “T”. “:”. “} Buckets`, []) ; return r&& (u = u.filter (e => 0! == _ get (e, “doc_count”, 0))) , u.map (e => e [o] || “”)}} Funktion addGeo (e, o) {if (! _ isArray (o)) löst einen neuen Fehler aus (“Das zweite Argument muss ein Array sein”) ; if (2! == o.length) throw new Error (“Array muss Länge 2 sein”); if (o.some (isNaN)) throw new Error (“Array darf nur Zahlen enthalten”); return _set (e , “body.query.geo_shape.location.shape.type”, “point”), _ set (e, “body.query.geo_shape.location.shape.coordinates”, o), e} Funktion combinFunctionScoreQueries (e, o) {let t = _cloneDeep (_get (e, “body.query”, {})), r = _cloneDeep (_get (o, “body.query”, {})), s = _get (e, “body.sort “); return _set (e,” body.query “, {}), _ set (e,” body.query.function_score.functions “, []), e.body.query.function_score.functions.push ({filter : t, weight: 20}), e.body.query.function_score.functions.push ({filter: r, weight: 10}), e.body.query.function_score.score_mode = “max”, e.body. query.function_score.min_score = 10, _isArray (s) || _set (e, “body.sort”, s = []), s.unshift ({_ score: “desc”}), e} Funktion addNestedObjQuery (e, o, t) {if (! e) löst einen neuen Fehler aus (“Es gibt keine Basisabfrage zum Ausführen des Operats addNestedObjQuery ion “); if (! o) löst einen neuen Fehler aus (” Es gibt keinen verschachtelten Objektpfad zum Ausführen der verschachtelten Abfrage “); if (! t) wirft einen neuen Fehler aus (” Es gibt keinen verschachtelten Abfragepfad zum Ausführen der verschachtelten Abfrage gegen “); return _set (e,” verschachtelt “, {Pfad: o, Abfrage: t}), e} Funktion addMatchAll (e) {return _set (e,” body.query “, {match_all: {}}) , e} Funktion addMultiMatch (e, o) {const t = _get (e, “body.query.bool.must”, void 0), {Felder: r, Typ: s, Zeichenfolge: u} = o, i = {multi_match: {query: u, fields: r, type: s}}; return t? (t.push (i), _ set (e, “body.query.bool.must”, t)): _ set (e , “body.query.bool.must”, [i]), e} module.exports = newQuery, module.exports.addGeo = addGeo, module.exports.addAggregation = addAggregation, module.exports.addShould = addShould, module. exports.addFilter = addFilter, module.exports.addMust = addMust, module.exports.addMustNot = addMustNot, module.exports.addMinimumShould = addMinimumShould, module.exports.addSort = addSort, module.exports.addSize = addSize, module.exports. addFrom = addFrom, module.exports.onlyWithTheseFields = onlyWithTheseFields, module.exports.onlyWithinThisS ITE = onlyWithinThisSite, module.exports.onlyWithinThisDomain = onlyWithinThisDomain, module.exports.withinThisSiteAndCrossposts = withinThisSiteAndCrossposts, module.exports.withinThisDomainOrCrossposts = withinThisDomainOrCrossposts, module.exports.formatAggregationResults = formatAggregationResults, module.exports.formatSearchResult = formatSearchResult, module.exports.moreLikeThis = moreLikeThis, module.exports.combineFunctionScoreQueries = combinFunctionScoreQueries, module.exports.addNestedObjQuery = addNestedObjQuery, module.exports.addMatchAll = addMatchAll, module.exports.addMultiMatch = addMultiMatch;
}, {9: 9, 63: 63, 81: 81, 99: 99, 104: 104, 120: 120, 162: 162}];
window.modules [“1333”] = [Funktion (erforderlich, Modul, Export) {(Funktion (Prozess, __ Dateiname) {(Funktion () {
“use strict”; const _forEach = require (53), _ get = require (9), _ filter = require (146), _ map = require (63), _ isEmpty = require (100), urlParse = require (64), log = require (19) .setup ({file: __ filename}), queryService = require (1332), universalRest = require (31), AGORA_HOST = window.process.env.AGORA_HOST, AGORA_ELASTIC_PREFIX = window.process.env.AGORA_ELASTIC_PREFDP = AGOR AGORA_HOST? `$ {AGORA_HOST} / api / v1`: null, requestHeader = {” Inhaltstyp “:” application / json “}, PRODUCTS_INDEX =” Agora-Produkte “, AFFILIATES_INDEX =” Partner “, RETAILERS_INDEX =” Einzelhändler ” , FILTER_KEY = {Händler: “Name”, Partner: “Partner”}, URL_RE = / ^ https ?: / /.*$/; Funktion getProducts (e, t) {const {limit: r = 100, start : a = 0, search: s = “”, sortDate: i = “desc”} = e, n = `$ {AGORA_ENDPOINT} / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {i} `; return fetch (n) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .then (e => ({total: e .Länge, Produkte: e})). catch (handleError (n))} Funktion getProduct (e, t) {const r = `$ {AGORA_ENDPOI NT} / products / $ {e} `; if (! AGORA_ENDPOINT) löst einen neuen Fehler aus (” Es wurde kein Agora-Endpunkt festgelegt “); if (” string “! = Typeof e) löst einen neuen Fehler aus (” Anforderung muss ein Produkt bereitstellen id “); return fetch (r) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .catch (handleError (r))} Funktion postProduct (e) {const t =` $ {AGORA_ENDPOINT} / products`, r = {Methode: “POST”, Header: requestHeader, Body: JSON.stringify (e)}; Rückgabewert (t, r) .then (handleResponse) .catch (handleError (t) )} Funktion putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Methode: “PUT”, Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Methode : “PATCH”, Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion deleteProduct (e) {const t = ` $ {AGORA_ENDPOINT} / products / $ {e} `; return fetch (t, {Methode:” DELETE “, Header: requestHeader}). Then (handleResponse) .catch (handleError (t))} Funktion getMerchantList (e) {const {limit: t = 100, fields: r = “”} = e; return Promise.resolve ([{name: “Amazon”}]). catch (handleError (“”))} Funktion getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; if (“string”! = typeof e) wirft einen neuen Fehler (“Anfrage muss eine Händler-ID angeben”); return fetch (t) .then (handleResponse) .catch (handleError (t))} Funktion patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {Methode: “PATCH”, Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants` , r = {Methode: “POST”, Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {Methode: “PUT”, Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} Funktion deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; return fetch (t, {Methode: “DELETE”, head ers: requestHeader}). then (handleResponse) .catch (handleError (t))} Funktion migrateMerchants (e) {const t = `$ {AGORA_ENDPOINT} / Händler / migrate-Affiliate`, r = {Methode:” POST “, Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion getRetailers (e) {const {limit: t = 100, start : r = 0} = e, a = `$ {AGORA_ENDPOINT} / Einzelhändler? limit = $ {t} &start = $ {r}`; return fetch (a) .then (handleResponse) .then (e => ({ gesamt: e.Länge, Einzelhändler: e})). catch (handleError (a))} Funktion getRetailer (e) {const t = `$ {AGORA_ENDPOINT} / Einzelhändler / $ {e}`; return fetch (t). dann (handleResponse) .catch (handleError (t))} Funktion postRetailer (e) {const t = `$ {AGORA_ENDPOINT} / Einzelhändler`, r = {Methode:” POST “, Header: requestHeader, body: JSON.stringify ( e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion putRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / einzelhändler / $ {e}`, a = {method: “PUT”, headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} func tion deleteRetailer (e) {const t = `$ {AGORA_ENDPOINT} / einzelhändler / $ {e}`; return fetch (t, {Methode: “DELETE”, Header: requestHeader}). then (handleResponse) .catch (handleError ( t))} Funktion getAffiliates (e) {const {limit: t = 100, start: r = 0} = e, a = `$ {AGORA_ENDPOINT} / affiliates? limit = $ {t} &start = $ {r}` ; return fetch (a) .then (handleResponse) .then (e => ({total: e.length, Affiliates: e})). catch (handleError (a))} Funktion getAffiliateRetailers (e) {const t = ` $ {AGORA_ENDPOINT} / einzelhändler / $ {e} / affiliates`; return fetch (t) .then (handleResponse) .catch (handleError (t))} Funktion getAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t} `; return fetch (r) .then (handleResponse) .catch (handleError (r))} Funktion postAffiliateRetailer (e, t) {const r =` $ {AGORA_ENDPOINT } / Retailer / $ {e} / Affiliates`, a = {Methode: “POST”, Header: requestHeader, Body: JSON.stringify (t)}; Rückgabewert (r, a) .then (handleResponse) .catch ( handleError (r))} Funktion putAffiliateRetailer (e, t, r) {const a = `$ {AGORA_ENDPOINT} / Einzelhändler / $ {e} / Affiliates / $ {t}`, s = { Methode: “PUT”, Header: requestHeader, body: JSON.stringify (r)}; return fetch (a, s) .then (handleResponse) .catch (handleError (a))} Funktion deleteAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t}`; return fetch (r, {Methode: “DELETE”, Header: requestHeader}). catch (handleError (r))} Funktion postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {Methode: “POST”, Header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Funktion patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales / $ {e}`, a = {Methode: “PATCH”, Header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function handleResponse (e) {try {return e.json (). then (t = > {if (e.status> = 400) {const e = _get (t, “message.details [0] .message”); wirf einen neuen Fehler (e)} return t})} catch (e) {throw new Fehler (e.message)}} Funktion handleError (e) {return t => {Wurfprotokoll (“warn”, `Fehlgeschlagene Anforderung an $ {e}`, t), neuer Fehler (`Anforderung an $ {e} fehlgeschlagen `)}} Funktion buildProductsQuer y ({search: e = “”, limit: t = 100, start: r = 0, sortDate: a = “”, filter: s, locale: i}) {const n = queryService (PRODUCTS_INDEX), c = s&&Object .keys (s) .length? Object.keys (s) .filter (e => Array.isArray (s [e]) &&s [e] .length): [], o = {}, l = {}; if (prependElasticPrefix (n), e || c.length || i || queryService.addMatchAll (n), i&& (queryService.addMust (o, {match: {“locales.locale”: i}}), queryService. addMust (l, {match: {“Merchants.locale”: i}})), e) if (isURL (e)) queryService.addMust (n, [queryService.addNestedObjQuery ({}, “Merchants”, {match: {“Merchants.buyUrl”: e}})]); else {const t = {}; queryService.addShould (t, [{match: {“locales.productId”: e}}, {match: {“locales. name “: {query: e, boost: 2}}}]), queryService.addMinimumShould (t, 1), queryService.addMust (o, _get (t,” body.query “))} if (c.length) {const e = {}; c.forEach (t => {const r = s [t], a = FILTER_KEY [t], i = {}; a&& (i [`Händler. $ {a}`] = r , queryService.addShould (e, {Terms: i}))}), queryService.addMinimumShould (e, 1), queryService.addMust (l, _get (e, “body.que”) ry “))} return _isEmpty (o) || queryService.addMust (n, [queryService.addNestedObjQuery ({},” locales “, _ get (o,” body.query “))]), _ isEmpty (l) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, “Händler”, _ get (l, “body.query”))]), queryService.addSize (n, t), r> = 0&&queryService.addFrom (n, r), “desc” === a || “asc” === a? queryService.addSort (n, {updatedAt: {order: a}}): e&&queryService.addSort (n, {_ score: {order: ” desc “}}), n} Funktion prependElasticPrefix (e) {return e.index = AGORA_ELASTIC_PREFIX?` $ {AGORA_ELASTIC_PREFIX} _ $ {e.index} `: e.index, e} Funktion buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {active :! 0}}), t&&queryService.addMust (r, queryService.addNestedObjQuery ({}, “Händler”) _get (queryService.addMust ({}, {match: {“Merchants.locale”: t}}), “body.query”))), queryService.addAggregation (r, {Händler: {verschachtelt: {Pfad: “Händler “}, aggs: {name: {Terms: {field:” Merchants.name “, Größe: e}}}}}), queryService.addSize (r, 0), r} Funktion isURL (e) {URL_RE.test (e) zurückgeben} Funktion filterByLocale (e, t, r = {Gebietsschemas: “US”}) {const a = Array.isArray (e); wenn (_isEmpty (e)) ein? [] zurückgibt: {}; const s = [“Gebietsschemas”, “Händler”], i = a? e: [e], n = Object.keys (r), c = _map (i, e => {const a = Object.assign ({}, e); return _forEach (s, s => {if (Object.keys (a)). enthält (s)) {const i = t? _filter (e [s], [“locale”, t]): e [s]; a [s] = i ,! i.length&&n.includes (s) && ( a [s] = (_ filter (e [s], [“locale”, r [s]]) || []). map (e => (e.id = null, e.locale = t, e) ))}}), a.name = _get (a, “locales [0] .name”, “”), a}); return a&&c.length? c: _get (c, “[0]”, {} )} Funktion searchByQueryWithRawResults (e, t) {const r = `// $ {t.site.host} $ {80! == t.site.port?`: $ {t.site.port} `:” ” } $ {t.site.path} / _ agora / _search`; return universalRest.post (r, e ,! 0)} Funktion buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); return prependElasticPrefix (t), queryService. addNestedObjQuery (t.body.query, “Händler”, {match: {“Merchants.buyUrl”: e}}), t} Funktion ge tAffiliatesByLocale (e, t) {const r = queryService (AFFILIATES_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {locale: e}}), queryService.addSize (r, 1e3), queryService.addSort (r, {name: “asc”}), searchByQueryWithRawResults (r, t) .then (e => _ get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”) , {})))} function buildRetailersQuery ({search: e = “”, limit: t = 50, start: r = 0, direction: a = “asc”, locale: s = “US”}) {const i = queryService (RETAILERS_INDEX); return prependElasticPrefix (i), queryService.addMust (i, {Übereinstimmung: {Gebietsschema: s}}), e? queryService.addMultiMatch (i, {Felder: [“Name ^ 2”, “Domänen” ], Zeichenfolge: e, Typ: “phrasenpräfix”}) πŸ™ queryService.addSort (i, {“name.keyword”: a}), queryService.addSize (i, t), r> = 0&&queryService.addFrom (i, r)), i} Funktion getRetailersList (e, t) {return searchByQueryWithRawResults (buildRetailersQuery (e), t) .then (e => ({total: _get (e, “Hits.total”, 0), Einzelhändler: _get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {}))})} Funktion getRetailersByAffiliateId (e, t, r) {const a = queryService (RETAILERS_INDEX ); r eturn e? (prependElasticPrefix (a), queryService.addMust (a, {match: {locale: r}}), queryService.addMust (a, [queryService.addNestedObjQuery ({}, “AffiliateRetailers”, {match: {“AffiliateRetailers) .affiliateId “: e}})]), queryService.addSize (a, 1e4), queryService.addSort (a, {” name.keyword “:” asc “}), searchByQueryWithRawResults (a, t) .then (e = > _get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {}))): Promise.reject ()} Funktion getMerchantsList (e) {return searchByQueryWithRawResults ( buildMerchantsAggregation (1e6, _get (e, “site.agoraLocale”)), e) .then (queryService.formatAggregationResults ({aggregationName: “Merchants”, Feld: “key”, Unterfeld: “name”}))} function queryRetailersByUrl ( e, t, r) {const a = urlParse (e) .host.split (“www.”). join (“”), s = queryService (RETAILERS_INDEX); return queryService.addMust (s, {match: {locale : r}}), queryService.addMust (s, {match: {Domains: a}}), prependElasticPrefix (s), queryService.addSize (s, 10), searchByQueryWithRawResults (s, t) .then (e => _ get (e, “hit.hits”, []). map (e => _ get (e, “_ source”, {}))} function queryRetailersByNa me (e, t, r) {const a = queryService (RETAILERS_INDEX); return queryService.addMust (a, {match: {locale: r}}), queryService.addMust (a, {match: {“name.keyword” :e}}),prependElasticPrefix(a),queryService.addSize(a,10),searchByQueryWithRawResults(a,t).then(e=>_get(e,”hits.hits”,[]).map(e= >_get(e,”_source”,{})))}require(220),module.exports={buildProductsQuery:buildProductsQuery,buildMerchantsAggregation:buildMerchantsAggregation,getProducts:getProducts,getProduct:getProduct,postProduct:postProduct,putProduct:putProduct,patchProduct :patchProduct,deleteProduct:deleteProduct,getMerchantList:getMerchantList,getMerchant:getMerchant,postMerchant:postMerchant,patchMerchant:patchMerchant,putMerchant:putMerchant,deleteMerchant:deleteMerchant,migrateMerchants:migrateMerchants,getRetailers:getRetailers,getRetailersList:getRetailersList,getRetailer:getRetailer,postRetailer:postRetailer ,putRetailer:putRetailer,deleteRetailer:deleteRetailer,getRetailersByAffiliateId:getRetailersByAffiliateId,getAffiliates:getAffiliates ,getAffiliateRetailers:getAffiliateRetailers,getAffiliateRetailer:getAffiliateRetailer,postAffiliateRetailer:postAffiliateRetailer,putAffiliateRetailer:putAffiliateRetailer,deleteAffiliateRetailer:deleteAffiliateRetailer,isURL:isURL,filterByLocale:filterByLocale,patchLocale:patchLocale,postLocale:postLocale,buildMerchantsByUrlQuery:buildMerchantsByUrlQuery,getAffiliatesByLocale:getAffiliatesByLocale,searchByQueryWithRawResults:searchByQueryWithRawResults,getMerchantsList:getMerchantsList,queryRetailersByUrl:queryRetailersByUrl,queryRetailersByName:queryRetailersByName};

}). call (this)}). call (this, require (17), “/ services / universal / agora.js”)}, {“9”: 9, “17”: 17, “19”: 19 , “31”: 31, “53”: 53, “63”: 63, “64”: 64, “100”: 100, “146”: 146, “220”: 220, “1332”: 1332}] ;
window.modules [“1334”] = [function (require, module, exports) {“use strict”; const _map = require (63), _ mapValues ​​= require (215), _ reduce = require (103), _ assign = require ( 150), _ get = require (9), _ pickBy = require (151), _ find = require (56), affiliateFields = [“siteShortKey”, “pageUri”, “productId”, “utmMedium”, “utmSource”, “sessionCount” , “format”, “utmCampaign”, “referrer”, “deviceAbbreviation”, “zone”], affiliateSettings = {amazon: {domains: [“amazon.com”, “amazon.co.uk”], subtagKey: “ascsubtag “, maxLength: 99, delimiter:” standard “, encode:! 1}, narrative: {domains: [” shop-links.co/” ],subtagKey:”u1″,maxLength:99,delimiter:”standard “, encode:! 0}, rakuten: {domains: [“click.linksynergy.com/deeplink”,”linksynergy.walmart.com/deeplink” ],subtagKey:”u1″,maxLength:72,delimiter:”standard”,encode :! 1}, shareasale: {domains: [“shareasale.com”], subtagKey: “afftrack”, maxLength: 99, delimiter: “standard”, encode:! 1}, skimlinks: {domains: [“go.redirectingat .com “], subtagKey:” xcust “, maxLength: 50, delimiter:” alt “, encode:! 1}, impact: {domains: [], subtagKey:” subId2 “, maxLeng th: 99, delimiter: “standard”, encode:! 1}, avantlink: {domains: [“avantlink.com”], subtagKey: “ctc”, maxLength: 64, delimiter: “alt”, encode:! 1} , cj: {domains: [“tkqlhce.com”, “jdoqocy.com”, “dpbolvw.net”, “anrdoezrs.net”, “kqzyfj.com”], subtagKey: “sid”, maxLength: 64, delimiter: “alt”, encode:! 1, joinBy: “/”, assignBy: “/”, positioned:! 0, position: “after”, positionKey: “type / dlg /”}, partnerize: {domains: [“prf .hn “], subtagKey:” pubref “, maxLength: 100, delimiter:” alt “, encode:! 1, joinBy:” / “, assignBy:”: “, positioned:! 0, position:” before “, positionKey : “destination”}, pepperjam: {domains: [“gopjn.com”, “pntrac.com”, “pjtra.com”, “pjatr.com”, “pntrs.com”, “pntra.com”], subtagKey : “sid”, maxLength: 100, delimiter: “alt”, encode:! 1}, awin: {domains: [“awin1.com”], subtagKey: “pref1”, maxLength: 100, delimiter: “alt”, encode:! 1, positioned:! 0, position: “before”, positionKey: “ued”}}, subtagDictionary = {siteShortKey: “”, pageUri: “p”, productId: “i”, zone: “z”, deviceAbbreviation: “d”, utmSource: “s”, utmMedium: “m”, utmCampaign: “c”, sessionCount: “u”, referrer: “r”, format: “t”}, delimiter s = {standard: [“[“, “]”], old: [“__”, “_”]}; function parseValueFromSubtag (e, t, i) {const a = t [0] et [1], s = i.split (a) [1] || “”; return s? s.split (t [0]) [0]: null} function parseSubtag (e, t = delimiters.standard) {return _pickBy (_mapValues (subtagDictionary, i => parseValueFromSubtag (i, t, e)))} function generateSubtag (e, t, i = delimiters.standard, a =! 1) {const s = (e => t => `$ {e [0]} $ {t} $ {e [1]} `) (i); let n = _reduce (affiliateFields, (t, i) => {const a = s (subtagDictionary [i]), n = e [i]; return t (n? an: “”)}, “”); return a&& (n = encodeURIComponent (n)), n} function applySubtagMaxlength (e, t) {var i = t-3 * (e .split (“,”). length-1 e.split (“|”). length-1); return e.substr (0, i)} function getSubtagData ({getters: e, fields: t = [], visitState: i, locals: a, productLink: s}) {let n = {}; return t.forEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locals: a, productLink: s})}), n} function parseQuery (e = “”) {return e.split (“&”). reduce ((e, t) => {const i = t.split (“= “) [0], a = t.split (” = “) [1]; return void 0! == a&& (e [i] = a), e}, {})} func tion processSubtagPosition ({url: e, positionKey: t, subtagKey: i, position: a = “after”, subtagString: s, joinBy: n, assignBy: o} = {}) {const [r, l] = e. split (t), u = `$ {i} $ {o} $ {s}`, g = []; if (“after” === a) {if (! l) return e; const [a, s = “”] = l.split (`$ {i} $ {o}`), d = s.split (n) .slice (1) .join (n); g.push (`$ {r} $ {t} `, u), a&&g.push (a), d&&g.push (d)} if (” before “=== a) {const [e, a =” “] = r.split (` $ {i} $ {o} `), s = a.split (n) .slice (1) .join (n); g.push (e), s&&g.push (s), g.push (u,` $ {t} $ {l} `)} return g.reduce ((e, t) => {return e.slice (-1) === n&& (e = e.slice (0, -1)), e.length? [e, t] .join (n): t}, “”)} function processSubtag ({getters: e, affiliate: t, url: i, visitState: a = {}, locals: s}) {const n = affiliateFields, o = _get (affiliateSettings [t], “subtagKey”), r = _get (affiliateSettings [t], “maxLength”), l = _get (affiliateSettings [t], “encode”), u = _get (affiliateSettings [t], “delimiter”), g = _get (affiliateSettings [t], “positioned”,! 1), d = _get (affiliateSettings [t], “position”), c = _get (affiliateSettings [t ], “positionKey”), p = _get (affiliateSettings [t], “assignBy”, “=”), m = _get (affiliateSettings [t], “joinBy”, “&”), f = delimiters [u]; let b, y, S = i. indexOf (“?”)> = 0? i.split (“?”). pop (): “”, h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, locals: s, productLink: i}); return o&& (y = h [o] || “”, y = applySubtagMaxlength (b = generateSubtag (_ = _ assign (parseSubtag (y, f), _ pickBy (_)), t , f, l), r), h [o] = y, S = _map (h, (e, t) => `$ {t} = $ {e}`) .join (“&”), i = g? processSubtagPosition ({url: i, positionKey: c, subtagKey: o, position: d, subtagString: y, joinBy: m, assignBy: p}): i.split (“?”) [0] `? $ {S} `), i} function getAffiliate (e) {const t = Object.keys (affiliateSettings); return _find (t, t => _ find (affiliateSettings [t] .domains, t => e.includes (t. toLowerCase ()))) || “”} function createSubtagProcessor (e) {return ({url: t, visitState: i, locals: a, affiliate: s}) => (s = getAffiliate (t) || s) ? processSubtag ({getters: e, url: t, affiliate: s, visitState: i, locals: a}): “”} module.exports.generateSubtag = generateSubtag, module.exports.getAffiliate = getAffiliate, module.expo rts.createSubtagProcessor = createSubtagProcessor, module.exports.processSubtag = processSubtag;
}, {“9”: 9, “56”: 56, “63”: 63, “103”: 103, “150”: 150, “151”: 151, “215”: 215}];
window.modules [“article-nav.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), _ throttle = require (50), $ visibility = require (5) , $ popup = require (65), $ gtm = require (3), {reportSocial: reportSocial} = require (66), auth0 = require (7); module.exports = (t => {let e = dom.find (“.page-header”), i = dom.find (“. article-content”), r = dom.find (t, “. deepscroll-headline”), o = dom.find (t, “. deepscroll -rubric “), s = dom.find (t,”. deepscroll-rubric-sponsored “), l = dom.find (“. article .article-header .rubric “), n = dom.find (” # deepscroll_center_divider “), a = dom.find (“. clay-paragraph “), d = dom.find (t,”. logo “), c = dom.find (t,”. dyn-cut-logo “), p = dom.find (t, “. article-nav-top”), u = dom.find (t, “. article-nav-deepscroll”), m = dom.find (‘link [rel = “canonical”] ‘), f = m&&m.getAttribute (“href”), g = dom.find (‘ meta [property = “og: image”] ‘)? dom.find (‘ meta [property = “og: image”] ‘ ) .getAttribute (“content”): “”, h = dom.find (‘meta [property = “og: title”]’)? dom.find (‘meta [property = “og: title”]’). getAttribute (“content”): “”, y = dom.find (t, “. share -link.facebook “), w = dom.find (t,”. share-link.twitter “), v = dom.find (t,”. share-link.pinterest “), b = t.classList.contains (“header-simple”), x = window.getComputedStyle (d, null) .getPropertyValue (“- targetFlexBasis”), L = window.getComputedStyle (d, null) .getPropertyValue (“- verticalStart”) || 0 , C = window.getComputedStyle (d, null) .getPropertyValue (“- verticalEnd”) || 0, $ =! 1, _ = 55; function k () {_ = parseInt (window.getComputedStyle (d, null) .getPropertyValue (“- stickyTop”)) || _, C = $ visibility.getViewportWidth ()> = 1180? window.getComputedStyle (d, null) .getPropertyValue (“- verticalEndDesktop”) || C: window.getComputedStyle (d, null) .getPropertyValue (“- verticalEnd”) || C} function S () {$ =! 1, P ()} function P () {let {top: r} = t.getBoundingClientRect (), o = window.getComputedStyle (d, null) .getPropertyValue (“- baseFlexBasis”), s = ox, l = (_- e.getBoundingClientRect (). top) / _, n = Math.max (0, Math. min (1, l)), m = LC-2, f = Math.round (L- (m * n 2)), g = Math.ceil (os * n); if (lt? e.classList.add (“header-after-scroll”): e.classList.remove (“header-after-scroll”), p.style.transfo rm = `translateY ($ {C} px)`, u.style.transform = `translateY ($ {C} px)`, void (d.style.flexBasis = x “px”)} window.scrollY> r? t.classList.add (“after-scroll”): t.classList.remove (“after-scroll”), window.scrollY> r? e.classList.add (“header-after-scroll”): e.classList .remove (“header-after-scroll”), p.style.transform = `translateY ($ {f} px)`, u.style.transform = `translateY ($ {f} px)`, d.style. flexBasis = g “px”, c&& (c.style.flexBasis = g “px”), $ visibility.getViewportWidth ()> = 1180&&i&&function () {const t = a? $ visibility.getPageOffset () 0, e = $ visibility.getPageOffset (i) .top, r = Math.max (e, t); return Math.max (window.scrollY, document.body.scrollTop)> = r} ()? T.classList .add (“deep-scroll”): t.classList.remove (“deep-scroll”)} function V (t) {var e = t.currentTarget, i = e.getAttribute (“href”), r = e .getAttribute (“data-handle”), o = $ popup.getPopupClass (e.classList), s = $ visibility.isBelowPrimaryContent (e)? “bottom”: “top”; $ gtm.reportNow ({event: “social -share-widget “, clickLocation: s, socialNetw ork: o}), reportSocial (o), $ visibility.getViewportWidth ()> = 768&&o&& (t.preventDefault (), $ popup.popWindow (o, r, i))}! function () {const e = _throttle ( P, 30); if (k (), dom.findAll (t, “. Share-link”). ForEach (t => t.addEventListener (“click”, V)), y&& (y.href = “http : //www.facebook.com/sharer/sharer.php? u = “f”? utm_source = fb&utm_medium = s3&utm_campaign = sharebutton-t “), w&& (w.href =” https://twitter.com/share? text = “encodeURIComponent (h)” &url = “f”? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = “w.getAttribute (” data-handle “)), v&C: // pinterest. com / pin / create / button /? url = “f”? utm_source = pin&utm_medium = s3&utm_campaign = sharebutton-t&description = “encodeURIComponent (h)” &media = “g)”, b) return; auth0.on (“init0.on (” init ) => {auth0.isSubscriber () &&t.classList.add (“subscribed”)}), window.addEventL istener (“scroll”, e), window.addEventListener (“resize”, S), window.addEventListener (“resize”, k), l? l.classList.contains (“rubric-sponsor-story”) &&s? ( o.classList.remove (“visible”), s.classList.add (“visible”), s.textContent = l.text || l.textContent) πŸ™ o.textContent = l.text || l.textContent, o.href = l.href || “#”) πŸ™ n.style.display = “none”, o.style.display = “none”); S (), r.textContent = h} ()}) ;
}, {“3”: 3, “4”: 4, “5”: 5, “7”: 7, “50”: 50, “65”: 65, “66”: 66}];
window.modules [“nav-search-button.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), $ gtm = require (3), {reportSearch: reportSearch } = require (66), openClass = “open”, closeClass = “closed”; module.exports = (e => {const s = e, t = dom.find (e, “. nav-search-button-trigger “), n = dom.find (e,”. nav-search-form “), o = dom.find (e,”. search-input “); function i () {const e = dom.find (” body “); s.classList.toggle (closeClass), s.classList.toggle (openClass), e.classList.toggle (” disabled “), e.classList.toggle (” search-active “)} function c () {i (), s.classList.contains (openClass) &&o.focus ()} function a (e) {! s.contains (e.target) &&s.classList.contains (openClass) &&i ()} function r (e ) {27 === e.keyCode&&s.classList.contains (openClass) &&i ()} function d (e) {e.preventDefault (), $ gtm.reportCustomEvent ({category: “search”, label: “on =” window.location.href, action: o.value}), reportSearch ((o.value || “”). split (“”), () => n.submit ())}! function (e, s, t) {s&&s.addEventListener (“click”, c); t&&t.addEventListener (“submit”, d); e.addEventListener (“click”, a), document.addEventListener (“keydown”, r), e .addEventListener (“touchend”, a), n.addEventListener (“submit”, d)} (dom.find (“body”), t, dom.find (e, “. nav-search-form submit”)) });
}, {“3”: 3, “4”: 4, “66”: 66}];
window.modules [“nav-dropdown-button.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), visibility = require (5), {reportSearch: reportSearch} = require (66); function getNextSiblings (e) {const t = []; let i = e; for (; i = i.nextElementSibling;) t.push (i); return t} function getMainChildren (e, t) {let i = [], n = e.firstChild; for (; n = n.nextElementSibling;) n.contains (t)? n.isSameNode (t) || (i = i.concat (getMainChildren (n, t ))): i.push (n); return i} function isMobile () {return visibility.getViewportWidth () {let t; const i = e.querySelector (“. nav-dropdown-button-trigger”), n = dom.find (“body”), o = dom.find (“. top”), l = dom.find (“. confetti-list”), s = dom.find (“. nav-dropdown-button_nymag-homepage “), r = dom.find (” header.page-header “) || o, c = dom.find (‘[data-editable =” main “]’), a = dom.closest (e,”. page-header “), d = a? a.querySelectorAll (“. confetti-image.blue “):” “, g = a? a.querySelectorAll (“. confetti-image.green “):” “, u = a? a.querySelectorAll (“. confetti-image.orange”): “”, f = a? a.querySelectorAll (“. confetti-image.orange2”): “”, m = a? a.querySe lectorAll (“. confetti-image.pink”): “”, p = a? a.querySelectorAll (“. confetti-image.purple”): “”, h = a? a.querySelectorAll (“. confetti-image. yellow “):” “, y = e.querySelectorAll (“. dropdown-nav-search-form “); function b (e) {let t = e.currentTarget, i = t.querySelector (“. nav-search- input “), n = i? i.value.split (” “): []; e.preventDefault (), reportSearch (n, () => t.submit ())} i.addEventListener (” click “, () => {initializeHeight (e), v ()}); for (let e = 0, t = y.length; e (function (e) {e.classList.remove (“c-right”, “c -rightdown “,” c-left “,” c-leftdown “)}) (e))}, 500)} ()) πŸ™ i.setAttribute (” aria-expanded “,” true “), t = window .scrollY), e.classList.toggle (“closed”), e.classList.toggle (“open”), n.classList.toggle (“disabled”), a&&e.isSameNode (s)? function () {if ( o.contains (e)) {const e = getMainChildren (o, s); S (e), w (o)} if (c.contains (e)) {const e = getMainChildren (c, s); o. classList.toggle (“hidden-component”), w (c), S (e)} e.classList.toggle (“open-mobile”)} (): a&&! y&&r&& (w (r), function () { const i = e .classList.contains (“open”)? 0: t; window.scrollTo ({top: i})} ())} function w (e) {S (getNextSiblings (e))} function S (e) {e .forEach (e => {e.classList.toggle (“hidden-component”)})} n.addEventListener (“click”, t => {! e.contains (t.target) &&e.classList.contains (” open “) &&v ()}), document.addEventListener (” keydown “, t => {27 === t.keyCode&&e.classList.contains (” open “) &&v ()})});
}, {“4”: 4, “5”: 5, “66”: 66}];
window.modules [“follow.client”] = [function (require, module, exports) {“use strict”; const _find = require (56), $ popup = require (65); DS.controller (“follow”, [function () {function e (e) {this.el = e, this.handle = e.getAttribute (“data-handle”)} return e.prototype = {events: {click: “openFollow”}, openFollow: function (e) {var t, n, a = $ popup.position, o = $ popup.params, l = {}, r = {w: 780, h: 500}, s = new a (rw, rh) , c = this.el.classList; l.handle = this.handle, r.left = s.left, r.top = s.top, n = _find ([{className: “facebook”, url: “https: //facebook.com/{handle}”,network:”Facebook”},{className:”pinterest”,url:”http://www.pinterest.com/ registers”,network:”Pinterest “}, {className: “instagram”, url: “https://www.instagram.com/ Zonenhandle}”, network: “Instagram”}, {className: “rss”, url: “http: //feeds.feedburner. com / {handle} “, network:” RSS “}, {className:” twitter “, url:” https://twitter.com/intent/follow?screen_name=phiahandle Genealogie&tw_p=followbutton&variant=2.0 “, network: “Twitter”}, {className: “snapchat”, url: “https://www.snapchat.com/discover/ Genealogiehandle}”, netw ork: “Snapchat”}], function (e) {return c.contains (e.className)}), l.url = n.url.replace (“{handle}”, l.handle), l.network = n.network, l.name = “Follow” l.handle “on” l.network, t = new o (l, r), window.open (t.address, t.name, t.features), e. preventDefault ()}}, e}]);
}, {“56”: 56, “65”: 65}];
window.modules [“comments-link.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), _ get = require (9), _ isFinite = require (122), ajax = require (121); DS.controller (“comments-link”, [function () {var t, e = “http: //” document.documentElement.getAttribute (“data-uri”) “.html”; function n (n) {var o; (this.el = n, this.coral_talk_root = n.getAttribute (“data-coral-talk”), this.commentsCount = dom.find (n, “. comments-link-count “), this.commentsText = dom.find (n,”. comments-link-text “), this.isNavVariation = n.classList.contains (” comments-link_article-nav “), this.cutoffCnt = n.getAttribute ( “data-cutoffCnt”) || 1e3, t = `$ {this.coral_talk_root} /api/v1/graph/ql`,this.shouldRenderCommentStream ()) && (o = this.onCommentCountFetched.bind (this), ajax. sendReceiveJson ({method: “GET”, url: t ‘? query = {asset (url: “‘ e ‘”) {totalCommentCount}}’, dataType: “json”}, function (t, e) {var n = _get (e, “data.asset.totalCommentCount”, 0); return t? o (t): _ isFinite (n)? void o (null, n): o (“Unexpected Coral-Talk response”)}))} return n.pro totype.onCommentCountFetched = function (t, e) {if (t) return console.warn (t); e> 0&& (this.isNavVariation&&e1? “s”: “”), this.el.classList.remove (“no- comments “))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf (” @ published “)}, n}]);
}, {“4”: 4, “9”: 9, “121”: 121, “122”: 122}];
window.modules [“head-gtm.client”] = [function (require, module, exports) {“use strict”; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (154), isProduction = require (8) (); function reportWebVitals (e) {isProduction || console.log (“reportWebVitals:% O”, e); const t = “string” == typeof e.name?e.name.toUpperCase () : e.name; window.dataLayer = window.dataLayer || [], window.dataLayer.push ({event: “analyticsEvent”, event_action: t, event_category: “Web Vitals”, event_label: e.id, event_value: e .delta, eventAction: t, eventCategory: “Web Vitals”, eventLabel: e.id, eventNonInt:! 0, eventValue: e.delta, nonInteraction:! 0, transport: “beacon”})} getCLS (e => { e.delta = Math.round (1e3 * e.delta), reportWebVitals (e)}), getFID (e => {e.delta = Math.round (e.delta), reportWebVitals (e)}), getLCP ( e => {e.delta = Math.round (e.delta), reportWebVitals (e)});
}, {“8”: 8, “154”: 154}];
window.modules [“concert-ads.client”] = [function (require, module, exports) {“use strict”; const customMappings = {“crime-assault”: “Power”, “career money productivity”: “Power “,” feminism-politics-identity “:” Power “,” culture-media “:” Culture “, celebrity:” Culture “, living:” Style “, fashion:” Style “, shopping:” Style “, weddings: “Style”, beauty: “Style”, animals: “Self”, “learning creativity”: “Self”, “relationships-friends family”: “Self”, “mental health personality social behavior”: “Self”, “learning creativity “:” Self “,” health-wellness “:” Self “, parenting:” Self “,” relationships-sex dating marriage “:” Self “}, striptags = require (67); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get (“concert_config_url”), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (“ConcertAds initializing without Permutive”), window.concertAds = createConcertAds ( ), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {const e = getAuthStatus (); let t = getD ata (“title”), n = window.location.href, i = getData (“section”), o = “”, a = getData (“type”), r = getData (“vertical”); t&& (t = striptags (htmlDecode (t)). split (“”)), n = n.slice (n.lastIndexOf (“/”) 1); const l = {kw: getKeywords (), network: r, page_type: a , entry_group: i, keywords: t, pn: n}; return “Homepage” === a? o = “homepage”: “Section Page” === a&& (o = (o = window.location.pathname). replace (/ // g, “”)), i&&-1 === i.indexOf (“”) && (o = i), customMappings [i] && (o = customMappings [i]), window.location .hostname.match (/ . aws ./ i) ​​&& (l.clay_sandbox_env = r), new window.ConcertAds ({cmd: [], slots: [], dfpVariables: l, slugPath: “/” o. replace (/ – | – / g, “-“), loggedIn: “unauthenticated”! == e, paywallActive: getPaywallStatus (e)})} function getKeywords () {try {const e = window._nymPermutive.article.keywords ; return e&&e.length> 0&&e.some (Boolean)? e: (document.querySelector (‘meta [name = “keywords”]’) || document.querySelector (‘meta [property = “article: tag”]’)). getAttribute (“content”). split (“,”). map (function (e) {return e.trim ()})} catch (e) {return}} function getData (e) {if (window._nymPermutive) {if (e in window._nymPermutive) return window._nymPermutive [e]; if (window._nymPermutive.article&&e in window._nymPermutive.article) return window. _nymPermutive.article [e]; if (window._nymPermutive.user&&e in window._nymPermutive.user) return window._nymPermutive.user [e]}} function htmlDecode (e) {var t = document.createElement (“div”); return t.innerHTML = e, 0 === t.childNodes.length? “”: t.childNodes [0] .nodeValue} function getAuthStatus () {const e = JSON.parse (localStorage.getItem (“auth0: profile” )), t = e? e [“http://nymag.com/app_metadata”]: null; return t? t.has_subscription? “entitled”: “unentitled”: “unauthenticated”} function getPaywallStatus (e) {const t = getData (“totalCount”) || 0; return Boolean (t> = 3&& “entitled”! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (“concertAdsReady”, in stallConcertAds);
}, {“67”: 67}];
window.modules [“curated-feed.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), lazyLoad = require (108); function lazyLoadImage (e) {const o = dom.find (e, “img [data-src]”), t = dom.findAll (e, “source [data-srcset]”), a = dom.closest (e, “. feed-item” ); if (o&&a) {new lazyLoad.LazyLoader (a, o, t) .init ()}} function handleLazyLoad (e) {(dom.findAll (e, “. feed-item”) || []). forEach (lazyLoadImage)} module.exports = (e => {const o = e.querySelectorAll (“button.show-more”); function t (e) {const {currentTarget: o} = e; if (o) { const e = o.parentElement.parentElement; e&&e.querySelector (“. content”). classList.toggle (“collapsed”)}} o&&o.forEach (function (e) {e.addEventListener (“click”, t)}) , handleLazyLoad (e)});
}, {“4”: 4, “108”: 108}];
window.modules [“coral-talk.client”] = [function (require, module, exports) {“use strict”; const dom = require (4), store = require (128), visibility = require (5), auth0 = require (7), TALK_AUTH = “talk: auth_token”; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! e.CORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: e.TALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = window.Coral.Talk.render (e.commentStreamContainer, t)}} function getAuthToken (e) {var = e&&e [“http://nymag.com/coral_talk”] || auth0.getTalkJwt (), i = store.get (TALK_AUTH); return t? i&&t == i? i: (store.set (TALK_AUTH, t ), t) πŸ™ i&&store.remove (TALK_AUTH), null)} function coralLogin () {coralEmbed.login (getAuthToken ())} function embedScript (e, t) {let i = document.createElement (“script”); i.type = “text / javascript”, i.async =! 0, i.src = e, i.addEventListener (“load”, () => {hasEmbedScriptLoaded =! 0, r enderComments (t)}), document.getElementsByTagName (“head”) [0] .appendChild (i)} function initVerificationMessage () {auth0.isAuthenticated () &&auth0.refresh (); let e = document.querySelector (“. coral -talk-container “); auth0.isAuthenticated () &&! auth0.isEmailVerified () && (e.insertAdjacentHTML (” beforebegin “, ‘ n n Please verify your account to enable commenting. Didn ‘t receive a verification email? Re-send email now. N ‘), document.querySelector (“. Activation-link”). AddEventListener (“click”, sendVerificationEmail))} function sendVerificationEmail () {let e = document.querySelector (“. Coral-talk -verify-address “); return fetch (` https: // $ {window.location.host} / _user / verification-email? user_id = $ {auth0.getUserID ()} `, {method:” GET “, headers : {“Content-Type”: “application / json”}}). Then (e => e) .then (t => {t&&200 == t.status? E.innerHTML = “Verification email was sent successfully”: e.innerHTML = `$ {t.statusText}`}). catch (e => console.log (e))} function attemptScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {new visibility.Visible (e, {preloadThreshold: 750}). On (“preload”, () => attemptScriptEmbedding (e, t))} function removeSignInButton (e ) {e&&e.parentNode&&dom.removeElement (e)} function init (e) {const t = e.getAttribute (“data-coral-talk-host”), i = `$ {t} / static / embed.js` , n = `http: // $ {document.documentElement.getAttribute (” data-uri “)}. html`, a =” true “=== e.getAttribute (” data-maintenance “), o = -1 ! == n.indexOf (“@ published”), r = e.querySelector (“. coral-talk-container”), s = e.querySelector (“. coral-talk-btn-signin”), c = { CORAL_TALK_HOST: t, EMBED_URL: i, commentStreamContainer: r, signInButton: s, TALK_ASSET_URL: n}; “, () => auth0.showLogin ()), auth0.isAuthenticated () &&removeSignInButton (s)}), auth0.on (” login “, t => {removeSignInButton (s), getAuthToken (t), visibility.isElementInViewport (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()}), auth0.on (“logout”, () => {store.remove (TALK_AUTH)}))} module.exports = init;
}, {“4”: 4, “5”: 5, “7”: 7, “128”: 128}];
window.modules [“choreographer.client”] = [function (require, module, exports) {“use strict”; const cookie = require (54), _ get = require (9), _ omit = require (86), {insertSpeedBumpComponents : insertSpeedBumpComponents} = require (90), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (91), {generateGrowl: generateGrowl} = require (89), gtm = require (3), {getLocalStorage: getLocalStorage:} = require 33), {reportPaywall: reportPaywall} = require (66), moment = require (38), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (92), auth0 = require (7), {Scenario: Scenario} = require (87), cidReadyEvent = “nymcid-set”, cidKey = “nymcid”, isProduction = require (8) (), logger = require (85) .Logger (() => getLocalStorage (“show_choreographer_logs”)), {Verdon : Verdon} = require (88), TEST_COHORT_FLAG = “optimizeCohort”; function displayDebug (e = “”) {if (“entitlement”! == e.split (“#”). Pop ()) return; const t = _get (window, “dataLayer [0] .userDetails”, {}), o = _get (window, ” dataLayer [0] .pageDetails.featureTypes “,” “), n = o.includes (” magazine “)?” magazine “:” “, r = o.includes (” feature “)?” featured “:” “, i = “Value of Article:” (n || r || “article”), a = _get (JSON.parse (localStorage.getItem (“auth0: profile”)), “http://nymag.com/app_metadata “), l =” Authentication Status: “(a?” authenticated “:” unauthenticated “), s =” Entitlement Status: “(!! a&&a.has_subscription?” entitled “:” unentitled “), c = Object.keys (_omit (t, “newYorkMediaUserID”)). map (e => `$ {e}: $ {t [e]}`), d = document.body, g = document.createElement (“div”), u = document.createElement (“ul”); [i, l, s, … c] .map (e => {const t = document.createElement (“li”); return t.classList.add (“debug -item “), t.appendChild (document.createTextNode (e)), t}). forEach (e => {u.appendChild (e)}), u.classList.add (” data-bullets “), g .classList.add (“debug-choreographer”), g.classList.add (“display-debug-data”), g.appendChild (u), d.appendChild (g)} function initializeChoreographer (e) {const t = e.getAttribute (“data-site-slug”), o = pageShouldCountAsView (t), n = auth0.isSubscriber ( ); return t? getClientId (cidKey, 8e3) .then (e => (logger.h1 (“Choreographer initialized”), logger.log (`clientId: $ {e}`), logger.log (`page counts as a view: $ {o} `), window.nymViewsResponse || (o? updateClientHistoryWithPageData (e, t): getClientHistory (e)))). then (r => {if (logger.group (), logger.h2 (“Client history”), logger.table (r), logger.groupEnd (), isNCR ()) return; const {scenarios: i, touts: a, testCohort: l = “”} = readJSONFromScript (e.querySelector ( “script”)); if (! (l === (document.body.dataset [TEST_COHORT_FLAG] || “”))) return; const s = i.map (e => Scenario (Object.assign ({} , e, {history: r, siteSlug: t, isSubscriber: n}))). filter (e => (logger.group (), logger.h2 (“Evaluating scenarios”), logger.log (e), logger .groupEnd (), e.shouldShow)). reduce ((e, {action: t, min: o, count: n}) => {const r = a.find (({value: e}) => e === t); return r? (e [r.type] = r, e [r.type] .viewCount = no, e): e}, {}); logger.group (), logger.h2 ( “Active Touts”), logger.log (s), logger.groupEnd (), executeTouts (e, o, s, r)}). Catch (console.error): console.error (“siteSlug not found.”) } function documentIncludes Component (e) {return document.querySelector (`[data-uri * =” / $ {e} / “]`)} function pageShouldCountAsView (e) {const t = “strategist” === e, o = [” product “,” product-grid “]. find (e => documentIncludesComponent (e)); return t ||! o} function executeTouts (e, t, o = {}, n) {const {global: r} = n, i = {featureArticleCount: r.Feature || 0, magazineArticleCount: r.Magazine || 0, standardArticleCount: r.Article || 0, totalArticleCount: r.total || 0}, a = window.concertAds, l = window.ConcertAds; if (o [“speed-bump”] && (_get (a, “adsBlocked”,! 0)? insertSpeedBumpComponents (findTemplate (e, “speed-bump”), o [“speed-bump”], i): a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertSpeedBumpComponents (findTemplate (e, “speed-bump”), o [“speed-bump”], i)})), o [ “newsletter-speed-bump”] && (_get (a, “adsBlocked”,! 0)? insertNewsletterSpeedBumpComponents (findTemplate (e, “newsletter-speed-bump”), o [“newsletter-speed-bump”], i) : a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertNewsletterSpeedBumpComponents (findTemplate (e, “news letter-speed-bump “), o [” newsletter-speed-bump “], i)})), o [” branded-growl “] &&brandedTakeoverTime (o [” branded-growl “]) &&t) return logger.log (“should show branded growl”), void growlManager (findTemplate (e, “branded-growl”), {baseTrackingData: i, body: o [“branded-growl”]. brandedGrowlBody, contentClass: “branded-content”, cta : o [“branded-growl”]. brandedGrowlCTA, imageUrl: o [“branded-growl”]. imageUrl, link: o [“branded-growl”]. brandedGrowlLink, name: o [“branded-growl”]. name , scrollDepth: o [“branded-growl”]. brandedGrowlScrollDepth, title: o [“branded-growl”]. brandedGrowlTitle, toutType: “branded growl”}, “# branded-growl”); if (t&&o [“content- cliff “]) contentCliff (findTemplate (e,” content-cliff “), o [” content-cliff “], o [” content-cliff “]. viewsLeft, n); else {if (t&&o [” cliff-takeover “]) return / coronavirus news | pivot | paywall exclude / i.test (window._nymGtmPage.tags)? void (isProduction&&logger.log (” Content cliff no-op due to excluded tag match: “, window._nymGtmPage.tags)): void cliffTakeover (findTemplate (e,” paywall-reader-interface “), i, o [” cliff-takeover “]); if (o [” growl-newletter “] || ! o [“promo-growl”]) if (o [“baby-growl”]) babyGrowl (findTemplate (e, “paywall-reader-interface”), i, o [“baby-growl”]); else { if (! o [“warning-growl-2”]) return o [“warning-growl”] &&shouldWarn ()? (setContentCliffWarningDisplayed (), logger.log (“should show warning”), void growlManager (findTemplate (e, “warning-growl”), {contentClass: “warning-content”, title: o [“warning-growl”]. warningGrowlTitle, name: o [“warning-growl”]. name, scrollDepth: o [“warning-growl “] .warningGrowlScrollDepth, cta: o [” warning-growl “]. warningGrowlCTA, body: o [” warning-growl “]. warningGrowlBody, link: o [” warning-growl “]. warningGrowlLink, baseTrackingData: i, toutType: “warning growl”}, “# warning-growl”)): void 0; warningGrowl (findTemplate (e, “paywall-reader-interface”), i, o [“warning-growl-2”])} else growlManager ( findTemplate (e, “growl-message”), {contentClass: “promo-content”, title: void 0, name: o [“promo-growl “] .name, scrollDepth: o [” promo-growl “]. promoGrowlScrollDepth, cta: o [” promo-growl “]. promoGrowlCTA, body: o [” promo-growl “]. promoGrowlMessage, link: o [” promo -growl “]. promoGrowlLink, baseTrackingData: i, toutType:” promo growl “},” # growl-message “)}} function shouldWarn () {return! contentCliffWarningDisplayed ()} function getContentCliffWarningDisplayedKey () {const e = new date, t = e.getMonth (); return`content-cliff-warning-displayed – $ {e.getFullYear ()} – $ {t} `} function contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return” true “= ==getLocalStorage(e)}function setContentCliffWarningDisplayed(){const e=getContentCliffWarningDisplayedKey();return setLocalStorage(e,”true”)}function growlManager(e,{contentClass:t,scrollDepth:o,name:n,title:r ,body:i,cta:a,link:l,baseTrackingData:s,toutType:c,imageUrl:d=null},g=””){const u=function(){const e=`n n n n ${r}n ${d?”:””}n ${i}n ${d?“:””}n ${a}n n n n `;return document.createRange().createContextualFragment(e)}(),p={creative:i,id:c,name:n,position:”growl”};u.querySelector(“a”).addEventListener(“click”,()=>promotionReport(“Click”,s,p)),generateGrowl(e,g,{content:u,scrollDepth:o,onShow:()=>promotionReport(“View”,s,p)})}function contentCliff(e,t,o,n){const{first_visit:r,global:i}=n,a={totalArticleCount:i.total||0,standardArticleCount:i.Article||0,featureArticleCount:i.Feature||0,magazineArticleCount:i.Magazine||0},{contentCliffBody:l}=t,s=document.importNode(e,!0).querySelector(“.content-cliff”),c=document.querySelector(“.article-content > .clay-paragraph”),d={creative:l,id:”content cliff”,name:”Content Cliff”,position:”in-article”};s&&(c.insertAdjacentHTML(“afterend”,s.outerHTML),require(“content-cliff.client”)(document.querySelector(“.content-cliff”),{contentCliffOptions:t,viewsLeft:o,firstVisit:Number(r),onShow:()=>promotionReport(“View”,a,d),onClickCliff:()=>promotionReport(“Click”,a,d)}))}functio n verdonFosseToutSetter(e,t,o,n,r){const i=new Verdon({container:”.paywall-reader-interface”,url:”https://fosse.nymag.com/fosse/v1.6.1/index.html”}),a=e.type,l={email:auth0.getEmail(),isAuthenticated:auth0.isAuthenticated(),isSubscriber:auth0.isSubscriber()};n.classList.add(a),i.once(“frame:ready”,()=>{i.sendMessage(“tout:show”,{readerState:l,toutType:a,toutData:e}),r&&i.sendMessage(“frame:height”)}),i.on(“tout:visible”,()=>{promotionReport(“View”,t,o)}),i.on(“tout:sign-in”,()=>{auth0.showLogin(window.location.href)}),i.on(“tout:log-out”,()=>{auth0.logout()}),i.on(“tout:dismiss”,()=>{n.classList.add(“dismiss”),i.sendMessage(“tout:hide”,{toutType:a,toutData:e})}),i.on(“tout:subscribe”,()=>{e.ctaLink=replaceQueryParams(e.ctaLink),promotionReport(“Click”,t,o),window.open(e.ctaLink,”_blank”)}),i.on(“frame:height”,e=>{n.style.height=`${e.payload.currentHeight 10}px`}),i.on(“tout:view-account”,()=>{window.location.href=”https://subs.nymag.com/account”})}function promotion Report(e,t,o){const{creative:n,id:r,name:i,position:a}=o;t.event=`eec.promotion${e}`,t.ecommerce={promoView:{promotions:[{creative:n.trim(),id:r,name:i,position:a}]}},gtm.reportNow(t),reportPaywall({creative:n.trim(),eventType:e,id:r,name:i,position:a})}function babyGrowl(e,t,o){const n=document.importNode(e,!0).querySelector(“.paywall-reader-interface”),r={creative:o.babygrowlDescription,id:”baby growl”,name:”baby growl”,position:”growl”};document.body.appendChild(n),o.ctaLink=o.babygrowlCtaLink,o.ctaText=o.babygrowlMessage,o.headline=o.babygrowlDescription,verdonFosseToutSetter(o,t,r,n)}function cliffTakeover(e,t,o){const{cliffTakeoverCTA:n,cliffTakeoverCtaLink:r,cliffTakeoverDescription:i,cliffTakeoverImage:a,cliffTakeoverPromo:l,cliffTakeoverStatus:s,type:c}=o,d=document.importNode(e,!0).querySelector(“.paywall-reader-interface”),g=document.querySelectorAll(“.clay-paragraph”),u={creative:l,id:”content cliff”,name:”Content Cliff”,position:”growl”},p={cta:n,ctaLink:r,description:i,im age:a,promo:l,status:s,type:c};document.body.appendChild(d),g.forEach((e,t)=>{0!==t&&e.remove()}),verdonFosseToutSetter(p,t,u,d,!0),document.querySelector(“html”).style.overflowY=”hidden”,document.body.style.position=”fixed”}function warningGrowl(e,t,o){const{type:n,warningGrowl2CTA:r,warningGrowl2CtaLink:i,warningGrowl2Description:a,warningGrowl2Image:l,warningGrowl2Promo:s,warningGrowl2Status:c}=o,d=document.importNode(e,!0).querySelector(“.paywall-reader-interface”),g={creative:s,id:”warning growl”,name:”Warning Growl”,position:”growl”},u={cta:r,ctaLink:i,description:a,image:l,promo:s,status:c,type:n};document.body.appendChild(d),verdonFosseToutSetter(u,t,g,d,!0)}function getClientId(e=””,t=8e3){let o=cookie.get(e);return o?Promise.resolve(o):new Promise((o,n)=>{const r=setTimeout(()=>{n(`could not find key: ${e} on cookie after ${t}ms`)},t);window.addEventListener(cidReadyEvent,()=>{clearTimeout(r),o(cookie.get(e))})})}function readJSONFromScript(e){try{return J SON.parse(e.innerHTML)}catch(e){return{touts:[],scenarios:[]}}}function findTemplate(e,t=””){const o=e&&e.querySelector(`[data-template-id=”${t}”]`);return o&&o.content}function isNCR(){return/[?&]source=ncr/.test(location.search)}function brandedTakeoverTime(e){const{startTime:t,endTime:o,startDate:n,endDate:r}=e,i=n.concat(” “,t),a=r.concat(” “,o),l=moment(i),s=moment(a);return moment().isBetween(l,s)}function optimizeDebugger(){return new Promise(e=>{const t=window.location.search||””;if(t){const o=new URLSearchParams(t),n=o.get(“optimize-attribute-name”)||””,r=o.get(“optimize-attribute-value”)||””,i=o.get(“optimize-delay”)||0,a=o.get(“optimize-cookie”)||!1;setTimeout(()=>{a&&(document.cookie=randomNymcid()),document.body.setAttribute(`data-${n}`,r),e()},i)}else e()})}function randomNymcid(){return`nymcid=${(()=>([1e7] -1e3 -4e3 -8e3 -1e11).replace(/[018]/g,e=>(e^16*crypto.getRandomValues(new Uint8Array(1))[0]>>e/ 4).toString(16)[0]))()}`}function replaceQueryParams(e){const t=window.location.search||””;if(t){const o=new URLSearchParams(t);if(e.includes(“?”)){const t=e.split(“?”),n=new URLSearchParams(t[1]);for(let e of o.entries())n.set(e[0],e[1]);e=`${t[0]}?${n.toString()}`}else e=`${e}?${o.toString()}`}return e}module.exports=(e=>new Promise(e=>{auth0.on(“init”,()=>{e()})}).then(()=>optimizeDebugger()).then(()=>{displayDebug(window.location.href),initializeChoreographer(e)}));
}, {“3″:3,”7″:7,”8″:8,”9″:9,”33″:33,”38″:38,”54″:54,”66″:66,”85″:85,”86″:86,”87″:87,”88″:88,”89″:89,”90″:90,”91″:91,”92″:92,”content-cliff.client”:”content-cliff.client”}];
window.modules[“growl.client”] = [function(require,module,exports){“use strict”;require(152);const _some=require(75),dom=require(4),localStorageKeyRoot=”slideout-“,{getLocalStorage:getLocalStorage,setLocalStorage:setLocalStorage}=require(33);module.exports=((e,t)=>{const{content:o,onShow:s,scrollDepth:r=50,dismissable:i=!1}=t,n=Number(r||e.getAttribute(“data-display-at-page-scroll-percentage”)),a=dom.find(e,”.modal”),l=”slideout-” (t.id||e.getAttribute(“id”)),c=getLocalStorage(l);function d(){a.classList.add(“hidden”)}function g(){setLocalStorage(l,!0),d()}i&&c?e.remove():(o&&e.querySelector(“[data-content]”).appendChild(o),n&&function(e=50){const t=new IntersectionObserver(e=>{_some(e,”isIntersecting”)&&(a.style.top=”inherit”,a.classList.remove(“hidden”,”initial”),”function”==typeof s&&s(),t.unobserve(a))});a.style.top=`${document.querySelector(“body”).scrollHeight/(100/e)}px`,t.observe(a)}(n),e.querySelector(“.dismiss-modal”).addEventListener(“click”,()=>i?g():d()),e.addEventListener(“growl:hide”,d),e.addEventListener(“growl:dismiss”,g))});
}, {“4″:4,”33″:33,”75″:75,”152”:152}];
window.modules[“speed-bump.client”] = [function(require,module,exports){“use strict”;const gtm=require(3),visibility=require(5);module.exports=((e,i)=>{if(!i||!e)return;const{name:o,speedbumpDescription:r,speedbumpMessage:t,speedbumpLink:n,baseTrackingData:s}=i,c=new visibility.Visible(e,{shownThreshold:.5});e.querySelector(“.description”).innerHTML=r,e.querySelector(“.promo-link”).innerHTML=t,e.querySelector(“.promo-link”).href=n,e.classList.remove(“collapsed”),c.on(“shown”,function(){if(visibility.isElementNotHidden(e)){let e=s;e.event=”eec.promotionView”,e.ecommerce={promoView:{promotions:[{name:o,creative:r,id:”speed bump”,position:”in-article”}]}},gtm.reportNow(e),c.destroy()}}),e.querySelector(“.promo-link”).addEventListener(“click”,function(){let e=s;e.event=”eec.promotionClick”,e.ecommerce={promoClick:{promotions:[{name:o,creative:r,id:”speed bump”,position:”in-article”}]}},gtm.reportNow(e)})});
}, {“3″:3,”5”:5}];
window.modules[“newsletter-speed-bump.client”] = [function(require,module,exports){“use strict”;const{loadRecaptcha:loadRecaptcha}=require(119),_isEmpty=require(100),_set=require(120),_kebabCase=require(93),gtm=require(3),auth0=require(7),visibility=require(5),COMPONENT_NAME=”newsletter-speed-bump”,EMAIL_VALID_REGEX=/^(?:(?:[^()[]\.,;:[email protected]”] (?:.[^()[]\.,;:[email protected]”] )*)|(“. “))@(?:(?:[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(?:(?:[a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/,LOCAL_STORAGE_KEY_NAME=”newsletterSpeedBumpSignUpStatus_”,MAX_EMAIL_LENGTH=50;function setClass(e,t){e.classList.add(t)}function getRequestUrl(e){return e.getAttribute(“action”)}function getPageType(e){const t=e?e.getAttribute(“content”):””;return _kebabCase(t)}function getPayloadObject(e,t,r,s){const n={};return _set(n,`vars.source_${t}`,`${COMPONENT_NAME}_${s}`),n.email=r,n.lists={},n.lists[t]=!0,n.recaptcha=e,n.signuppage=`${document.location.href}_${t}`,n[`source_${t}`]=”newsleter_speedbump”,n}module.exports=((e,t)=>{if(!t||!e)return;if(“success”===window.localStorage.getItem(`${LOCAL_STORAGE_KEY_NAME}${t.newsletterSpeedBumpNewsletterId}`))return void e.remove();const{baseTrackingData:r,name:s,newsletterSpeedBumpCtaCopy:n,newsletterSpeedBumpDescription:i,newsletterSpeedBumpHeadline:a,newsletterSpeedBumpNewsletterId:o,newsletterSpeedBumpThankYouMessage:c,RECAPTCHA_PUBLIC_KEY:l}=t,u=auth0.getEmail(),d=e.querySelector(“.description”),p=e.querySelector(“.input.email”),m=e.querySelector(“.error-message”),h=e.querySelector(“.form”),E=e.querySelector(“.form-container”),y=e.querySelector(“.form-recaptcha-container”),g=e.querySelector(“.headline”),v=e.querySelector(“.container”),S=e.querySelector(“.input.newsletterId”),_=e.querySelector(“.recaptcha-wrapper”),L=e.querySelector(“.input.submit”),w=e.querySelector(“.text-container”),q=new visibility.Visible(e,{shownThreshold:.5});u&&(p.removeAttribute(“required”),e.classList.add(“signed-in”)),d.innerHTML=i,g.innerHTML=a,S.value=o,L.value=n,q.on(“shown”,function(){if(visibility.isElementNotHidden(e)){const e=r;e.event=”eec.promotionView”,e.ecommerce={promoView:{promotions:[{creative:`${a} | ${i}`,id:”newsletter speed bump”,name:s,position:”in-article”}]}},gtm.reportNow(e),q.destroy()}}),p.addEventListener(“focus”,()=>{_.classList.remove(“hidden”)}),h.addEventListener(“submit”,t=>{t.preventDefault();const s=new XMLHttpRequest,n=u||e.querySelector(“.input.email”).value,i=getPageType(document.querySelector(‘meta[name=”type”]’));u||!(n.length>=50)&&EMAIL_VALID_REGEX.test(n)?loadRecaptcha(l,”newsletterSubmit”,!0).then(a=>{s.open(“POST”,getRequestUrl(h),!0),s.setRequestHeader(“Content-Type”,”application/json;charset=UTF-8″),s.addEventListener(“load”,s=>{const a=s.currentTarget||s.target;if(a.status>=200&&a.statussetClass(e,”success”)),[d,E,m,_].forEach(e=>setClass(e,”hidden”)),g.innerHTML=c.replace(“{{email}}”,n),m.innerHTML=””;const s=JSON.parse(a.response),l=_isEmpty(s.sailthruIds)?””:Object.values(s.sailthruIds)[0],u=r;u.event=”eec.purchase”,u.ecommerce={purchase:{actionField:{id:l,revenue:”0.00″},products:[{category:”newsletter signup”,name:S.value,quantity:1,variant:`${COMPONENT_NAME} – ${i}`}]}},gtm.reportNow(u),setTimeout(()=>{e.classList.add(“hidden”)},5e3),t.preventDefault()}else m.innerHTML=”*An error has occurred. Please try again.”}),s.addEventListener(“error”,()=>{m.classList.remove(“hidden”),m.innerHTML=”*An error has occurred. Please try again.”}),s.send(JSON.stringify(getPayloadObject(a,o,n,i))),t.preventDefault()}):m.innerHTML=”*Please enter a valid email”})});
}, {“3″:3,”5″:5,”7″:7,”93″:93,”100″:100,”119″:119,”120”:120}];
window.modules[“content-cliff.client”] = [function(require,module,exports){“use strict”;const auth0=require(7),isProduction=require(8)(),logger=require(85).Logger(()=>!isProduction);module.exports=((t,e)=>{if(!e)return;logger.group(),logger.h2(“Content Cliff”);const{contentCliffOptions:o,firstVisit:n,onShow:r,onClickCliff:i}=e,c=300,l=Number(document.querySelector(“[data-components-count]”).getAttribute(“data-components-count”)),u=3,s=[“taboola”],a=”#content-cliff”,f=t,d=function(){let t=0;return document.querySelectorAll(“[data-word-count]”).forEach(function(e){t =Number(e.getAttribute(“data-word-count”)||0,10)||0}),t}(),g=function(t,e){function o(t){return Math.round(t.getTime()/1e3/60)}const n=o(t),r=o(e);return n-r}(new Date,new Date(n)){},show:()=>{r(),function(){(p=function(t=””){return document.querySelectorAll(`${t} ~ *`)}(a)).forEach(t=>t.remove()),function(){const{contentCliffStatus:e,contentCliffPromo:n,contentCliffCTA:r,contentCliffURL:c}=o,l=t.querySelector(“[data-content-cliff-status]”),u=t.querySelector(“[data-content-cliff-promo]”),s=t.querySelector(“[data-content-cliff-cta]”);s&&s.setAttribute(“href”,c),s&&s.insertAdjacentHTML(“afterbegin”,r),l&&l.insertAdjacentHTML(“afterbegin”,e),u&&u.insertAdjacentHTML(“afterbegin”,n),s&&s.addEventListener(“click”,i)}(),f.classList.remove(“collapsed”),e=s,e.forEach(t=>{const e=document.querySelector(`[data-uri*=”/${t}/”]`);e&&e.remove()}),m.addEventListener(“click”,()=>auth0.showLogin());var e}()}}[function(){if(dl)return logger.log(`article word count ${d} was too short for the cliff`),logger.log(`article components count is smaller than ${u} and not eligible for the cliff`),”noop”;if(g&&isProduction)return”noop”;g&&logger.log(`First session check was ${g}! Showing the cliff anyway: isProduction => ${isProduction}`);if(/coronavirus news|pivot|paywall exclude/i.test(window._nymGtmPage.tags))return isProduction&&logger.log(“Content cliff no-op due to excluded tag match: “,window._nymGtmPage.tags),”noop”;return”show”}()],m=t.querySelector(“.content-cliff-login”);let p=[];return logger.log(`should noop in production due to 30-minute first-session window: ${g}`),logger.groupEnd(),auth0.on(“login”,()=>{f.classList.add(“collapsed”),(p=Array.prototype.slice.call(p,0).reverse()).forEach(t=>f.insertAdjacentElement(“afterend”,t)),p=[]}),”function”==typeof h?h():void 0});
}, {“7″:7,”8″:8,”85”:85}];
window.modules[“most-popular.client”] = [function(require,module,exports){“use strict”;const dom=require(4),lazyLoad=require(108);function lazyLoadImage(a){const o=dom.find(a,”img[data-src]”),d=a&&dom.findAll(a,”source[data-srcset]”),e=o&&dom.closest(o,”.feed-image-wrap”);if(o&&e){new lazyLoad.LazyLoader(e,o,d).init()}}function handleLazyLoad(a){(dom.findAll(a,”.most-popular-item”)||[]).forEach(lazyLoadImage)}module.exports=(a=>{handleLazyLoad(a)});
}, {“4″:4,”108”:108}];
window.modules[“collection-package.client”] = [function(require,module,exports){“use strict”;const dom=require(4),Hammer=require(112),lazyLoad=require(108),_debounce=require(111),BREAKPOINT=768,ANIMATION_DURATION=250;module.exports=(e=>{const t=dom.find(“.collection-simple_text-top”),n=e.querySelector(“.list-wrapper”),i=e.querySelector(“.package-content”),o=dom.findAll(e,”.article”),r=e.classList.contains(“carousel-layout”);var a,s=0,c=!1;if(r){if(!n)return;function d(){a.off(“swipeleft”).off(“swiperight”),s=0,n.style.transform=”translate(0px)”,window.innerWidth1?(window.cancelAnimationFrame(s),i&&i()):(t=r (c=d)*(2-c)*a,e.style.transform=”translate(” t “px)”,window.requestAnimationFrame(s))};n||(n=0);window.requestAnimationFrame(s)}(n,i,ANIMATION_DURATION,function(){s=e,c=!1})}function f(){c||s>0&&l(s-1)}function u(){c||s{!function(e){const t=dom.findAll(e,”source[data-srcset]”),n=dom.find(e,”img[data-src]”),i=dom.find(e,”.article-img-wrapper”);if(t&&n&&i){const e=new lazyLoad.LazyLoader(i,n,t);i.classList.add(“contains-image”),e.init()}}(e)})});
}, {“4″:4,”108″:108,”111″:111,”112”:112}];
window.modules[“sticky-list.client”] = [function(require,module,exports){“use strict”;const dom=require(4),$gtm=require(3),_get=require(9),stickyContainer=require(“sticky-container.client”);DS.controller(“sticky-list”,[“$window”,function(t){var e=require(230),i=40;function s(s){let n,r=function(t){let s=t[0],n=0,r=e.height(this.contentArea),h=this.contentArea.offsetHeight;if(this.containers&&this.containers.length){if(s.target.offsetHeight){let t=this.breakouts.findIndex(t=>(function(t,e){return t!==document.body&&t.contains(e)})(t,s.target.parentElement));if(t>-1&&this.breakouts[t]){let e=this.breakouts[t].offsetHeight i;this.containers[t].style.marginBottom=`${e}px`}}if(h!==this.currentHeigh){const t=e.rect(this.rightRail,this.contentArea);this.currentHeight=h,this.rightRail.style.height=r-t.top-a(this.rightRail) “px”,this.breakouts.forEach((s,r)=>{let a=e.rect(s,this.contentArea),h=e.intersection(a,t);if(h){let e,s=h.top-t.top-n;n =s h.height i,this.containers[r].style.height=`${s}px`,this.containers[r].style.minHeight=`${s}px`,e=this.breakouts[r].offsetHeight i,this.containers[r].style.marginBottom=`${e}px`}})}}}.bind(this);t.innerWidth{let n=_get(e,”dataset.name”,””),r=n.slice(-1)||”1″,a=[“Image_Gallery”,”Standard_Article”,”Feature”,”One_Column_Article”].find(t=>n.includes(t))||””;this.rightRail.parentElement.classList.contains(“tertiary”)&&a&&(e.dataset.name=parseInt(i,10) se===t)||0;return i.slice(s 1).reduce((t,e)=>t (e.offsetHeight||0),0)||0}return s.prototype={setPins:function(){const t=e.rect(this.rightRail,this.contentArea),i=e.height(this.contentArea),s=i-t.top-a(this.rightRail);let n,h,o,l;if(this.populatePinsList(),s1&&t.classList.add(“multi-children”),l=0;l{const t=Array.from(e.children);let o,a,i=0;for(;ia.bottom||n.righta.right)?a.bottom-n.top:0}function getElementsOverlapAmount(e,t){var n,a=[];return _forEach(t,function(t){n=getElementsVerticalOverlap(e,t),a.push(n)}),_max(a)}function getNYMagAdChannel(e){var t=””;switch(e){case”company information”:t=”company”;break;case”new york guides & things to do”:t=”to-do”;break;case”other”:t=e;break;case”sponsored guides”:t=”s-guides”;break;case”urbanist”:t=”urbanist”;break;default:t=””}return t}function appendSectionToDfpAds(){var e,t,n,a=document.querySelector(“meta[property=’og:site_name’]”),o=document.querySelector(“article[data-content-channel]”),i=document.querySelectorAll(AD_NAME_SELECTOR);a&&(e=a.content),o&&(t=o.getAttribute(“data-content-channel”).toLowerCase()),t&&”New York Magazine”===e&&(n=getNYMagAdChannel(t)),n&&appendToAdd(i,n)}function appendPageTypeToDfpAds(){let e=document.querySelector(“.body > div”)||{},t=document.querySelector(“body”)||{},n=e&&e.classList,a=n&&n.length?[…n]:[],o=_find(a,e=>e.includes(“feature”)),i=document.querySelectorAll(AD_NAME_SELECTOR);n&&(o?appendPageNumberPositionToDfpAds(i,”Feature”):n.contains(“lede-gallery-content”)?appendPageNumberPositionToDfpAds(i,”Image_Gallery”):t.classList.contains(“one-column-layout”)?appendPageNumberPositionToDfpAds(i,”One_Column_Article”):n.contains(“article-content”)&&appendPageNumberPositionToDfpAds(i,”Standard_Article”))}function appendPageNumberPositionToDfpAds(e,t){const n=[“528×379″,”1100×200″,”1×1”];let a=e||[],o=dom.find(“.ad-splash”),i=dom.find(“section.wrapper”),r=dom.find(“.secondary”),d=dom.find(“.bottom”),s=dom.find(“.primary”),c={IA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}},BA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}}};a.forEach(e=>{let a,l=””,u=e.dataset.sizes,m=e.classList.value,p=_find(n,e=>u.includes(e)),g=e.parentElement.classList.contains(“image-gallery-mobile-grid-ad”);if(u&&!p||e.setAttribute(“data-name”,e.getAttribute(“data-name”) “/” t),i&&u&&!p){let n,u;if(o&&o.contains(e)?l=”LB”:i&&i.contains(e)?l=”IA”:(r&&r.contains(e)||d&&d.contains(e)||s&&s.contains(e))&&(l=”BA”),c[l]){if(!(u=checkForAdViewport(m)))return;g?(n=c[l][u].grid,c[l][u].grid ):(n=c[l][u].normal,c[l][u].normal ),a=n{e.setAttribute(“data-name”,e.getAttribute(“data-name”) “/” t)})}function injectGoogleScripts(){var e=document.createElement(“script”),t=document.createElement(“script”),n=document.createDocumentFragment();e.src=”//www.googletagservices.com/tag/js/gpt.js”,e.async=”async”,t.src=”//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”,t.async=”async”,n.appendChild(e),n.appendChild(t),document.getElementsByTagName(“body”)[0].appendChild(n)}appendSectionToDfpAds(),appendPageTypeToDfpAds(),injectGoogleScripts(),DS.controller(“ad”,[“adService”,function(e){return function(t){var n,a,o,i=t.getAttribute(“data-offload”),r=new $visibility.Visible(t,{preloadThreshold:i?window.innerHeight/4:200}),d=!1;function s(){window.innerWidth>=1180&&t.parentElement.classList.contains(“ad-repeat”)&&flaggedComponentsOnPage.length&&(a=getElementsOverlapAmount(t,flaggedComponentsOnPage),o=parseInt(t.parentElement.getAttribute(“data-gap”),10),t.style.marginTop=o 30 a “px”)}function c(){s(),e.refresh(n)}function l(){e.remove(n),d||(d=!0,r.on(“shown”,c))}document.querySelector(‘script[data-name=”concert-ads”]’)||(n=e.create(t),r.preload&&$visibility.isElementNotHidden(t)?(e.addToPageLoadQueue(n),i&&r.on(“hidden”,l)):(r.on(“preload”,function(){!n.slot&&$visibility.isElementNotHidden(t)&&(s(),e.load(n))}),i&&r.on(“hidden”,l)),this.adData=n)}}]);
}, {“4″:4,”5″:5,”53″:53,”55″:55,”56″:56,”57”:57}];
window.modules[“article.client”] = [function(require,module,exports){“use strict”;const $visibility=require(5),$gtm=require(3),ImageZoom=require(69),$sentry=require(70);DS.controller(“article”,[function(){var e=40;function t(t){const i=document.querySelector(“.wrapper > .tertiary”),n=t.querySelector(“.lede-image-wrapper.full-bleed”),r=t.querySelector(“.attribution.full-bleed”),o=t.querySelector(“.article-header”),l=o?o.querySelector(“img”):null,c=function(){let t=o.getBoundingClientRect().height;n&&(t=n.getBoundingClientRect().height 25,r&&(t =r.getBoundingClientRect().height)),i.style.paddingTop=t e “px”};i&&o&&(window.innerWidtht(e)),$sentry.initializeIDListeners()}}]);
}, {“3″:3,”5″:5,”69″:69,”70”:70}];
window.modules[“tags.client”] = [function(require,module,exports){“use strict”;const _forEach=require(53);DS.controller(“tags”,[function(){function e(e){this.el=e}return e.prototype={events:{“a.more click”:”showAll”},showAll:function(e){var t=e.target,o=this.el.querySelectorAll(“li.hidden”);_forEach(o,function(e){e.classList.remove(“hidden”)}),t.parentNode.removeChild(t),e.preventDefault()}},e}]);
}, {“53”:53}];
window.modules[“newsletter-flex-text.client”] = [function(require,module,exports){“use strict”;const dom=require(4),_kebabCase=require(93),_isEmpty=require(100),_set=require(120),permutive=require(66),cmptName=”newsletter-flex-text”,{loadRecaptcha:loadRecaptcha}=require(119),gtm=require(3),EMAIL_VALID_REGEX=/^(?:(?:[^()[]\.,;:[email protected]”] (?:.[^()[]\.,;:[email protected]”] )*)|(“. “))@(?:(?:[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(?:(?:[a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/,MAX_EMAIL_LENGTH=50;DS.controller(cmptName,[“$window”,function(e){function t(t){this.el=t,this.email=dom.find(t,”.email”),this.title=dom.find(t,”.title”),this.description=dom.find(t,”.description”),this.source=dom.find(t,”.source”),this.form=dom.find(t,”.form”),this.returnMsg=dom.find(t,”.return-message”),this.newsletterId=dom.find(t,”.newsletterId”).value,this.expandedTerms=dom.find(t,”.expanded-terms”),this.recaptchaKey=this.form.dataset.recaptchaPublicKey,this.local=e.localStorage,this.session=e.sessionStorage,this.apiEndpoint=this.form.dataset.post,this.displayComponent()}return t.prototype={getPageType:function(){var e=dom.find(‘meta[name=”type”]’),t=e?e.getAttribute(“content”):””;return _kebabCase(t)},getPayloadObject:function(e){var t={};return t.email=this.email.value,t.recaptcha=e,_set(t,`vars.source_${this.newsletterId}`,`${cmptName}_${this.getPageType()}`),t.lists={},t.lists[this.newsletterId]=!0,t},displayComponent:function(){var t=this,s=”success”===this.local[“signUpColumnStatus” this.newsletterId.toString()],i=”true”===this.form.getAttribute(“data-display-after-sign-up”);if(!s||i){if(this.el.classList.remove(“initially-hidden”),this.form.classList.remove(“initially-hidden”),setTimeout(function(){t.el.classList.remove(“opacity-zero”)},100),this.session)try{this.session.setItem(“signUpColumn”,”displayed”)}catch(e){}}else t.el.parentElement.classList.add(“newsletter-collapsed”);e.addEventListener(“unload”,function(){t.session.removeItem(“signUpColumn”)})},events:{“.form submit”:”submitForm”,”.email keypress”:”clearMsg”,”.terms-button click”:”showTerms”},clearMsg:function(){this.returnMsg.innerHTML=””},showTerms:function(){this.expandedTerms.classList.add(“active”),this.expandedTerms.setAttribute(“aria-hidden”,”false”)},submitForm:function(e){let t=this.form.getAttribute(“data-error-msg”);e.preventDefault(),this.email.value.length>=50||!EMAIL_VALID_REGEX.test(this.email.value)?(t&&””!==t||(t=”*Please enter a valid email”),this.returnMsg.innerHTML=t,this.returnMsg.focus()):loadRecaptcha(this.recaptchaKey,”newsletterSubmit”,!0).then(e=>fetch(this.apiEndpoint,{method:”POST”,headers:{“Content-Type”:”application/json”},body:JSON.stringify(this.getPayloadObject(e))}).then(e=>e.json()).then(e=>{e&&e.ok?this.successHandle(e):this.errorHandle()}).catch(e=>this.errorHandle(e)))},reportGTM:function(e){const t=_isEmpty(e.sailthruIds)?””:Object.values(e.sailthruIds)[0];let s={event:”eec.purchase”};s.ecommerce={purchase:{actionField:{id:t,revenue:”0.00″},products:[{category:”newsletter signup”,quantity:1,name:this.newsletterId.toString(),variant:`${cmptName} – ${this.getPageType()}`}]}},gtm.reportNow(s)},errorHandle:function(e){this.returnMsg.classList.add(“error”),this.returnMsg.innerHTML=e||”An error occurred. Please try again.”,this.returnMsg.focus()},successHandle:function(e){let t=this,s=this.form.getAttribute(“data-success-title-msg”),i=this.form.getAttribute(“data-success-description-msg”);if(s&&””!==s||(s=”Thanks, you’re all set!”),i&&””!==i||(i=”You’ll receive the next newsletter in your inbox.”),window.fbq&&window.fbq(“track”,”Lead”),permutive.reportNewsletterSubscribe([this.newsletterId]),this.reportGTM(e),this.title.innerHTML=s,this.description.innerHTML=i,this.returnMsg.focus(),this.el.classList.add(“success”),setTimeout(function(){t.el.classList.add(“opacity-zero”),setTimeout(function(){t.el.classList.add(“initially-hidden”),t.el.parentElement.classList.add(“newsletter-collapsed”)},1e3)},5e3),this.local)try{this.local.setItem(“signUpColumnStatus” this.newsletterId.toString(),”success”)}catch(e){}}},t}]);
}, {“3″:3,”4″:4,”66″:66,”93″:93,”100″:100,”119″:119,”120”:120}];
window.modules[“memo-pixel.client”] = [function(require,module,exports){“use strict”;(()=>{var e=document.createElement(“script”);e.async=!0,e.type=”text/javascript”,e.src=document.location.protocol “//d16xpr36wrmcmk.cloudfront.net/js/memo.js”,(document.getElementsByTagName(“head”)[0]||document.getElementsByTagName(“body”)[0]).appendChild(e)})(),module.exports=(()=>{});
}, {}];
window.modules[“affiliate-links.client”] = [function(require,module,exports){“use strict”;const dom=require(4),_includes=require(57),_startsWith=require(61),globalClick=require(60),visit=require(59),productSubtags=require(62);var excludedHostnames,skimlinksBaseUrl,skimlinksId,visitState,productUrl,ignoreDataAttribute=”data-affiliate-links-ignore”,article=window.document.querySelector(“article”),isSponsored=article&&”Sponsor Story”===article.getAttribute(“data-type”);function setExcludedHostnames(t){excludedHostnames=(t.getAttribute(“data-excluded-hostnames”)||””).toLowerCase().split(“,”)}function isSkimLink(t){return!!(skimlinksId=t.getAttribute(“data-skimlinks”))}function isExcluded(t){return _includes(excludedHostnames,t)||_startsWith(t,”www.”)&&_includes(excludedHostnames,t.slice(4))||isSponsored}function isUrlProtocol(t){return 0!==t.indexOf(“mailto:”)&&0!==t.indexOf(“javascript:”)}function getTargetHostname(t){return(t.hostname||t.host||t.href||””).toLowerCase()}function convertSkimlinkUrl(t){return(skimlinksBaseUrl=skimlinksBaseUrl||skimlinksId?”//go.redirectingat.com/?xs=1&id=” skimlinksId “&sref=” encodeURIComponent(window.location.href) “&url=”:void 0)&&skimlinksBaseUrl encodeURIComponent(t)}function hasIgnoreAttribute(t){return”true”===t.getAttribute(ignoreDataAttribute)}function convertSkimlink(t){var e,i,r,s=dom.closest(t.target,”a”),n=s&&s.href;n&&n.length&&!t.defaultPrevented&&(i=getTargetHostname(s),!isUrlProtocol(n)||isExcluded(i)||hasIgnoreAttribute(s)||productSubtags.getAffiliate(n)||(e=convertSkimlinkUrl(n))&&(productUrl=n,r=s&&s.getAttribute(“data-track-id”),s.href=productSubtags.ensureSubtag({url:e,productId:r,visitState:visitState,anchorEl:s})))}function revertSkimLink(t){var e=dom.closest(t.target,”a”),i=e&&e.href||””;i.includes(skimlinksBaseUrl)&&i&&i.length&&productUrl&&(e.href=productUrl)}module.exports=(t=>{const e=isSkimLink(t);visit.onceReady(function(t){visitState=t}),e&&(setExcludedHostnames(t),globalClick.addHandler(convertSkimlink,revertSkimLink))});
}, {“4″:4,”57″:57,”59″:59,”60″:60,”61″:61,”62”:62}];
window.modules[“gtm.client”] = [function(require,module,exports){“use strict”;const $gtm=require(3);DS.controller(“gtm”,[function(){return function(t){$gtm.init(t.getAttribute(“data-container-id”),t.getAttribute(“data-site-slug”))}}]);
}, {“3”:3}];
window.modules[“banner-callout.client”] = [function(require,module,exports){“use strict”;const visit=require(59),_get=require(9);module.exports=(t=>{let e;const s=t.querySelector(“.banner-trigger”),i=window.localStorage,a=`banner-callout-${_get(window.kiln,”preloadSite.slug”,”nymag”)}`;visit.onceReady(function(){!function(){try{e=JSON.parse(i.getItem(a))||{}}catch(t){e={}}}(),e.dismissed||t.classList.add(“show”)}),t.addEventListener(“click”,n=>{(n.target.matches(“a”)||n.target.matches(“span.banner-link”)||n.target.matches(“.banner-trigger”))&&(e.dismissed=Date.now().toString(),function(){try{i.setItem(a,JSON.stringify(e))}catch(t){}}(),function(){t.classList.contains(“show”)?s.setAttribute(“aria-expanded”,”false”):s.setAttribute(“aria-expanded”,”true”);t.classList.remove(“show”)}())})});
}, {“9″:9,”59”:59}];
window.modules[“global-nav.client”] = [function(require,module,exports){“use strict”;const dom=require(4),auth0=require(7),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),pageUri=require(148).getPageUri();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 init(e){auth0.on(“init”,()=>{signInButton.addEventListener(“click”,function(e){e.preventDefault(),auth0.showLogin()}),signOutButton.addEventListener(“click”,function(e){e.preventDefault(),auth0.logout(),gtmSendReport(“Sign Out”,e.target,”user-info-link”)}),auth0.isAuthenticated()&&e.classList.add(“signed-in”),auth0.isSubscriber()&&e.classList.add(“subscribed”),e.querySelectorAll(“.user-link”).forEach(e=>{e.classList.add(“active”)})}),auth0.on(“login”,()=>{e.classList.add(“signed-in”),auth0.isSubscriber()&&e.classList.add(“subscribed”)}),auth0.on(“logout”,()=>{e.classList.remove(“signed-in”),e.classList.remove(“subscribed”)})}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”)&&gtmSendReport(n.text,n,”global-nav-link”)}),module.exports=init;
}, {“3″:3,”4″:4,”7″:7,”148”:148}];
window.modules[“aaa-module-mounting.legacy”] = [function(require,module,exports){“use strict”;const eventify=require(176),_pickBy=require(151),_each=require(312),fingerprintjs2=require(311),DS=require(310);function registerGlobals(){window.DS=DS,window.Eventify=eventify,window.Fingerprint2=fingerprintjs2,DS.value(“Eventify”,eventify),DS.value(“Fingerprint2”,fingerprintjs2),DS.value(“$document”,window.document),DS.value(“$window”,window)}function mountDollarSliceComponents(){DS.service(“components”,[“$document”,”$module”,function(e,n){var r=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),o=Object.keys(r);function t(e){return r=>{try{n.get(e,r)}catch(e){logMountError(r,e)}}}_each(o,n=>{var r=e.querySelectorAll(‘[data-uri*=”/_components/’ n ‘/”]’),o=e.querySelectorAll(‘[data-uri$=”/_components/’ n ‘”]’);_each(r,t(n)),_each(o,t(n))}),this.components=o}]),DS.get(“components”)}function logMountError(e,n){const r=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error(“Error attaching controller to ” r,n)}registerGlobals(),document.addEventListener(“DOMContentLoaded”,()=>{mountDollarSliceComponents()});
}, {“151″:151,”176″:176,”310″:310,”311″:311,”312”:312}];
window.modules[“ads.legacy”] = [function(require,module,exports){“use strict”;const _map=require(63),_forEach=require(53),_isString=require(195),_intersectionWith=require(313),_isEqual=require(201),_each=require(312),_debounce=require(111),_sortBy=require(134),page=require(148),visit=require(59);DS.service(“adService”,[“Eventify”,”$cid”,”$document”,”$window”,function(e,t,a,i){var o,n,s,r,d,c,l,u,g,p,m={},h=this,f=[],b=visit.getQueryParamsObject([“utm_campaign”]),w=document.querySelector(‘script[data-type=”ad-a9″]’);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||[],c=i.googletag,w&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()}),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)),u=document.createElement(“script”),g=document.createDocumentFragment(),p=document.getElementsByTagName(“head”)[0],u.src=”https://z.moatads.com/voxprebidheader841653991752/moatheader.js”,g.appendChild(u),p.insertBefore(g,p.firstChild),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?c.defineSlot(o.name,o.sizes,o.id).addService(c.pubads()):c.defineOutOfPageSlot(o.name,o.id).addService(c.pubads())).setTargeting(“adid”,o.id),b.hasOwnProperty(“utm_campaign”)&&t.setTargeting(“utmcamp”,b.utm_campaign),a=h.getAdCount(o.label),t.setTargeting(“label”,o.label “_” o.site “-” a),c.display(o.id),c.pubads().addEventListener(“slotOnload”,function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),(n=v(o))?window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([t],{changeCorrelator:!1})})}):c.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},m[n]=this},r=function(e){c.cmd.push(function(){var t=o(e);m[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=v(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},c.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)})}),c.pubads().setTargeting(“kw”,o),c.pubads().setTargeting(“entry_group”,o),r=r.slice(r.lastIndexOf(“/”) 1),c.pubads().setTargeting(“pn”,r),c.companionAds().setRefreshUnfilledSlots(!0),c.pubads().enableAsyncRendering(),c.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(m);return _each(i,function(i){(t=m[i]).data.loaded&&t.data.label===e&&a }),a},this.getById=function(e){return m[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,”homepageTakeover/TopLeaderboard”:1},t=_sortBy(f,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),f=[]},10),this.addToPageLoadQueue=function(e){f.push(e),d()});function v(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}}]);
}, {“53″:53,”59″:59,”63″:63,”111″:111,”134″:134,”148″:148,”195″:195,”201″:201,”312″:312,”313”:313}];
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[“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) {
To attempt {
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 ();
//]]

Ref: https://nymag.com