Ebene Magazine – Récapitulatif de la saison de la maison d’été: «Til Death Do Us Party

0
1

S’il y avait un prix MVP pour cette saison, il devrait certainement aller à l’équipe de nettoyage qui a vaporisé le tapis de chambre jamais aspiré de Ciara et a dû nettoyer une cuvette de toilettes pleine de crottes non rincées. Non je rigole. La vraie MVP serait Danielle.

Ce n’est pas non plus une blague. Elle a gagné le titre cette nuit ivre quand Lindsay a paniqué sur Stephen et il a menacé de partir. Danielle a pris sa valise et l’a mise dans sa chambre pour le garder dans la maison. Mais elle l’a vraiment mérité le lendemain matin. Avant que Lindsay ne doive parler à Stephen de leurs problèmes et des raisons pour lesquelles il la quitte toujours, Lindsay lui a demandé: «Suis-je le problème dans cette relation?» Sans même réfléchir, Danielle a dit: «Oui», et a regardé sans ciller le gouffre sans fond du besoin de Lindsay et lui a dit ce que tout le monde avait peur.

Il y a beaucoup de gens formidables dans cette maison, des gens qui apportent leur corps chaud, des gens qui apportent le drame, des gens qui apportent une quantité illimitée de boissons pétillantes au thé glacé dur même s’il y en a une pénurie dans le monde entier. Danielle n’est peut-être pas l’une de ces personnes (bien qu’elle soit magnifique et puisse servir le corps), mais Danielle nous apporte la vérité. Danielle nous ramène à la réalité, et sans elle, toute cette entreprise vibrerait à une fréquence trop élevée pour qu’aucun de nous ne puisse la tolérer, comme lorsqu’un chien ne supporte pas le vrombissement du réfrigérateur. Elle a également aspiré le martini expresso renversé sur le court de bière-pong, alors voilà.

Le travail principal de Danielle, bien sûr, est de désactiver Lindsay, et cet épisode, elle a été aussi activée qu’une nouvelle carte de crédit lors d’une vente chez Nordstrom Rack. Après une journée à la plage (dernier épisode présenté), tout le monde boit et souffre d’une grave affliction d’éléphantiasis du Jenga. Lindsay se fait gaspiller une fille de relations publiques (ce qui est comme une fille blanche, mais plus méchante) et décide de descendre et de barrer Stephen avec des textes sur la façon dont il doit descendre et passer du temps avec elle. Puis, quand il ne répond pas, elle lui envoie un message en l’ignorant. Le mec est occupé à créer des liens avec les frères. Il ne regarde même pas son téléphone! Finalement, sa négligence signifie qu’elle doit monter à l’étage et lui dire: «Si vous ne vous souciez pas de votre putain de fille, vous pouvez partir tout de suite.»

Stephen prend l’appât mais s’arrête avant de quitter la maison. (Je sais. Je sais. La saison est terminée. Je ne peux plus faire de petites blagues.) Le matin, Lindsay dit qu’elle a des problèmes d’abandon et qu’il ne peut pas continuer à menacer de la quitter, parce que c’est la pire chose qu’il puisse faire. Stephen est d’accord, mais il ne dit pas que si elle le veut, alors elle doit arrêter de paniquer ivre et de crier sur les problèmes de sa propre création. Nous ne devons jamais oublier que Lindsay a été abandonnée par sa mère, alors ce qu’elle fait dans chaque relation est d’imprimer ses besoins sur son partenaire à un point tel qu’elle les chasse. Elle attend la personne qui dira: «Peu importe ce que tu fais, je ne pars pas comme ta mère l’a fait.»

Stephen, quant à lui, est quelqu’un qui court chaque fois qu’il y a un problème ou une confrontation. Nous n’en savons pas assez sur lui, son éducation ou sa psychologie pour en savoir plus que ce qu’il aime dire n’importe quoi et faire exploser les doigts. Mais que leurs deux ensembles de névroses soient contradictoires plutôt que complémentaires ne présage rien de bon pour eux deux et, honnêtement, ils devraient se séparer. Eh bien, heureusement pour nous, ils l’ont fait, donc nous n’aurons plus jamais à naviguer dans ces eaux perfides de Stephen et Lindsay. Cependant, l’été reviendra, et Lindsay aura un nouveau compagnon et elle sera à la hauteur de ses manigances, j’en suis sûr. Je vais les ouvrir à nouveau comme une étude de cas freudienne, car la pathologie de Lindsay est fascinante et je voudrais continuer à la sucer comme si c’était un paquet de ramen de 99 cents qui ne finit jamais.

Maintenant, passons à des relations plus stables, comme celles de Paige et Perry. Oh, je plaisante. Ils ont rompu aussi. Toute la rupture entre Paige et Perry ressemblait un peu à un éclat: sortie de nulle part, apparemment désordonnée, mais expédiée avec une rapidité surprenante. Aussi vite qu’une drag queen peut décoller une paire de faux cils, Paige décide qu’elle ne veut plus être dans une relation et rompt avec lui, même si elle ne l’a pas annoncé au monde avant cet automne. Selon Internet, ils sont toujours en panne, mais Internet dit aussi que le monde est plat et que Joe Rogan est génial, donc je n’irais pas croire à Internet de si tôt.

Il est un peu choquant qu’il n’y ait que deux relations stables dans la maison: Kyle et Amanda et le dévouement de Luke à Beavis pour le feu. (Feu! Hehe feu!) Alors que la deuxième de ces relations était célébrée chaque semaine, le mariage d’entraînement entre Kyle et Amanda est quelque chose de nouveau. Je dois dire que ce que j’aime le plus dans cet équipage, c’est leur dévouement incessant à un thème – ils ont littéralement passé toute la journée à installer un autel et une réception pour un mariage simulé pour seulement dix personnes. Cette chose était professionnelle. J’aurais aimé qu’ils aient un juge de paix là-bas et qu’ils se soient mariés à la télévision et qu’ils aient ensuite organisé une fête sur le thème du mariage l’année suivante. Je veux dire, ils prévoient de le faire à Jersey City; cela pourrait tout aussi bien ne pas arriver.

Cette célébration n’aurait peut-être même pas eu lieu sans Stephen. Comment auraient-ils pu avoir autant de minuscules bougies LED pour éclairer les marches avant si ce n’était pas pour lui et son étalage de dévotion pour Lindsay? Au moins, ces accros d’Amazon ont recyclé quelque chose cette saison.

Sérieusement, cependant, la cérémonie était vraiment douce et m’a apporté une petite larme aux yeux, ne serait-ce que parce que nous avons vu à quel point Kyle et Amanda s’aiment et à quel point Kyle et Carl s’aiment. Cela bouge juste mon cœur gay ratatiné qu’il y a tellement d’amour authentique dans cette petite Biosphère 2 pour les ivrognes. Quand Kyle demande à Carl d’être son co-meilleur homme, cela m’a aussi fait pleurer, moins que quand Amanda et Paige se plaignent ouvertement de combien ils s’aiment quand elle demande à Paige d’être une demoiselle d’honneur. Est-ce que c’est le patriarcat qui parle ou est-ce que c’est mon excitation pour Kyle et Carl de s’entendre? (Quand Kyle a dû embrasser un membre du même sexe pendant Sexy Jenga et ne s’est pas entendu avec Carl, j’étais tellement dévasté que j’ai dû prendre un Lexapro supplémentaire.)

La seule personne qui ne partage pas tout cet amour est Hannah, qui reste assise toute la journée à ressembler à un ours en gomme rassis qui a été écrasé par un pneu de vélo. Tout d’abord, elle ne fait rien pour se préparer au faux mariage (qui, très bien, mais aussi Robert, qui n’est même pas à la maison, a aimé 18 tâches ménagères). Ensuite, elle appelle Des et se plaint de la méchanceté de tout le monde avec elle et contre elle alors qu’elle était à l’origine de tous les combats. Enfin, elle essaie de ne pas être folle quand Amanda demande à Paige d’être demoiselle d’honneur mais pas à elle.

Voici ce qu’Hannah ne semble pas comprendre: soit elle peut se moquer de Kyle et continuer à être amie avec Amanda, soit elle doit s’éloigner des deux. Elle dit dans son confessionnal qu’elle a choisi de parler de Kyle cet été et c’est ce qu’elle a obtenu. Paige a gardé le silence à son sujet et c’est sa récompense. Elle dit que dire de la merde sur l’un des fiancés de votre meilleur ami est une sorte de haut niveau moral. Nous avons tous des amis avec des partenaires que nous détestons, mais nous les tolérons parce que nous aimons davantage nos amis. Mais pas Hannah. Non, elle pense qu’être ouverte et authentique à propos de sa haine fait d’elle une meilleure personne et cela rend Amanda merdique de ne pas vouloir s’associer avec elle.

Quand Hannah a dit qu’elle ne voulait pas être invitée au mariage, je savais que c’était fini. Pas seulement son amitié avec Amanda, mais peut-être Summer House dans son ensemble. Ce qui a toujours été génial dans cette émission, par opposition à Real Housewives, c’est que ces gars-là semblent tous s’aimer et passer du temps pendant la saison morte. C’était comme une petite vue sur un vrai groupe d’amis. Même s’il y avait un drame, ils s’en remettraient et continueraient de faire la fête ensemble. Cela semble avoir pris fin avec Hannah devenant voyou cette saison. (J’ai adoré quand elle a reconnu que cette saison, elle n’avait pas été douée pour contrôler sa colère.) Avec le petit aperçu que nous avons de la réunion, on dirait que des cris et des récriminations et Hannah gâche tout, et je ne veux pas qu’elle revienne dans la maison si ce n’est que des cris et de la stupidité et des gens qui ne peuvent pas se supporter forcés dans le même espace. J’en ai assez sur les femmes au foyer.

Revenons à Danielle pendant une minute, d’accord. Elle est la seule vraie personne dans cette émission, après tout, et elle a apporté Robert, un kit de brassage maison que ton père t’a offert pour Noël. Il est également normal et gentil et semble s’intégrer parfaitement. Alors que le reste de l’équipage continue de faire rage, dansant sous les lasers dans le brouillard d’une machine à fumée, ils s’assoient sur un petit tuffet avec le feu qui fait rage à proximité et se regardent dans les yeux. Danielle lui dit qu’elle aime vraiment sa compagnie et qu’elle veut continuer à vivre. Il lui dit qu’il l’aime aussi et veut qu’elle soit sa petite amie. La fumée monte dans l’air humide et Danielle sourit du genre de sourire habituellement réservé pour souffler les bougies d’anniversaire ou découvrir que le nouveau film de Melissa McCarthy n’a pas été réalisé par son mari. Les deux s’embrassent alors que les grillons rugissent et que les lucioles clignotent et que les nuages ​​roulent sur la lune d’une manière qui les rend tous les deux plus beaux. Ils ne veulent pas se retirer, ils ne veulent pas que ce baiser se termine, ils ne veulent pas que cette fête se termine, ils ne veulent pas que cette saison de félicité et de captivité se termine. Mais finalement, il doit. Tous les baisers finissent par se séparer, toutes les lucioles meurent, toutes les feuilles deviennent rouges et tombent au sol. L’été, comme Stephen, est toujours un peu trop court.

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

= 0? (U = f.substr (0, v), c = f.substr (v 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 [« 1168 »] = [function (require, module, exports) {« 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 map (r, e) {if (r.map) return r.map (e); pour (var t = [], n = 0; n0&&a [a.length-1]) && (6 === i [0] || 2 === i [0])) {o = 0; continue} si (3 === i [0] && (! a || i [1]> a [0 ] &&i [1] « : » akbar-men « , » ∑ « : » majmou « , » ¤ « : » omla « }, az: {}, ca: { » ∆ « : » delta « , » ∞ « : « infini », « ♥ »: « amor », « & »: « i », « | »: « o », «  »: « mes que », « ∑ »: « suma dels », « ¤ »:  » moneda « }, cz: { » ∆ « : » delta « , » ∞ « : » nekonecno « , » ♥ « : » laska « , » & « : » a « , » | « : » nebo « , » « : « vice jako », « ∑ »: « soucet », « ¤ »: « mena »}, de: {« ∆ »: « delta », « ∞ »: « unendlich », « ♥ »: « Liebe »,  » & « : » und « , » | « : » oder « , » « : » groesser als « , » ∑ « : » Summe von « , » ¤ « : » Waehrung « }, dv: { » ∆ « : » delta « , » ∞ « : » kolunulaa « , » ♥ « : » loabi « , » & « : » aai « , » | « : » noonee « , » « : » ah vure bodu « , » ∑ « : » jumula  » , « ¤ »: « faisaa »}, en: {« ∆ »: « delta », « ∞ »: « infinity », « ♥ »: « love », « & »: « et », « | »:  » ou « , » « : » supérieur à « , » ∑ « : » somme « , » ¤ « : » devise « }, 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 menthe « , » ∑ « : » szu mma « , » ¤ « : » penznem « }, il: { » ∆ « : » delta « , » ∞ « : » infinito « , » ♥ « : » amore « , » & « : » e « , » |  » : « o », «  »: « maggiore di », « ∑ »: « somma », « ¤ »: « moneta »}, lt: {}, lv: {« ∆ »: « delta », « ∞ »: « bezgaliba », « ♥ »: « milestiba », « & »: « un », « | »: « vai », «  »: « lielaks neka », « ∑ »: « summa », « ¤ »: « valuta « }, mon: { » ∆ « : » kwahkhyaet « , » ∞ « : » asaonasme « , » ♥ « : » akhyait « , » & « : » nhin « , » | « : » tho « , » « : » kyithaw « , » ∑ « : » paungld « , » ¤ « : » ngwekye « }, mk: {}, nl: { » ∆ « : » delta « , » ∞ « : » oneindig « , » ♥ « : » liefde « , » & « : » 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 », «  »: « bolche », « ∑ « : » 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 « == typeof a) for (g in n = a.maintainCase ||! 1, O = a.custom&& « object » == typeof 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 (fonction (e) O [e «  »] = e «  »}), t =! 0): t = !! a.titleCase, a.custom&& « number » == typeof a.custom.length&&Array.prototype.toString.call (a. personnalisé) &&a.custom.forEach (fonction (e) {O [e «  »] = e «  »}), Object.keys (O) .forEach (fonction (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; pour (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = e. remplacer (/ (^ s | s $) / g, «  »)). longueur; 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); renvoie t&& ( E = E.replace (/ ( w) ( S *) / g, function (e, a, n) {var t = a.toUpperCase () (null! == n? N: «  »); retour 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 (e) {return function (a) {return n (a, e)}}, o = function (e) {return e.replace (/ [- \ ^ $ *?. () | [] {} /] / g, « \ $ & »)}, i = function (e, a) {for (var n in a) if (a [n] === e) return! 0}; if (« undefined »! = typeof 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 « speakurl: les globals existent /(getSlug|createSlug)/ »;e.getSlug=n,e.createSlug=t}catch(e){}}(ceci);
}, {}];
window.modules [« 1198 »] = [function (require, module, exports) {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 (e) {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: each, remove: remove, clearAll: clearAll };
}, {« 1200 »: 1200}];
window.modules [« 1202 »] = [function (require, module, exports) {module.exports = {name: « memoryStorage », read: read, write: write, each: each, remove: remove, clearAll: clearAll} ; 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 [« 1223 »] = [function (require, module, exports) {! function (e) {var t = function (e) {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) renvoie e.replace (/ ()? ([^)? / G, function (e, n, r, a) {return a = a || «  », (n = n || «  »). correspondance (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; renvoie 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 (e) {var t = n (« (?: (?:] *> | ^) \ s * (?:] *> \ s *) *) (?: ( « |“ | “) | (‘|’ | ‘)) », « i »); if (e || « chaîne » = = type de e) retourne e.replace (t, fonction (e, t, n) {var s = t? « dquo »: « quo », r = t || n; return [e.slice (0, e.lastIndexOf (r)),  », r, «  »]. join («  » )})}, c = t.widont = function (e) {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 « ); retourne 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)}; var l, o, u = t.smartypants = fonction (e) {var t, n, r = f (e), a = [], p = [], c = «  », i = «  », l =! 1, o = «  »; return r.forEach (function (e) {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) interrupteur (n = g (n ), n = h (n), n = d (n), n = x (n)) {case « ‘ »: n = / S / .test (o)? « ‘ »: « ‘ »; pause ; case ‘ »‘: n = / S / .test (o)? » «  »: «  » « ; break; par défaut: n = m (n)} o = t, a.push (n)}}) , a.join («  »)}, f = t.tokenize = function (e) {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 (e) {return e.replace (/…/ g, « … »). remplacer (/ . . ./ g, « … »)}, x = t.smartBackticks = function (e) {return e.replace (/ «  / g, «  » « ). replace (/  » / g, » «  ») }, m = t.smartQuotes = function (e) {var t = « (? =% s \ B) ». replace (« % s », « [!  » # \ $ \% \ ‘ () *, -. \ /:;? \ @ \ [\\] \ ^ _ `{|} ~] »), s = « [^ \ \ t \ r n \ [\ {\ (\ -] « , r = n ( » (\ s | | – | & [mn] tiret; | – | – | ȁ [34];) ‘( ? = \ w) « , » g « ), a = n ( » (« s ») ‘(?! \ s | s \ b | \ d) « , » g « ), p = n (« ( » s « ) ‘(?! \ s | s \ b) », « g »), c = n (‘ (\ s | | – | & [mn] tiret; | – | – | ȁ [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, » ‘ » »). remplacer (/ b’ (? = d {2} s) / g, « ‘ »). remplacer (r, « $ 1′ »). replace (a, « $ 1 ‘ »). replace (p, « $ 1’ $ 2 »). replace (« ‘ », « ‘ »). replace (c, « $ 1 » « ). replace (i, » «  ») .replace (l, « $ 1 » « ). replace (‘ »‘, «  » « )}, y = function (e) {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) &&v (l, t [l]); y.prototype.chain = function () {return this._chain =! 0, this}, y.prototype.value = function this._wrapped}} (this);
}, {}];
window.modules [« 1319 »] = [function (require, module, exports) {« use strict »; const universalAgora = require (1321), universalRest = require (10), universalQuery = require (1320), _ get = require ( 23); 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, produits: t? universalAgora.filterByLocale (r): r}})} function getMerchantsList (e) { renvoie searchByQueryWithRawResults (universalAgora.buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale »)), e) .then (universalQuery.formatAggregationResults ({aggregationName: « merchants », field: « key », subfield: « name »}) )} module.exports.getProduct = universalAgora.getProduct, module.exports.getProducts = getProducts, module.exports.getMerchantsList = getMerchantsList, module.exports.searchByQueryWith RawResults = searchByQueryWithRawResults, module.exports.buildMerchantsByUrlQuery = universalAgora.buildMerchantsByUrlQuery;
}, {« 10 »: 10, « 23 »: 23, « 1320 »: 1320, « 1321 »: 1321}];
window.modules [« 1320 »] = [function (require, module, exports) {« use strict »; const _map = require (50), _ get = require (23), _ isArray = require (150), _ set = require ( 108), _ isObject = require (87), _ cloneDeep = require (69), _ uniq = require (92); function formatSearchResult (e) {return _map (e.hits.hits, « _ source »)} function newQuery (e) { if (! e) throw new Error (« Un` index` est requis pour construire une requête « ); 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); renvoie 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)) throw new Error (« Filter requête requise pour être un objet « ); retourne 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 (« Un nombre est requis comme deuxième 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)) throw new Error (`Le second argument doit être un nombre: $ {o}`); return _set ( e, « body.size », o)} function addFrom (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o)) throw new Error (` Le deuxième argument doit être un nombre: $ {o} `); return _set (e, » body.from « , o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throw new Error ( » Second argument is required to 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, {terme: {site: o.slug}}), addMustNot (e, {existe: {field: « subsite »}})), e} function onlyWithinThisDomain (e, o) { return addFilter (e, {prefix: {canonicalUrl: `http: // $ {o.host}`}}), e} function withinThisSiteAndCrossposts (e, o) {var t = {term: {}}, r = { booléen: {devrait: [], minimum_should_match: 1}}; return t.term [« crosspost. » (o.subsiteSlug || o.slug)] =! 0, r.bool.should.push (t), o.subsiteSlug? r.bool.should.push ({terme: {sous-site: o.subsiteSlug}}) : (r.bool.should.push ({terme: {site: o.slug}}), addMustNot (e, {existe: {champ: « sous-site »}})), addFilter (e, r), e} function withinThisDomainOrCrossposts (e, o) {return addShould (e, {term: {[`crosspost. $ {o.subsiteSlug || o.slug}`] :! 0}}), addShould (e, {prefix: {canonicalUrl : `http: // $ {o.host}`}}), addMinimumShould (e, 1), e} function moreLikeThis (e, o, t) {let r = {fields: [« tags »], comme: {_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)}} function 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} function formatAggregationResults ({aggregationName: e = «  », field: o = «  », subfield: t = «  », skipEmpty: r = ! 0}) {fonction de retour (s = {}) {let i = _get (s, `agrégations. $ {E} $ {t? ». « T ». « : ». « } Buckets`, []) ; retourne r&& (i = i.filter (e => 0! == _ get (e, « doc_count », 0))) , i.map (e => e [o] || «  »)}} function addGeo (e, o) {if (! _ isArray (o)) throw new Error (« Second argument is required to be an Array ») ; if (2! == o.length) throw new Error (« Le tableau doit avoir une longueur de 2 »); if (o.some (isNaN)) throw new Error (« Le tableau ne doit contenir que des nombres »); return _set (e , « body.query.geo_shape.location.shape.type », « point »), _ set (e, « body.query.geo_shape.location.shape.coordinates », o), e} fonction combineFunctionScoreQueries (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 ({filtre : t, poids: 20}), e.body.query.function_score.functions.push ({filtre: r, poids: 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} function addNestedObjQuery (e, o, t) {if (! e) throw new Error (« Il n’y a pas de requête de base pour exécuter l’opérat addNestedObjQuery ion « ); if (! o) throw new Error ( » Il n’y a pas de chemin d’objet imbriqué sur lequel effectuer la requête imbriquée « ); if (! t) throw new Error ( » Il n’y a pas de chemin de requête imbriqué pour exécuter la requête imbriquée contre « ); return _set (e, » imbriqué « , {chemin: o, requête: t}), e} function addMatchAll (e) {return _set (e, » body.query « , {match_all: {}}) , 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 .onlyWithinThisSite = onlyWithinThisSite, module.exports.onlyWithinThisDomain = onlyWithinThisDomain, module.exports.withinThisSiteAndCrossposts = withinThisSiteAndCrossposts, module.exports.withinThisDomainOrCrossposts = withinThisDomainOrCrossposts = withinThisDomainOrCrossposts = withinThisDomainOrCrossposts = withinThisDomainOrCrossposts = withinThisDomaine ts.formatAggregationResults = formatAggregationResults, module.exports.formatSearchResult = formatSearchResult, module.exports.moreLikeThis = moreLikeThis, module.exports.combineFunctionScoreQueries = combineFunctionScoreQueries, module.exports.addNestedObjQuery = addNestedObjQuery, module.exports.moreLikeThis = moreLikeThis, module.exports.combineFunctionScoreQueries = combineFunctionScoreQueries, module.exports.addNestedObjQuery = addNestedObjQuery
}, {« 23 »: 23, « 50 »: 50, « 69 »: 69, « 87 »: 87, « 92 »: 92, « 108 »: 108, « 150 »: 150}];
window.modules [« 1321 »] = [function (require, module, exports) {(function (process, __ filename) {(function () {
« use strict »; const _forEach = require (40), _ get = require (23), _ filter = require (134), _ map = require (50), _ isEmpty = require (88), urlParse = require (51), log = require (22) .setup ({file: __ filename}), queryService = require (1320), universalRest = require (10), AGORA_HOST = window.process.env.AGORA_HOST, AGORA_ELASTIC_PREFIX = window.process.env.AGORA_ELASTIC_PREFIX, AGORA_ELASTIC_PREFIX, AGORA_ELASTIC_PREFIX, AGORA_ELASTIC_PREFIX AGORA_HOST? `$ {AGORA_HOST} / api / v1`: null, requestHeader = { » Content-Type « : » application / json « }, PRODUCTS_INDEX = » agora-products « , AFFILIATES_INDEX = » affiliates « , RETAILERS_INDEX = » retailers  » , FILTER_KEY = {marchands: « nom », affiliés: « affilié »}, URL_RE = / ^ https?: / /.*$/; function getProducts (e, t) {const {limit: r = 100, start : a = 0, recherche: s = «  », sortDate: c = « desc »} = e, n = `$ {AGORA_ENDPOINT} / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {c} `; renvoie fetch (n) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .then (e => ({total: e .length, produits: e})). catch (handleError (n))} function getProduct (e, t) {const r = `$ {AGORA_ENDPOI NT} / products / $ {e} `; if (! AGORA_ENDPOINT) throw new Error ( » No Agora endpoint has been set « ); if ( » string « ! = Typeof e) throw new Error ( » request must provide a product id « ); renvoie fetch (r) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .catch (handleError (r))} function postProduct (e) {const t =` $ {AGORA_ENDPOINT} / products`, r = {method: « POST », headers: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t) )} function putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {method: « PUT », headers: requestHeader, body: JSON.stringify (t)}; renvoie fetch (r, a) .then (handleResponse) .catch (handleError (r))} function patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {méthode : « PATCH », headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteProduct (e) {const t = ` $ {AGORA_ENDPOINT} / products / $ {e} `; return fetch (t, {method: » DELETE « , headers: requestHeader}). Then (handleResponse) .catch (handleError (t))} fonction getMerchantList (e) {const {limite: t = 100, champs: r = «  »} = e; return Promise.resolve ([{name: « Amazon »}]). catch (handleError («  »))} function getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / marchands / $ {e}`; if (« string »! = typeof e) throw new Error (« request must provide a product id »); return fetch (t) .then (handleResponse) .catch (handleError (t))} function patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / merchants / $ {e}`, a = {méthode: « PATCH », headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / merchants` , r = {méthode: « POST », headers: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} function putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / merchants / $ {e}`, a = {method: « PUT », headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / merchants / $ {e}`; return fetch (t, {méthode: « DELETE », heade rs: requestHeader}). then (handleResponse) .catch (handleError (t))} function postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {method: « POST », headers: requestHeader , body: JSON.stringify (e)}; renvoie fetch (t, r) .then (handleResponse) .catch (handleError (t))} function patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales /${e}`,a={method: »PATCH »,headers: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 ») ; throw new Error (e)} return t})} catch (e) {throw new Error (e.message)}} function handleError (e) {return t => {throw log (« warn », `La requête a échoué à $ {e} `, t), new Error (` request to $ {e} failed`)}} function buildProductsQuery ({search: e = «  », limit: t = 100, start: r = 0, sortDate: a = «  », filters: s, locale: c}) {const n = queryService (PRODUCTS_INDEX), o = s&&Object.keys (s) .length? Object.keys (s) .filter (e => Array.isArray (s [e]) &&s [e] .length ): [], i = {}, u = {}; if (prependElasticPrefix (n), e || o.length || c || queryService.addMatchAll (n), c&& (queryService.addMust (i, {match : {« locales.locale »: c}}), queryService.addMust (u, {match: {« merchants.locale »: c}})), e) if (isURL (e)) queryService.addMust (n, [queryService.addNestedObjQuery ({}, « marchands », {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 (i, _get (t , « body.query »))} if (o.length) {const e = {}; o.forEach (t => {const r = s [t], a = FILTER_KEY [t], c = {}; a&& (c [`marchands. $ {a}`] = r, queryService.addShould (e, {terms: c}))}), queryService.addMinimumShould (e, 1), queryService.addMust (u, _get (e , « body.query »))} return _isEmpty (i) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, « locales », _ get (i, « body.query »))]), _ isEmpty ( u) || queryService.addMust (n, [queryService.addNestedObjQuery ({}, « marchands », _ get (u, « body.query »))]), querySer vice.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} function prependElasticPrefix (e) {return e.index = AGORA_ELASTIC_PREFIX? `$ {$ AGORA_ELASTIC_PREFIX} _ } `: e.index, e} function buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {active:! 0}}) , t&&queryService.addMust (r, queryService.addNestedObjQuery ({}, « marchands », _ get (queryService.addMust ({}, {match: {« merchants.locale »: t}}), « body.query »))) , queryService.addAggregation (r, {marchands: {imbriqués: {chemin: « marchands »}, aggs: {nom: {termes: {champ: « merchants.name », taille: e}}}}}), queryService. addSize (r, 0), r} function isURL (e) {return URL_RE.test (e)} function filterByLocale (e, t, r = {locales: « US »}) {const a = Array.isArray (e) ; if (_isEmpty (e)) renvoie un? []: {}; const s = [« locales », « marchands »], c = a? e: [e], n = Object.keys ( r), o = _map (c, e => {const a = Object.assign ({}, e); return _forEach (s, s => {if (Object.keys (a) .includes (s)) { const c = t? _filter (e [s], [« locale », t]): e [s]; a [s] = c,! c.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}); renvoie a&&o.length? o: _get (o, « [0] », {})} function searchByQueryWithRawResults (e , t) {const r = `// $ {t.site.host} $ {80! == t.site.port?`: $ {t.site.port} `: » « } $ {t.site .path} / _ agora / _search`; renvoie universalRest.post (r, e,! 0)} function buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); renvoie prependElasticPrefix (t), queryService.addNestedObjQuery (t.body. query, « merchants », {match: {« merchants.buyUrl »: e}}), t} function getAffiliatesByLocale (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 getRetailersByAffiliateId (e, t) {const r = queryService (RETAILERS_INDEX); return e? (prependElasticPrefix (r), queryService.addMust (r, [queryService.addNestedObjQuery ({}, « affiliateRetailers », {match: {« affiliateRetailers.affiliateId »: e}})]) , queryService.addSize (r, 1e3), queryService.addSort (r, {name: « asc »}), searchByQueryWithRawResults (r, t) .then (e => _ get (e, « hits.hits », []) .map (e => _ get (e, « _ source », {})))): Promise.reject ()} function getMerchantsList (e) {return searchByQueryWithRawResults (buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale ») ), e) .then (queryService.formatAggregationResults ({aggregationName: « merchants », field: « key », subfield: « name »}))} function queryRetailersByUrl (e, t) {const r = urlParse (e) .host .split (« www. »). join («  »), a = queryService (RETAILERS_INDEX); return queryService.addMust (a, {match: {domaines: r}}), prependElasticPrefix (a), queryService.addSize (a , 10), searchByQueryWithRawResults (a, t) .then (e => _ get (e, « hits.hits », []). Map (e => _ get ( e, « _ source », {})))} require (208), module.exports = {buildProductsQuery: buildProductsQuery, buildMerchantsAggregation: buildMerchantsAggregation, getProducts: getProducts, getProduct: getProduct, postProduct: postProduct, putProduct: patchProduct deleteProduct: deleteProduct, getMerchantList: getMerchantList, getMerchant: getMerchant, postMerchant: postMerchant, patchMerchant: patchMerchant, putMerchant: putMerchant, deleteMerchant: deleteMerchant, isURL: isURL, filterByLocale: filterByLocale, patchLocale: patchLocale, postLocale: postLocale, buildMerchantsByUrlQuery: buildMerchantsByUrlQuery, getAffiliatesByLocale: getAffiliatesByLocale, searchByQueryWithRawResults: searchByQueryWithRawResults, getRetailersByAffiliateId: getRetailersByAffiliateId, getMerchantsList: getMerchantsList, queryRetailersByUrl: queryRetailersByUrl;

}). call (this)}). call (this, require (11), « / services / universal / agora.js »)}, {« 10 »: 10, « 11 »: 11, « 22 »: 22 , « 23 »: 23, « 40 »: 40, « 50 »: 50, « 51 »: 51, « 88 »: 88, « 134 »: 134, « 208 »: 208, « 1320 »: 1320}] ;
window.modules [« 1322 »] = [function (require, module, exports) {« use strict »; const _map = require (50), _ mapValues ​​= require (203), _ Reduce = require (91), _ assign = require ( 138), _ get = require (23), _ pickBy = require (139), _ find = require (43), affiliateFields = [« siteShortKey », « pageUri », « productId », « utmMedium », « utmSource », « sessionCount » , « format », « utmCampaign », « referrer », « deviceAbbreviation », « zone »], affiliateSettings = {amazon: {domaines: [« amazon.com », « amazon.co.uk »], subtagKey: « ascsubtag « , maxLength: 99, délimiteur: » standard « , encoder:! 1}, narrativ: {domaines: [ » shop-links.co/ » ,subtagKey: »u1″,maxLength:99,delimiter: »standard « , encoder:! 0}, rakuten: {domaines: [« click.linksynergy.com/deeplink », »linksynergy.walmart.com/deeplink » circular,subtagKey: »u1″,maxLength:72,delimiter: »standard »,encode :! 1}, shareasale: {domaines: [« shareasale.com »], subtagKey: « afftrack », maxLength: 99, délimiteur: « standard », encoder:! 1}, skimlinks: {domaines: [« go.redirectingat .com « ], subtagKey: » xcust « , maxLength: 50, délimiteur: » alt « , encoder:! 1}, impact: {domaines: [], subtagKey: » subId2 « , maxLeng th: 99, délimiteur: « standard », encoder:! 1}, avantlink: {domaines: [« avantlink.com »], subtagKey: « ctc », maxLength: 64, délimiteur: « alt », encoder:! 1} , cj: {domaines: [« tkqlhce.com », « jdoqocy.com », « dpbolvw.net », « anrdoezrs.net », « kqzyfj.com »], subtagKey: « sid », maxLength: 64, délimiteur: « alt », encode:! 1, joinBy: « / », assignBy: « / », positionné:! 0, position: « après », positionKey: « type / dlg / »}, partenariat: {domaines: [« prf .hn « ], subtagKey: » pubref « , maxLength: 100, délimiteur: » alt « , encoder:! 1, joinBy: » / « , assignBy: »: « , positionné:! 0, position: » avant « , positionKey : « destination »}, pepperjam: {domaines: [« gopjn.com », « pntrac.com », « pjtra.com », « pjatr.com », « pntrs.com », « pntra.com »], subtagKey : « sid », maxLength: 100, délimiteur: « alt », encoder:! 1}, awin: {domaines: [« awin1.com »], subtagKey: « pref1 », maxLength: 100, délimiteur: « alt », encoder:! 1, positionné:! 0, position: « avant », positionKey: « ued »}}, subtagDictionary = {siteShortKey: «  », pageUri: « p », productId: « i », zone: « z », deviceAbbreviation: « d », utmSource: « s », utmMedium: « m », utmCampaign: « c », sessionCount: « u », referrer: « r », format: « t »}, délimiteur s = {standard: [« [« , « ] »], alt: [« __ », « _ »]}; 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, champs: t = [], visitState: i, locaux: a, productLink: s}) {let n = {}; return t.forEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locaux: a, productLink: s})}), n} function parseQuery (e = «  ») {return e.split (« & »). reduction ((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 = {}, locaux: 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], « positionné »,! 1), d = _get (affiliateSettings [t], « position »), c = _get (affiliateSettings [t ], « positionKey »), p = _get (affiliateSettings [t], « assignBy », « = »), m = _get (affiliateSettings [t], « joinBy », « & »), f = délimiteurs [u]; laissez b, y, S = i. indexOf (« ? »)> = 0? i.split (« ? »). pop (): «  », h = parseQuery (S), _ = getSubtagData ({getters: e, champs: n, visitState: a, locaux: 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;
}, {« 23 »: 23, « 43 »: 43, « 50 »: 50, « 91 »: 91, « 138 »: 138, « 139 »: 139, « 203 »: 203}];
window.modules [« article-nav.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ throttle = require (37), $ visibilité = require (5) , $ popup = require (52), $ gtm = require (3), {reportSocial: reportSocial} = require (53), auth0 = require (12); 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-sponsorisé « ), 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 [propriété = « og: image »] ‘)? dom.find (‘ meta [propriété = « og: image »] ‘ ) .getAttribute (« content »): «  », h = dom.find (‘meta [property = « og: title »]’)? dom.find (‘meta [property = « og: title »]’). getAttribute (« content »): «  », y = dom.find (t, « . shar e-link.facebook « ), w = dom.find (t, ». share-link.twitter « ), v = dom.find (t, ». share-link.pinterest « ), b = t.classList. contient (« 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 = $ visibilité.getViewportWidth ()> = 1180? window.getComputedStyle (d, null) .getPropertyValue (« – verticalEndDesktop ») || C: window. getComputedStyle (d, null) .getPropertyValue (« – verticalEnd ») || C} fonction S () {$ =! 1, P ()} fonction 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.transf orm = `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 »), $ visibilité.getViewportWidth ()> = 1180&&i&&fonction () {const t = a ?top $ visibilité.getPage. 0, e = $ visibilité.getPageOffset (i) .top, r = Math.max (e, t); retourne 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 = $ visibilité.isBelowPrimaryContent (e)? « bottom »: « top »; $ gtm.reportNow ({event: « social -share-widget « , clickLocation: s, socialNet work: o}), reportSocial (o), $ visibilité.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://thare.com text = « encodeURIComponent (h) » &url = « f »? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = « w.getAttribute ( » data-handle « )), v&ref ( » data-handle « ) // com / pin / create / button /? url = « f »? utm_source = pin&utm_medium = s3&utm_campaign = sharebutton-t&description = « encodeURIComponent (h) » &media = « g), b) return; auth0. ) => {auth0.isSubscriber () &&t.classList.add (« abonné »)}), window.addEvent Listener (« 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 = « aucun », o.style.display = « aucun »); S (), r.textContent = h} ()}) ;
}, {« 3 »: 3, « 4 »: 4, « 5 »: 5, « 12 »: 12, « 37 »: 37, « 52 »: 52, « 53 »: 53}];
window.modules [« nav-search-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), $ gtm = require (3), {reportSearch: reportSearch } = require (53), 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 « ); fonction 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 ()} fonction a (e) {! s.contains (e.target) &&s.classList.contains (openClass) &&i ()} fonction 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 (« clic », c); t&&t.addEventListener (« soumettre », d); e.addEventListener (« clic », a), document.addEventListener (« keydown », r), e .addEventListener (« touchend », a), n.addEventListener (« soumettre », d)} (dom.find (« corps »), t, dom.find (e, « . nav-search-form submit »)) });
}, {« 3 »: 3, « 4 »: 4, « 53 »: 53}];
window.modules [« nav-dropdown-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), visibilité = require (5), {reportSearch: reportSearch} = require (53); 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); retourne i} function isMobile () {retourne visibilité.getViewportWidth () {let t; const i = e.querySelector (« . nav-dropdown-button-trigger »), n = dom.find (« corps »), 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, ». en-tête de page « ), 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. jaune « ): » « , 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 ( » clic « , () => {initializeHeight (e), v ()}); for (soit e = 0, t = y.length; e (function (e) {e.classList.remove (« c-right », « c -rightdown « , » c-left « , » c-leftdown « )}) (e))}, 500)} ()) 🙁 i.setAttribute ( » aria-extended « , » true « ), t = window .scrollY), e.classList.toggle (« fermé »), e.classList.toggle (« ouvert »), n.classList.toggle (« désactivé »), 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 (« composant-caché »), 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})} ())} fonction w (e) {S (getNextSiblings (e))} fonction S (e) {e .forEach (e => {e.classList.toggle (« composant-caché »)})} n.addEventListener (« clic », 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, « 53 »: 53}];
window.modules [« follow.client »] = [function (require, module, exports) {« use strict »; const _find = require (43), $ popup = require (52); 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/{handle} »,network: »Pinterest « }, {className: « instagram », url: « https://www.instagram.com/{handle} », réseau: « Instagram »}, {className: « rss », url: « http: //feeds.feedburner. com / {handle} « , réseau: » RSS « }, {className: » twitter « , url: » https://twitter.com/intent/follow?screen_name={handle}&tw_p=followbutton&variant=2.0 « , réseau: « Twitter »}, {className: « snapchat », url: « https://www.snapchat.com/discover/{handle} », 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}]);
}, {« 43 »: 43, « 52 »: 52}];
window.modules [« comments-link.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ get = require (23), _ isFinite = require (110), ajax = require (109); 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 ({méthode: « 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 (« Réponse Coral-Talk inattendue »)}))} retour n.pr ototype.onCommentCountFetched = function (t, e) {if (t) return console.warn (t); e> 0&& (this.isNavVariation&&e1? « s »: «  »), this.el.classList.remove (« non- comments « ))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf ( » @ published « )}, n}]);
}, {« 4 »: 4, « 23 »: 23, « 109 »: 109, « 110 »: 110}];
window.modules [« head-gtm.client »] = [function (require, module, exports) {« use strict »; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (142), isProduction = require (9) (); 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)});
}, {« 9 »: 9, « 142 »: 142}];
window.modules [« concert-ads.client »] = [function (require, module, exports) {« use strict »; const customMappings = {« crime-assault »: « Power », « Care Money Productivity »: « Power « , » féminisme-politique-identité « : » Pouvoir « , » culture-média « : » Culture « , célébrité: » Culture « , vivant: » Style « , mode: » Style « , shopping: » Style « , mariages: «Style», beauté: «Style», animaux: «Soi», «apprentissage de la créativité»: «Soi», «relations-amis famille»: «Soi», «comportement social de la personnalité en santé mentale»: «Soi», «apprentissage créativité « : » Self « , » health-wellness « : » Self « , parentalité: » Self « , » relations-sexe dating marriage « : » Self « }, striptags = require (54); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get (« concert_config_url »), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (« ConcertAds initialisant sans Permutive »), window.concertAds = createConcertAds ( ), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {const e = getAuthStatus (); let t = getD ata (« titre »), 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), nouvelle fenêtre.ConcertAds ({cmd: [], slots: [], dfpVariables: l, slugPath: « / » o. replace (/ – | – / g, « -« ), connecté: « non authentifié »! == 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 [propriété = « article: tag »]’)). getAttribute (« contenu »). 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 dans window._nymPermutive.article) return window. _nymPermutive.article [e]; if (window._nymPermutive.user&&e dans 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; retourne t? t.has_subscription? « intitulé »: « unentitled »: « unauthenticated »} function getPaywallStatus (e) {const t = getData (« totalCount ») || 0; return Boolean (t> = 3&& « intitulé »! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (« concertAdsReady », in stallConcertAds);
}, {« 54 »: 54}];
window.modules [« latest-news.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), lazyLoad = require (96); function lazyLoadImage (a) {const o = dom.find (a, « img [data-src] »), d = dom.findAll (a, « source [data-srcset] »), e = dom.closest (a, « . result »); if (o&&e) {new lazyLoad.LazyLoader (e, o, d) .init ()}} function handleLazyLoad (a) {(dom.findAll (a, « . result ») || []). forEach (lazyLoadImage) } module.exports = (a => {handleLazyLoad (a)});
}, {« 4 »: 4, « 96 »: 96}];
window.modules [« coral-talk.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), store = require (116), visibilité = require (5), auth0 = require (12), TALK_AUTH = « talk: auth_token »; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! hasCoralTalkRender =! hasCoralTalkRender =! e.CORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: e.TALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = window.Coral.Talk.render (e.commentStreamContainer, var)}} function getAuthContainer, var)}} function (e) = 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, renderComments (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 Veuillez vérifier votre compte pour activer les commentaires. Vous n ‘avez pas reçu d ‘ e-mail de vérification? Renvoyez l’e-mail maintenant. 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 = « L’e-mail de vérification a été envoyé avec succès »: e.innerHTML = `$ {t.statusText}`}). catch (e => console.log (e))} function tryScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {nouvelle visibilité.Visible (e, {preloadThreshold: 750}). On (« preload », () => tryScriptEmbedding (e, t))} function removeSignInButton (e ) {e&&e.parentNode&&dom.removeElement (e)} fonction init (e) {const t = e.getAttribute (« data-coral-talk-host »), i = `$ {t} / / embed.js` statique , 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} ;! a&&o&& (auth0. « , () => auth0.showLogin ()), auth0.isAuthenticated () &&removeSignInButton (s)}), auth0.on ( » login « , t => {removeSignInButton (s), getAuthToken (t), visibilité.isElement (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()}), auth0.on (« déconnexion », () => {store.remove (TALK_AUTH)}))} module.exports = init;
}, {« 4 »: 4, « 5 »: 5, « 12 »: 12, « 116 »: 116}];
window.modules [« choreographer.client »] = [function (require, module, exports) {« use strict »; const cookie = require (41), _ get = require (23), _ omit = require (74), {insertSpeedBumpComponents : insertSpeedBumpComponents} = require (78), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (79), {generateGrowl: generateGrowl} = require (77), gtm = require (3), {getLocalStorage: getLocalStorage, setLocalStorage (setLocalStorage) 14), {reportPaywall: reportPaywall} = require (53), moment = require (24), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (80), auth0 = require (12), {Scenario: Scenario} = require (75), cidReadyEvent = « nymcid-set », cidKey = « nymcid », isProduction = require (9) (), logger = require (73) .Logger (() => getLocalStorage (« show_choreographer_logs »)), {Verdon : Verdon} = require (76), TEST_COHORT_FLAG = « OptimizeCohort »; function displayDebug (e = «  ») {if (« droit »! == e.split (« # »). Pop ()) return; const t = _get (fenêtre, « dataLayer [0] .userDetails », {}), o = _get (fenêtre , « dataLayer [0] .pageDetails.featureTypes », «  »), n = o.includes (« magazine »)? « magazine »: «  », r = o.includes (« feature »)? « vedette »:  » « , i = » Valeur de l’article: « (n || r || » article « ), a = _get (JSON.parse (localStorage.getItem ( » auth0: profile « )), » http://nymag.com / app_metadata « ), l = » Statut d’authentification: « (a? » authentifié « : » non authentifié « ), s = » Statut du droit: « (!! a&&a.has_subscription? » intitulé « : » non autorisé « ), c = Objet .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.isSubscribe r (); return t? getClientId (cidKey, 8e3) .then (e => (logger.h1 (« Chorégraphe initialisé »), logger.log (`clientId: $ {e}`), logger.log (`page compte comme une vue: $ {o} `), window.nymViewsResponse || (o? updateClientHistoryWithPageData (e, t): getClientHistory (e)))). then (r => {if (logger.group (), logger .h2 (« Historique du client »), logger.table (r), logger.groupEnd (), isNCR ()) return; const {scénarios: i, touts: a, testCohort: l = «  »} = readJSONFromScript (e. querySelector (« script »)); if (! (l === (document.body.dataset [TEST_COHORT_FLAG] || «  »))) return; const s = i.map (e => Scénario (Object.assign ( {}, e, {history: r, siteSlug: t, isSubscriber: n}))). filter (e => (logger.group (), logger.h2 (« Evaluating scenarios »), logger.log (e) , logger.groupEnd (), e.shouldShow)). reduction ((e, {action: t, min: o, count: n}) => {const r = a.find (({value: e}) = > e === t); retourne 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. « )} fonction documentInclud esComponent (e) {return document.querySelector (`[data-uri * = » / $ {e} / « ]`)} function pageShouldCountAsView (e) {const t = « stratège » === 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, « ne wsletter-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 exclue tag matc h: « , 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 », titre: void 0, nom: o [« promo-gro wl « ]. 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, nom: n, titre: r, corps: i, cta: a, lien: 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 « , nom: » 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)}))} funct ion 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: licencier », () = > {n.classList.add (« ignorer »), 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 »})}fonction promoti onReport (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, nom: 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, cliffImageTakeover : a, cliffTakeoverPromo: l, cliffTakeoverStatus: s, tapez: 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, image: 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 (` clé introuvable: $ {e} sur le cookie après $ {t} ms`)}, t); window.addEventListener (cidReadyEvent, () => {clearTimeout (r), o (cookie.get (e))} )})} function readJSONFromScript (e) {try {return JSON.parse (e.innerHTML)} catch (e) {return {touts: [], scénarios: []}}} 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 (« nom-attribut-d’optimisation ») || «  », r = o.get (« valeur-attribut-d’optimisation ») || «  », i = o .get (« optimiser-délai ») || 0, a = o.get (« optimiser-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 (soit 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, « 9 »: 9, « 12 »: 12, « 14 »: 14, « 23 »: 23, « 24 »: 24, « 41 »: 41, « 53 »: 53 , « 73 »: 73, « 74 »: 74, « 75 »: 75, « 76 »: 76, « 77 »: 77, « 78 »: 78, « 79 »: 79, « 80 »: 80,  » content-cliff.client « : » content-cliff.client « }];
window.modules [« growl.client »] = [function (require, module, exports) {« use strict »; require (140); const _some = require (62), dom = require (4), localStorageKeyRoot = « slideout – « , {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage} = require (14); module.exports = ((e, t) => {const {content: o, onShow: s, scrollDepth: r = 50, ignorable: i =! 1} = t, n = Number (r || e.getAttribute (« data-display-at-page-scroll-pourcentage »)), 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&&fonction (eerver = 50) {const t = new Inters 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 ( » corps « ). scrollHeight / (100 / e)} px`, t.observe (a)} (n), e.querySelector (« . ignore-modal »). addEventListener (« click », () => i? g (): d ()), e.addEventListener (« growl: hide » , d), e.addEventListener (« grogner: rejeter », g))});
}, {« 4 »: 4, « 14 »: 14, « 62 »: 62, « 140 »: 140}];
window.modules [« speed-bump.client »] = [function (require, module, exports) {« use strict »; const gtm = require (3), visibilité = require (5); module.exports = ((e , i) => {if (! i ||! e) return; const {nom: o, speedbumpDescription: r, speedbumpMessage: t, speedbumpLink: n, baseTrackingData: s} = i, c = nouvelle visibilité.Visible (e , {shownThreshold: .5}); e.querySelector (« . description »). innerHTML = r, e.querySelector (« . promo-link »). innerHTML = t, e.querySelector (« . promo-link ») .href = n, e.classList.remove (« réduit »), c.on (« affiché », function () {if (visibilité.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 (107), _ isEmpty = require (88), _ set = require (108), _ kebabCase = require (81), gtm = require (3), auth0 = require (12), visibilité = require (5), COMPONENT_NAME = « newsletter-speed-bump », EMAIL_VALID_REGEX = / ^ (? : (?: [^ () [] \.,;: s @ « ] (?: . [^ () [] \.,;: s @ »]) *) | (« . »)) @ (?: (?: [[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, nom: s, newsletterSpeedBumpCtaCopy: n, newsletterSpeedBumpDescription: i, newsletterSpeedBumpHeadline: a, newsletterSpeedBumpNewsletterId: o, newsletterSpeedBumpMerciYouMessage: c, RECAPTCHA_PUBLIC_PUBLIC_TWEAU = tc, RECAPTCHA_PUBLIC_PUBLIC. 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 = nouvelle visibilité.Visible (e, {shownThreshold: .5}); u&& (p.removeAttribute (« required »), e.classList.add (« signed-in « )), d.innerHTML = i, g.innerHTML = a, S.valeur = o, Lv aleur = n, q.on (« affiché », function () {if (visibilité.isElementNotHidden (e)) {const e = r; e.event = « eec.promotionView », e.ecommerce = {promoView: {promotions : [{création: `$ {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, »12″:12, »81″:81, »88″:88, »107″:107, »108 »:108}];
window.modules[« content-cliff.client »] = [function(require,module,exports){« use strict »;const auth0=require(12),isProduction=require(9)(),logger=require(73).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});
}, {« 9″:9, »12″:12, »73 »:73}];
window.modules[« ad.client »] = [function(require,module,exports){« use strict »;const _forEach=require(40),_max=require(42),_find=require(43),_includes=require(44),$visibility=require(5),dom=require(4),MAX_MOBILE_RE=/[[0-9]{1,3}-(768|600)/,MAX_TABLET_RE=/[0-9]{3}-(1024|1180)/,DESKTOP_RE=/(1024|1180)-plus/,AD_NAME_SELECTOR='[data-name^= »/4088/ »], [data-name^= »/172968584/ »]’;var flaggedComponentsOnPage=function(){var e,t=document.querySelector(« .article-content »),n=[];return t&&_forEach([‘.article-sidebar[data-width= »large »]’],function(a){e=t.querySelectorAll(a),_forEach(e,function(e){n.push(e)})}),n}();function getElementsVerticalOverlap(e,t){var n=e.getBoundingClientRect(),a=t.getBoundingClientRect();return!(n.top>a.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, »40″:40, »42″:42, »43″:43, »44 »:44}];
window.modules[« sticky-list.client »] = [function(require,module,exports){« use strict »;const dom=require(4),$gtm=require(3),_get=require(23),stickyContainer=require(« sticky-container.client »);DS.controller(« sticky-list »,[« $window »,function(t){var e=require(218),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(;i{handleLazyLoad(a)});
}, {« 4″:4, »96 »:96}];
window.modules[« article.client »] = [function(require,module,exports){« use strict »;const $visibility=require(5),$gtm=require(3),ImageZoom=require(56),$sentry=require(57);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, »56″:56, »57 »:57}];
window.modules[« tags.client »] = [function(require,module,exports){« use strict »;const _forEach=require(40);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}]);
}, {« 40 »: 40}];
window.modules[« newsletter-flex-text.client »] = [function(require,module,exports){« use strict »;const dom=require(4),_kebabCase=require(81),_isEmpty=require(88),_set=require(108),permutive=require(53),cmptName= »newsletter-flex-text »,{loadRecaptcha:loadRecaptcha}=require(107),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.displayComponent()}return t.prototype={getRequestUrl:function(){return this.form.getAttribute(« action »)},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){var t=new XMLHttpRequest,s=this.form.getAttribute(« data-error-msg »);this.email.value.length>=50||!EMAIL_VALID_REGEX.test(this.email.value)?(s&& » »!==s||(s= »*Please enter a valid email »),this.returnMsg.innerHTML=s,this.returnMsg.focus(),e.preventDefault()):loadRecaptcha(this.recaptchaKey, »newsletterSubmit »,!0).then(s=>{dom.preventDefault(e),t.open(« POST »,this.getRequestUrl(),!0),t.setRequestHeader(« Content-Type », »application/json;charset=UTF-8″),t.addEventListener(« load »,this.onRequest.bind(this)),t.addEventListener(« error »,this.onError.bind(this)),t.send(JSON.stringify(this.getPayloadObject(s))),e.preventDefault()})},onRequest:function(e){const t=e.currentTarget||e.target;t.status>=200&&t.status{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(44),_startsWith=require(48),globalClick=require(47),visit=require(46),productSubtags=require(49);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, »44″:44, »46″:46, »47″:47, »48″:48, »49 »:49}];
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(46),_get=require(23);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 »)}())})});
}, {« 23 »: 23, « 46 »: 46}];
window.modules[« global-nav.client »] = [function(require,module,exports){« use strict »;const dom=require(4),auth0=require(12),signInButton=dom.find(« .user-signin »),signOutButton=dom.find(« .user-signout »),globalNav=dom.find(‘[class^= »global-nav »]’),body=dom.find(« body »),dropdownItems=dom.findAll(« .dropdown-wrap »),gtm=require(3),pageUri=require(136).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, »12″:12, »136 »:136}];
window.modules[« aaa-module-mounting.legacy »] = [function(require,module,exports){« use strict »;const eventify=require(164),_pickBy=require(139),_each=require(301),fingerprintjs2=require(300),DS=require(299);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()});
}, {« 139 »: 139, « 164 »: 164, « 299 »: 299, « 300 »: 300, « 301 »: 301}];
window.modules[« ads.legacy »] = [function(require,module,exports){« use strict »;const _map=require(50),_forEach=require(40),_isString=require(184),_intersectionWith=require(302),_isEqual=require(190),_each=require(301),_debounce=require(99),_sortBy=require(122),page=require(136),visit=require(46);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}}]);
}, {« 40″:40, »46″:46, »50″:50, »99″:99, »122″:122, »136″:136, »184″:184, »190″:190, »301″:301, »302 »:302}];
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, nom) {
try {
fn (el); // initier le contrôleur
} 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 === ‘fonction’) {
const name = key.replace(‘.client’,  »),
instancesSelector = `[data-uri * = » _ composants / $ {nom} / « ]`,
defaultSelector = `[data-uri $ = » _ composants $ {name} « ]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);

for (let el des instances) {
tryToMount (controllerFn, el, nom);
}

for (laissez el des valeurs par défaut) {
tryToMount (controllerFn, el, nom);
}
}
});
} // Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services ou composants qui pourraient en avoir besoin
// 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
// attend que DOMContentLoaded s’initialise, car les fichiers eux-mêmes doivent d’abord être montés

mountLegacyServices ();
mountComponentModules ();
//]]

Ref: https://www.vulture.com

QU’EN PENSEZ-VOUS?

[comment]

PUB

Laisser un commentaire, votre avis compte!

[gs-fb-comments] [comment-form]

Laisser un commentaire, votre avis compte!