{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///embed.js","webpack:///webpack/bootstrap f9e5b1775a770d70c741","webpack:///./~/preact/dist/preact.mjs","webpack:///./static/src/store/store.js","webpack:///./static/src/utils/utils.js","webpack:///./static/src/store/actions.js","webpack:///./static/src/utils/clientUtils.js","webpack:///./~/qs/lib/index.js","webpack:///./static/src/utils/tracking.js","webpack:///./static/src/components/core/link/link.js","webpack:///./static/src/models/Geo.js","webpack:///./static/src/store/ticketingPublic.js","webpack:///./static/src/utils/copy.js","webpack:///./static/src/utils/formatDateTime.js","webpack:///./static/src/utils/gdpr/oneTrust/categories.js","webpack:///./~/freezer-js/src/utils.js","webpack:///./~/whatwg-fetch/fetch.js","webpack:///./static/src/utils/pure.js","webpack:///(webpack)/buildin/global.js","webpack:///./static/src/components/core/link/route.js","webpack:///./static/src/models/Theater.js","webpack:///./static/src/utils/dataProviderToTicketProvider.js","webpack:///./static/src/utils/gdpr/cleanCategoryName.common.js","webpack:///./static/src/utils/gdpr/oneTrust/Pixel.js","webpack:///./static/src/utils/gdpr/oneTrust/queue.js","webpack:///./~/freezer-js/src/emitter.js","webpack:///./~/node-libs-browser/~/process/browser.js","webpack:///./~/object-assign/index.js","webpack:///./~/qs/lib/formats.js","webpack:///./~/qs/lib/utils.js","webpack:///./~/shallow-equals/index.js","webpack:///./static/src/base/embed/embedApp.js","webpack:///./static/src/base/embed/embedDoc.js","webpack:///./static/src/store/update.js","webpack:///./static/src/store/updateShowtimes.js","webpack:///./static/src/utils/historyPushEvent.js","webpack:///./static/src/utils/polyfill.js","webpack:///./~/promise-polyfill/promise.js","webpack:///./static/src/base/embed/embed.js","webpack:///./static/src/components/core/transition/transition.js","webpack:///./static/src/components/core/transition/transitionStates.js","webpack:///./static/src/components/shared/cookiesModal/cookiesModal.js","webpack:///./static/src/components/shared/dynamicTheaterSentence/dynamicTheaterSentence.js","webpack:///./static/src/components/shared/modal/exitModal.js","webpack:///./static/src/components/shared/regionMismatchModal/changeRegionModal.js","webpack:///./static/src/components/shared/svgIcons/svgIcons.js","webpack:///./static/src/models/City.js","webpack:///./static/src/models/Exhibitor.js","webpack:///./static/src/models/Format.js","webpack:///./static/src/models/Movie.js","webpack:///./static/src/models/Screening.js","webpack:///./static/src/services/mxApi.js","webpack:///./static/src/store/updateTicketing.js","webpack:///./static/src/utils/deserialise.js","webpack:///./static/src/utils/gdpr/index.js","webpack:///./static/src/utils/gdpr/oneTrust/connectToOneTrust.js","webpack:///./static/src/utils/gdpr/oneTrust/createPixelComponent.js","webpack:///./static/src/utils/gdpr/oneTrust/index.js","webpack:///./static/src/utils/gdpr/oneTrust/maybeHandle.js","webpack:///./static/src/utils/geoFencing.js","webpack:///./static/src/utils/handleApi.js","webpack:///./static/src/utils/preprocessScreenings.js","webpack:///./static/src/utils/regionModal.js","webpack:///./static/src/utils/smoothScroll.js","webpack:///./static/src/utils/staticData.js","webpack:///./static/src/utils/timeTracker.js","webpack:///./static/src/base/embed/embed.sss","webpack:///./static/src/components/core/link/link.sss","webpack:///./static/src/components/core/transition/transition.sss","webpack:///./static/src/components/shared/cookiesModal/cookiesModal.sss","webpack:///./static/src/components/shared/dynamicTheaterSentence/dynamicTheaterSentence.sss","webpack:///./static/src/components/shared/modal/exitModal.sss","webpack:///./static/src/components/shared/regionMismatchModal/changeRegionModal.sss","webpack:///./static/src/components/shared/svgIcons/svgIcons.sss","webpack:///./~/freezer-js/freezer.js","webpack:///./~/freezer-js/src/freezer.js","webpack:///./~/freezer-js/src/frozen.js","webpack:///./~/freezer-js/src/nodeCreator.js","webpack:///./~/qs/lib/parse.js","webpack:///./~/qs/lib/stringify.js","webpack:///./~/setimmediate/setImmediate.js","webpack:///./~/timers-browserify/main.js"],"names":["root","factory","exports","module","define","amd","a","i","this","modules","__webpack_require__","moduleId","installedModules","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","h","nodeName","attributes","lastSimple","child","simple","children","EMPTY_CHILDREN","arguments","length","stack","push","pop","undefined","String","VNode","key","options","vnode","extend","obj","props","cloneElement","slice","enqueueRender","component","_dirty","items","debounceRendering","defer","rerender","list","renderComponent","isSameNodeType","node","hydrating","splitText","_componentConstructor","isNamedNode","normalizedNodeName","toLowerCase","getNodeProps","defaultProps","createNode","isSvg","document","createElementNS","createElement","removeNode","parentNode","removeChild","setAccessor","old","style","cssText","IS_NON_DIMENSIONAL","test","innerHTML","__html","useCapture","replace","substring","addEventListener","eventProxy","removeEventListener","_listeners","e","removeAttribute","ns","removeAttributeNS","setAttributeNS","setAttribute","className","type","event","flushMounts","mounts","afterMount","componentDidMount","diff","dom","context","mountAll","parent","componentRoot","diffLevel","isSvgMode","ownerSVGElement","ret","idiff","appendChild","out","prevSvgMode","_component","nodeValue","createTextNode","replaceChild","recollectNodeTree","vnodeName","buildComponentFromVNode","firstChild","fc","vchildren","nextSibling","innerDiffNode","dangerouslySetInnerHTML","diffAttributes","isHydrating","j","f","vchild","originalChildren","childNodes","keyed","keyedLen","min","len","childrenLen","vlen","_child","__key","trim","insertBefore","unmountOnly","unmountComponent","ref","removeChildren","lastChild","next","previousSibling","attrs","createComponent","Ctor","inst","recyclerComponents","render","Component","constructor","doRender","nextBase","splice","state","setComponentProps","renderMode","_disable","__ref","getDerivedStateFromProps","base","componentWillMount","componentWillReceiveProps","prevContext","prevProps","syncComponentUpdates","isChild","rendered","cbase","previousProps","previousState","prevState","previousContext","isUpdate","initialBase","initialChildComponent","skip","snapshot","shouldComponentUpdate","componentWillUpdate","getChildContext","getSnapshotBeforeUpdate","toUnmount","childComponent","childProps","_parentComponent","baseParent","componentRef","t","unshift","componentDidUpdate","afterUpdate","_renderCallbacks","originalComponent","oldDom","isDirectOwner","isOwner","beforeUnmount","componentWillUnmount","inner","merge","Promise","resolve","then","bind","setTimeout","setState","callback","forceUpdate","preact","dispatch","eventName","window","getIEVersion","Event","dispatchEvent","_freezerJs","_freezerJs2","default","Store","Freezer","on","reactionName","Error","getVersion","navigator","ua","userAgent","ieIndex","indexOf","parseInt","cached","_classCallCheck","instance","Constructor","TypeError","debounce","precall","trigger","waiting","apply","that","args","onEvent","requestAnimationFrame","dbounce","thisArg","clearTimeout","timer","throttle","fn","threshhold","scope","last","deferTimer","now","Date","once","done","result","hasClass","addClass","removeClass","triggerAnim","offsetWidth","toggleClass","condClass","cond","Array","isArray","map","cn","join","joinClasses","concat","filter","clamp","v","max","accessNested","path","def","split","prop","asList","_typeof","keys","k","arrayUnique","array","reduce","elem","arrayUnion","appDataDate","val","isNaN","match","NaN","sortObjectByOrder","mapCallback","getProperty","objectByOrder","sort","obj1","obj2","prop1","prop2","noProp1","noProp2","localeCompare","numeric","toString","el","addToQuery","q","forEach","toQueryString","query","addedVal","encodeURIComponent","defaultLevelsDeep","objPaths","createObjectPathDeep","pathsObj","optionsRef","newPath","newOptions","option","newOptionsTest","newOption","create","title","levels","deleteNulls","defaults","recurse","replaceWithVNode","src","search","count","_toRegexp","replaceFunc","arr","cPos","found","exec","index","global","RegExp","_matchSelector","selector","every","attr","_attributeCheck","_classCheck","findInVNode","asPath","direct","currentPath","childrenOffset","parts","sel","srcIsArray","nextNodes","nextSelector","nextPath","nextOffset","inter","nextResult","parseDate","Number","date","joinPaths","slash","il","part","charAt","hasOnlyNumericKeys","isFinite","objToArr","idx","sanitizeObj","endsWith","functionBody","str","lastIndexOf","pathOnly","isFunctionalComp","comp","isObject","isNumeric","parseFloat","accessOrCreateNested","levelCount","level","getVideoTypeFromSrc","parseNumericArray","arrayStr","getStylingImagePath","appData","imgName","defaultImg","images","styling","convertHexToHsl","hex","r","g","b","Math","round","saturation","lightness","encodeHtmlRecursively","encodeHtml","formatPrice","isIntegerOrAlmost","displayWhen","textToJsxArray","BindFactory","_createClass","defineProperties","target","descriptor","writable","protoProps","staticProps","Symbol","iterator","_preact","cache","id","_fn","reduceTextJsx","jsxArray","line","text","display","abs","price","toFixed","UPDATE_STORE","BEFORE_LOAD","PAGE_STATE_LOADED","START_API","GMAPS_LOADED","URL_CHANGED","CLOSE_APP","UPDATE_LOADER","SET_BG_STATUS","SET_ACTIVE_PAGE","SET_CLIENT_SIZE","START_FORCE_CLIENT_ORIENTATION","STOP_FORCE_CLIENT_ORIENTATION","SET_BACKGROUND_VIDEO_PLAYING","SET_BACKGROUND_VIDEO_ENABLED","SET_BACKGROUND_VIDEO_MUTED","SET_BACKGROUND_ELEMENT","UPDATE_BACKGROUND_SETTINGS","CALENDAR_CLICKED","MESSENGER_CLICKED","HOMEPAGE_TRAILER_ENDED","CLICKED_FOLLOW","SET_SIDE_NAV_OPEN","SET_SIDE_NAV_ACTIVE","CLICKED_SHARE","LINK_CLICKED","EXTERNAL_LINK_CLICKED","HEADER_HIDDEN","SET_CLIENT_GEO","GET_SCREENINGS","UPDATE_DYNAMIC_DATA","SET_THEATERS","ADD_THEATERS","SELECT_THEATER","SET_MAP_OPEN","SET_CITIES","SET_CITY_SHOW_COUNT","SELECT_NEARBY_CITY","UPDATE_THEATER_FILTERED_SCREENINGS","AFTER_THEATERS_UPDATE","EXTRA_THEATERS","DO_LOCATION_SEARCH","FIRST_DATA_LOADED","SCREENINGS_LOADED","SELECT_ST_DATE","SELECT_PROVIDER","SELECT_TIME","SELECT_SCREENING","TICKET_LINK_CLICKED","SHOW_SCREENING_AUTH","OPEN_TICKETING","REOPEN_TICKETING","GO_TICKETING_TYPES","UPDATE_TICKET_TYPE_QUANTITY","CREATE_OR_UPDATE_ORDER","UPDATE_ORDER_TICKETS","GO_TICKETING_SEATING","PICK_OR_UNPICK_SEATS","UPDATE_TICKETING_SEATS","FLUSH_SEAT_LAYOUT","GO_TICKETING_REVIEW","GO_TICKETING_CONTACT_DETAILS","GO_TICKETING_PAYMENT","OPEN_PAYMENT","PAYMENT_MESSAGE_RECEIVED","CLOSE_PAYMENT","TICKET_PURCHASE_COMPLETE","SET_TICKETING_MESSAGE","CLEAR_TICKETING_MESSAGE","GO_TICKETING_TIMEOUT","CLOSE_TICKETING","CHECK_FILTERS","RELOAD_FILTERS","TOGGLE_FILTER","FILTER_EXCLUDE","FILTER_DISABLE","SET_FILTER_VISIBILITY","RESET_FILTER","RESET_FILTERS","APPLY_FILTERS","SEARCH_NEW_CITY","SHOW_MODAL","HIDE_MODAL","UPDATE_MODAL","SHOW_COOKIES_MODAL","MODAL_RESULT_OK","MODAL_RESULT_CANCEL","APP_LIST_SCROLLED","MOVIES_LIST_SCROLLED","SCREENINGS_LIST_SCROLLED","EVENT_DATA_LIST_SCROLLED","QUIZ_STARTED","SET_USER","SET_USER_REGION_MODAL_DISMISSED","SET_IOSFIXEDFIX","YOUTUBE_READY","YOUTUBE_PROGRESS","YOUTUBE_ENDED","YOUTUBE_PAUSE","YOUTUBE_PLAY","VR_SET_MODE","SCROLL_LOCK","SCROLL_UNLOCK","ONETRUST_SHOW","AUTH_RESPONSE","AUTH_CLEAR","fetch","_interopRequireDefault","_objectWithoutProperties","buildClientStoreData","initialState","ev","emit","actions","dimensions","getDims","device","getDevice","deviceSize","getSize","orientation","width","height","isIOS","getIsIOS","iOSVersion","getIOSVersion","isIE","getIsIE","isEdge","getIsEdge","isFirefox","getIsFirefox","isTouch","msMaxTouchPoints","isChrome","getIsChrome","isSafari","getIsSafari","hasWebGL","getHasWebGL","header","order","sideNavActive","sideNavBelow","client","breakpoints","Infinity","innerWidth","innerHeight","getQueryParameterByName","url","location","href","regex","results","decodeURIComponent","updateQueryStringItem","usePush","parsedQS","queryString","parse","qs","stringify","method","history","pathname","agent","findParent","tagName","toUpperCase","parentElement","chrome","msie","rv","edge","canvas","getContext","calculateShowtimesStatus","activeDate","forceLive","pages","showtimes","getAC_ID","cookie","find","getGeoFromIPAsync","apiRoot","_utils","res","json","countryCode","data","rawSearchLocation","address","apiKey","srcRegion","region","status","set","loading","error","_tracking","track","reject","firstResult","findLocationInRegion","getCity","isCountry","types","formatted_address","geoData","city","cityName","geometry","lat","lon","lng","Geo","searchLocation","loc","gmapsApiKey","source","geos","geo","sourceIndex","countryComp","address_components","short_name","isInCurrentCountry","cityComp","long_name","geoA","geoB","generateFakeTimes","formats","random","movies","provider_id","provider_movie_id","format_id","theaters","country","tz","provider_theater_id","screenings","sTime","movie_id","theater_id","toISOString","time","_formatDateTime2","is_visible","included","meta","getCountry2","getBoundingRegions","br","disabledBr","extraBr","dynamicData","regions","toJS","brObject","slug","country2","getGeoScreeningsAsync","noBoundingRegionCheck","_ref","stdataApiRoot","apis","stdata","be","exhibitor","include[0]","include[1]","include[2]","include[3]","addTitleFilterToQuery","radiusFactor","blockedProviders","headers","Accept","Content-Type","getTheatersScreeningsAsync","_ref2","ids","containing","processScreeningsApi","_ref3","clientGeo","activePage","theaterMasters","firstBatch","_ref3$data","_ref3$included","preprocessScreenings","_preprocessScreenings2","cc","ignore","formatNames","formatsLookup","_ref4","prev","newName","Format","movieNames","moviesLookup","_ref5","format","Movie","theaterMasterDocs","_ref6","doc","values","atomIds","wwm2dMovie","wwm2dMovieId","mainAtom","main","atom","atomId","mid","screeningDates","dFrom","from","dTo","to","checkScreening","screening","isPast","stDate","theaterScreenings","all","movie","Screening","exhibitorsLookup","_ref7","Exhibitor","pinned","_ref8","Theater","exhibitor_id","theaterMasterDoc","theater_master_id","enabled","getUniques","accessor","finalScreenings","finalMovies","exhibitors","getCitiesAsync","_ref9","overrideCountry","citiesFilters","targetCountry","countries","provider","pidmod","citiesUseMovieAggregate","fetchPath","store","pageData","overrideMovieIds","extraMovieIds","movieMasterIds","titleSlugs","extraTitleSlugs","isInViewport","element","offsets","rect","getBoundingClientRect","html","documentElement","top","left","bottom","clientHeight","right","clientWidth","getPath","page","showtimesStatus","getPageTitle","copy","activePageName","$copy","release","getCopyWithParams","assign","PAGE_NAME","RELEASE_DATE","$DATE_FORMAT","$DATETIME_LOCALE","$DYNAMIC_TITLE","_getCopyWithParams","attribute","_n","getSizeBasedTT","baseName","alternateName","1","groups","dSize","group","conditions","some","ok","_cond$split","_cond$split2","_slicedToArray","cDevice","cOrientation","startsWith","requestSignedStaticMapUrl","urls","staticMaps","studio","staticSigningService","body","JSON","err","getPiwikId","sliceIterator","_arr","_d","_e","_s","_i","_qs","_qs2","_formatDateTime","_store","_store2","_actions","newObj","_Geo","_Geo2","_Theater","_Theater2","_Exhibitor","_Exhibitor2","_Screening","_Screening2","_Format","_Format2","_Movie","_Movie2","_preprocessScreenings","cookies","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_cookie$split","_cookie$split2","substr","__INITIAL_STATE__","editable","_data","ni","useCustomPageTrack","suffix","trackingSuffix","currentTime","getTime","tracked","isInit","isBeacon","beacon","powTracker","trackEvent","queue","tData","hitType","eventCategory","gaCategory","eventAction","eventLabel","eventValue","nonInteraction","gaCustom","gaEnabled","gaPrefixList","ga","gaQueue","sendBeacon","preq","getRequest","baseUrl","getTrackerUrl","trackLinkOut","trackId","label","setupGA","anonymize","campaign","namePrefix","optsObj","cookieExpires","initTracker","isToolkitIframe","disableTracking","__IS_DEMO__","__IS_LOCAL__","viewMode","_clientUtils","customReferrer","referrer","tracking","insights","campaignValue","newSearch","newUrl","protocol","host","hash","setCustomUrl","__IS_FACEBOOK__","setReferrerUrl","setCustomVariable","coppa","useGoogleAnalytics","googleAnalytics","gad","actuallyLoadGA","w","getElementsByTagName","async","category","gaEv","oneTrustCategory","powsterOneTrust","trackingScript","querySelector","onload","script","updateDataLayer","dataLayer","googleTagManagerActive","updateDataLayerScreening","theater","cta","filmTitle","domain","day","ddmmyyyy","time24","updateDataLayerPageView","pageId","firstLoad","_interopRequireWildcard","generateOnClick","fList","_this","_arguments","clickOut","useExitModal","ignoreExitModal","staticData","exitModal","preventDefault","scrollTo","_exitModal2","vanity","getRelativeRoot","getRelativePageUrl","pagePath","getAbsolutePageUrl","relative","goToPage","noMergeQS","newQS","isServer","_route2","handlePageLinkClick","mergeQS","trackLabel","stopImmediatePropagation","stopPropagation","beforePageChange","confirmation","confirm","currentTarget","getAttribute","trackData","link","Link","_extends","_route","_svgIcons","svg","_link","_link2","_exitModal","_staticData","fullProps","iconStyle","iconClass","linkClass","childId","removeSourceQS","extraOnClick","renderCustomChild","childHTML","_fullProps$HTMLTag","HTMLTag","scrollSection","getStaticData","baseQS","removeV","queryStringObj","newQSString","onClick","IconComponent","anchorLink","iconLink","inside","class","iconLinkUrl","iconLinkSvg","extraSpanProps","setGoogleLatLng","google","maps","googleLatLng","LatLng","otherGeo","dl","dL","unit","precision","R","deg2rad","PI","φ1","φ2","Δφ","Δλ","sinφ","sin","sinλ","cos","atan2","sqrt","roundTo","pow","generateCardNumPlaceholder","getPrintYourTicketUrl","getIframeCommunicatorUrl","hasUniqueSeatLabels","getSeatLayoutBoundingBox","getPickedSeats","getSeats","isSofa","findWheelchairInGroup","getSeatAtPosition","createSeatLookup","isSeatForDisablePeople","isCompanionSeat","isWheelchair","areSeatsEqual","areSeatPositionsEqual","getTicketsText","getAreaCategories","getFallbackUrl","isDirectTicketingEnabled","isPowErrorObject","isMxErrorObject","getPowErrorKey","getMxErrorKey","powErrors","mxErrors","seatStatus","defaultGateway","gateways","isDemoTicketing","IS_DEMO","deeplinkProviders","AUTHNET","VANTIV","PXPAY","VERIFONE2","BRAINTREE","MASTERCARD","AVAILABLE","SOLD","HOUSE","WHEELCHAIR","RESERVED","BROKEN","PLACEHOLDER","COMPANION","UNEXPECTED_ERROR","CINEMA_CHAIN_CONFIG_ISSUE","AUTHORISATION_EXCEPTION","VENDOR_CONFIGURATION_EXCEPTION","CINEMA_TICKET_SERVICE_ACCESS_ERROR","CINEMA_TICKET_SERVICE_TIMEOUT","CANT_CONNECT_TO_SITE","CANT_CONNECT_TO_LOYALTY","UNEXPECTED_CINEMA_TICKET_SERVICE_ERROR","FAILED_TO_RETRIEVE_SEATS_FOR_ORDER","FAILED_TO_PROCESS_ORDER_VALUE","REFUND_BOOKING_FAILED","CINEMA_TICKET_SERVICE_CONFIG_ERROR","CINEMA_TICKET_SERVICE_NOT_FOUND","BOOKING_FEE_CONFIG_ERROR","PAYMENT_CONFIG_ERROR","CINEMA_CHAIN_NOT_FOUND","SITE_NOT_FOUND","SHOWTIME_NOT_FOUND","TICKET_TYPES_MANDATORY","CONCESSIONS_NOT_SUPPORTED","SHOWTIME_DOES_NOT_SUPPORT_SEATING","TOTAL_PAYMENT_AMOUNT_IS_INSUFFICIENT","MULTI_SITE_ORDER_NOT_SUPPORTED","ORDER_DOES_NOT_EXISTS","NO_SEAT_MAP_FOR_SOLD_OUT_SHOWTIMES","TICKET_TYPE_NOT_FOUND","REQUEST_TOO_LARGE","CUSTOMER_DETAILS_NOT_SET","VENDOR_ACCESS_NOT_ALLOWED","REFUND_PAST_SCREENINGS_NOT_ALLOWED","REFUND_CINEMA_CHAIN_NOT_ALLOWED","BOOKINS_BELONGS_TO_ANOTHER_VEND0R","INSUFFICIENT_CUSTOMER_DETAILS","LOYALTY_NOT_ALLOWED_FOR_CINEMA_CHAIN","INSUFFICIENT_LOYALTY_MEMBER_DETAILS","TICKET_TYPES_FOR_PAST_SCREENINGS","SEATS_UNAVAILABLE","NO_CONTIGUOUS_SEATS","BOOKING_DOES_NOT_EXIST","BOOKING_ALREADY_CANCELLED","SHOWTIME_UNAVAILABLE","TICKET_NOT_FOR_SALE","SELECTED_SEATS_INVALID_FOR_THE_TICKET","ORDER_ALREADY_BEING_COMPLETED","ORDER_CANNOT_BE_UNIQUELY_IDENTIFIED","COULD_NOT_GET_TICKET_TYPES_FOR_SESSION","LOYALTY_MEMBER_NOT_FOUND","INVALID_API_KEY","AUTH_FAIL","AUTH_EXPIRED","INVALID_EXHIBITOR","INVALID_ORDER","NO_ORDER","COMPLETE_ORDER_FAIL","NO_BOOKING_REF","NOT_YOUR_ORDER","PRIVATE_SCREENING","TOO_MANY_ORDERS","TOO_MANY_TICKETS","TRANSACTION_FAIL","NO_MERCHANT","TRANSACTION_VOID_FAIL","NO_MERCHANT_CREDENTIALS","INVALID_PRICE","INVALID_BOOKING_FEE","isErrorObject","code","errorCode","errorCodeDescription","store_","enableDirectTicketing","forceDirectTicketing","ticketingEnabled","paymentEnabled","gateway","fallbackUrl","website","providerName","ticketTypes","areaCategories","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","areaCategoryCode","description","areaCategory","descriptions","tickets","ticketTypeStrs","ticketTypeId","ticketType","quantity","seatPos1","seatPos2","areaNumber","rowIndex","columnIndex","seat1","seat2","position","seat","originalStatus","areSeatPositionsContiguous","positions","columnIndices","binarySearch","compare","objective","minIndex","maxIndex","currentIndex","compareSeatAtPosition","getSeatAtPositionLayout","seatLayout","seatPosition","area","areas","number","rows","row","seats","getSeatAtPositionLookup","lookup","isSeatLookup","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","rowCount","columnCount","areaLookup","rowLookup","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","_iterator6","_seat$position","seatLookup","seatsInGroup","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","areAllSeatsInSofaPicked","selectedSeats","groupedTickets","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_step8","_iterator8","selectedSeat","rowName","seatName","ticketId","ticketIds","area1","area2","pickedSeats","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_step9","_iterator9","_ret3","pickedSeat","removeSofaFromPickedSeats","_iteratorNormalCompletion10","_didIteratorError10","_iteratorError10","_step10","_iterator10","findIndex","pickedSeatsSorterStable","pickedSeat1","pickedSeat2","pos1","pos2","getRelativeUrl","removeIncompleteSofas","lastAction","_iteratorNormalCompletion11","_didIteratorError11","_iteratorError11","_step11","_iterator11","_iteratorNormalCompletion14","_didIteratorError14","_iteratorError14","_step14","_iterator14","sofas","Set","_iteratorNormalCompletion12","_didIteratorError12","_iteratorError12","_step12","_iterator12","_ref10","add","_iteratorNormalCompletion13","_didIteratorError13","_iteratorError13","_step13","_iterator13","sofa","box","cellWidth","cellHeight","jl","_seats$j$position","kl","seatLabel","has","pageSlug","activePath","appendIndex","fromCharCode","getCopy","isCopySet","copyKey","opts","fallback","fromCopy","copyItem","realKey","parseRepeatPattern","pos","ch","parseQuoted","quote","pad","vl","objectAssign","require","localeDefaults","tokenLen","baseFunctions","$TIME_SEPARATOR","$DATE_SEPARATOR","$AM","$PM","$DAYS_SHORT","$DAYS_FULL","$MONTHS_SHORT","$MONTHS_FULL","$ORD","transforms","getHours","H","getMinutes","getSeconds","noZeroes","getMilliseconds","F","isUppercase","designator","T","getDate","trf","getDay","M","getMonth","y","getFullYear","z","getTimezoneOffset","hours","_toConsumableArray","arr2","categories","changeListeners","STRICTLY_NECESSARY","FUNCTIONAL","TARGETING","dict","ADVERTISING","3","4","listener","addChangeListener","removeChangeListener","process","self","Utils","ob","createNonEnumerable","proto","ne","message","console","each","clbk","addNE","createNE","nextTick","flushQueue","dirty","shift","hasPostMessage","postMessage","Window","processQueue","removeListener","findPivot","__","pivot","parents","isLeaf","freezeInstances","cons","Boolean","warn","normalizeName","normalizeValue","iteratorFor","support","iterable","Headers","append","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","onerror","readBlobAsArrayBuffer","blob","FileReader","promise","readAsArrayBuffer","readBlobAsText","readAsText","readArrayBufferAsText","buf","view","Uint8Array","chars","bufferClone","byteLength","buffer","Body","_initBody","_bodyInit","_bodyText","Blob","isPrototypeOf","_bodyBlob","formData","FormData","_bodyFormData","searchParams","URLSearchParams","arrayBuffer","isDataView","_bodyArrayBuffer","ArrayBuffer","isArrayBufferView","rejected","decode","normalizeMethod","upcased","methods","Request","input","credentials","mode","form","bytes","parseHeaders","rawHeaders","Response","bodyInit","statusText","viewClasses","DataView","isView","oldValue","entries","clone","response","redirectStatuses","redirect","RangeError","init","request","xhr","XMLHttpRequest","getAllResponseHeaders","responseURL","responseText","ontimeout","open","withCredentials","responseType","setRequestHeader","send","polyfill","nextProps","nextState","_shallowEquals2","isSameProp","pureRenderDecorator","_shallowEquals","Function","eval","route","pushState","customDefault","_len","_key","checkTicketProviderIds","mainTheater","alternateTheater","dataProviderToTicketProvider","providerId","attachTicketProvider","tms_id","fandango","movietickets","datetime","matching","sc2","srcTicketProviders","s2","validateFilter","tester","allowNulls","current","mp","matchProp","excluded","inactiveScreeningsFilter","disabled","validateMovie","validateFormat","reald","validateTheater","vals","prov","pid","providerTheaterId","filterTheater","filters","activeScreenings","filteredScreenings","timeOfDay","nextDaySTDate","hour","minute","ticketProvider","providers","filterPass","active","activeExhibitor","webedia","firstDate","urlContainsBlacklistTheater","_ticketingPublic","_dataProviderToTicketProvider","_dataProviderToTicketProvider2","regionProviders","addr","useEnglishCopy","name_en","address_en","city_en","addedMoviesCache","logo","activeScreening","addressParts","fullAddress","masterId","masterDoc","providerExhibitorId","provider_exhibitor_id","distance","distanceFrom","$DISTANCE_UNIT","distanceUnit","disabledList","wwm_ticketing","wwm_tickettype","movietickets_theater_id","fandango_theater_id","atom_theater_id","getRank","rank","currMaster","currRank","masterRank","hasBadDeeplinks","computeUrls","exhibitorDomain","mfixList","midnightFix","nextDayDatetime","offsetDate","mxLinks","deeplinksObj","overrideDeeplinks","isValidDLContext","ctx","checkDLContext","dateFormat","potentialMatches","affiliate","tProviders","ticketProviders","override","useCinemaUrls","affiliateCodeExhibitors","movieSlug","addAffiliateCode","qsPos","strictNullHandling","affiliateCode","matchingDeeplink","preventDeeplinkOverride","screeningUrl","cinema","movieFandango","movie_code_id","fandangoUrl","formattedDate","movieId","movieticketsMovieId","dateTime","tz_offset","customAtomURL","cinepapaya","yandex","kinohod","rambler","cleanCategoryName","_queue","Pixel","pixel","shouldQueue","triggerOrQueue","drain","_categories","managed","prevQueue","specialEvents","emitterProto","listeners","_events","off","returnValue","lastValue","onceListeners","special","Emitter","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","runClearTimeout","marker","cachedClearTimeout","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","timeout","run","Item","noop","browser","env","argv","version","versions","addListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask","toObject","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","test1","test2","test3","letter","symbols","percentTwenties","formatters","RFC1738","RFC3986","hexTable","compactQueue","item","compacted","arrayToObject","plainObjects","allowPrototypes","mergeTarget","acc","encode","string","charCodeAt","compact","refs","isRegExp","isBuffer","shallow","aIsArray","aTypeof","flat","shallowArray","shallowObject","ka","kb","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","setPrototypeOf","__proto__","_embed","_embed2","_dynamicTheaterSentence","_dynamicTheaterSentence2","_copy","EmbedApp","_Component","getPrototypeOf","appState","initialStore","appUrl","settings","textColor","highlightTextColor","buttonTextColor","buttonBackgroundColor","backgroundColor","textFontSize","buttonFontSize","mobileTextColor","mobileHighlightTextColor","mobileButtonTextColor","mobileButtonBackgroundColor","mobileBackgroundColor","mobileTextFontSize","mobileButtonFontSize","extraQueryParameters","containerStyles","background","buttonStyles","color","fontSize","container","content","highlight","releaseDate","dates","linkContainer","button","Embed","relativeRoot","reload","initialData","pageTitle","charset","rel","crossorigin","updateBackground","bg","detectCurrentPage","hostname","bestMatch","bestMatchCount","baseHtml","execScripts","trackPageView","extraOptions","lastTrackedPage","offsetHeight","_gdpr","_smoothScroll","_geoFencing","_geoFencing2","_cookiesModal","_cookiesModal2","storeData","loader","videoEnabled","allowBgVideo","smoothScrollTo","videoPlaying","muted","sideNavOpen","hidden","headerStore","isTablet","hideHeader","started","quizId","quiz","clientStore","validOrientations","refCount","uiState","overlayOrientation","orientationChanged","force","originalSetItem","setItemQueue","originalCookieDescriptor","cookieQueue","localStorage","setItem","getOwnPropertyDescriptor","Document","HTMLDocument","CookiesModal","accept","preventCookies","_localStorage$setItem","blockClose","backdropColor","fadeIn","detectedPage","showbarebones","embedmode","classList","forceFullHeader","iframe","embedMode","onUrlChange","onpushstate","onreplacestate","live","updateSize","isFirstVisit","getItem","redirected","STATIC_PIXELS","pixelsElem","preventTrackingOnLoad","noCookies","regionModalDismissed","user","appBasePath","missedPath","missedPageId","from404","redirectTo","redirectOnLoadAfterShowtimes","redirectOnLoad","loaded","beforeLoad","loadAPI","visibilityChange","msHidden","webkitHidden","inactiveModal","maxWidth","margin","padding","textAlign","textTransform","border","borderRadius","lineHeight","cursor","modal","extra","cb","iosFixedFix","oneTrust","displayModal","_objectAssign","_objectAssign2","_regionModal","_City","_City2","needsRegions","autoBoundingRegions","useRegionSwitcher","useRegionMismatchModal","useAlternateLanguages","appRegionsUrl","regionPromise","demoLinkedRegions","currentRegion","useClientGeo","forceStartGeo","localStorageGeo","gmaps","locationResolveChain","addLocationOption","cancel","cancelGeo","noRemainingCheck","showtimesState","total","firstDataLoaded","newTheaters","nt","theaterId","currentActive","newActive","SET_THEATER_STATE","stateData","newIds","sortTheatersByDate","compProp","sortBy","undefinedFirst","aPinned","va","vb","sortFunc","first","mapOpen","overflow","cities","cityShowCount","noRefresh","hiddenFilters","visible","disabledFilters","disabledFormats","disabledExhib","disabledWebediaTheater","webediaTheater","disabledTheater","defaultFilters","defaultDate","datesList","date1","date2","currentDate","setDate","desired","defaultHour","tmp","defaultMinute","defaultFormat","defaultExhib","defaultTheater","desiredFormat","srcOptions","formatFilterIsStrict","df","desiredExhib","std","timeofday","keepCurrent","_data$movies","_data$formats","timeOfDayOptions","stDateOptions","screeningsMovieIds","tp","includes","timeOfDayOrder","formatOrder","reverse","nameA","nameB","exhib","useTitleFilter","useFormatFilter","providerNames","preventReload","storeFilter","selectedDate","thMasters","keepCurrentFilters","geoSource","displayRegionModalIfNeeded","isFirstBatch","loadingPage","errors","detail","processedPinned","allKeys","errCode","citiesProps","citiesCache","newCity","City","cachedCities","cachedCity","sc","authToken","authScreening","token","remove","mailchimp","uuid","lid","finalObject","L","start","replaceState","debug","info","setImmediate","_state","_handled","_value","_deferreds","doResolve","handle","deferred","_immediateFn","onFulfilled","onRejected","newValue","finale","_unhandledRejectionFn","Handler","reason","ex","setTimeoutFunc","prom","remaining","race","_setImmediateFn","_setUnhandledRejectionFn","_embedDoc","_embedDoc2","_embedApp","_embedApp2","_promisePolyfill","_promisePolyfill2","Raven","config","install","__START_PAGE_ID__","getElementById","App","Doc","EmbedDoc","_transitionStates","transitionStates","_transition","_transition2","Transition","getStyles","transition-duration","duration","animation-duration","setTimer","endTimer","timerFunc","afterTimer","preventExecution","childGenerator","getChildGenerator","firstChildState","STATE_CHILD_ENTERING","secondChild","secondChildState","STATE_CHILD_EMPTY","upcomingChild","disableInit","noInitialTransition","STATE_CHILD_VISIBLE","getNextStep","waitBeforeNext","newChildId","getId","goToNextPage","renderChildren","vNode","_this2","firstChildVisible","secondChildVisible","childType","currentState","newState","STATE_CHILD_LEAVING","_props","enteringClass","visibleClass","leavingClass","emptyClass","baseClass","entering","leaving","empty","firstChildNode","secondChildNode","styles","transitionState","firstChildClass","getActiveClass","secondChildClass","containerProps","_class","_pure","_pure2","pure","Modal","acceptCookies","sendResult","rejectCookies","$COOKIES_MODAL_TITLE","$COOKIES_MODAL_TEXT","buttons","yes","$COOKIES_MODAL_ACCEPT","no","$COOKIES_MODAL_DENY","DynamicTheaterSentence","switchActive","showTheater","activeTheater","theaterTime","nearbyTime","loadingFinished","clearInterval","linkQueryParameters","nrTheaters","sentence","beforeRelease","nowPlaying","nowPlayingTheater","nowPlayingTheaters","intro","selectedTheater","transitionContainer","transition","ExitModal","closeModal","openLink","strippedVanity","getTitle","_changeRegionModal","_changeRegionModal2","formatUrlWithoutProtocol","ChangeRegionModal","_temp","_ret","closeHandler","requireRegionCopy","regionCode","userRegionApp","dynamicCopy","imagePath","appRegionCode","currentApp","appCountryCode","titleCopy","subTitleCopy","stayCopy","userRegionUrl","modalBox","locationBar","locationBarTitle","getFlagPath","alt","closeModalButton","contentBox","heading","gotoButtonContainer","gotoButton","arrowRight","remainLinkBox","remainLink","svgRenderer","svgContent","SVGContent","wrapper","SvgPlay","SvgCart","SvgCompass","SvgLinkOut","SvgGuy","SvgCar","SvgTrain","SvgBin","SvgArrowRight","SvgTick","SvgRealD","SvgImax3d","SvgImax","SvgMuted","SvgSpeaker","SvgCarrotUp","SvgCarrotDown","SvgFullScreenClose","SvgFullScreenOpen","SvgStar","SvgMarker","SvgSearch","SvgEdit","SvgCopy","SvgHeart","SvgUser","SvgLink","SvgShare","SvgShowtimes","SvgSynopsis","SvgVideos","_svgIcons2","createSVGTree","refresh","oldProps","names","setAttributes","svgIcon","viewBox","svgShareIcon","xmlns","svgUserIcon","x","rx","ry","cx","cy","fill-rule","svgBase","transform","stroke-width","stroke-linejoin","fill","stroke-linecap","font-family","font-size","font-weight","letter-spacing","word-spacing","stroke","compass","nameEn","localName","screeningsCount","newCount","logo_file","movietickets_movie_id","fandango_movie_id","getTimeOfDayId","hour24","getTZOffsetString","offset","sign","minutes","STDate","timeOfDayMapping","tomorrow","todayStr","tomorrowStr","datesCache","providerScreeningId","provider_screening_id","setDateTime","iso","setHours","getSTDate","timeSplit","TimeOfDay","createDatetime","nextDay","days","months","years","yoff","moff","doff","UTC","dateStr","year","month","valueOf","dayShort","monthShort","dateNum","yyyymmdd","$DATE_FILTER_FORMAT","$TODAY","$TOMORROW","completeOrder","startTransaction","getSeatingMap","updateSeats","removeTickets","addTickets","cancelOrder","updateTickets","createOrder","getTicketTypes","_handleApi","_deserialise","_deserialise2","API_BASE","API_HEADERS","dummyExhibitor","dummyTheater","dummyScreening","params","seating","handleApiResponse","dummy","getApp","getAnalytics","piwikId","deviceWidth","analytics","apiGet","apiPath","deserialise","apiPost","apiDelete","apiPut","apiPatch","exhibitorId","screeningId","seatingSupported","orderTickets","ticket","app","orderId","ticketsToAdd","ticketIdsToRemove","paymentArgs","email","zip","loyaltyNumber","address1","address2","loyalty","paymentResponse","openTicketing","ticketing","timeTracker","DWELL_TIME","paymentGateway","loyaltyEnabled","termsUrl","privacyUrl","theaterPaymentGateway","theaterLoyaltyEnabled","theaterTermsUrl","theaterPrivacyUrl","sessionId","_sessionId","theaterMxId","screeningMxId","movieTitle","movieFormat","movieDate","theaterName","theaterAddress","exhibitorName","SELECT_TICKETS","startDate","savedTickets","isDemo","reopenTicketing","hasAlreadyBookedTickets","clearTicketingSession","orderCancelled","_ticketing","end","apiLoading","apiMessage","apiMessageCallback","orderComplete","mxApi","clearAll","setTicketingMessage","clearTicketingMessage","closeTicketing","wasLoading","lastStep","NOT_ACTIVE","newTicketing","SELECT_SEATS","getTheaterOccupancy","OCCUPANCY_FLOAT_PRECISION","closeApp","goToTicketingTypes","LOADING_TIME_TICKET_TYPES","maxTickets","goToError","updatedTicketing","onHttpError","updateTicketTypeQuantity","isAllocatedSeating","areTicketsEqual","tickets1","tickets2","ticketType1","ticketType2","createOrUpdateOrder","prevOrder","prevTickets","goToNextSectionAfterOrderCreated","updateOrder","prepareSeatingMap","rowLabel","LOADING_TIME_CREATE_ORDER","_ticketing2","seatingMap","expiration","refreshTimeout","nextTickets","addedTickets","removedTickets","previouslyOrderedTickets","groupedTicket","previousQuantity","_ticketing3","LOADING_TIME_UPDATE_ORDER","getTicketWithSeatCount","updatedOrder","bookingFee","goToTicketingSeating","flushSeatLayout","_ticketing4","LOADING_TIME_FLUSH_LAYOUT","pickOrUnpickSeats","unpickSeats","pickSeats","_ticketing$seating","availablePerArea","seatsToAllocate","pickedPerArea","_ret2","availCount","errorMessage","areaName","NUM_AVAIL","AREA_NAME","alreadyPickedPerArea","loneCompanionSeats","isCompanion","wheelchairSeat","pickedWheelchair","companionLabel","wheelchairLabel","COMP_LABEL","WLCHR_LABEL","seatToMove","oldestAction","MAX_SAFE_INTEGER","indexToRemove","LABEL","modified","seatPos","shouldUpdateSeats","cachedPickedSeats","cachedSeat","updateTicketingSeats","goToTicketingReview","numberOfSeatsToPick","getNumberOfSeatToPick","NUM_SEAT","checkOrphanSeatPolicy","seatsBefore","seatsAfter","seatMovement","_ticketing5","columnId","rowId","LOADING_TIME_UPDATE_SEATS","REVIEW","goToTicketingContactDetails","CONTACT_DETAILS","goToTicketingPayment","contactDetails","_ticketing6","iframeCommunicatorUrl","iFramecommunicationsChannel","returnUrl","cancelUrl","LOADING_TIME_START_TRANSACTION","paymentData","PAYMENT","usedLoyalty","LOADING_TIME_PAYMENTS","getTicketList","ticketList","getElapsedTime","elapsedTime","ceil","onPaymentMessageReceived","handleAuthnetPaymentMessage","handleVantivPaymentMessage","handlePxPayPaymentMessage","handleVerifone2PaymentMessage","handleBraintreePaymentMessage","goToTicketingTimeout","MIN","allowedTime","ERROR","getSeatSlots","getSeatPositionNormalized","getOrderTotalPrice","ticketingOrder","COMPLETE","_timeTracker","_timeTracker2","_mxApi","TimeTracker","totalPrice","expirationSet","timeoutSet","getTicketCount","ticketCount","seatCount","boundingBox","boundaryLeft","boundaryRight","boundaryTop","soldSeatCount","isSeatAvailable","seatSlots","availableSeats","getRowForSeat","orphanSeats","_ret4","leftSeat","leftLeftSeat","orphanSeatLabel","rightSeat","rightRightSeat","ORPHAN_SEATS","trackSeatingHeatmap","_ticketing7","completeOrderAfterPaymentSucceed","transactionDone","_ticketing8","_ref11","bookingId","paymentSucceed","payment","didAbodeTrackerFailed","msgData","payload","action","HostedPaymentStatus","ExpressResponseMessage","_oneTrust2","_oneTrust","connectToOneTrust","C","OneTrustComponent","onCategoriesChange","nextCategories","oneTrustAllowed","createPixelComponent","Components","PixelComponent","maybeHandle","_Pixel","_maybeHandle","_connectToOneTrust","_createPixelComponent","_cleanCategoryName","_cleanCategoryName2","cleanCategory","OneTrust","ToggleInfoDisplay","bubbles","cancelable","E","CustomEvent","FakeEvent","createEvent","initCustomEvent","allowedCategories","isOptatonInitialised","OptanonWrapper","activeGroups","OptanonActiveGroups","_Pixel2","createTrigger","geoFencing","geoFence","geofencing","redirectObj","redirection","appRegion","getGeo","regionData","regionAllow","allowRegions","ignoreFor","ignoreGeoFence","optionsList","getActiveRedirect","checklist","countryNot","listResults","redirectState","geoFencedLocation","defaultLink","noActivePage","destinationHost","isError","handleApiResponseText","getDateTimestamp","getDateRange","inRange","range","pad2","cleanTime","getTheaterId","identifier","ptid","inc","getIncluded","caches","editFormat","formatCache","srcMovie","movieCache","clearCaches","formatSlug","thCache","splitTheater","nid","indicator","nTh","specialTheaters","comments","commentsList","newTheater","disabledScreenings","disabledScreeningsContexts","localFormatCache","getFormat","fid","fObj","tid","customFormats","customFormatsList","dataObj","dateRanges","times","theaterNot","theatersNot","domains","sDate","formatCond","thId","exId","formatObject","getGeoRegionMatches","regionCodes","countryCodeRE","regexResult","languageCode","getCurrentAppLanguageMatch","language","regionMatches","detectRegionMismatch","appCode","getAppCountryCode","appLanguage","getAppLanguageCode","getAppRegionCode","geoCode","getGeoCountryCode","geoMismatch","getMatchingRegionApp","geoCountryCode","availableAppRegions","getAppGeoRegions","appLanguageCode","matches","currentAppLanguageMatch","exactMatch","firstMatch","displayRegionModal","roots","sharedImages","alteredRegions","dynamicRegions","staticRegions","extraExternalRegions","reg","getScroll","hor","pageXOffset","scrollLeft","pageYOffset","scrollTop","setScroll","getElemPos","offsetParent","endScroll","_smthscrl","cancelAnimationFrame","oneDir","horizontal","currentScroll","dirIndex","previousScroll","Element","sizeProp","relativeTo","maxPos","offsetStart","minPos","offsetEnd","rT","equiv","middle","loop","easing","directionsArray","direction","defaultEasing","timeStart","stop","smoothScrollBy","isSmoothScrolling","isStaticDataSet","labelPrefix","labelSuffix","events","endAt","clear","endAllAt","heading2","detachedWarn","lastCall","Frozen","initialValue","frozen","me","ops","pivotTriggers","pivotTicking","triggerNow","_","notify","addToPivotTriggers","onStore","update","freezeFn","mutable","freeze","updateRoot","prevNode","updated","getListener","hub","reset","getEventHub","getData","setData","nodeCreator","addParent","trans","isFrozen","copyMeta","removeParent","refreshParents","replacement","fixChildren","deleteIndex","transact","transacting","unpivot","oldChild","newChild","oldNode","param","ticking","createListener","commonMethods","msg","js","arrayMethods","els","prepend","toRemove","toAdd","FrozenArray","objectMethods","filtered","FrozenObject","createArray","utils","allowDots","arrayLimit","decoder","delimiter","depth","parameterLimit","parseValues","cleanStr","ignoreQueryPrefix","limit","bracketEqualsPos","parseObject","chain","leaf","cleanRoot","parseArrays","parseKeys","givenKey","brackets","segment","tempObj","arrayPrefixGenerators","prefix","indices","repeat","toISO","encoder","encodeValuesOnly","serializeDate","skipNulls","generateArrayPrefix","formatter","objKeys","arrayFormat","joined","addQueryPrefix","task","tasksByHandle","nextHandle","registerImmediate","clearImmediate","runIfPresent","currentlyRunningATask","attachTo","importScripts","postMessageIsAsynchronous","oldOnMessage","onmessage","messagePrefix","onGlobalMessage","attachEvent","MessageChannel","channel","port1","port2","onreadystatechange","Timeout","clearFn","_id","_clearFn","setInterval","close","unref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","_onTimeout"],"mappings":"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vB7Z,EI99BSyR,WJ+9BTzR,EI/9BmB0R,WJg+BnB1R,EIh+B6B2R,cJi+B7B3R,EIj+B0C4R,cJk+B1C5R,EIl+BuD8R,cJm+BvD9R,EIn+BoE+R,YJo+BpE/R,EIp+B+EsS,cJq+B/EtS,EIp+BSyS,QJq+BTzS,EIp+BSiT,SJq+BTjT,EIp+BSqT,cJq+BTrT,EIr+BsByT,aJs+BtBzT,EIr+BS0T,cJs+BT1T,EIr+BS+T,oBJw+BT/T,EIt+BS8U,aJu+BT9U,EIv+BqBiV,gBJw+BrBjV,EIv+BSqV,oBJw+BTrV,EIv+BSkW,cJw+BTlW,EIv+BSqW,mBJw+BTrW,EIx+B2BwX,cJy+B3BxX,EIx+BSsY,YJy+BTtY,EIx+BSyY,YJy+BTzY,EIx+BS8Y,qBJy+BT9Y,EIz+B6BgZ,WJ0+B7BhZ,EI1+BuCkZ,cJ2+BvClZ,EI1+BSwb,cJ2+BTxb,EI1+BSub,iBJ2+BTvb,EI1+BSoZ,eJ2+BTpZ,EI1+BSuZ,WJ2+BTvZ,EI1+BSwZ,mBJ2+BTxZ,EI1+BS0Z,WJ2+BT1Z,EI3+BmB2Z,YJ4+BnB3Z,EI3+BSga,sBJ4+BTha,EI3+BSia,oBJ4+BTja,EI3+BSsb,cJ4+BTtb,EI3+BSqb,qBJ4+BTrb,EI3+BSob,eJ4+BTpb,EI3+BSma,sBJ4+BTna,EI3+BSmb,cJ4+BTnb,EI5+BqBkb,yBJ6+BrBlb,EI5+BSya,mBJg/BH,SAAUxa,EAAQD,EAASQ,GAEjC,YAGAY,QAAOC,eAAerB,EAAS,cAC7Be,OAAO,GKt6DI+b,gBAAoB,eACpBC,cAAoB,cACpBC,oBAAoB,oBACpBC,YAAoB,YACpBC,eAAoB,eACpBC,cAAoB,cAEpBC,YAAY,YAGZC,gBAAgB,gBAGhBC,gBAAkB,gBAClBC,kBAAkB,kBAGlBC,kBAAiC,kBACjCC,iCAAiC,iCACjCC,gCAAiC,gCAGjCC,+BAA+B,+BAC/BC,+BAA+B,+BAC/BC,6BAA+B,6BAC/BC,yBAA+B,yBAC/BC,6BAA+B,6BAG/BC,mBAAyB,mBACzBC,oBAAyB,oBACzBC,yBAAyB,yBACzBC,iBAAyB,iBAGzBC,oBAAwB,oBACxBC,sBAAwB,sBACxBC,gBAAwB,gBACxBC,eAAwB,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","file":"embed.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 36);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return h; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createElement\", function() { return h; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cloneElement\", function() { return cloneElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Component\", function() { return Component; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"rerender\", function() { return rerender; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"options\", function() { return options; });\nvar VNode = function VNode() {};\n\nvar options = {};\n\nvar stack = [];\n\nvar EMPTY_CHILDREN = [];\n\nfunction h(nodeName, attributes) {\n\tvar children = EMPTY_CHILDREN,\n\t    lastSimple,\n\t    child,\n\t    simple,\n\t    i;\n\tfor (i = arguments.length; i-- > 2;) {\n\t\tstack.push(arguments[i]);\n\t}\n\tif (attributes && attributes.children != null) {\n\t\tif (!stack.length) stack.push(attributes.children);\n\t\tdelete attributes.children;\n\t}\n\twhile (stack.length) {\n\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\tfor (i = child.length; i--;) {\n\t\t\t\tstack.push(child[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t}\n\n\t\t\tif (simple && lastSimple) {\n\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\tchildren = [child];\n\t\t\t} else {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\n\t\t\tlastSimple = simple;\n\t\t}\n\t}\n\n\tvar p = new VNode();\n\tp.nodeName = nodeName;\n\tp.children = children;\n\tp.attributes = attributes == null ? undefined : attributes;\n\tp.key = attributes == null ? undefined : attributes.key;\n\n\tif (options.vnode !== undefined) options.vnode(p);\n\n\treturn p;\n}\n\nfunction extend(obj, props) {\n  for (var i in props) {\n    obj[i] = props[i];\n  }return obj;\n}\n\nvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\nfunction cloneElement(vnode, props) {\n  return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n}\n\nvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\nvar items = [];\n\nfunction enqueueRender(component) {\n\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t(options.debounceRendering || defer)(rerender);\n\t}\n}\n\nfunction rerender() {\n\tvar p,\n\t    list = items;\n\titems = [];\n\twhile (p = list.pop()) {\n\t\tif (p._dirty) renderComponent(p);\n\t}\n}\n\nfunction isSameNodeType(node, vnode, hydrating) {\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\treturn node.splitText !== undefined;\n\t}\n\tif (typeof vnode.nodeName === 'string') {\n\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t}\n\treturn hydrating || node._componentConstructor === vnode.nodeName;\n}\n\nfunction isNamedNode(node, nodeName) {\n\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n}\n\nfunction getNodeProps(vnode) {\n\tvar props = extend({}, vnode.attributes);\n\tprops.children = vnode.children;\n\n\tvar defaultProps = vnode.nodeName.defaultProps;\n\tif (defaultProps !== undefined) {\n\t\tfor (var i in defaultProps) {\n\t\t\tif (props[i] === undefined) {\n\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\nfunction createNode(nodeName, isSvg) {\n\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\tnode.normalizedNodeName = nodeName;\n\treturn node;\n}\n\nfunction removeNode(node) {\n\tvar parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n\nfunction setAccessor(node, name, old, value, isSvg) {\n\tif (name === 'className') name = 'class';\n\n\tif (name === 'key') {} else if (name === 'ref') {\n\t\tif (old) old(null);\n\t\tif (value) value(node);\n\t} else if (name === 'class' && !isSvg) {\n\t\tnode.className = value || '';\n\t} else if (name === 'style') {\n\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\tnode.style.cssText = value || '';\n\t\t}\n\t\tif (value && typeof value === 'object') {\n\t\t\tif (typeof old !== 'string') {\n\t\t\t\tfor (var i in old) {\n\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i in value) {\n\t\t\t\tnode.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];\n\t\t\t}\n\t\t}\n\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\tif (value) node.innerHTML = value.__html || '';\n\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\tname = name.toLowerCase().substring(2);\n\t\tif (value) {\n\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t} else {\n\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t}\n\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\ttry {\n\t\t\tnode[name] = value == null ? '' : value;\n\t\t} catch (e) {}\n\t\tif ((value == null || value === false) && name != 'spellcheck') node.removeAttribute(name);\n\t} else {\n\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''));\n\n\t\tif (value == null || value === false) {\n\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t} else if (typeof value !== 'function') {\n\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t}\n\t}\n}\n\nfunction eventProxy(e) {\n\treturn this._listeners[e.type](options.event && options.event(e) || e);\n}\n\nvar mounts = [];\n\nvar diffLevel = 0;\n\nvar isSvgMode = false;\n\nvar hydrating = false;\n\nfunction flushMounts() {\n\tvar c;\n\twhile (c = mounts.pop()) {\n\t\tif (options.afterMount) options.afterMount(c);\n\t\tif (c.componentDidMount) c.componentDidMount();\n\t}\n}\n\nfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\tif (!diffLevel++) {\n\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\thydrating = dom != null && !('__preactattr_' in dom);\n\t}\n\n\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\tif (! --diffLevel) {\n\t\thydrating = false;\n\n\t\tif (!componentRoot) flushMounts();\n\t}\n\n\treturn ret;\n}\n\nfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\tvar out = dom,\n\t    prevSvgMode = isSvgMode;\n\n\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\tdom.nodeValue = vnode;\n\t\t\t}\n\t\t} else {\n\t\t\tout = document.createTextNode(vnode);\n\t\t\tif (dom) {\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tout['__preactattr_'] = true;\n\n\t\treturn out;\n\t}\n\n\tvar vnodeName = vnode.nodeName;\n\tif (typeof vnodeName === 'function') {\n\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t}\n\n\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\tvnodeName = String(vnodeName);\n\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\tif (dom) {\n\t\t\twhile (dom.firstChild) {\n\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t}\n\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\trecollectNodeTree(dom, true);\n\t\t}\n\t}\n\n\tvar fc = out.firstChild,\n\t    props = out['__preactattr_'],\n\t    vchildren = vnode.children;\n\n\tif (props == null) {\n\t\tprops = out['__preactattr_'] = {};\n\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\tprops[a[i].name] = a[i].value;\n\t\t}\n\t}\n\n\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\tfc.nodeValue = vchildren[0];\n\t\t}\n\t} else if (vchildren && vchildren.length || fc != null) {\n\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t}\n\n\tdiffAttributes(out, vnode.attributes, props);\n\n\tisSvgMode = prevSvgMode;\n\n\treturn out;\n}\n\nfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\tvar originalChildren = dom.childNodes,\n\t    children = [],\n\t    keyed = {},\n\t    keyedLen = 0,\n\t    min = 0,\n\t    len = originalChildren.length,\n\t    childrenLen = 0,\n\t    vlen = vchildren ? vchildren.length : 0,\n\t    j,\n\t    c,\n\t    f,\n\t    vchild,\n\t    child;\n\n\tif (len !== 0) {\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tvar _child = originalChildren[i],\n\t\t\t    props = _child['__preactattr_'],\n\t\t\t    key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\tif (key != null) {\n\t\t\t\tkeyedLen++;\n\t\t\t\tkeyed[key] = _child;\n\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (vlen !== 0) {\n\t\tfor (var i = 0; i < vlen; i++) {\n\t\t\tvchild = vchildren[i];\n\t\t\tchild = null;\n\n\t\t\tvar key = vchild.key;\n\t\t\tif (key != null) {\n\t\t\t\tif (keyedLen && keyed[key] !== undefined) {\n\t\t\t\t\tchild = keyed[key];\n\t\t\t\t\tkeyed[key] = undefined;\n\t\t\t\t\tkeyedLen--;\n\t\t\t\t}\n\t\t\t} else if (min < childrenLen) {\n\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\tf = originalChildren[i];\n\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\tif (f == null) {\n\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\tremoveNode(f);\n\t\t\t\t} else {\n\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (keyedLen) {\n\t\tfor (var i in keyed) {\n\t\t\tif (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);\n\t\t}\n\t}\n\n\twhile (min <= childrenLen) {\n\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t}\n}\n\nfunction recollectNodeTree(node, unmountOnly) {\n\tvar component = node._component;\n\tif (component) {\n\t\tunmountComponent(component);\n\t} else {\n\t\tif (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);\n\n\t\tif (unmountOnly === false || node['__preactattr_'] == null) {\n\t\t\tremoveNode(node);\n\t\t}\n\n\t\tremoveChildren(node);\n\t}\n}\n\nfunction removeChildren(node) {\n\tnode = node.lastChild;\n\twhile (node) {\n\t\tvar next = node.previousSibling;\n\t\trecollectNodeTree(node, true);\n\t\tnode = next;\n\t}\n}\n\nfunction diffAttributes(dom, attrs, old) {\n\tvar name;\n\n\tfor (name in old) {\n\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t}\n\t}\n\n\tfor (name in attrs) {\n\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t}\n\t}\n}\n\nvar recyclerComponents = [];\n\nfunction createComponent(Ctor, props, context) {\n\tvar inst,\n\t    i = recyclerComponents.length;\n\n\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\tinst = new Ctor(props, context);\n\t\tComponent.call(inst, props, context);\n\t} else {\n\t\tinst = new Component(props, context);\n\t\tinst.constructor = Ctor;\n\t\tinst.render = doRender;\n\t}\n\n\twhile (i--) {\n\t\tif (recyclerComponents[i].constructor === Ctor) {\n\t\t\tinst.nextBase = recyclerComponents[i].nextBase;\n\t\t\trecyclerComponents.splice(i, 1);\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\treturn inst;\n}\n\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n\nfunction setComponentProps(component, props, renderMode, context, mountAll) {\n\tif (component._disable) return;\n\tcomponent._disable = true;\n\n\tcomponent.__ref = props.ref;\n\tcomponent.__key = props.key;\n\tdelete props.ref;\n\tdelete props.key;\n\n\tif (typeof component.constructor.getDerivedStateFromProps === 'undefined') {\n\t\tif (!component.base || mountAll) {\n\t\t\tif (component.componentWillMount) component.componentWillMount();\n\t\t} else if (component.componentWillReceiveProps) {\n\t\t\tcomponent.componentWillReceiveProps(props, context);\n\t\t}\n\t}\n\n\tif (context && context !== component.context) {\n\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\tcomponent.context = context;\n\t}\n\n\tif (!component.prevProps) component.prevProps = component.props;\n\tcomponent.props = props;\n\n\tcomponent._disable = false;\n\n\tif (renderMode !== 0) {\n\t\tif (renderMode === 1 || options.syncComponentUpdates !== false || !component.base) {\n\t\t\trenderComponent(component, 1, mountAll);\n\t\t} else {\n\t\t\tenqueueRender(component);\n\t\t}\n\t}\n\n\tif (component.__ref) component.__ref(component);\n}\n\nfunction renderComponent(component, renderMode, mountAll, isChild) {\n\tif (component._disable) return;\n\n\tvar props = component.props,\n\t    state = component.state,\n\t    context = component.context,\n\t    previousProps = component.prevProps || props,\n\t    previousState = component.prevState || state,\n\t    previousContext = component.prevContext || context,\n\t    isUpdate = component.base,\n\t    nextBase = component.nextBase,\n\t    initialBase = isUpdate || nextBase,\n\t    initialChildComponent = component._component,\n\t    skip = false,\n\t    snapshot = previousContext,\n\t    rendered,\n\t    inst,\n\t    cbase;\n\n\tif (component.constructor.getDerivedStateFromProps) {\n\t\tstate = extend(extend({}, state), component.constructor.getDerivedStateFromProps(props, state));\n\t\tcomponent.state = state;\n\t}\n\n\tif (isUpdate) {\n\t\tcomponent.props = previousProps;\n\t\tcomponent.state = previousState;\n\t\tcomponent.context = previousContext;\n\t\tif (renderMode !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\tskip = true;\n\t\t} else if (component.componentWillUpdate) {\n\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t}\n\t\tcomponent.props = props;\n\t\tcomponent.state = state;\n\t\tcomponent.context = context;\n\t}\n\n\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\tcomponent._dirty = false;\n\n\tif (!skip) {\n\t\trendered = component.render(props, state, context);\n\n\t\tif (component.getChildContext) {\n\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t}\n\n\t\tif (isUpdate && component.getSnapshotBeforeUpdate) {\n\t\t\tsnapshot = component.getSnapshotBeforeUpdate(previousProps, previousState);\n\t\t}\n\n\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t    toUnmount,\n\t\t    base;\n\n\t\tif (typeof childComponent === 'function') {\n\n\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\tinst = initialChildComponent;\n\n\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\tsetComponentProps(inst, childProps, 1, context, false);\n\t\t\t} else {\n\t\t\t\ttoUnmount = inst;\n\n\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\tinst._parentComponent = component;\n\t\t\t\tsetComponentProps(inst, childProps, 0, context, false);\n\t\t\t\trenderComponent(inst, 1, mountAll, true);\n\t\t\t}\n\n\t\t\tbase = inst.base;\n\t\t} else {\n\t\t\tcbase = initialBase;\n\n\t\t\ttoUnmount = initialChildComponent;\n\t\t\tif (toUnmount) {\n\t\t\t\tcbase = component._component = null;\n\t\t\t}\n\n\t\t\tif (initialBase || renderMode === 1) {\n\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t}\n\t\t}\n\n\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\tif (!toUnmount) {\n\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (toUnmount) {\n\t\t\tunmountComponent(toUnmount);\n\t\t}\n\n\t\tcomponent.base = base;\n\t\tif (base && !isChild) {\n\t\t\tvar componentRef = component,\n\t\t\t    t = component;\n\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t(componentRef = t).base = base;\n\t\t\t}\n\t\t\tbase._component = componentRef;\n\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t}\n\t}\n\n\tif (!isUpdate || mountAll) {\n\t\tmounts.unshift(component);\n\t} else if (!skip) {\n\n\t\tif (component.componentDidUpdate) {\n\t\t\tcomponent.componentDidUpdate(previousProps, previousState, snapshot);\n\t\t}\n\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t}\n\n\twhile (component._renderCallbacks.length) {\n\t\tcomponent._renderCallbacks.pop().call(component);\n\t}if (!diffLevel && !isChild) flushMounts();\n}\n\nfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\tvar c = dom && dom._component,\n\t    originalComponent = c,\n\t    oldDom = dom,\n\t    isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t    isOwner = isDirectOwner,\n\t    props = getNodeProps(vnode);\n\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\tisOwner = c.constructor === vnode.nodeName;\n\t}\n\n\tif (c && isOwner && (!mountAll || c._component)) {\n\t\tsetComponentProps(c, props, 3, context, mountAll);\n\t\tdom = c.base;\n\t} else {\n\t\tif (originalComponent && !isDirectOwner) {\n\t\t\tunmountComponent(originalComponent);\n\t\t\tdom = oldDom = null;\n\t\t}\n\n\t\tc = createComponent(vnode.nodeName, props, context);\n\t\tif (dom && !c.nextBase) {\n\t\t\tc.nextBase = dom;\n\n\t\t\toldDom = null;\n\t\t}\n\t\tsetComponentProps(c, props, 1, context, mountAll);\n\t\tdom = c.base;\n\n\t\tif (oldDom && dom !== oldDom) {\n\t\t\toldDom._component = null;\n\t\t\trecollectNodeTree(oldDom, false);\n\t\t}\n\t}\n\n\treturn dom;\n}\n\nfunction unmountComponent(component) {\n\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\tvar base = component.base;\n\n\tcomponent._disable = true;\n\n\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\tcomponent.base = null;\n\n\tvar inner = component._component;\n\tif (inner) {\n\t\tunmountComponent(inner);\n\t} else if (base) {\n\t\tif (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);\n\n\t\tcomponent.nextBase = base;\n\n\t\tremoveNode(base);\n\t\trecyclerComponents.push(component);\n\n\t\tremoveChildren(base);\n\t}\n\n\tif (component.__ref) component.__ref(null);\n}\n\nfunction Component(props, context) {\n\tthis._dirty = true;\n\n\tthis.context = context;\n\n\tthis.props = props;\n\n\tthis.state = this.state || {};\n\n\tthis._renderCallbacks = [];\n}\n\nextend(Component.prototype, {\n\tsetState: function setState(state, callback) {\n\t\tif (!this.prevState) this.prevState = this.state;\n\t\tthis.state = extend(extend({}, this.state), typeof state === 'function' ? state(this.state, this.props) : state);\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t},\n\tforceUpdate: function forceUpdate(callback) {\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\trenderComponent(this, 2);\n\t},\n\trender: function render() {}\n});\n\nfunction render(vnode, parent, merge) {\n  return diff(merge, vnode, {}, false, parent, false);\n}\n\nvar preact = {\n\th: h,\n\tcreateElement: h,\n\tcloneElement: cloneElement,\n\tComponent: Component,\n\trender: render,\n\trerender: rerender,\n\toptions: options\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (preact);\n\n//# sourceMappingURL=preact.mjs.map\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _freezerJs = __webpack_require__(74);\n\nvar _freezerJs2 = _interopRequireDefault(_freezerJs);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar Store = new _freezerJs2['default']({}, {\n\t// live: true\n});\n\nStore.on('afterAll', function (reactionName) {\n\t// UNCOMMENT THIS TO LOG EVENTS\n\t//   PLEASE COMMENT BACK BEFORE PUSHING\n\t// console.log(...arguments);\n\n\tif (reactionName === 'update') {\n\t\treturn;\n\t}\n\tdispatch(reactionName);\n});\n\nStore.on(undefined, function () {\n\t// console.trace();\n\tthrow new Error('Undefined action! Please define your actions!');\n});\n\nvar getIEVersion = function () {\n\tfunction getVersion() {\n\t\tif (typeof window === 'undefined' || !window.navigator) {\n\t\t\treturn 0;\n\t\t}\n\t\tvar ua = window.navigator.userAgent;\n\t\tvar ieIndex = ua.indexOf('MSIE');\n\n\t\t// If IE, return version number\n\t\tif (ieIndex >= 0) {\n\t\t\treturn parseInt(ua.slice(ieIndex + 5));\n\t\t}\n\t\t// Look for IE 11 updated user agent string\n\t\tif (/Trident\\/7\\./.test(ua)) {\n\t\t\treturn 11;\n\t\t}\n\t\t// Not IE\n\t\treturn 0;\n\t}\n\n\tvar cached = null;\n\treturn function () {\n\t\treturn cached === null ? cached = getVersion() : cached;\n\t};\n}();\n\nfunction dispatch(eventName) {\n\t// Only dispatch events on window for non-ie browsers (???)\n\tif (typeof window === 'undefined' || getIEVersion()) {\n\t\treturn;\n\t}\n\tvar event = new Event(eventName);\n\twindow.dispatchEvent(event);\n}\n\nif (typeof window !== 'undefined') {\n\twindow.Store = Store;\n\tdispatch('NEW_STORE');\n}\n\nexports['default'] = Store;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.convertHexToHsl = exports.encodeHtmlRecursively = exports.encodeHtml = exports.getStylingImagePath = exports.formatPrice = exports.isIntegerOrAlmost = exports.displayWhen = exports.parseNumericArray = exports.getVideoTypeFromSrc = exports.isNumeric = exports.isObject = exports.isFunctionalComp = exports.pathOnly = exports.functionBody = exports.textToJsxArray = exports.BindFactory = exports.sanitizeObj = exports.objToArr = exports.hasOnlyNumericKeys = exports.joinPaths = exports.parseDate = exports.findInVNode = exports.replaceWithVNode = exports.deleteNulls = exports.defaultLevelsDeep = exports.toQueryString = exports.addToQuery = exports.sortObjectByOrder = exports.appDataDate = exports.arrayUnion = exports.arrayUnique = exports.asList = exports.clamp = exports.joinClasses = exports.condClass = exports.toggleClass = exports.triggerAnim = exports.removeClass = exports.addClass = exports.hasClass = exports.accessOrCreateNested = exports.accessNested = exports.once = exports.dbounce = exports.throttle = exports.debounce = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _preact = __webpack_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Make a function only called once per frame max (useful for events triggered a lot, like resize)\n// THIS IS ACTUALLY THROTTLING AND NOT DEBOUNCING (we should rename that)\nfunction debounce(f, precall) {\n\tvar waiting = false;\n\tvar args = [];\n\tvar that = null;\n\tfunction trigger() {\n\t\twaiting = false;f.apply(that, args);\n\t}\n\tvar onEvent = function onEvent() {\n\t\tif (waiting) return;\n\t\twaiting = true;\n\t\targs = arguments;\n\t\tthat = this;\n\t\trequestAnimationFrame(trigger);\n\t};\n\tif (precall) f.apply(this, [].slice.call(arguments, 2));\n\treturn onEvent;\n}\n\n// Actual debouncing\nfunction dbounce(f, d) {\n\tif (d == undefined) d = 250;\n\tvar timer = null,\n\t    args = [],\n\t    thisArg = null;\n\tfunction trigger() {\n\t\tf.apply(thisArg, args);\n\t}\n\tfunction onEvent() {\n\t\tthisArg = this;\n\t\targs = [].slice.call(arguments);\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(trigger, d);\n\t}\n\treturn onEvent;\n}\n\n// Other throttling with custom timing\nfunction throttle(fn, threshhold, scope) {\n\tif (threshhold == undefined) threshhold = 250;\n\tvar last = void 0;\n\tvar deferTimer = void 0;\n\treturn function () {\n\t\tvar context = scope || this;\n\n\t\tvar now = +new Date();\n\t\tvar args = arguments;\n\t\tif (last && now < last + threshhold) {\n\t\t\t// hold on to it\n\t\t\tclearTimeout(deferTimer);\n\t\t\tdeferTimer = setTimeout(function () {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply(context, args);\n\t\t\t}, threshhold);\n\t\t} else {\n\t\t\tlast = now;\n\t\t\tfn.apply(context, args);\n\t\t}\n\t};\n}\n\n// Make a function only callable once\n// Saves the return value and returns it for subsequent calls\nfunction once(f) {\n\tvar done = false;\n\tvar result = void 0;\n\treturn function () {\n\t\tif (done) return result;\n\t\tdone = true;\n\t\treturn result = f.apply(this, arguments);\n\t};\n}\n\n// DOM classNames handling\n\n// Long versions accepting arrays\n// function hasClass(elem, className) {\n// \tif (!elem || !className) return false;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.every(cn=>hasClass(elem, cn));\n// \tclassName = arr[0];\n// \treturn (' ' + elem.className + ' ').indexOf(' ' + className + ' ') !== -1;\n// }\n// function addClass(elem, className) {\n// \tif (!elem || !className) return;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.forEach(cn=>addClass(elem, cn));\n// \tclassName = arr[0];\n// \tif(!hasClass(elem, className))\n// \t\telem.className += ' ' + className;\n// }\n// function removeClass(elem, className) {\n// \tif (!elem || !className) return;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.forEach(cn=>removeClass(elem, cn));\n// \tclassName = arr[0];\n// \tif(hasClass(elem, className))\n// \t\telem.className = (' ' + elem.className + ' ').replace(className, ' ').slice(1,-1);\n// }\n// function toggleClass(e,c) { (hasClass(e,c) ? removeClass : addClass)(e,c); }\n\n// Short versions\nfunction hasClass(e, c) {\n\treturn (' ' + e.className + ' ').indexOf(' ' + c + ' ') !== -1;\n}\nfunction addClass(e, c) {\n\tif (!hasClass(e, c)) e.className += (e.className ? ' ' : '') + c;\n}\n// function removeClass(e, c) { e.className = e.className.split(' ').filter(v => v != c).join(' '); }\nfunction removeClass(e, c) {\n\te.className = (' ' + e.className + ' ').replace(' ' + c + ' ', ' ').slice(1, -1);\n}\nfunction triggerAnim(e, c) {\n\tremoveClass(e, c);e.offsetWidth;addClass(e, c);\n}\nfunction toggleClass(e, c) {\n\t(hasClass(e, c) ? removeClass : addClass)(e, c);\n}\n\n// Easy way to add a class based on a condition (also check the class exists)\nfunction condClass(cond, className) {\n\tif (arguments.length === 1) {\n\t\tclassName = cond;\n\t\tcond = true;\n\t}\n\tif (Array.isArray(className)) return className.map(function (cn) {\n\t\treturn condClass(cond, cn);\n\t}).join('');\n\treturn cond && className && typeof className === 'string' ? ' ' + className : '';\n}\n\n/**\n * Join several classes together.\n *\n * @example\n * joinClasses('square', 'blue', false && 'active');\n * // returns 'square blue'\n * @param {...string} classNames - the class names to join\n * @return {string} the full class name\n */\nfunction joinClasses() {\n\treturn [].concat.apply([], arguments).filter(function (e) {\n\t\treturn e;\n\t}).join(' ');\n}\n\n// Clamp a value between two bounds\nfunction clamp(v, min, max) {\n\treturn v > min ? v < max ? v : max : min;\n}\n\n// Access to a property of a nested object, or return a default value if the path cannot be accessed\n// For example, if obj is { nested: { property : [ 'hello' ] } }\n// to get 'hello', path would need to be 'nested.property.0' or ['nested', 'property', 0]\n// if we use 'non.existing.path' as a path, it would return def\nfunction accessNested(obj, path, def) {\n\tif (typeof path === 'string') path = path.split('.');\n\tif (!Array.isArray(path)) return def; // Path is not an array\n\tif (!path.length) return obj;\n\tvar prop = path[0];\n\tif (obj && obj.hasOwnProperty(prop)) return accessNested(obj[prop], path.slice(1), def);\n\treturn def;\n}\n// mini version with less checks for console one-liners:\n// var n=(o,p,k)=>(o&&(p=p.split?p.split('.'):p).length)?n(o[p.shift()],p):o;\n\n// Used for example with appData.pages.showtimes.data.stuff, when you can specify either one or a lsit of values\n// if an array, returns it\n// if a string (e.g. 'hello'), returns ['hello']\n// if an object (e.g. {1: 'abc', 2: 'def'}) returns ['abc', 'def']\n// if an object of booleans (e.g. {abc: true, def: true, ghi: false}) returns ['abc', 'def']\n// Also removes falsy values (i.e. disabled items)\nfunction asList(value) {\n\tif (!value) return [];\n\tif ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') return [value];\n\tif (!Array.isArray(value)) value = Object.keys(value).map(function (k) {\n\t\treturn typeof value[k] === 'boolean' ? value[k] && k : value[k];\n\t});\n\treturn value.filter(function (e) {\n\t\treturn e;\n\t});\n}\n\n/* ---- ARRAY STUFF ---- */\n\n// Returns an array with only unique values (remove duplicates)\nfunction arrayUnique(array) {\n\t// Move to sets when widely available : return [...new Set(array)];\n\tif (!array || !Array.isArray(array)) return array;\n\treturn array.reduce(function (result, elem) {\n\t\tif (result.indexOf(elem) === -1) result.push(elem);\n\t\treturn result;\n\t}, []);\n}\n\n// Returns the union of a set of arrays ([1,2,3], [2,3,4] => [1,2,3,4])\nfunction arrayUnion() /* array1, array2, ... */{\n\treturn arrayUnique([].concat.apply([], arguments));\n}\n\n/* ---- ----------- ---- */\n\n// Return a date based on a date set in thundr\n// If a number, consider it a timestamp\n// If a string yyyy-MM-dd, get the beginning of this day in local time (usually release dates for example are local)\n// If something else tries new Date(val)\nfunction appDataDate(val) {\n\tif (typeof val === 'number') {\n\t\treturn new Date(val);\n\t}\n\tif (typeof val === 'string') {\n\t\tif (!isNaN(val)) return new Date(+val);else {\n\t\t\tvar m = val.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n\t\t\treturn m ? new Date(+m[1], +m[2], +m[3]) : new Date(val);\n\t\t}\n\t}\n\treturn new Date(NaN);\n}\n\n// function sortObjectByOrder(object, mapCallback, property) {\n//\n// \tif (!object) {\n// \t\treturn;\n// \t}\n// \tproperty = property || 'order';\n//\n// \tlet getProperty = typeof property === 'function' ? property : obj => obj[property];\n//\n// \tlet objectByOrder = Object.keys(object).map(k => ({ key: k, value: object[k] })).sort((obj1, obj2) => {\n// \t\tif (!obj1.value) return 1;\n// \t\tif (!obj2.value) return -1;\n//\n// \t\tlet prop1 = accessNested(obj1.value, property);\n// \t\tlet prop2 = accessNested(obj2.value, property);\n//\n//\n// \t\tif (prop1 == undefined) return 1;\n// \t\tif (prop2 == undefined) return -1;\n//\n// \t\tprop1 = parseInt(prop1) || prop1;\n// \t\tprop2 = parseInt(prop2) || prop2;\n//\n// \t\tif(prop1 < prop2)  return -1;\n// \t\telse if(prop1 > prop2) return 1;\n// \t\telse                   return 0;\n// \t});\n//\n// \tif (typeof mapCallback !== 'function') {\n// \t\tmapCallback = value => value;\n// \t}\n// \treturn objectByOrder.map(el => mapCallback(el.value, el.key));\n// }\n\nfunction sortObjectByOrder(object, mapCallback, property) {\n\tif (!object) {\n\t\treturn [];\n\t}\n\tproperty = property || 'order';\n\tvar getProperty = typeof property === 'function' ? property : function (obj) {\n\t\treturn obj[property];\n\t};\n\n\tvar objectByOrder = Object.keys(object).map(function (k) {\n\t\treturn { key: k, value: object[k] };\n\t}).sort(function (obj1, obj2) {\n\t\tif (!obj1.value) return 1;\n\t\tif (!obj2.value) return -1;\n\n\t\tvar prop1 = getProperty(obj1.value, obj1.key);\n\t\tvar prop2 = getProperty(obj2.value, obj2.key);\n\t\tvar noProp1 = prop1 == undefined;\n\t\tvar noProp2 = prop2 == undefined;\n\t\t// If both don't have an order set, sort them by keys (so that it works with 1, 2, etc.)\n\t\tif (noProp1 && noProp2) return obj1.key.localeCompare(obj2.key, undefined, { numeric: true });\n\t\tif (noProp1) return 1;\n\t\tif (noProp2) return -1;\n\n\t\tvar stringCompare = isNaN(prop1) || isNaN(prop2);\n\t\t// sort them by order\n\t\treturn stringCompare ? prop1.toString().localeCompare(prop2.toString()) : prop1 - prop2;\n\t});\n\n\tif (typeof mapCallback !== 'function') {\n\t\tmapCallback = function mapCallback(value) {\n\t\t\treturn value;\n\t\t};\n\t}\n\treturn objectByOrder.map(function (el) {\n\t\treturn mapCallback(el.value, el.key);\n\t});\n}\n\nfunction addToQuery(q, path, o) {\n\tif (o == null) {\n\t\treturn q;\n\t}\n\tif ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) !== 'object') {\n\t\treturn q[path] = o;\n\t}\n\tvar ks = Object.keys(o);\n\tks.forEach(function (k) {\n\t\treturn addToQuery(q, path + '[' + k + ']', o[k]);\n\t});\n\treturn q;\n}\nfunction toQueryString(obj) {\n\tif (!obj) return '';\n\tvar value = obj;\n\tif (typeof obj !== 'string') {\n\t\tvar query = {};\n\t\tObject.keys(obj).forEach(function (key) {\n\t\t\treturn addToQuery(query, key, obj[key]);\n\t\t});\n\t\tvalue = Object.keys(query).reduce(function (a, k) {\n\t\t\tvar v = query[k];\n\t\t\tif (v == null) return a;\n\t\t\tvar addedVal = encodeURIComponent(k);\n\t\t\tif (typeof v !== 'boolean' && v !== '') {\n\t\t\t\taddedVal += '=' + encodeURIComponent(v);\n\t\t\t}\n\t\t\ta.push(addedVal);\n\t\t\treturn a;\n\t\t}, []).join('&');\n\t}\n\treturn value ? '?' + value : '';\n}\n\n/**\n * Make an object with all the paths that exist in the given object and\n * specifying where they are coming from\n * @param\t{Object} obj - The base object that it will compare to\n * @param\t{Array} options - array of different object which it will use to compare to, to match with the base object\n */\nfunction defaultLevelsDeep(obj, options) {\n\t// NOTE: Options Structure [{title:'TITLE|STRING|', object:DATA|OBJECT|},...];\n\tvar objPaths = {};\n\tcreateObjectPathDeep(obj, objPaths, options);\n\treturn objPaths;\n}\n\nfunction createObjectPathDeep(obj, pathsObj, optionsRef) {\n\tvar path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n\tvar options = optionsRef.slice();\n\tObject.keys(obj).map(function (key) {\n\t\tvar newPath = '' + path + key + '.';\n\t\tvar newOptions = options.filter(function (option) {\n\t\t\treturn option.object && option.object.hasOwnProperty(key);\n\t\t});\n\n\t\tif (_typeof(obj[key]) === 'object' && obj[key] !== null) {\n\t\t\tvar newOptionsTest = newOptions.map(function (option) {\n\t\t\t\tvar newOption = Object.create(option);\n\t\t\t\tnewOption.object = option.object[key];\n\t\t\t\tnewOption.title = option.title;\n\t\t\t\treturn newOption;\n\t\t\t});\n\n\t\t\tcreateObjectPathDeep(obj[key], pathsObj, newOptionsTest, newPath);\n\t\t}\n\t\tvar levels = [];\n\t\tif (newOptions.length > 0) {\n\t\t\tnewOptions.forEach(function (option) {\n\t\t\t\tlevels.push(option.title);\n\t\t\t});\n\t\t}\n\n\t\tpathsObj[newPath] = levels;\n\n\t\treturn key;\n\t});\n}\n\n/**\n * Delete all the null properties in a specified object\n * @param  {Object} defaults - the object that needs to be filtered\n * @param  {Boolean} recurse - does it need to keep looking\n */\nfunction deleteNulls(defaults, recurse) {\n\tfor (var i in defaults) {\n\t\tif (defaults[i] === null) {\n\t\t\tdelete defaults[i];\n\t\t} else if (recurse && _typeof(defaults[i]) === 'object') {\n\t\t\tdeleteNulls(defaults[i], recurse);\n\t\t}\n\t}\n}\n\n// Replace the content in a VNode by some other VNode\n// for example, to put 'cat' in bold\n// let result = replaceWithVNode(<div>I love my cat, he is the best</div>, 'cat', <b>cat</b>);\n// - OR (works with regexp and callback functions) -\n// let result = replaceWithVNode(<div>My cat ♥ your dog</div>, /\\b(cat|dog)\\b/g, match => <b>{match[1]}</b>);\n// /!\\ changes the src object (and returns it) !\n// Count is used to prevent infinite recursion, do not specify it for your initial call\nfunction replaceWithVNode(src, search, replace, count) {\n\tif (!src || !search) return src;\n\t// Check input\n\tcount = (+count || 0) + 1;\n\t// Prevent deep recursion ?\n\tif (count > 20) return src;\n\tsearch = _toRegexp(search);\n\tvar replaceFunc = replace;\n\tif (typeof replace !== 'function') replaceFunc = function replaceFunc() {\n\t\treturn replace;\n\t};\n\t// Array\n\tif (Array.isArray(src)) {\n\t\treturn src.reduce(function (arr, elem) {\n\t\t\treturn arr.concat(replaceWithVNode(elem, search, replace, count));\n\t\t}, []);\n\t}\n\t// VNode\n\tif ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) === 'object' && src.children) {\n\t\tsrc.children = src.children.reduce(function (arr, child) {\n\t\t\treturn arr.concat(replaceWithVNode(child, search, replace, count));\n\t\t}, []);\n\t\treturn src;\n\t}\n\t// Make sure to cast to string\n\tsrc = src + '';\n\tvar length = void 0,\n\t    result = [];\n\tvar cPos = 0,\n\t    found = void 0;\n\twhile (found = search.exec(src)) {\n\t\t// eslint-disable-line no-cond-assign\n\t\tresult.push(src.slice(cPos, found.index), replaceFunc(found));\n\t\tcPos = found.index + found[0].length;\n\t\t// The regex is not global, stop at the first match (otherwise inifnite loop - stays on the same match when doing exec multiple times)\n\t\tif (!search.global) break;\n\t}\n\t// No match at all, just return the source instead of an array containing the source\n\tif (!result.length) return src;\n\t// Don't forget the part between the end of the last match and the end of the string\n\tresult.push(src.slice(cPos));\n\treturn result;\n}\n// Utility for replaceWithVNode (changes a string to regexp, with escaped special chars : '(cat|dog)' matches that literally instead of cat OR dog)\nfunction _toRegexp(s) {\n\tif (s instanceof RegExp) return s;\n\treturn new RegExp((s + '').replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'g'); // eslint-disable-line no-useless-escape\n}\n\nvar _classCheck = function _classCheck(el, attr, val) {\n\treturn el.attributes && ~(' ' + (el.attributes['class'] || el.attributes.className || '') + ' ').indexOf(' ' + val + ' ');\n};\nvar _attributeCheck = function _attributeCheck(el, attr, val) {\n\treturn attr ? el.attributes && (val ? el.attributes[attr] == val : el.attributes.hasOwnProperty(attr)) : val ? val === '*' || el.nodeName === val : false;\n};\nfunction _matchSelector(node, selector) {\n\tif (!node) return false;\n\treturn selector.every(function (s) {\n\t\tvar attr = undefined,\n\t\t    val = undefined,\n\t\t    fn = _attributeCheck;\n\t\tif (s[0] === '.') fn = _classCheck, val = s.slice(1);else if (s[0] === '#') attr = 'id', val = s.slice(1);else if (s[0] === '[') {\n\t\t\tvar match = s.match(/^\\[([^=]+)(=(['\"]?)(.+)\\3)?\\]$/);\n\t\t\tif (match) attr = match[1], val = match[4];\n\t\t} else val = s;\n\t\treturn fn(node, attr, val);\n\t});\n}\n\n// Return the subelement matching the selector\n// - node: VNode in which to perform the search (for example <div class=\"myElement\"><input id=\"val\" disabled /></div>)\n// - selector: CSS-like selector for the element you want to find\n// - asPath: if true returns the path to access the match (as an array of strings), instead of returning the matching element itself. Can be used in accessNested. (e.g. ['children', '2', 'children', '1'])\n// - direct/currentPath/childrenOffset : Internal use\n// Supported selector things :\n// - + (adjacent)\n// - ~ (sibling)\n// -   (space ; descendant)\n// - > (direct child)\n// - .class\n// - #id\n// - [attribute]\n// - [attribute=\"value\"]\nfunction findInVNode(node, selector, asPath, direct, currentPath, childrenOffset) {\n\t// if(!node) return;\n\tcurrentPath = currentPath || [];\n\tvar parts = selector;\n\tif (!Array.isArray(selector)) parts = (selector || '').split(/\\s*(\\+|>|~|\\s)\\s*/g);\n\tif (!parts[0]) return undefined;\n\n\tvar sel = parts[0].split(/(\\[[^\\]]+\\]|[.#]?[^.#\\[]+)/g).filter(function (e) {\n\t\treturn e;\n\t}); // eslint-disable-line no-useless-escape\n\tvar srcIsArray = Array.isArray(node);\n\tif (!srcIsArray) node = [node];\n\tfor (var i = 0, l = node.length; i < l; i++) {\n\t\tvar el = node[i];\n\t\tif (!el) continue;\n\t\tvar nextNodes = void 0,\n\t\t    nextSelector = parts,\n\t\t    nextPath = currentPath.slice();\n\t\tvar nextOffset = 0;\n\t\tif (srcIsArray) nextPath.push(i + (childrenOffset || 0));\n\t\tif (_matchSelector(el, sel)) {\n\t\t\tif (parts.length < 2) {\n\t\t\t\tif (asPath) {\n\t\t\t\t\tif (srcIsArray) currentPath.push(i + (childrenOffset || 0));\n\t\t\t\t\t// return currentPath.join('.');\n\t\t\t\t\treturn currentPath;\n\t\t\t\t}\n\t\t\t\treturn el;\n\t\t\t}\n\t\t\tnextNodes = el.children;\n\t\t\tnextPath.push('children');\n\t\t\tdirect = false;\n\t\t\tvar inter = parts[1];\n\t\t\tif (inter === '>') {\n\t\t\t\tdirect = true;\n\t\t\t} else if (inter === '~' || inter === '+') {\n\t\t\t\tnextNodes = inter === '+' ? node.slice(i + 1, i + 2) : node.slice(i + 1);\n\t\t\t\tnextPath = currentPath.slice();\n\t\t\t\tnextOffset = (childrenOffset || 0) + i + 1;\n\t\t\t\tdirect = true;\n\t\t\t}\n\t\t\tnextSelector = parts.slice(2);\n\t\t} else if (!direct && el.children) {\n\t\t\tnextNodes = el.children;\n\t\t\tnextPath.push('children');\n\t\t}\n\t\tif (nextNodes) {\n\t\t\tvar nextResult = findInVNode(nextNodes, nextSelector, asPath, direct, nextPath, nextOffset);\n\t\t\tif (nextResult) {\n\t\t\t\treturn nextResult;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Parse dates in a few formats (e.g. dd/mm/yyyy ; yyyy-mm-dd)\nfunction parseDate(d) {\n\tif (!d || d instanceof Date) return d;\n\tif (typeof d === 'number') return new Date(d);\n\tif (typeof d !== 'string') return undefined;\n\tvar match = d.match(/^(?:(?:([0-9]{1,2})\\/)?([0-9]{1,2})\\/)?([0-9]{4})$/);\n\tif (match) return new Date(+match[3], +(match[2] || 1) - 1, +(match[1] || 1));\n\t// Handled be new Date(string) but depends on timezone so we need to handle that \"manually\" as well\n\t// Because it gives an UTC date and we want to be able to use getDate() instead of getUTCDate()\n\tmatch = d.match(/^(\\d{1,4})-(\\d{1,2})(?:-(\\d{1,2})(T\\d{1,2}:\\d{1,2}:\\d{1,2}(\\.\\d+)?Z?)?)?$/);\n\tif (match) return new Date(+match[1], +match[2] - 1, +(match[3] || 1));\n\tif (!Number.isNaN(+d)) return new Date(+d);\n\tvar date = new Date(d);\n\treturn isNaN(date) ? undefined : date;\n}\n\n/**\n * Join several parts of a path together.\n *\n * @example\n * // returns 'http://myserver.com/images/title.jpg'\n * joinPaths('http://myserver.com', 'images', '/title.jpg');\n * @param {...string} parts - the path parts to join\n * @return {string} the final path containing all the parts\n */\nfunction joinPaths() {\n\tvar path = '';\n\tvar slash = false; // whether slash is needed before\n\tfor (var i = 0, il = arguments.length; i < il; i++) {\n\t\tvar part = arguments[i];\n\t\tif (!part) continue;\n\t\t// ^ ensure empty string is not counted as a path part\n\t\tif (i > 0 && part.charAt(0) === '/') {\n\t\t\tpart = part.substring(1);\n\t\t}\n\t\tpath += slash ? '/' + part : part;\n\t\tslash = path.charAt(path.length - 1) !== '/';\n\t}\n\treturn path;\n}\n\n/**\n * Generate handlers based on a key.\n * Created handlers are cached to avoid re-creating handlers when a React\n * component is updated.\n *\n * @example\n * // in the constructor()\n * this.buttonClicks = new BindFactory(this.handleClick, this);\n * // in the render()\n * <li key={i} onClick={this.buttonClicks.get(i)}></li>\n * @constructor\n */\n\nvar BindFactory = function () {\n\tfunction BindFactory(fn, context) {\n\t\t_classCallCheck(this, BindFactory);\n\n\t\tthis.fn = fn;\n\t\tthis.context = context;\n\t\tthis.cache = {};\n\t}\n\n\t_createClass(BindFactory, [{\n\t\tkey: 'clear',\n\t\tvalue: function clear() {\n\t\t\tthis.cache = {};\n\t\t}\n\t}, {\n\t\tkey: 'get',\n\t\tvalue: function get(id) {\n\t\t\tvar _fn;\n\n\t\t\tif (id in this.cache) return this.cache[id];\n\t\t\tvar value = (_fn = this.fn).bind.apply(_fn, [this.context].concat(Array.prototype.slice.call(arguments)));\n\t\t\tthis.cache[id] = value;\n\t\t\treturn value;\n\t\t}\n\t}]);\n\n\treturn BindFactory;\n}();\n\n/**\n * Return whether the given object has only numeric key strings.\n * Can be used to detect if an object is in reality an array.\n *\n * @example\n * hasOnlyNumericKeys({\"0\": \"foo\", \"1\": \"bar\", \"3\": \"baz\"}); // true\n * hasOnlyNumericKeys({\"0\": \"foo\", \"sam\": \"bar\"}); // false\n * hasOnlyNumericKeys({\"0\": \"foo\", \"Infinity\": \"bar\"}); // false\n * @param {Object} obj - the input object\n * @return {boolean} true if obj is an array with string keys, false otherwise\n */\n\n\nfunction hasOnlyNumericKeys(obj) {\n\tfor (var key in obj) {\n\t\tif (!isFinite(+key)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Convert an object to an array. (stricter version of asList)\n * Non-numeric/Infinite keys will be removed in the array representation of the\n * object.\n *\n * @param {Object} obj - the input object\n * @return {Array} an array equivalent to obj\n */\nfunction objToArr(obj) {\n\tvar arr = [];\n\tfor (var key in obj) {\n\t\tvar idx = +key;\n\t\tif (isFinite(idx)) {\n\t\t\tarr[idx] = obj[key];\n\t\t}\n\t}\n\treturn arr;\n}\n\n/**\n * Sanitize recursively an object created in Thundr.\n * Note that numeric value will be casted to Number unless a '@s' is explicitely\n * specified at the end of the key.\n *\n * @example\n * sanitizeObj({\"power\": \"45\", \"range\": {\"0\": \"-5.6\", \"1\": \"5.2\"}, \"id@s\": \"124\"})\n * // return {\"power\": 45, \"range\": [-5.6, 5.2], \"id\": \"124\"}\n * @param {Object} obj - the input object\n * @param {Object|Array} the sanitized object or array\n */\nfunction sanitizeObj(obj) {\n\tvar out = {};\n\tfor (var key in obj) {\n\t\tvar val = obj[key];\n\t\tif (val != null && (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') {\n\t\t\tval = sanitizeObj(val);\n\t\t} else if (key.endsWith('@s')) {\n\t\t\tkey = key.substring(0, key.length - 2);\n\t\t} else {\n\t\t\tval = isFinite(+val) ? +val : val;\n\t\t}\n\t\tout[key] = val;\n\t}\n\tif (hasOnlyNumericKeys(out)) {\n\t\treturn objToArr(out);\n\t}\n\treturn out;\n}\n\n/**\n * Convert a multiline text to an array of JSX elements.\n *\n * @param {string} text - string with 0 or more \\n\n * @return {Array.<string|JSX>} an array of JSX elements\n */\nvar textToJsxArray = function () {\n\tfunction reduceTextJsx(jsxArray, line, i) {\n\t\tif (i > 0) {\n\t\t\tjsxArray.push((0, _preact.h)('br', null));\n\t\t}\n\t\tjsxArray.push(line);\n\t\treturn jsxArray;\n\t}\n\n\treturn function (text) {\n\t\tvar lines = text.split('\\n');\n\t\tvar jsxArray = lines.reduce(reduceTextJsx, []);\n\t\treturn jsxArray;\n\t};\n}();\n\n/**\n * Return the body of a function as a string.\n *\n * @example\n * functionBody(() => { console.log('test'); });\n * // ^ returns \" console.log('test'); \"\n *\n * @param {Function} fn - the input function\n * @return {string} the body of the function `fn`\n */\nfunction functionBody(fn) {\n\tif (typeof fn !== 'function') return '';\n\n\tvar str = fn.toString();\n\tstr = str.slice(str.indexOf('{') + 1, str.lastIndexOf('}'));\n\n\treturn str;\n}\n\n/**\n * Return the part part of a URI.\n *\n * @example\n * pathOnly('this/is/a/folder/file.txt');\n * // ^ returns 'this/is/a/folder/'\n *\n * @param {string} path - the full URI of a resource\n * @return {string} only the path part of the resource\n */\nfunction pathOnly(path) {\n\tvar index = path.lastIndexOf('/');\n\tif (index === -1) return path;\n\treturn path.substring(0, index + 1);\n}\n\n/**\n * Return whether an object is a functional component.\n *\n * @param {*} comp - the component to test\n * @return {!boolean} true if comp is functional, false otherwise\n */\nfunction isFunctionalComp(comp) {\n\tvar nodeName = comp && comp.nodeName;\n\treturn nodeName && typeof nodeName === 'function' && !(nodeName.prototype && nodeName.prototype.render);\n}\n\n/**\n * Return whether a variable is a JS (key, value) object.\n *\n * @param {*} obj - the object to test\n * @return {!boolean} true if obj is an object, false otherwise\n */\nfunction isObject(obj) {\n\treturn obj !== null && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && !Array.isArray(obj);\n}\n\n/**\n * Return whether a variable is a valid numberic value (string number are allowed).\n *\n * @param {*} obj - the object to test\n * @return {!boolean} true if val is numeric, false otherwise\n */\nfunction isNumeric(val) {\n\treturn !isNaN(parseFloat(val)) && isFinite(val);\n}\n\n/**\n * Access a deep member of an object and create intermediates if they are undefined.\n *\n * @param {!Object} obj - the object to look in\n * @param {Array.<string>|string} path - the path of the member in the object\n * @param {*=} def - the default value\n */\nfunction accessOrCreateNested(obj, path, def) {\n\tif (typeof path === 'string') path = path.split('.');\n\tvar levelCount = path.length;\n\tif (levelCount === 0) return obj;\n\n\tfor (var i = 0; i < levelCount; i++) {\n\t\tif (obj === null || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object') {\n\t\t\tconsole.error('Cannot access property \"' + path.slice(i).join('.') + '\" in ' + ('\"' + path.slice(0, i).join('.') + ' (object is ' + (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) + ')'));\n\t\t\treturn;\n\t\t}\n\t\tvar level = path[i];\n\t\tif (!obj.hasOwnProperty(level)) {\n\t\t\tif (i < levelCount - 1) {\n\t\t\t\tobj[level] = {};\n\t\t\t} else {\n\t\t\t\tobj[level] = def;\n\t\t\t}\n\t\t}\n\t\tobj = obj[level];\n\t}\n\treturn obj;\n}\n\n/**\n * Return the video type for <source> tag based on the extension in the video url.\n *\n * @param {string} src - the video src url.\n * @return {string} the video type corresponding to the input video url, or null if no type match.\n */\nfunction getVideoTypeFromSrc(src) {\n\tsrc = src.split('?')[0];\n\tvar type = null;\n\tif (src.endsWith('.mp4')) {\n\t\ttype = 'video/mp4';\n\t} else if (src.endsWith('.ogg') || src.endsWith('.ogv') || src.endsWith('.ogm')) {\n\t\ttype = 'video/ogg';\n\t} else if (src.endsWith('.webm')) {\n\t\ttype = 'video/webm';\n\t}\n\treturn type;\n}\n\n/**\n * Parse an string array of numeric numbers.\n *\n * @example\n * parseNumericArray('5, 2, 1.2, 7'); // returns [5, 2, 1.2, 7]\n *\n * @param {string} arrayStr - the string array\n * @return {Array.<number>|null} the array of numeric value, or null in case the parsing failed\n */\nfunction parseNumericArray(arrayStr) {\n\tif (typeof arrayStr !== 'string') return null;\n\tvar parts = arrayStr.split(/[|/,;]/);\n\t// use ES5 loop to early out in case of non-numeric value\n\tvar il = parts.length;\n\tfor (var i = 0; i < il; i++) {\n\t\tvar val = parseFloat(parts[i].trim());\n\t\tif (!isFinite(val)) return null;\n\t\tparts[i] = val;\n\t}\n\treturn parts;\n}\n\n/**\n * Quick helper to choose whether a node should be displayed.\n *\n * @example\n * <div style={displayWhen(isLoading)} />\n *\n * @param {boolean} cond - the condition to display the node\n * @return {{display: string}} the element display style\n */\nvar displayWhen = function displayWhen(cond) {\n\treturn { display: cond ? 'block' : 'none' };\n};\n\n/**\n * Return whether the given number is an integer or almost.\n *\n * @example\n * isIntegerOrAlmost(9.5); // false\n * isIntegerOrAlmost(10.00000223); // true\n * isIntegerOrAlmost(-10); // true\n *\n * @param {!number} n - the integer to test\n * @return {!boolean}\n */\nvar isIntegerOrAlmost = function isIntegerOrAlmost(n) {\n\treturn Math.abs(n - Math.round(n)) < 1e-6;\n};\n\n/**\n * Return the formatted price\n * Note that we might have to change that later for different currencies.\n *\n * @example\n * formatNumber(12.000003); // returns \"12\"\n * formatNumber(12.100003); // returns \"12.1\"\n *\n * @param {!number} price - the price amount to convert\n * @return {!string} the formatted price\n */\nvar formatPrice = function formatPrice(price) {\n\treturn price.toFixed(isIntegerOrAlmost(price) ? 0 : 2);\n};\n\n/**\n * Return the uri of an image if it exists in appData -> styling -> images || returns the default image path\n *\n * @param {*} obj - appData\n * @param {!string} imgName - name of image we are trying to find\n * @param {!string} defaultImg - value returned if the imgName doesn't exist\n * @return {!string} path of the onesheet stored in appData or default value\n */\nfunction getStylingImagePath(appData, imgName, defaultImg) {\n\tvar images = appData.styling.images;\n\n\tif (images && images[imgName]) {\n\t\treturn images[imgName];\n\t} else {\n\t\treturn defaultImg;\n\t}\n}\n\n/**\n * Transforms HTML tags in HTML entities for safe rendering.\n *\n * @example\n * encodeHtml('<script>'); // returns \"&lt;script&gt;\"\n * encodeHtml('%3Cscript%3E'); // returns \"%3Cscript%3E\"\n *\n * @param {!string} str - the string to encode\n * @return {!string} the string with HTML tags replaced with HTML entities\n */\nvar encodeHtml = function encodeHtml(str) {\n\treturn str.toString().replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/%3C/g, '&lt;').replace(/%3E/g, '&gt;');\n};\n\n/**\n * Transforms HTML tags in HTML entities recursively in any object.\n *\n * @param {*} obj - the input object\n * @return {*} the same object with all string encoded with HTML entities\n */\nvar encodeHtmlRecursively = function encodeHtmlRecursively(obj) {\n\tif (typeof obj === 'string') return encodeHtml(obj);\n\tif (Array.isArray(obj)) return obj.map(function (e) {\n\t\treturn encodeHtmlRecursively(e);\n\t});\n\tif (isObject(obj)) {\n\t\tfor (var key in obj) {\n\t\t\tobj[key] = encodeHtmlRecursively(obj[key]);\n\t\t}\n\t}\n\treturn obj;\n};\n\n/**\n * Converts HEX value to HSL value\n *\n * @param {*} Hex value\n * @return {*} HSL value\n */\n\nfunction convertHexToHsl(hex) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\tvar result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n\tvar r = parseInt(result[1], 16);\n\tvar g = parseInt(result[2], 16);\n\tvar b = parseInt(result[3], 16);\n\n\tr /= 255, g /= 255, b /= 255;\n\tvar max = Math.max(r, g, b),\n\t    min = Math.min(r, g, b);\n\tvar h = void 0,\n\t    s = void 0,\n\t    l = (max + min) / 2;\n\n\tif (max == min) {\n\t\th = s = 0; // achromatic\n\t} else {\n\t\tvar d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch (max) {\n\t\t\tcase r:\n\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);break;\n\t\t\tcase g:\n\t\t\t\th = (b - r) / d + 2;break;\n\t\t\tcase b:\n\t\t\t\th = (r - g) / d + 4;break;\n\t\t}\n\t\th /= 6;\n\t}\n\n\ts = s * 100;\n\ts = Math.round(s);\n\tl = l * 100;\n\tl = Math.round(l);\n\th = Math.round(360 * h);\n\n\tvar saturation = options.saturation,\n\t    lightness = options.lightness;\n\n\n\tvar colorInHSL = 'hsl(' + h + ', ' + (saturation || s) + '%, ' + (lightness || l) + '%)';\n\n\treturn colorInHSL;\n}\n\nexports.debounce = debounce;\nexports.throttle = throttle;\nexports.dbounce = dbounce;\nexports.once = once;\n// export { watch };\n\nexports.accessNested = accessNested;\nexports.accessOrCreateNested = accessOrCreateNested;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.triggerAnim = triggerAnim;\nexports.toggleClass = toggleClass;\nexports.condClass = condClass;\nexports.joinClasses = joinClasses;\nexports.clamp = clamp;\nexports.asList = asList;\nexports.arrayUnique = arrayUnique;\nexports.arrayUnion = arrayUnion;\nexports.appDataDate = appDataDate;\nexports.sortObjectByOrder = sortObjectByOrder;\n// export { redirect };\n\nexports.addToQuery = addToQuery;\nexports.toQueryString = toQueryString;\nexports.defaultLevelsDeep = defaultLevelsDeep;\nexports.deleteNulls = deleteNulls;\nexports.replaceWithVNode = replaceWithVNode;\nexports.findInVNode = findInVNode;\nexports.parseDate = parseDate;\nexports.joinPaths = joinPaths;\nexports.hasOnlyNumericKeys = hasOnlyNumericKeys;\nexports.objToArr = objToArr;\nexports.sanitizeObj = sanitizeObj;\nexports.BindFactory = BindFactory;\nexports.textToJsxArray = textToJsxArray;\nexports.functionBody = functionBody;\nexports.pathOnly = pathOnly;\nexports.isFunctionalComp = isFunctionalComp;\nexports.isObject = isObject;\nexports.isNumeric = isNumeric;\nexports.getVideoTypeFromSrc = getVideoTypeFromSrc;\nexports.parseNumericArray = parseNumericArray;\nexports.displayWhen = displayWhen;\nexports.isIntegerOrAlmost = isIntegerOrAlmost;\nexports.formatPrice = formatPrice;\nexports.getStylingImagePath = getStylingImagePath;\nexports.encodeHtml = encodeHtml;\nexports.encodeHtmlRecursively = encodeHtmlRecursively;\nexports.convertHexToHsl = convertHexToHsl;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/* Action Types\n-----------------------*/\n\nvar UPDATE_STORE = exports.UPDATE_STORE = 'UPDATE_STORE';\nvar BEFORE_LOAD = exports.BEFORE_LOAD = 'BEFORE_LOAD';\nvar PAGE_STATE_LOADED = exports.PAGE_STATE_LOADED = 'PAGE_STATE_LOADED';\nvar START_API = exports.START_API = 'START_API';\nvar GMAPS_LOADED = exports.GMAPS_LOADED = 'GMAPS_LOADED';\nvar URL_CHANGED = exports.URL_CHANGED = 'URL_CHANGED';\n\nvar CLOSE_APP = exports.CLOSE_APP = 'CLOSE_APP';\n\n// Loader\nvar UPDATE_LOADER = exports.UPDATE_LOADER = 'UPDATE_LOADER';\n\n// Bg Status\nvar SET_BG_STATUS = exports.SET_BG_STATUS = 'SET_BG_STATUS';\nvar SET_ACTIVE_PAGE = exports.SET_ACTIVE_PAGE = 'SET_ACTIVE_PAGE';\n\n// App Dimensions/Browser Stats\nvar SET_CLIENT_SIZE = exports.SET_CLIENT_SIZE = 'SET_CLIENT_SIZE';\nvar START_FORCE_CLIENT_ORIENTATION = exports.START_FORCE_CLIENT_ORIENTATION = 'START_FORCE_CLIENT_ORIENTATION';\nvar STOP_FORCE_CLIENT_ORIENTATION = exports.STOP_FORCE_CLIENT_ORIENTATION = 'STOP_FORCE_CLIENT_ORIENTATION';\n\n// Background\nvar SET_BACKGROUND_VIDEO_PLAYING = exports.SET_BACKGROUND_VIDEO_PLAYING = 'SET_BACKGROUND_VIDEO_PLAYING';\nvar SET_BACKGROUND_VIDEO_ENABLED = exports.SET_BACKGROUND_VIDEO_ENABLED = 'SET_BACKGROUND_VIDEO_ENABLED';\nvar SET_BACKGROUND_VIDEO_MUTED = exports.SET_BACKGROUND_VIDEO_MUTED = 'SET_BACKGROUND_VIDEO_MUTED';\nvar SET_BACKGROUND_ELEMENT = exports.SET_BACKGROUND_ELEMENT = 'SET_BACKGROUND_ELEMENT';\nvar UPDATE_BACKGROUND_SETTINGS = exports.UPDATE_BACKGROUND_SETTINGS = 'UPDATE_BACKGROUND_SETTINGS';\n\n// Home page\nvar CALENDAR_CLICKED = exports.CALENDAR_CLICKED = 'CALENDAR_CLICKED';\nvar MESSENGER_CLICKED = exports.MESSENGER_CLICKED = 'MESSENGER_CLICKED';\nvar HOMEPAGE_TRAILER_ENDED = exports.HOMEPAGE_TRAILER_ENDED = 'HOMEPAGE_TRAILER_ENDED';\nvar CLICKED_FOLLOW = exports.CLICKED_FOLLOW = 'CLICKED_FOLLOW';\n\n// Menu\nvar SET_SIDE_NAV_OPEN = exports.SET_SIDE_NAV_OPEN = 'SET_SIDE_NAV_OPEN';\nvar SET_SIDE_NAV_ACTIVE = exports.SET_SIDE_NAV_ACTIVE = 'SET_SIDE_NAV_ACTIVE';\nvar CLICKED_SHARE = exports.CLICKED_SHARE = 'CLICKED_SHARE';\nvar LINK_CLICKED = exports.LINK_CLICKED = 'LINK_CLICKED';\nvar EXTERNAL_LINK_CLICKED = exports.EXTERNAL_LINK_CLICKED = 'EXTERNAL_LINK_CLICKED';\nvar HEADER_HIDDEN = exports.HEADER_HIDDEN = 'HEADER_HIDDEN';\n\n// Footer\n// export const FOOTER_SIZE = 'FOOTER_SIZE';\n\n// Client Geo\nvar SET_CLIENT_GEO = exports.SET_CLIENT_GEO = 'SET_CLIENT_GEO';\nvar GET_SCREENINGS = exports.GET_SCREENINGS = 'GET_SCREENINGS';\n\n// Dynamic Data\nvar UPDATE_DYNAMIC_DATA = exports.UPDATE_DYNAMIC_DATA = 'UPDATE_DYNAMIC_DATA';\n\n// Theaters\nvar SET_THEATERS = exports.SET_THEATERS = 'SET_THEATERS';\nvar ADD_THEATERS = exports.ADD_THEATERS = 'ADD_THEATERS';\nvar SELECT_THEATER = exports.SELECT_THEATER = 'SELECT_THEATER';\n// export const SELECT_FIRST_THEATER               = 'SELECT_FIRST_THEATER';\nvar SET_MAP_OPEN = exports.SET_MAP_OPEN = 'SET_MAP_OPEN';\nvar SET_CITIES = exports.SET_CITIES = 'SET_CITIES';\nvar SET_CITY_SHOW_COUNT = exports.SET_CITY_SHOW_COUNT = 'SET_CITY_SHOW_COUNT';\nvar SELECT_NEARBY_CITY = exports.SELECT_NEARBY_CITY = 'SELECT_NEARBY_CITY';\nvar UPDATE_THEATER_FILTERED_SCREENINGS = exports.UPDATE_THEATER_FILTERED_SCREENINGS = 'UPDATE_THEATER_FILTERED_SCREENINGS';\nvar AFTER_THEATERS_UPDATE = exports.AFTER_THEATERS_UPDATE = 'AFTER_THEATERS_UPDATE';\nvar EXTRA_THEATERS = exports.EXTRA_THEATERS = 'EXTRA_THEATERS';\nvar DO_LOCATION_SEARCH = exports.DO_LOCATION_SEARCH = 'DO_LOCATION_SEARCH';\nvar FIRST_DATA_LOADED = exports.FIRST_DATA_LOADED = 'FIRST_DATA_LOADED';\nvar SCREENINGS_LOADED = exports.SCREENINGS_LOADED = 'SCREENINGS_LOADED';\nvar SELECT_ST_DATE = exports.SELECT_ST_DATE = 'SELECT_ST_DATE';\nvar SELECT_PROVIDER = exports.SELECT_PROVIDER = 'SELECT_PROVIDER';\nvar SELECT_TIME = exports.SELECT_TIME = 'SELECT_TIME'; // DON'T USE FOR TRACKING, use SELECT_SCREENING INSTEAD\nvar SELECT_SCREENING = exports.SELECT_SCREENING = 'SELECT_SCREENING';\nvar TICKET_LINK_CLICKED = exports.TICKET_LINK_CLICKED = 'TICKET_LINK_CLICKED';\nvar SHOW_SCREENING_AUTH = exports.SHOW_SCREENING_AUTH = 'SHOW_SCREENING_AUTH';\n\n// Ticketing\nvar OPEN_TICKETING = exports.OPEN_TICKETING = 'OPEN_TICKETING';\nvar REOPEN_TICKETING = exports.REOPEN_TICKETING = 'REOPEN_TICKETING';\nvar GO_TICKETING_TYPES = exports.GO_TICKETING_TYPES = 'GO_TICKETING_TYPES';\nvar UPDATE_TICKET_TYPE_QUANTITY = exports.UPDATE_TICKET_TYPE_QUANTITY = 'UPDATE_TICKET_TYPE_QUANTITY';\nvar CREATE_OR_UPDATE_ORDER = exports.CREATE_OR_UPDATE_ORDER = 'CREATE_OR_UPDATE_ORDER';\nvar UPDATE_ORDER_TICKETS = exports.UPDATE_ORDER_TICKETS = 'UPDATE_ORDER_TICKETS';\nvar GO_TICKETING_SEATING = exports.GO_TICKETING_SEATING = 'GO_TICKETING_SEATING';\nvar PICK_OR_UNPICK_SEATS = exports.PICK_OR_UNPICK_SEATS = 'PICK_OR_UNPICK_SEATS';\nvar UPDATE_TICKETING_SEATS = exports.UPDATE_TICKETING_SEATS = 'UPDATE_TICKETING_SEATS';\nvar FLUSH_SEAT_LAYOUT = exports.FLUSH_SEAT_LAYOUT = 'FLUSH_SEAT_LAYOUT';\nvar GO_TICKETING_REVIEW = exports.GO_TICKETING_REVIEW = 'GO_TICKETING_REVIEW';\nvar GO_TICKETING_CONTACT_DETAILS = exports.GO_TICKETING_CONTACT_DETAILS = 'GO_TICKETING_CONTACT_DETAILS';\nvar GO_TICKETING_PAYMENT = exports.GO_TICKETING_PAYMENT = 'GO_TICKETING_PAYMENT';\nvar OPEN_PAYMENT = exports.OPEN_PAYMENT = 'OPEN_PAYMENT';\nvar PAYMENT_MESSAGE_RECEIVED = exports.PAYMENT_MESSAGE_RECEIVED = 'PAYMENT_MESSAGE_RECEIVED';\nvar CLOSE_PAYMENT = exports.CLOSE_PAYMENT = 'CLOSE_PAYMENT';\nvar TICKET_PURCHASE_COMPLETE = exports.TICKET_PURCHASE_COMPLETE = 'TICKET_PURCHASE_COMPLETE';\nvar SET_TICKETING_MESSAGE = exports.SET_TICKETING_MESSAGE = 'SET_TICKETING_MESSAGE';\nvar CLEAR_TICKETING_MESSAGE = exports.CLEAR_TICKETING_MESSAGE = 'CLEAR_TICKETING_MESSAGE';\nvar GO_TICKETING_TIMEOUT = exports.GO_TICKETING_TIMEOUT = 'GO_TICKETING_TIMEOUT';\nvar CLOSE_TICKETING = exports.CLOSE_TICKETING = 'CLOSE_TICKETING';\n\n// Filters\nvar CHECK_FILTERS = exports.CHECK_FILTERS = 'CHECK_FILTERS';\nvar RELOAD_FILTERS = exports.RELOAD_FILTERS = 'RELOAD_FILTERS';\nvar TOGGLE_FILTER = exports.TOGGLE_FILTER = 'TOGGLE_FILTER';\nvar FILTER_EXCLUDE = exports.FILTER_EXCLUDE = 'FILTER_EXCLUDE';\nvar FILTER_DISABLE = exports.FILTER_DISABLE = 'FILTER_DISABLE';\nvar SET_FILTER_VISIBILITY = exports.SET_FILTER_VISIBILITY = 'SET_FILTER_VISIBILITY';\nvar RESET_FILTER = exports.RESET_FILTER = 'RESET_FILTER';\nvar RESET_FILTERS = exports.RESET_FILTERS = 'RESET_FILTERS';\nvar APPLY_FILTERS = exports.APPLY_FILTERS = 'APPLY_FILTERS';\nvar SEARCH_NEW_CITY = exports.SEARCH_NEW_CITY = 'SEARCH_NEW_CITY';\n\n// Modal\nvar SHOW_MODAL = exports.SHOW_MODAL = 'SHOW_MODAL';\nvar HIDE_MODAL = exports.HIDE_MODAL = 'HIDE_MODAL';\nvar UPDATE_MODAL = exports.UPDATE_MODAL = 'UPDATE_MODAL';\nvar SHOW_COOKIES_MODAL = exports.SHOW_COOKIES_MODAL = 'SHOW_COOKIES_MODAL';\n// MODAL RESULTS (should probably move that somewhere else)\nvar MODAL_RESULT_OK = exports.MODAL_RESULT_OK = 'OK';\nvar MODAL_RESULT_CANCEL = exports.MODAL_RESULT_CANCEL = 'CANCEL';\n\nvar APP_LIST_SCROLLED = exports.APP_LIST_SCROLLED = 'APP_LIST_SCROLLED';\nvar MOVIES_LIST_SCROLLED = exports.MOVIES_LIST_SCROLLED = 'MOVIES_LIST_SCROLLED';\nvar SCREENINGS_LIST_SCROLLED = exports.SCREENINGS_LIST_SCROLLED = 'SCREENINGS_LIST_SCROLLED';\nvar EVENT_DATA_LIST_SCROLLED = exports.EVENT_DATA_LIST_SCROLLED = 'EVENT_DATA_LIST_SCROLLED';\n\n// QUIZ\nvar QUIZ_STARTED = exports.QUIZ_STARTED = 'QUIZ_STARTED';\n\n// USER\nvar SET_USER = exports.SET_USER = 'SET_USER';\nvar SET_USER_REGION_MODAL_DISMISSED = exports.SET_USER_REGION_MODAL_DISMISSED = 'SET_USER_REGION_MODAL_DISMISSED';\n\nvar SET_IOSFIXEDFIX = exports.SET_IOSFIXEDFIX = 'SET_IOSFIXEDFIX';\n\n// YOUTUBE\nvar YOUTUBE_READY = exports.YOUTUBE_READY = 'YOUTUBE_READY';\nvar YOUTUBE_PROGRESS = exports.YOUTUBE_PROGRESS = 'YOUTUBE_PROGRESS';\nvar YOUTUBE_ENDED = exports.YOUTUBE_ENDED = 'YOUTUBE_ENDED';\nvar YOUTUBE_PAUSE = exports.YOUTUBE_PAUSE = 'YOUTUBE_PAUSE';\nvar YOUTUBE_PLAY = exports.YOUTUBE_PLAY = 'YOUTUBE_PLAY';\n\n// VR\nvar VR_SET_MODE = exports.VR_SET_MODE = 'VR_SET_MODE';\n\n// SCROLL CONTROLS\nvar SCROLL_LOCK = exports.SCROLL_LOCK = 'SCROLL_LOCK';\nvar SCROLL_UNLOCK = exports.SCROLL_UNLOCK = 'SCROLL_UNLOCK';\n\n// TRACKING\nvar ONETRUST_SHOW = exports.ONETRUST_SHOW = 'ONETRUST_SHOW';\n\n// AUTHENTICATION\nvar AUTH_RESPONSE = exports.AUTH_RESPONSE = 'AUTH_RESPONSE';\nvar AUTH_CLEAR = exports.AUTH_CLEAR = 'AUTH_CLEAR';\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(fetch) {\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.requestSignedStaticMapUrl = exports.getIsIOS = exports.getSizeBasedTT = exports.getCopyWithParams = exports.getPiwikId = exports.getPageTitle = exports.getPath = exports.findParent = exports.getQueryParameterByName = exports.isInViewport = exports.getAC_ID = exports.calculateShowtimesStatus = exports.updateQueryStringItem = exports.getDevice = exports.getDims = exports.getSize = exports.buildClientStoreData = exports.getCitiesAsync = exports.processScreeningsApi = exports.getTheatersScreeningsAsync = exports.searchLocation = exports.rawSearchLocation = exports.getGeoScreeningsAsync = exports.getGeoFromIPAsync = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _formatDateTime = __webpack_require__(11);\n\nvar _formatDateTime2 = _interopRequireDefault(_formatDateTime);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _Geo = __webpack_require__(8);\n\nvar _Geo2 = _interopRequireDefault(_Geo);\n\nvar _Theater = __webpack_require__(18);\n\nvar _Theater2 = _interopRequireDefault(_Theater);\n\nvar _Exhibitor = __webpack_require__(45);\n\nvar _Exhibitor2 = _interopRequireDefault(_Exhibitor);\n\nvar _Screening = __webpack_require__(48);\n\nvar _Screening2 = _interopRequireDefault(_Screening);\n\nvar _Format = __webpack_require__(46);\n\nvar _Format2 = _interopRequireDefault(_Format);\n\nvar _Movie = __webpack_require__(47);\n\nvar _Movie2 = _interopRequireDefault(_Movie);\n\nvar _utils = __webpack_require__(2);\n\nvar _tracking = __webpack_require__(6);\n\nvar _preprocessScreenings = __webpack_require__(60);\n\nvar _preprocessScreenings2 = _interopRequireDefault(_preprocessScreenings);\n\nvar _ticketingPublic = __webpack_require__(9);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n/**\n * Add Client data to the initial state of the store\n * @return {Object} The current initial State\n */\nfunction buildClientStoreData(initialState) {\n\t// NOTE: this is a random hack to make hover work on mobile in the navigation\n\t// Should we maybe put it somewhere else ? Seems a bit weird to have it in that function\n\twindow.addEventListener('touchend', function () {});\n\n\twindow.addEventListener('unload', function (ev) {\n\t\t_store2['default'].emit(actions.CLOSE_APP, ev);\n\t});\n\n\tvar dimensions = getDims();\n\tvar device = getDevice();\n\tvar deviceSize = getSize(dimensions, device);\n\tvar orientation = dimensions.width > dimensions.height ? 'landscape' : 'portrait';\n\tvar isIOS = getIsIOS(device);\n\tvar iOSVersion = getIOSVersion();\n\tvar isIE = getIsIE();\n\tvar isEdge = getIsEdge();\n\tvar isFirefox = getIsFirefox();\n\tvar isTouch = !!('ontouchstart' in window) || window.navigator.msMaxTouchPoints > 0;\n\tvar isChrome = !!getIsChrome();\n\tvar isSafari = getIsSafari();\n\tvar hasWebGL = getHasWebGL();\n\n\tif (initialState.header) {\n\t\tvar order = ['none', 'mobile', 'tablet', 'desktop'];\n\t\tinitialState.header.sideNavActive = order.indexOf(deviceSize) <= order.indexOf(initialState.header.sideNavBelow);\n\t}\n\n\tinitialState.client = {\n\t\tdimensions: dimensions,\n\t\tdeviceSize: deviceSize,\n\t\tdevice: device,\n\t\torientation: orientation,\n\t\tisIOS: isIOS,\n\t\tiOSVersion: iOSVersion,\n\t\tisEdge: isEdge,\n\t\tisIE: isIE,\n\t\tisFirefox: isFirefox,\n\t\tisChrome: isChrome,\n\t\tisTouch: isTouch,\n\t\tisSafari: isSafari,\n\t\thasWebGL: hasWebGL\n\t};\n\n\treturn initialState;\n}\n\nfunction getSize() {\n\tvar dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getDims();\n\tvar device = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getDevice();\n\n\tvar largeDesktopStartWidth = 1280; //not using this...yet. (Be careful ! We use the result of this function in the tracking)\n\tvar breakpoints = [[768, 'mobile'], [1024, 'tablet'], [Infinity, 'desktop']];\n\n\tfor (var i = 0; i < breakpoints.length; i++) {\n\t\tif (dimensions.width < breakpoints[i][0]) {\n\t\t\tif (device == \"iphone\" && i == 1) return breakpoints[0][1]; //because iPhone x\n\t\t\telse return breakpoints[i][1];\n\t\t}\n\t}\n\n\treturn 'unknown';\n}\n\nfunction getDims() {\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight\n\t};\n}\n\nfunction getQueryParameterByName(name, url) {\n\tif (!url) url = window.location.href;\n\tname = name.replace(/[\\[\\]]/g, '\\\\$&'); // eslint-disable-line\n\tvar regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');\n\tvar results = regex.exec(url);\n\tif (!results) return null;\n\tif (!results[2]) return '';\n\treturn decodeURIComponent(results[2].replace(/\\+/g, ' '));\n}\n\nfunction updateQueryStringItem(key, value, state, usePush) {\n\tvar parsedQS = _qs2['default'].parse(location.search.slice(1));\n\tif ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) !== 'object') {\n\t\tif (value !== null) {\n\t\t\tparsedQS[key] = value;\n\t\t} else {\n\t\t\tdelete parsedQS[key];\n\t\t}\n\t} else {\n\t\tusePush = state;\n\t\tstate = value;\n\t\tfor (var p in key) {\n\t\t\tif (key.hasOwnProperty(p)) {\n\t\t\t\tvar v = key[p];\n\t\t\t\tif (v !== null) {\n\t\t\t\t\tparsedQS[p] = v;\n\t\t\t\t} else {\n\t\t\t\t\tdelete parsedQS[p];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar qs = _qs2['default'].stringify(parsedQS);\n\tqs = qs ? '?' + qs : '';\n\tvar method = usePush ? 'pushState' : 'replaceState';\n\thistory[method](state, '', (location.pathname || '') + qs);\n}\n\n/**\n * Get the Device data.\n * @return {Object} Device data object\n */\nfunction getDevice() {\n\tif (typeof window !== 'undefined') {\n\t\tvar agent = ('' + navigator.userAgent).toLowerCase();\n\t\tif (agent.indexOf('android') !== -1) {\n\t\t\treturn 'android';\n\t\t}\n\t\tif (agent.indexOf('iphone') !== -1) {\n\t\t\treturn 'iphone';\n\t\t}\n\t\tif (agent.indexOf('ipad') !== -1) {\n\t\t\treturn 'ipad';\n\t\t}\n\t}\n\treturn 'desktop';\n}\n\nfunction findParent(el, tagName) {\n\ttagName = tagName.toUpperCase();\n\tvar parent = el.parentElement;\n\twhile (parent) {\n\t\tif (parent.tagName === tagName) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = parent.parentElement;\n\t}\n}\n\n/**\n * Is the browser Chrome?\n * @return {boolean|string} is the browser chrome\n */\nfunction getIsChrome() {\n\tif (getIsEdge()) return false;\n\tif (typeof window !== 'undefined') {\n\t\treturn navigator.userAgent.match('CriOS') || !!window.chrome;\n\t}\n\treturn false;\n}\n\n/**\n * Is the browser IE (or Edge)?\n * @return {boolean|string} is the browser ie/which version\n */\nfunction getIsIE() {\n\tvar ua = window.navigator.userAgent;\n\n\tvar msie = ua.indexOf('MSIE ');\n\tif (msie > 0) {\n\t\t// IE 10 or older => return version number\n\t\treturn parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n\t}\n\n\tvar trident = ua.indexOf('Trident/');\n\tif (trident > 0) {\n\t\t// IE 11 => return version number\n\t\tvar rv = ua.indexOf('rv:');\n\t\treturn parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n\t}\n\n\tvar edge = ua.indexOf('Edge/');\n\tif (edge > 0) {\n\t\t// Edge (IE 12+) => return version number\n\t\treturn parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n\t}\n\n\t// other browser\n\treturn false;\n}\n\n/**\n * Is the browser Edge?\n * @return {boolean|string} is the browser edge\n */\nfunction getIsEdge() {\n\tvar ua = window.navigator.userAgent;\n\tvar edge = ua.indexOf('Edge/');\n\tif (edge > 0) {\n\t\treturn parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n\t}\n\treturn false;\n}\n\n/**\n * Is the browser Firefox?\n * @return {boolean} is the browser firefox\n */\nfunction getIsFirefox() {\n\treturn window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\n/**\n * Is the device IOS?\n * @return {boolean} is the device ios\n */\nfunction getIsIOS() {\n\tif (typeof window !== 'undefined') {\n\t\tvar agent = ('' + navigator.userAgent).toLowerCase();\n\t\treturn agent.indexOf('ipad') !== -1 || agent.indexOf('iphone') !== -1;\n\t}\n\n\treturn false;\n}\n\n/**\n * Get version of ios (if it is ios).\n * @return {string} version of ios\n */\nfunction getIOSVersion() {\n\treturn parseFloat(('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ''])[1]).replace('undefined', '3_2').replace('_', '.').replace('_', '')) || false;\n}\n\n/**\n * Return whether WebGL is available.\n * @return {boolean} true if WebGL is available, false otherwise\n */\nfunction getHasWebGL() {\n\tvar canvas = document.createElement('canvas');\n\tvar gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\treturn !!gl;\n}\n\nfunction getIsSafari() {\n\treturn navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1;\n}\n\n/**\n * Calculate the status of showtimes (is it live yet or not).\n * @param {Date} activeDate - the date that showtimes is going live\n * @param {boolean} forceLive - Should we force showtimes to go live (-1 to prevent live status)\n * @param {Object} pages - All the pages that the app has\n * @return {boolean} is showtimes live or not\n */\nfunction calculateShowtimesStatus(activeDate, forceLive, pages) {\n\treturn (activeDate <= Date.now() || forceLive || pages.showtimes && pages.showtimes.path === '/') && forceLive !== -1;\n}\n\n/**\n * Get the _pk_id/ac_id\n */\nfunction getAC_ID() {\n\tvar cookie = document.cookie.split(';').find(function (c) {\n\t\treturn c.trim().slice(0, 6) === '_pk_id';\n\t});\n\n\tif (cookie) return cookie.split('=')[1].split('.')[0];else return null;\n}\n\nif (typeof window !== 'undefined') window.getAC_ID = getAC_ID;\n\n/**\n * Get the client geo from ip\n */\nfunction getGeoFromIPAsync(apiRoot) {\n\tapiRoot = apiRoot || (0, _utils.accessNested)(_store2['default'].get(), 'appData.apis.stdata.root') || 'https://stdata.powster.com';\n\treturn fetch(apiRoot + '/geo').then(function (res) {\n\t\treturn res.json();\n\t})['catch'](function (e) {\n\t\t// If error, try getting the capital city of the app region\n\t\tvar countryCode = (0, _utils.accessNested)(_store2['default'].get(), 'appData.meta.region.slug') || 'us';\n\t\tif (countryCode === 'intl' || countryCode === 'mde' || countryCode === 'lam') {\n\t\t\tthrow e;\n\t\t}\n\t\treturn fetch(apiRoot + '/capital?country=' + countryCode).then(function (r) {\n\t\t\treturn r.json();\n\t\t});\n\t}).then(function (data) {\n\t\tif (data && data.countryCode) {\n\t\t\tdata.countryCode = data.countryCode.toLowerCase();\n\t\t}\n\t\treturn data;\n\t});\n\t// Further error handled at usage in updateShowtimes\n}\n\nfunction rawSearchLocation(address, apiKey, srcRegion) {\n\tvar q = {\n\t\taddress: address,\n\t\tkey: apiKey\n\t};\n\n\tvar region = srcRegion;\n\tif (region) {\n\t\t// Special cases (ccTLD, not ISO ; see https://developers.google.com/maps/documentation/geocoding/intro#RegionCodes)\n\t\tif (region === 'gb') region = 'uk';\n\t\tq.region = region;\n\t}\n\n\treturn fetch('https://maps.googleapis.com/maps/api/geocode/json' + (0, _utils.toQueryString)(q)).then(function (res) {\n\t\treturn res.json();\n\t}).then(function (data) {\n\t\tif (data.status !== 'OK') {\n\t\t\t_store2['default'].emit(actions.SET_THEATERS, []);\n\t\t\t_store2['default'].get().showtimes.set({ loading: false, error: 'GEOCODING' });\n\t\t\t(0, _tracking.track)({ a: 'location_fail', l: status });\n\t\t\t// probably 'ZERO_RESULTS' (we should check though)\n\t\t\treturn Promise.reject();\n\t\t}\n\t\tvar firstResult = findLocationInRegion(data.results, srcRegion);\n\t\tvar getCity = Promise.resolve();\n\t\tvar apiRoot = (0, _utils.accessNested)(_store2['default'].get(), 'appData.apis.stdata.root') || 'https://stdata.powster.com';\n\t\tif (firstResult.isCountry) {\n\t\t\tgetCity = fetch(apiRoot + '/capital?country=' + firstResult.countryCode).then(function (r) {\n\t\t\t\treturn r.json();\n\t\t\t});\n\t\t} else if (firstResult.types.indexOf('administrative_area_level_1') !== -1 && firstResult.countryCode === 'us') {\n\t\t\tgetCity = fetch(apiRoot + '/capital?state=' + firstResult.formatted_address.replace(/, USA$/i, '')).then(function (r) {\n\t\t\t\treturn r.json();\n\t\t\t});\n\t\t}\n\t\treturn getCity['catch'](function (e) {\n\t\t\treturn undefined;\n\t\t}).then(function (geoData) {\n\t\t\tif (!geoData) {\n\t\t\t\tvar countryCode = firstResult.countryCode;\n\t\t\t\tvar city = firstResult.cityName;\n\t\t\t\tvar _location = firstResult.geometry.location;\n\t\t\t\tvar lat = _location.lat;\n\t\t\t\tvar lon = _location.lng;\n\t\t\t\tgeoData = {\n\t\t\t\t\tlat: lat, lon: lon, countryCode: countryCode, city: city || address\n\t\t\t\t};\n\t\t\t}\n\t\t\tgeoData.countryCode = (geoData.countryCode || srcRegion || '').toLowerCase();\n\t\t\tgeoData.src = address;\n\t\t\treturn new _Geo2['default'](geoData);\n\t\t});\n\t});\n}\n\nfunction searchLocation(loc, gmapsApiKey, region, source) {\n\t// Start the loading animation when we start geocoding, not when it's done\n\t_store2['default'].get().showtimes.set({ loading: true });\n\n\t(0, _tracking.track)({ a: 'location_search' });\n\n\treturn rawSearchLocation(loc, gmapsApiKey, region).then(function (result) {\n\t\t// Update the actual location\n\t\t_store2['default'].emit(actions.SET_CLIENT_GEO, result, source || 'search');\n\t\t(0, _tracking.track)({ a: 'location', l: 'SUCCESS' });\n\t})['catch'](function () {\n\t\t_store2['default'].emit(actions.SET_THEATERS, []);\n\t\t_store2['default'].get().showtimes.set({ loading: false, error: 'GEOCODING' });\n\t\t(0, _tracking.track)({ a: 'location_fail', l: status });\n\t});\n}\n\n/**\n * Find the location located in the region (if it exists).\n * @param {Array} geos - array with all the possible geos\n * @param {Array} srcRegion - region in which we're doing the search\n * @return {Object} the best matching geo object to the active region\n */\nfunction findLocationInRegion(geos, srcRegion) {\n\t// Stop at the first one ?\n\tgeos.forEach(function (geo, index) {\n\t\tgeo.sourceIndex = index;\n\t\tgeo.isCountry = geo.types.indexOf('country') !== -1;\n\n\t\tvar countryComp = geo.address_components.find(function (comp) {\n\t\t\treturn (comp.types || []).indexOf('country') !== -1 && (comp.short_name || '').length === 2;\n\t\t});\n\t\tif (countryComp) {\n\t\t\tgeo.countryCode = countryComp.short_name.toLowerCase();\n\t\t}\n\t\tgeo.isInCurrentCountry = geo.countryCode === srcRegion;\n\n\t\tvar cityComp = geo.address_components.find(function (comp) {\n\t\t\treturn comp.types.indexOf('locality') !== -1;\n\t\t});\n\t\tif (cityComp) {\n\t\t\tgeo.cityName = cityComp.long_name;\n\t\t}\n\t});\n\tgeos.sort(function (geoA, geoB) {\n\t\t// If one of them is a country put it at the bottom\n\t\tif (geoA.isCountry !== geoB.isCountry) return geoA.isCountry ? 1 : -1;\n\t\tif (geoA.isInCurrentCountry !== geoB.isInCurrentCountry) {\n\t\t\treturn geoA.isInCurrentCountry ? -1 : 1;\n\t\t}\n\t\treturn geoA.sourceIndex - geoB.sourceIndex;\n\t});\n\treturn geos[0];\n}\n\n/**\n * Generates a fake API response with a bunch of screenings\n * TODO: Move that to the back-end. Create an endpoint stdata/screenings/fake and just call it\n */\nfunction generateFakeTimes(geo) {\n\tgeo = geo || {};\n\tvar formats = [{\n\t\ttype: 'formats',\n\t\tid: Math.random() + '',\n\t\tattributes: { name: '2d' }\n\t}];\n\tvar movies = [{\n\t\ttype: 'movies',\n\t\tid: Math.random() + '',\n\t\tattributes: {\n\t\t\tprovider_id: 'wwm',\n\t\t\tprovider_movie_id: Math.random() + '',\n\t\t\tformat_id: formats[0].id,\n\t\t\ttitle: 'Dummy movie'\n\t\t}\n\t}];\n\tvar theaters = [];\n\tfor (var i = ~~(Math.random() * 10 + 1); i--;) {\n\t\ttheaters.push({\n\t\t\ttype: 'theaters',\n\t\t\tid: Math.random() + '',\n\t\t\tattributes: {\n\t\t\t\tname: 'Dummy Theater #' + (i + 1),\n\t\t\t\taddress: 'Nowhere',\n\t\t\t\tcity: '???',\n\t\t\t\tcountry: geo.countryCode || 'gb',\n\t\t\t\turl: 'http://google.com',\n\t\t\t\tlat: (geo.lat || 0) + (Math.random() - .5) * .08,\n\t\t\t\tlon: (geo.lon || 0) + (Math.random() - .5) * .16,\n\t\t\t\ttz: 'Europe/London',\n\t\t\t\tprovider_id: 'wwm',\n\t\t\t\tprovider_theater_id: Math.random() + ''\n\t\t\t}\n\t\t});\n\t}\n\tvar screenings = [];\n\tvar now = Date.now();\n\tfor (var _i = ~~(Math.random() * 50 + 50); _i--;) {\n\t\tvar sTime = new Date(now + Math.random() * 7 * 24 * 60 * 60 * 1000);\n\t\tscreenings.push({\n\t\t\ttype: 'screenings',\n\t\t\tid: '8ac5ca20-f78f-11e6-9bb3-efc78af321f4',\n\t\t\tattributes: {\n\t\t\t\tmovie_id: movies[0].id,\n\t\t\t\ttheater_id: theaters[~~(Math.random() * theaters.length)].id,\n\t\t\t\tprovider_id: 'wwm',\n\t\t\t\tdate: sTime.toISOString(),\n\t\t\t\ttime: (0, _formatDateTime2['default'])(sTime, 'hh\\\\:mm\\\\:ss'),\n\t\t\t\turl: 'http://google.com',\n\t\t\t\tis_visible: true\n\t\t\t}\n\t\t});\n\t}\n\treturn {\n\t\tdata: screenings,\n\t\tincluded: formats.concat(movies).concat(theaters),\n\t\tmeta: []\n\t};\n}\n\n// Switch things like be_fr to be\nfunction getCountry2(country) {\n\treturn country && (country + '').toLowerCase().replace(/^([a-z]+)_.+$/, '$1');\n}\n\nfunction getBoundingRegions(appData) {\n\tvar br = (0, _utils.accessNested)(appData, 'pages.showtimes.data.boundingRegions', []);\n\tvar disabledBr = [];\n\tvar extraBr = [];\n\tif (!Array.isArray(br)) {\n\t\tdisabledBr = Object.keys(br).filter(function (k) {\n\t\t\treturn br[k] === false;\n\t\t});\n\t\textraBr = Object.keys(br).filter(function (k) {\n\t\t\treturn br[k] === true;\n\t\t});\n\t}\n\tif ((0, _utils.accessNested)(appData, 'options.autoBoundingRegions')) {\n\t\tvar dynamicData = _store2['default'].get().dynamicData;\n\t\tif (dynamicData && dynamicData.regions) {\n\t\t\tvar regions = dynamicData.regions;\n\t\t\tbr = Object.keys(regions).filter(function (k) {\n\t\t\t\treturn regions[k];\n\t\t\t});\n\t\t}\n\t}\n\tif (br.toJS) br = br.toJS();\n\n\t// Convert to array\n\tbr = (0, _utils.asList)(br);\n\tif (br.indexOf('intl') !== -1) return null;\n\n\t// Turn into object for duplicate removal (avoids having to filter things out at the end)\n\tvar brObject = {};\n\tbr.concat(extraBr, appData.meta.region.slug).forEach(function (country) {\n\t\tif (!country) return;\n\t\t// Turn it into a regular country code\n\t\tvar country2 = getCountry2(country);\n\t\tif (disabledBr.indexOf(country2) !== -1) {\n\t\t\treturn;\n\t\t}\n\t\t// Also check country2 if different\n\t\tif (country2 !== country && disabledBr.indexOf(country) !== -1) {\n\t\t\treturn;\n\t\t}\n\t\tbrObject[country2] = true;\n\t});\n\n\treturn Object.keys(brObject);\n}\n\n// TODO: We should probably merge getGeoScreeningsAsync and getTheatersScreeningsAsync they are very similar\n// (do we even still use getTheatersScreeningsAsync ?)\n\n/**\n * Get screenings from location\n * @param {Object} geo\n * @param {Object} state current Store (used for bounding region check etc.\n * @param {Boolean} noBoundingRegionCheck Do not check the region\n */\nfunction getGeoScreeningsAsync(geo, state, noBoundingRegionCheck) {\n\tvar _ref = state || {},\n\t    appData = _ref.appData;\n\n\tif (appData && (0, _utils.accessNested)(appData, 'options.generateFakeTimes')) {\n\t\treturn Promise.resolve(generateFakeTimes(geo));\n\t}\n\n\tvar lat = geo.lat,\n\t    lon = geo.lon,\n\t    countryCode = geo.countryCode;\n\n\tvar stdataApiRoot = appData.apis.stdata.root;\n\n\tvar be = (0, _utils.accessNested)(state, 'activePage.data.blockedExhibitors', {});\n\t// convert blockedExhibitors to object if it's an array\n\tif (Array.isArray(be)) {\n\t\tbe = be.reduce(function (be, exhibitor) {\n\t\t\tbe[exhibitor] = true;\n\t\t\treturn be;\n\t\t}, {});\n\t}\n\n\tvar br = getBoundingRegions(appData);\n\tif (br && !noBoundingRegionCheck) {\n\t\tif (br.indexOf(getCountry2(countryCode)) === -1) {\n\t\t\treturn Promise.reject('BOUNDING_REGION');\n\t\t}\n\t}\n\n\tvar q = {\n\t\t'include[0]': 'theaters',\n\t\t'include[1]': 'exhibitors',\n\t\t'include[2]': 'movies',\n\t\t'include[3]': 'formats'\n\t};\n\n\taddTitleFilterToQuery(q, appData);\n\n\t// blockedExhibitors.forEach(x => addToQuery(q, 'filter[exhibitors][exclude][domain]', x));\n\t(0, _utils.addToQuery)(q, 'filter[exhibitors][exclude][domain]', Object.keys(be).filter(function (d) {\n\t\treturn d && be[d];\n\t}));\n\n\tvar removeRadiusRestriction = (0, _utils.accessNested)(state, 'activePage.data.useGlobalScreenings');\n\n\t// gets every screening in the world if useGlobalScreenings is enabld in thundr\n\tif (!removeRadiusRestriction) {\n\t\tq['filter[theaters][lat]'] = lat;\n\t\tq['filter[theaters][lon]'] = lon;\n\t\tvar radiusFactor = (0, _utils.accessNested)(state, 'activePage.data.radiusFactor', 1);\n\t\tif (radiusFactor !== 1) q['filter[theaters][rf]'] = radiusFactor;\n\t}\n\n\tif (br) {\n\t\t(0, _utils.addToQuery)(q, 'filter[theaters][country]', br.filter(function (r) {\n\t\t\treturn r.match(/^[a-z]{2}$/);\n\t\t}));\n\t}\n\n\tvar blockedProviders = (0, _utils.asList)((0, _utils.accessNested)(state, 'activePage.data.blockedProviders', {}));\n\t(0, _utils.addToQuery)(q, 'filter[providers][id_not]', blockedProviders);\n\n\treturn fetch(stdataApiRoot + '/screenings' + (0, _utils.toQueryString)(q), {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then(function (res) {\n\t\treturn res.json();\n\t});\n}\n\n// SET CONTAINING TO TRUE IF ids ARE SCREENINGS IDS AND YOU WANT ALL SCREENINGS FROM THE THEATERS CONTAINING THEM\n// (otherwise ids are theaters ids)\nfunction getTheatersScreeningsAsync(_ref2, ids, containing) {\n\tvar appData = _ref2.appData,\n\t    client = _ref2.client;\n\n\tvar stdataApiRoot = appData.apis.stdata.root;\n\n\tif ((0, _utils.accessNested)(appData, 'options.generateFakeTimes')) {\n\t\treturn Promise.resolve(generateFakeTimes(client));\n\t}\n\n\tvar q = {\n\t\t'include[0]': 'theaters',\n\t\t'include[1]': 'exhibitors',\n\t\t'include[2]': 'movies',\n\t\t'include[3]': 'formats'\n\t};\n\n\taddTitleFilterToQuery(q, appData);\n\n\tvar prop = containing ? 'theater_containing' : 'theater_id';\n\tids.forEach(function (id, idx) {\n\t\tq['filter[' + prop + '][' + idx + ']'] = id;\n\t});\n\n\treturn fetch(stdataApiRoot + '/screenings' + (0, _utils.toQueryString)(q), {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then(function (res) {\n\t\treturn res.json();\n\t});\n}\n\nfunction processScreeningsApi(_ref3, clientGeo, appData, activePage, theaterMasters, firstBatch) {\n\tvar _ref3$data = _ref3.data,\n\t    data = _ref3$data === undefined ? [] : _ref3$data,\n\t    _ref3$included = _ref3.included,\n\t    included = _ref3$included === undefined ? [] : _ref3$included;\n\n\tif (typeof _preprocessScreenings2['default'] === 'function') {\n\t\tvar ret = (0, _preprocessScreenings2['default'])(data, included, appData);\n\t\tif (ret && ret.data) data = ret.data;\n\t\tif (ret && ret.included) included = ret.included;\n\t}\n\n\tactivePage = activePage || (0, _utils.accessNested)(appData, 'pages.showtimes') || {};\n\n\t// filter out any data from providers that we should ignore\n\tvar cc = clientGeo.countryCode;\n\tvar ignore = (0, _utils.accessNested)(activePage, 'data.ignoreProviderRegions', {});\n\tdata = data.filter(function (s) {\n\t\treturn !ignore[s.attributes.provider_id] || !ignore[s.attributes.provider_id][cc];\n\t});\n\tincluded = included.filter(function (t) {\n\t\treturn !t.attributes.provider_id || !ignore[t.attributes.provider_id] || !ignore[t.attributes.provider_id][cc];\n\t});\n\n\t// const formats = included.filter(({ type }) => (type === 'formats')).map((f) => (new Format(f.id, f.attributes)));\n\tvar formatNames = (0, _utils.accessNested)(activePage, 'data.formatNames', {});\n\tvar formatsLookup = included.filter(function (_ref4) {\n\t\tvar type = _ref4.type;\n\t\treturn type === 'formats';\n\t}).reduce(function (prev, f) {\n\t\t// if (f.attributes.name === 'standard') return prev;\n\t\tvar name = f.attributes.name;\n\t\tvar newName = formatNames[name] || formatNames[name.toLowerCase().replace(/\\s/g, '')];\n\t\tif (newName) {\n\t\t\tf.attributes.name = newName;\n\t\t}\n\t\tprev[f.id] = new _Format2['default'](f.id, f.attributes);\n\t\treturn prev;\n\t}, {});\n\t// let movies = included.filter(({ type }) => (type === 'movies')).map((m) => (new Movie(m.id, m.attributes, formats.find((f) => (f.id === m.attributes.format_id)))));\n\tvar movieNames = (0, _utils.accessNested)(activePage, 'data.movieNames', {});\n\tvar moviesLookup = included.filter(function (_ref5) {\n\t\tvar type = _ref5.type;\n\t\treturn type === 'movies';\n\t}).reduce(function (prev, m) {\n\t\tvar format = formatsLookup[m.attributes.format_id];\n\t\tvar newName = movieNames[m.id] || movieNames[m.attributes.provider_id + ':' + m.attributes.provider_movie_id];\n\t\tif (newName) {\n\t\t\tm.attributes.title = newName;\n\t\t}\n\t\tprev[m.id] = new _Movie2['default'](m.id, m.attributes, format);\n\t\treturn prev;\n\t}, {});\n\n\tvar theaterMasterDocs = included.filter(function (_ref6) {\n\t\tvar type = _ref6.type;\n\t\treturn type === 'theater_masters';\n\t}).reduce(function (prev, t) {\n\t\tprev[t.id] = t.attributes.doc;\n\t\treturn prev;\n\t}, {});\n\n\tvar movies = Object.values(moviesLookup);\n\n\tvar atomIds = (0, _utils.accessNested)(activePage, 'data.atomIds', {});\n\tvar wwm2dMovie = movies.find(function (m) {\n\t\tvar isWebedia = m.provider_id === 'wwm' || m.provider_id === 'webus';\n\t\treturn isWebedia && m.format && m.format.name.toLowerCase() === '2d';\n\t});\n\tvar wwm2dMovieId = wwm2dMovie && wwm2dMovie.provider_movie_id.split('|')[0];\n\tvar mainAtom = atomIds.main || wwm2dMovieId || undefined;\n\tmovies.forEach(function (m) {\n\t\tif (m.atom) return;\n\t\tvar atomId = mainAtom;\n\t\tvar mid = m.provider_id + ':' + m.provider_movie_id;\n\t\tif (atomIds[mid]) {\n\t\t\tatomId = atomIds[mid];\n\t\t} else if (m.provider_id === 'wwm' && m.format && m.format.name.toLowerCase === '2d') {\n\t\t\tatomId = mainAtom;\n\t\t}\n\t\tm.atom = atomId;\n\t});\n\n\tvar screeningDates = (0, _utils.accessNested)(activePage, 'data.screeningDates', {});\n\tvar dFrom = (0, _utils.parseDate)(screeningDates.from);\n\tvar dTo = (0, _utils.parseDate)(screeningDates.to);\n\t// TODO: ability to put a list of dates instead of from / to\n\tvar checkScreening = function checkScreening(screening) {\n\t\t// if (!screening.movie) return false;\n\t\tif (screening.isPast) return false;\n\t\tif (dFrom && screening.stDate.date < dFrom) return false;\n\t\tif (dTo && screening.stDate.date > dTo) return false;\n\t\treturn true;\n\t};\n\tvar theaterScreenings = data.reduce(function (all, s) {\n\t\tvar movie = moviesLookup[s.attributes.movie_id];\n\t\tif (!movie) return all;\n\t\tvar screening = new _Screening2['default'](s.id, s.attributes, movie, appData);\n\t\tif (checkScreening(screening)) {\n\t\t\tif (!all[screening.theater_id]) all[screening.theater_id] = [];\n\t\t\tall[screening.theater_id].push(screening);\n\t\t}\n\t\treturn all;\n\t}, {});\n\n\tvar exhibitorsLookup = included.filter(function (_ref7) {\n\t\tvar type = _ref7.type;\n\t\treturn type === 'exhibitors';\n\t}).reduce(function (prev, e) {\n\t\tprev[e.id] = new _Exhibitor2['default'](e.id, e.attributes);\n\t\treturn prev;\n\t}, {});\n\n\tvar pinned = (0, _utils.asList)((0, _utils.accessNested)(activePage, 'data.pinnedTheaters'));\n\tvar theaters = included.filter(function (_ref8) {\n\t\tvar type = _ref8.type;\n\t\treturn type === 'theaters';\n\t}).map(function (t) {\n\t\treturn new _Theater2['default'](t.id, t.attributes, {\n\t\t\tscreenings: theaterScreenings[t.id] || [],\n\t\t\texhibitor: exhibitorsLookup[t.attributes.exhibitor_id],\n\t\t\tclientGeo: clientGeo, appData: appData, theaterMasters: theaterMasters,\n\t\t\ttheaterMasterDoc: t.attributes.theater_master_id && theaterMasterDocs[t.attributes.theater_master_id],\n\t\t\tfirstBatch: firstBatch,\n\t\t\tpinned: pinned.indexOf(t.id) !== -1,\n\t\t\tactivePage: activePage\n\t\t});\n\t}).filter(function (t) {\n\t\treturn t.enabled;\n\t});\n\n\tvar getUniques = function getUniques(arr, accessor) {\n\t\treturn arr.reduce(function (f, v) {\n\t\t\treturn v = accessor ? accessor(v) : v, f.indexOf(v) === -1 && f.push(v), f;\n\t\t}, []);\n\t};\n\tvar finalScreenings = [].concat.apply([], theaters.map(function (t) {\n\t\treturn t.screenings;\n\t}));\n\tvar finalMovies = getUniques(finalScreenings, function (s) {\n\t\treturn s.movie;\n\t}).filter(function (e) {\n\t\treturn e;\n\t});\n\tvar finalFormats = getUniques(finalMovies, function (m) {\n\t\treturn m.format;\n\t});\n\n\treturn {\n\t\tformats: finalFormats,\n\t\tmovies: finalMovies,\n\t\tscreenings: finalScreenings,\n\t\texhibitors: Object.values(exhibitorsLookup),\n\t\ttheaters: theaters\n\t};\n}\n\nfunction getCitiesAsync(_ref9) {\n\tvar appData = _ref9.appData,\n\t    client = _ref9.client,\n\t    overrideCountry = _ref9.overrideCountry,\n\t    activePage = _ref9.activePage;\n\n\tvar stdataApiRoot = appData.apis.stdata.root;\n\tvar citiesFilters = _store2['default'].get().showtimes.citiesFilters; // probably not safe, but we need to get the latest version of the filters\n\tvar targetCountry = overrideCountry || client.geo.countryCode;\n\n\tvar q = {};\n\n\tif (targetCountry !== 'intl') {\n\t\tvar countries = getBoundingRegions(appData);\n\t\tif (countries) {\n\t\t\tif (countries.indexOf(targetCountry) === -1) {\n\t\t\t\tcountries.push(targetCountry);\n\t\t\t}\n\t\t\tcountries = countries.filter(function (r) {\n\t\t\t\treturn r.match(/^[a-z]{2}$/);\n\t\t\t});\n\t\t\t(0, _utils.addToQuery)(q, 'filter[theaters][country]', countries);\n\t\t}\n\t}\n\n\tvar ignore = (0, _utils.accessNested)(activePage, 'data.ignoreProviderRegions', {});\n\t(0, _utils.addToQuery)(q, 'filter[ignoreProviderRegions]', Object.keys(ignore).map(function (provider) {\n\t\tvar list = ignore[provider] || {};\n\t\tvar countries = Object.keys(list).filter(function (k) {\n\t\t\treturn list[k];\n\t\t});\n\t\tif (countries.length) {\n\t\t\treturn { provider: provider, countries: countries };\n\t\t}\n\t}).filter(function (e) {\n\t\treturn e;\n\t}));\n\n\tif (citiesFilters && citiesFilters.pidmod) {\n\t\t// Get the cities specific to a pidmod instead of for all screenings\n\t\t(0, _utils.addToQuery)(q, 'filter[movies][pidmod]', [citiesFilters.pidmod]);\n\t} else {\n\t\taddTitleFilterToQuery(q, appData);\n\t}\n\n\tif (appData.options && appData.options.citiesUseMovieAggregate) {\n\t\t// Get the cities specific to a pidmod instead of for all screenings\n\t\t(0, _utils.addToQuery)(q, 'useMovieAggregate', 'true');\n\t}\n\n\tvar fetchPath = stdataApiRoot + '/cities' + (0, _utils.toQueryString)(q);\n\n\treturn fetch(fetchPath, {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then(function (res) {\n\t\treturn res.json();\n\t});\n}\n\nfunction addTitleFilterToQuery(q, appData) {\n\tvar store = _store2['default'].get();\n\tvar pageData = (0, _utils.accessNested)(store, 'activePage.data') || (0, _utils.accessNested)(appData || store.appData, 'pages.showtimes.data') || {};\n\tvar overrideMovieIds = (0, _utils.asList)(pageData.overrideMovieIds);\n\tvar extraMovieIds = (0, _utils.asList)(pageData.extraMovieIds);\n\tvar movieMasterIds = (0, _utils.asList)(appData.meta.movieMasterIds);\n\tvar titleSlugs = [appData.meta.title.slug].concat((0, _utils.asList)(pageData.extraTitleSlugs));\n\n\tif (overrideMovieIds && overrideMovieIds.length) {\n\t\t(0, _utils.addToQuery)(q, 'filter[movies][pidmod]', overrideMovieIds);\n\t} else {\n\t\tif (movieMasterIds.length) {\n\t\t\t(0, _utils.addToQuery)(q, 'filter[movies][mmid]', movieMasterIds);\n\t\t} else {\n\t\t\t(0, _utils.addToQuery)(q, 'filter[titles][slug]', titleSlugs);\n\t\t}\n\t\tif (extraMovieIds && extraMovieIds.length) {\n\t\t\t(0, _utils.addToQuery)(q, 'filter[movies][pidmod]', extraMovieIds);\n\t\t}\n\t}\n\n\treturn q;\n}\n\nfunction isInViewport(element) {\n\tvar offsets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\tvar rect = element.getBoundingClientRect();\n\tvar html = document.documentElement;\n\n\treturn rect.top >= (offsets.top || 0) && rect.left >= 0 && rect.bottom <= (window.innerHeight || html.clientHeight) && rect.right <= (window.innerWidth || html.clientWidth);\n}\n\n// Returns the path of a page\nfunction getPath(page, showtimesStatus) {\n\tvar store = null;\n\tvar getStore = function getStore() {\n\t\treturn store || (store = _store2['default'].get());\n\t};\n\tif (typeof page === 'string') {\n\t\tpage = (0, _utils.accessNested)(getStore(), ['appData', 'pages', page]);\n\t}\n\tif (!page) return undefined;\n\n\t// if (showtimesStatus === undefined) {\n\t// \tshowtimesStatus = accessNested(getStore(), 'showtimes.status');\n\t// }\n\t// return page['path' + (showtimesStatus ? 'After' : 'Before') + 'Showtimes'] || page.path;\n\treturn page.path;\n}\n\nfunction getPageTitle(activePage, appData) {\n\tappData = appData || _store2['default'].get().appData;\n\tvar copy = appData.copy;\n\n\t// Hm ... This doesn't very feel like a very clean thing to do (not localized, etc.)\n\t// const activePageName = activePage.id[0].toUpperCase() + activePage.id.slice(1);\n\tvar activePageName = copy[activePage.$copy] || '';\n\tvar release = (0, _utils.parseDate)((0, _utils.accessNested)(appData, 'meta.dates.release', 0));\n\tvar params = Object.assign({\n\t\tPAGE_NAME: activePageName,\n\t\tRELEASE_DATE: (0, _formatDateTime2['default'])(release, copy.$DATE_FORMAT || 'MMMM d, yyyy', copy.$DATETIME_LOCALE)\n\t}, copy);\n\n\tvar altTitle = '$' + (activePage.id || '').toUpperCase() + '_ALT_TITLE';\n\tvar pageTitle = copy[altTitle] || copy.$DYNAMIC_TITLE;\n\treturn getCopyWithParams(params, pageTitle);\n}\n\n/**\n * Return the current Piwik identifier from the cookies.\n *\n * @return {string} the current piwik id, if found\n */\nvar getPiwikId = function getPiwikId() {\n\tif (!document || !document.cookie) return;\n\tvar cookies = document.cookie.split('; ');\n\tvar _iteratorNormalCompletion = true;\n\tvar _didIteratorError = false;\n\tvar _iteratorError = undefined;\n\n\ttry {\n\t\tfor (var _iterator = cookies[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\tvar cookie = _step.value;\n\n\t\t\tvar _cookie$split = cookie.split('='),\n\t\t\t    _cookie$split2 = _slicedToArray(_cookie$split, 2),\n\t\t\t    key = _cookie$split2[0],\n\t\t\t    value = _cookie$split2[1];\n\n\t\t\tif (key.startsWith('_pk_id')) {\n\t\t\t\treturn value.substr(0, 16);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError = true;\n\t\t_iteratorError = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion && _iterator['return']) {\n\t\t\t\t_iterator['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError) {\n\t\t\t\tthrow _iteratorError;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// ↓ This should be in utils.js tbh\n\n// Gets a copy value, and replaces %$THING% by other copy data\n// Example:\n// copy = {\n// \t'$MSG': 'Hello %$NAME%',\n// \t'$NAME': '%$FIRST_NAME% %$SURNAME%',\n// \t'$FIRST_NAME': 'John',\n// \t'$SURNAME': 'Doe'\n// };\n// getCopyWithParams(copy, '$MSG'); // Hello John Doe\n// getCopyWithParams(copy, 'Bye %$NAME%'); // Bye John Doe (if attribute is not a copy element, it uses that value directly)\n// getCopyWithParams(copy, '%$FIRST_NAME% is %$MOOD%'); // John is $MOOD (if a variable is not defined, outputs its name)\n// getCopyWithParams(copy, '100% with %$SURNAME%'); // 100% with Doe (a % sign alone still works)\n// getCopyWithParams(copy, 'a \\\\%protected% part'); // a %protected% part (prepend with a \\ to prevent parsing ; warning : needs to be doubled in string literals because of default JS escaping)\nfunction _getCopyWithParams(copy, attribute, _n) {\n\t// Prevent infinite recursion (e.g. $A = %$B%, $B = %$A%)\n\tif (++_n > 10) return attribute;\n\t// let content = copy.hasOwnProperty(attribute) ? copy[attribute] : attribute;\n\tvar content = (0, _utils.accessNested)(copy, attribute, attribute) + ''; // Allow using %subObject.$VALUE%\n\treturn content.replace(/(\\\\)?%([^% ]+)%/g, function (m, s, g) {\n\t\treturn s ? '%' + g + '%' : getCopyWithParams(copy, g, _n);\n\t});\n}\nfunction getCopyWithParams(copy, attribute) {\n\treturn _getCopyWithParams(copy, attribute, 0);\n}\n\n// Returns a tt image name based on some conditional data (used in home)\nfunction getSizeBasedTT(data, client, baseName, alternateName) {\n\tbaseName = baseName || 'tt.png';\n\talternateName = alternateName || 'tt2.png';\n\tif (!data) {\n\t\treturn baseName;\n\t}\n\n\tclient = client || _store2['default'].get().client;\n\tif (typeof data === 'string') {\n\t\tdata = { 1: data };\n\t}\n\n\tvar values = Object.keys(data).map(function (k) {\n\t\tvar val = data[k];\n\t\tif (val && (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && !val.name) {\n\t\t\tval = Object.assign({ name: k + '.png' }, val);\n\t\t}\n\t\treturn val;\n\t}).filter(function (e) {\n\t\treturn e;\n\t});\n\n\tvar groups = [];\n\tif (values.every(function (val) {\n\t\treturn (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object';\n\t})) {\n\t\tgroups = values.sort(function (a, b) {\n\t\t\tif (a.order && b.order) return a.order - b.order;\n\t\t\tif (a.order) return -1;\n\t\t\tif (b.order) return 1;\n\t\t\treturn values.indexOf(a) - values.indexOf(b);\n\t\t});\n\t} else {\n\t\tgroups = [data];\n\t}\n\n\tvar dSize = client.deviceSize;\n\tvar device = client.device;\n\tvar orientation = client.orientation;\n\tvar result = groups.find(function (group) {\n\t\tvar name = group.name,\n\t\t    order = group.order,\n\t\t    conditions = _objectWithoutProperties(group, ['name', 'order']);\n\n\t\tconditions = (0, _utils.asList)(conditions);\n\t\treturn !conditions.length || conditions.some(function (cond) {\n\t\t\tif (!cond) return false;\n\t\t\tvar ok = true;\n\t\t\tif (cond[0] === \"!\") {\n\t\t\t\tok = false;\n\t\t\t\tcond = cond.slice(1);\n\t\t\t}\n\n\t\t\tvar _cond$split = cond.split(\":\"),\n\t\t\t    _cond$split2 = _slicedToArray(_cond$split, 2),\n\t\t\t    cDevice = _cond$split2[0],\n\t\t\t    cOrientation = _cond$split2[1];\n\n\t\t\tif (cDevice && cDevice !== \"*\") {\n\t\t\t\tvar invalid = false;\n\t\t\t\tif (cDevice.startsWith(\"device=\")) {\n\t\t\t\t\tinvalid = cDevice.slice(7) !== device;\n\t\t\t\t} else if (cDevice.startsWith(\"size=\")) {\n\t\t\t\t\tinvalid = cDevice.slice(5) !== dSize;\n\t\t\t\t} else {\n\t\t\t\t\tinvalid = cDevice !== dSize && cDevice !== device;\n\t\t\t\t}\n\t\t\t\tif (invalid) return !ok;\n\t\t\t}\n\t\t\tif (cOrientation && cOrientation !== \"*\" && cOrientation !== orientation) return !ok;\n\t\t\treturn ok;\n\t\t});\n\t});\n\n\treturn result ? result.name || alternateName : baseName;\n}\n\n// Should put that in the appData\nvar staticSigningService = 'https://static-maps.s-prod.pow.io';\n// const staticSigningService = 'https://static-maps.s-test.pow.io';\n// const staticSigningService = 'http://localhost:6661';\n\n// Request a signed static maps url and puts it in the store when done (also returns a Promise with the result)\nfunction requestSignedStaticMapUrl(url) {\n\tvar store = _store2['default'].get();\n\tvar urls = store.showtimes.staticMaps;\n\tif (urls[url]) {\n\t\treturn Promise.resolve(urls[url]);\n\t}\n\turls.set(url, { loading: true });\n\n\tvar data = {\n\t\turl: url,\n\t\tstudio: (0, _utils.accessNested)(store, 'appData.meta.studio.slug')\n\t};\n\n\t// Dummy version\n\t// return new Promise(resolve => setTimeout(() => resolve({ signed: url }), 5000)).then(result => {\n\treturn fetch(staticSigningService + '/sign', {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Accept': 'application/json',\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tbody: JSON.stringify(data)\n\t}).then(function (res) {\n\t\treturn res.json();\n\t}).then(function (result) {\n\t\tvar urls = _store2['default'].get().showtimes.staticMaps;\n\t\turls.set(url, result);\n\t\treturn result;\n\t})['catch'](function (err) {\n\t\tconsole.log('static signature error', err);\n\t\t_store2['default'].get().showtimes.staticMaps.set('error', true);\n\t\t// Store.emit(actions.LOAD_DYNAMIC_MAP);\n\t});\n}\n\nexports.getGeoFromIPAsync = getGeoFromIPAsync;\nexports.getGeoScreeningsAsync = getGeoScreeningsAsync;\nexports.rawSearchLocation = rawSearchLocation;\nexports.searchLocation = searchLocation;\nexports.getTheatersScreeningsAsync = getTheatersScreeningsAsync;\nexports.processScreeningsApi = processScreeningsApi;\nexports.getCitiesAsync = getCitiesAsync;\nexports.buildClientStoreData = buildClientStoreData;\nexports.getSize = getSize;\nexports.getDims = getDims;\nexports.getDevice = getDevice;\nexports.updateQueryStringItem = updateQueryStringItem;\nexports.calculateShowtimesStatus = calculateShowtimesStatus;\nexports.getAC_ID = getAC_ID;\nexports.isInViewport = isInViewport;\nexports.getQueryParameterByName = getQueryParameterByName;\nexports.findParent = findParent;\nexports.getPath = getPath;\nexports.getPageTitle = getPageTitle;\nexports.getPiwikId = getPiwikId;\nexports.getCopyWithParams = getCopyWithParams;\nexports.getSizeBasedTT = getSizeBasedTT;\nexports.getIsIOS = getIsIOS;\nexports.requestSignedStaticMapUrl = requestSignedStaticMapUrl;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14)))\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar stringify = __webpack_require__(79);\nvar parse = __webpack_require__(78);\nvar formats = __webpack_require__(26);\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.track = track;\nexports.gaCustom = gaCustom;\nexports.trackLinkOut = trackLinkOut;\nexports.initTracker = initTracker;\nexports.updateDataLayer = updateDataLayer;\nexports.updateDataLayerScreening = updateDataLayerScreening;\nexports.updateDataLayerPageView = updateDataLayerPageView;\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _utils = __webpack_require__(2);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar gaEnabled = false;\nvar piwik = void 0;\nvar powT = void 0;\nvar gaCategory = '';\nvar gaPrefixList = [];\nvar tracked = {};\n\nvar isInit = false;\nvar isGAInit = false;\nvar queue = [];\nvar gaQueue = [];\n\n/**\n * Call this function to track an action\n * @param  {Object} data\n */\nfunction track(data) {\n\tif (typeof window === \"undefined\") {\n\t\tconsole.trace(\"TRACKING SERVER-SIDE\");\n\t\treturn;\n\t}\n\n\t// Edit is enabled, so stop tracking\n\tif (__INITIAL_STATE__.editable) {\n\t\treturn;\n\t}\n\n\tif (typeof data === \"string\") data = { a: data };\n\tvar _data = data,\n\t    a = _data.a,\n\t    l = _data.l,\n\t    ni = _data.ni,\n\t    once = _data.once,\n\t    v = _data.v,\n\t    useCustomPageTrack = _data.useCustomPageTrack;\n\n\t// (temporarily <- :/) separate static from standard\n\n\ta = \"static-\" + a;\n\n\tvar suffix = '';\n\tif (useCustomPageTrack) {\n\t\tvar activePage = _store2['default'].get().activePage;\n\t\tif (activePage && activePage.trackingSuffix && activePage.id !== 'showtimes') {\n\t\t\t// true: use the page id as the suffix (e.g. event-name-pageid)\n\t\t\t// string: use this value as the suffix\n\t\t\tsuffix = activePage.trackingSuffix === true ? activePage.id : activePage.trackingSuffix;\n\t\t}\n\t}\n\tif (suffix) {\n\t\ta += '-' + suffix;\n\t}\n\n\tvar currentTime = new Date().getTime();\n\t// check if time difference is less than 100ms or if it should only be called once\n\tif (tracked[a] && (currentTime - tracked[a] < 100 || once)) return;\n\t// store time of last tracking\n\ttracked[a] = currentTime;\n\n\t// Tracking debuging\n\t// console.trace();\n\tconsole.debug('%cTRACK: %c' + a + ' ' + (typeof l !== 'undefined' ? '[label:' + l + ']' : ''), 'color:blue; font-weight: bold;', 'font-style: italic;');\n\n\t// Send out event to store for pixels\n\ttry {\n\t\t_store2['default'].emit(\"TRACK_\" + a.replace(/^static-/, \"\").replace(/[- ]/g, \"_\").toUpperCase(), data);\n\t} catch (e) {\n\t\tconsole.log('Error during track event', e);\n\t}\n\n\t// powT.trackEvent('cat', a, l);\n\tif (isInit && data.isBeacon) {\n\t\tbeacon(a, l);\n\t\treturn;\n\t}\n\tif (isInit) {\n\t\t// powT.trackEvent(__INITIAL_STATE__.appData.meta.title.slug, a, l);\n\t\tpowTracker.trackEvent(a, l);\n\t} else {\n\t\tqueue.push([a, l]);\n\t}\n\n\t// -- GOOGLE ANALYTICS\n\tif (a.slice(0, 7) === \"static-\") {\n\t\t// Test before slicing in case we remove \"static-\" in the future\n\t\ta = a.slice(7);\n\t}\n\tvar region = __INITIAL_STATE__.appData.meta.region.slug;\n\tvar tData = {\n\t\thitType: \"event\",\n\t\teventCategory: gaCategory,\n\t\teventAction: \"website/core/\" + region + \"/\" + a\n\t};\n\tif (l) tData.eventLabel = l.toString();\n\tif (v) tData.eventValue = parseInt(v);\n\tif (ni) tData.nonInteraction = 1;\n\tgaCustom(\"send\", tData);\n}\n\nfunction gaCustom(eventName) {\n\tif (gaEnabled) {\n\t\tvar args = [].slice.call(arguments, 1);\n\t\tgaPrefixList.forEach(function (name) {\n\t\t\treturn ga.apply(ga, [name + eventName].concat(args));\n\t\t});\n\t} else {\n\t\t// if(!window.gaQueue) window.gaQueue = [];\n\t\t// window.gaQueue.push(arguments);\n\t\tgaQueue.push(arguments);\n\t}\n}\n\nfunction beacon(a, n) {\n\tif (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n\t\tvar preq = \"?e_a=\" + encodeURIComponent(a);\n\t\tif (n !== undefined) {\n\t\t\tpreq += \"&e_n=\" + encodeURIComponent(n);\n\t\t}\n\t\t// let data = powT.getRequest(preq);\n\t\t// let baseUrl = powT.getTrackerUrl();\n\t\tvar data = powTracker.getRequest(preq);\n\t\tvar baseUrl = powTracker.getTrackerUrl() || '//:0';\n\t\tif (baseUrl.startsWith(\"//:0\")) return;\n\t\ttry {\n\t\t\tnavigator.sendBeacon(baseUrl + data);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"failed to send beacon\", baseUrl + data);\n\t\t}\n\t}\n}\n\n/**\n * Tracking function for going to an external link\n * @param  {String} href\n * @param  {String} trackId\n * @param  {String} label\n */\nfunction trackLinkOut(href, trackId, label) {\n\tlabel = label instanceof Event ? undefined : label;\n\t_store2['default'].emit(actions.EXTERNAL_LINK_CLICKED, { href: href, trackId: trackId, label: label });\n\ttrack({ a: trackId || \"clicked-link-out\", l: label });\n}\n\nfunction setupGA(id, name, anonymize, ref, activePage, campaign) {\n\tif (!id) return;\n\tvar namePrefix = name ? name + \".\" : \"\";\n\tvar optsObj = { cookieExpires: 31536000 };\n\tif (name) optsObj.name = name;\n\tga(\"create\", id, optsObj);\n\tif (anonymize) ga(namePrefix + \"set\", \"anonymizeIp\", true);\n\tif (ref) ga(namePrefix + \"set\", \"referrer\", decodeURIComponent(ref));\n\tif (campaign) ga(namePrefix + \"set\", \"campaignName\", campaign);\n\tif (activePage) {\n\t\tga(namePrefix + \"set\", \"page\", activePage.path + location.search);\n\t}\n\tga(namePrefix + \"send\", \"pageview\");\n\n\tgaPrefixList.push(namePrefix);\n}\n\n/**\n * Init piwik tracking\n * @param  {Object} appData - appData coming from thundr\n */\nfunction initTracker(appData, options) {\n\tvar isToolkitIframe = location.search.match(/[?&]toolkit=true(&|$)/);\n\tvar disabled = !appData || appData.options && appData.options.disableTracking || isToolkitIframe;\n\tif (disabled || isInit || window.__IS_DEMO__ || window.__IS_LOCAL__) {\n\t\treturn;\n\t}\n\tif (typeof powTracker === 'undefined') {\n\t\tvar trackingScript = document.querySelector('script[src*=\"tracking.powster.com\"]');\n\t\tif (trackingScript) {\n\t\t\ttrackingScript.onload = initTracker.bind(this, appData, options);\n\t\t} else {\n\t\t\tvar script = document.createElement('script');\n\t\t\tscript.src = 'https://tracking.powster.com/js/tracker.js';\n\t\t\tscript.onload = initTracker.bind(this, appData, options);\n\t\t\tdocument.body.appendChild(script);\n\t\t}\n\t\treturn;\n\t}\n\tisInit = true;\n\n\tvar studio = appData.meta.studio.slug;\n\tvar title = appData.meta.title.slug;\n\tvar region = appData.meta.region.slug;\n\tvar viewMode = (0, _clientUtils.getSize)((0, _clientUtils.getDims)());\n\tvar pageType = \"website\";\n\tvar ref = window.customReferrer || document.referrer;\n\n\t// powT = piwik.getTracker(appData.apis.tracking.insights.root + \"/t\", 1);\n\n\tpowTracker.initTracker(appData.apis.tracking.insights.root + \"/t\", __INITIAL_STATE__.appData.meta.title.slug, options);\n\t//\n\t// Make sure the campaign url parameter is always lowercase\n\tvar search = location.search;\n\tvar campaign = search.match(/(?:\\?|&)(campaign)=([^&]+)/i);\n\tvar campaignValue = decodeURIComponent(campaign && campaign[2] || \"\");\n\tif (campaign && campaign[1] !== \"campaign\") {\n\t\tvar newSearch = search.replace(/(\\?|&)campaign=/i, \"$1campaign=\");\n\t\tvar newUrl = location.protocol + \"//\" + location.host + location.pathname + newSearch + location.hash;\n\t\t// console.log('fixing campaign', newUrl);\n\t\t// powT.setCustomUrl(newUrl);\n\t\tpowTracker.setCustomUrl(newUrl);\n\t}\n\tif (window.__IS_FACEBOOK__) {\n\t\t// powT.setCustomUrl(appData.meta.url + \"?campaign=fbtab\");\n\t\tpowTracker.setCustomUrl(appData.meta.url + \"?campaign=fbtab\");\n\t\tcampaignValue = \"fbtab\";\n\t}\n\n\tif (ref) {\n\t\t// powT.setReferrerUrl(decodeURIComponent(ref));\n\t\tpowTracker.setReferrerUrl(decodeURIComponent(ref));\n\t}\n\t// powT.setCampaignNameKey(\"campaign\");\n\t// powT.setCustomVariable(1, \"studio\", studio, \"visit\");\n\t// powT.setCustomVariable(2, \"movie\", title, \"visit\");\n\t// powT.setCustomVariable(3, \"region\", region, \"visit\");\n\t// powT.setCustomVariable(4, \"page_type\", pageType, \"visit\");\n\t// powT.setCustomVariable(5, \"view_mode\", viewMode, \"visit\");\n\t// powT.trackPageView();\n\n\t// Powster Tracking\n\tpowTracker.setCustomVariable(1, \"studio\", studio);\n\tpowTracker.setCustomVariable(2, \"movie\", title);\n\tpowTracker.setCustomVariable(3, \"region\", region);\n\tpowTracker.setCustomVariable(4, \"page_type\", pageType);\n\tpowTracker.setCustomVariable(5, \"view_mode\", viewMode);\n\t// Initial Page view event\n\tpowTracker.trackEvent(\"visit\");\n\n\t// powT.trackPageView();\n\tqueue.forEach(function (ev) {\n\t\t// powT.trackEvent(__INITIAL_STATE__.appData.meta.title.slug, ev[0], ev[1])\n\t\tpowTracker.trackEvent(ev[0], ev[1]);\n\t});\n\n\t// Google analytics ?\n\tif (!appData.options.coppa && appData.options.useGoogleAnalytics && appData.apis.tracking.googleAnalytics) {\n\t\tvar gad = appData.apis.tracking.googleAnalytics;\n\t\tvar actuallyLoadGA = function actuallyLoadGA() {\n\t\t\tif (gaEnabled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgaEnabled = true;\n\t\t\t(function (p, o, w, s, t, e, r) {\n\t\t\t\tp[\"GoogleAnalyticsObject\"] = t;\n\t\t\t\tp[t] = p[t] || function () {\n\t\t\t\t\t(p[t].q = p[t].q || []).push(arguments);\n\t\t\t\t}, p[t].l = 1 * new Date();\n\t\t\t\te = o.createElement(w), r = o.getElementsByTagName(w)[0];\n\t\t\t\te.async = 1;e.src = s;\n\t\t\t\tr.parentNode.insertBefore(e, r);\n\t\t\t})(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n\n\t\t\t// TODO: this as a param ?\n\t\t\tvar activePage = _store2['default'].get().activePage;\n\t\t\tvar anonymize = true;\n\n\t\t\t// setupGA(gad.global);\n\t\t\t// setupGA(gad.showtimes, 'showtimes');\n\t\t\t// setupGA(gad.local, 'local');\n\t\t\tObject.keys(gad).forEach(function (name) {\n\t\t\t\tvar id = gad[name];\n\t\t\t\tif (typeof id === \"string\" && id.slice(0, 3) === \"UA-\") {\n\t\t\t\t\tsetupGA(id, name === \"global\" ? null : name, anonymize, ref, activePage, campaignValue);\n\t\t\t\t}\n\t\t\t});\n\t\t\tgaCategory = gad.category;\n\t\t\tgaQueue.forEach(function (gaEv) {\n\t\t\t\tgaCustom.apply(window, gaEv);\n\t\t\t});\n\t\t};\n\n\t\tif (gad.oneTrustCategory) {\n\t\t\tif (window.powsterOneTrust && window.powsterOneTrust.indexOf(gad.oneTrustCategory) !== -1) {\n\t\t\t\tactuallyLoadGA();\n\t\t\t}\n\t\t\twindow.addEventListener('powster.onetrust.' + gad.oneTrustCategory, actuallyLoadGA);\n\t\t} else {\n\t\t\tactuallyLoadGA();\n\t\t}\n\t}\n\n\ttrack({ a: \"page_is\", ni: 1 });\n}\n\nfunction updateDataLayer(obj) {\n\t// Nothing to do here if there is no dataLayer\n\tif (!window.dataLayer || typeof dataLayer.push !== \"function\" || !window.googleTagManagerActive) {\n\t\treturn;\n\t}\n\n\tdataLayer.push(obj);\n}\n\n/**\n * Update the data layer with info about the current screening\n * @param  {Object} screening\n * @param  {Object} theater\n * @param  {string} event\n * @param  {string} href\n * @param  {string} provider\n */\nfunction updateDataLayerScreening(screening, theater, event, href, cta, provider) {\n\tif (!screening) return;\n\tvar obj = {};\n\tif (event) {\n\t\tobj.event = event;\n\t}\n\tif (href) {\n\t\tobj.href = href;\n\t}\n\tif (screening.movie && screening.movie.title) {\n\t\tobj.filmTitle = screening.movie.title;\n\t}\n\tif (theater) {\n\t\tif ((0, _utils.isObject)(theater.location)) {\n\t\t\tif (typeof theater.location.toJS === 'function') {\n\t\t\t\tobj.location = theater.location.toJS();\n\t\t\t} else {\n\t\t\t\tobj.location = theater.location;\n\t\t\t}\n\t\t}\n\t\tobj.theater = theater.name;\n\t\tif (theater.exhibitor) {\n\t\t\tobj.exhibitor = theater.exhibitor.domain;\n\t\t}\n\t}\n\tif (screening.stDate) {\n\t\tobj.day = screening.stDate.ddmmyyyy;\n\t}\n\tif (screening.time24) {\n\t\tobj.time = screening.time24;\n\t}\n\n\tobj.cta = cta || undefined;\n\t// NOTE: ^ Clients want undefined when cta not present\n\n\tif (provider) {\n\t\tobj.provider = provider;\n\t}\n\n\tupdateDataLayer(obj);\n}\n\n/**\n * Update the data layer when the page changes\n * @param  {String} pageId\n * @param  {Boolean} firstLoad\n */\nfunction updateDataLayerPageView(pageId, firstLoad) {\n\t// Let's send a different event depending if it's the initial load\n\t// or just a page change\n\tupdateDataLayer({\n\t\tevent: firstLoad ? \"page_load\" : \"page_change\",\n\t\tpage: pageId\n\t});\n}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.Link = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.getRelativeRoot = getRelativeRoot;\nexports.getRelativePageUrl = getRelativePageUrl;\nexports.getAbsolutePageUrl = getAbsolutePageUrl;\nexports.goToPage = goToPage;\n\nvar _preact = __webpack_require__(0);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _utils = __webpack_require__(2);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _tracking = __webpack_require__(6);\n\nvar _route = __webpack_require__(17);\n\nvar _route2 = _interopRequireDefault(_route);\n\nvar _svgIcons = __webpack_require__(43);\n\nvar svg = _interopRequireWildcard(_svgIcons);\n\nvar _link = __webpack_require__(67);\n\nvar _link2 = _interopRequireDefault(_link);\n\nvar _exitModal = __webpack_require__(41);\n\nvar _exitModal2 = _interopRequireDefault(_exitModal);\n\nvar _staticData = __webpack_require__(63);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar isServer = typeof window === 'undefined';\n\n// Static data from the store\nvar staticData = void 0;\n\n/**\n * Link component to navigate through the site\n * @prop  {String} trackId - tracking id that gets called when clicked\n * @prop  {String} pageId - the id for the page it needs to navigate to\n * @prop  {String} href - href for component\n * @prop  {Object} activePage - whats the current active page, not required!\n * @prop  {String} iconStyle - styling that gets applied to icon\n * @prop  {String} iconClass - class that gets applied to icon\n * @prop  {String} linkClass - class that gets added to link\n * @prop  {Boolean} noMergeQS - should the query parameters not be merged\n * @prop  {Boolean} download - true to force download rather than link out\n * @return {Object}  link dom element\n */\nvar Link = function Link(fullProps) {\n\tvar trackId = fullProps.trackId,\n\t    trackLabel = fullProps.trackLabel,\n\t    children = fullProps.children,\n\t    pageId = fullProps.pageId,\n\t    href = fullProps.href,\n\t    activePage = fullProps.activePage,\n\t    pages = fullProps.pages,\n\t    iconStyle = fullProps.iconStyle,\n\t    iconClass = fullProps.iconClass,\n\t    linkClass = fullProps.linkClass,\n\t    noMergeQS = fullProps.noMergeQS,\n\t    appData = fullProps.appData,\n\t    queryString = fullProps.queryString,\n\t    childId = fullProps.childId,\n\t    removeSourceQS = fullProps.removeSourceQS,\n\t    extraOnClick = fullProps.extraOnClick,\n\t    renderCustomChild = fullProps.renderCustomChild,\n\t    exitModal = fullProps.exitModal,\n\t    ignoreExitModal = fullProps.ignoreExitModal,\n\t    childHTML = fullProps.childHTML,\n\t    _fullProps$HTMLTag = fullProps.HTMLTag,\n\t    HTMLTag = _fullProps$HTMLTag === undefined ? \"a\" : _fullProps$HTMLTag,\n\t    scrollSection = fullProps.scrollSection,\n\t    props = _objectWithoutProperties(fullProps, ['trackId', 'trackLabel', 'children', 'pageId', 'href', 'activePage', 'pages', 'iconStyle', 'iconClass', 'linkClass', 'noMergeQS', 'appData', 'queryString', 'childId', 'removeSourceQS', 'extraOnClick', 'renderCustomChild', 'exitModal', 'ignoreExitModal', 'childHTML', 'HTMLTag', 'scrollSection']);\n\n\tif (!staticData) {\n\t\t// Get the static data if it hasn't been loaded in yet\n\t\t// So we can use it in the click events etc...\n\t\tstaticData = (0, _staticData.getStaticData)();\n\t}\n\n\tif (pageId) {\n\t\t// page id is provided, so its an \"internal\" link\n\t\tvar store = void 0,\n\t\t    getStore = function getStore() {\n\t\t\treturn store || (store = _store2['default'].get());\n\t\t};\n\t\tif (!activePage) {\n\t\t\t// No activePage provided\n\t\t\tactivePage = getStore().activePage;\n\t\t}\n\n\t\tif (!href) {\n\t\t\tvar pagePath = (0, _clientUtils.getPath)(pageId);\n\t\t\tif (pagePath) {\n\t\t\t\t// See if the page provided actually exists\n\t\t\t\thref = getRelativeRoot((0, _clientUtils.getPath)(activePage)) + pagePath.slice(1);\n\t\t\t} else {\n\t\t\t\t// No luck in finding it\n\t\t\t\thref = '.';\n\t\t\t}\n\t\t\tif (scrollSection) {\n\t\t\t\thref += '#' + scrollSection;\n\t\t\t}\n\t\t} else if (href[0] === '/') {\n\t\t\t// Already provided with an href\n\t\t\thref = getRelativeRoot((0, _clientUtils.getPath)(activePage)) + href.substring(1);\n\t\t}\n\t}\n\n\tif (queryString || pageId) {\n\t\t// Keep the current page query string if internal link and not specified otherwise\n\t\tvar newQS = isServer || !pageId || noMergeQS ? {} : _qs2['default'].parse(location.search.substr(1));\n\t\tif (!removeSourceQS) {\n\t\t\tvar baseQS = href.match(/\\?([^#]*)(#|$)/);\n\t\t\tnewQS = Object.assign(newQS, _qs2['default'].parse(baseQS && baseQS[1] || ''));\n\t\t}\n\t\tvar removeV = true;\n\t\tif (queryString) {\n\t\t\tvar queryStringObj = typeof queryString === 'string' ? _qs2['default'].parse(queryString) : queryString;\n\t\t\tif (queryStringObj.v) {\n\t\t\t\tremoveV = false;\n\t\t\t}\n\t\t\tnewQS = Object.assign(newQS, queryStringObj);\n\t\t}\n\t\t// removes youtube ID from URL when navigating away from the specific video page\n\t\tif (removeV && newQS.hasOwnProperty(\"v\")) {\n\t\t\tdelete newQS.v;\n\t\t}\n\t\tvar newQSString = (0, _utils.toQueryString)(newQS);\n\t\thref = href.replace(/(\\?([^#]*))?(#|$)/, newQSString + '$3');\n\t}\n\n\tvar onClick = void 0;\n\t// Only redirect through page if it doesn't have a target blank\n\tif (pageId && fullProps.target !== '_blank') {\n\t\tonClick = generateOnClick(handlePageLinkClick.bind(undefined, pageId, !noMergeQS, trackId, trackLabel), extraOnClick);\n\t} else {\n\t\tonClick = generateOnClick(_tracking.trackLinkOut.bind(undefined, href, trackId, trackLabel), extraOnClick, clickOut.bind(undefined, href, exitModal, !!ignoreExitModal));\n\t}\n\n\tvar IconComponent = svg[iconClass];\n\tvar anchorLink = iconClass || iconStyle ? _link2['default'].iconLink : _link2['default'].link;\n\n\tif (props['class']) {\n\t\tlinkClass = props['class'];\n\t\tdelete props['class'];\n\t}\n\n\tvar inside = children;\n\tif (!renderCustomChild) {\n\t\tinside = [];\n\t\tif (iconStyle) {\n\t\t\tinside.push((0, _preact.h)('div', { style: iconStyle, 'class': _link2['default'].iconLinkUrl }));\n\t\t}\n\t\tif (IconComponent) {\n\t\t\tinside.push((0, _preact.h)(IconComponent, { 'class': _link2['default'].iconLinkSvg }));\n\t\t}\n\t\tvar extraSpanProps = {};\n\t\tif (childHTML) {\n\t\t\textraSpanProps.dangerouslySetInnerHTML = { __html: childHTML };\n\t\t}\n\t\tinside.push((0, _preact.h)(\n\t\t\t'span',\n\t\t\t_extends({ 'class': anchorLink, id: childId }, extraSpanProps),\n\t\t\tchildren\n\t\t));\n\t}\n\n\treturn (0, _preact.h)(\n\t\tHTMLTag,\n\t\t_extends({\n\t\t\t'class': _link2['default'].top + (0, _utils.condClass)(linkClass),\n\t\t\thref: href,\n\t\t\tonClick: onClick\n\t\t}, props),\n\t\tinside\n\t);\n};\n\nexports.Link = Link;\nfunction generateOnClick() {\n\n\tvar fList = Array.prototype.concat.apply([], arguments);\n\tfList = fList.filter(function (f) {\n\t\treturn typeof f === 'function';\n\t});\n\tif (!fList.length) return;\n\t// Do not put an arrow function here so that we can use this and arguments\n\treturn function () {\n\t\tvar _this = this,\n\t\t    _arguments = arguments;\n\n\t\tfList.forEach(function (f) {\n\t\t\t// try-catch to prevent pixel errors breaking everything\n\t\t\ttry {\n\t\t\t\tf.apply(_this, _arguments);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n}\n\nfunction clickOut(href, useExitModal, ignoreExitModal, ev) {\n\tif ((useExitModal || staticData.options.exitModal) && !ignoreExitModal) {\n\t\t// Display the exit modal before allowing the user to leave the site\n\t\tev.preventDefault();\n\t\t// NOTE: This may be annoying if you're looking at a screening far down the list and it brings you back up\n\t\t// We should find other ways to solve the issues caused by not having that\n\t\twindow.scrollTo(0, 0);\n\t\t_store2['default'].emit(actions.SHOW_MODAL, (0, _preact.h)(_exitModal2['default'], { href: href, vanity: staticData.meta.url }), null, { type: 'themed' });\n\t}\n}\n\nfunction getRelativeRoot(path) {\n\treturn (path.substring(1).match(/\\//g) || []).map(function () {\n\t\treturn '../';\n\t}).join('');\n}\n\n// Get the relative url for a page.\n// page can be a string (page id) or a page appData object\nfunction getRelativePageUrl(page) {\n\tif (!page) return '.';\n\n\tvar href = '.';\n\tvar pagePath = (0, _clientUtils.getPath)(page);\n\tif (pagePath) {\n\t\tvar activePage = _store2['default'].get().activePage;\n\t\thref = getRelativeRoot((0, _clientUtils.getPath)(activePage)) + pagePath.slice(1);\n\t}\n\n\treturn href;\n}\n\nfunction getAbsolutePageUrl(page) {\n\tvar relative = getRelativePageUrl(page);\n\tvar a = document.createElement('a');\n\ta.href = relative;\n\treturn a.href;\n}\n\nfunction goToPage(pageId, queryString, noMergeQS, hash) {\n\tif (!pageId) return;\n\tvar page = (0, _utils.accessNested)(_store2['default'].get(), ['appData', 'pages', pageId]);\n\tif (!page) {\n\t\treturn;\n\t}\n\tvar href = getRelativePageUrl(page);\n\n\t// Keep the current page query string if internal link and not specified otherwise\n\tvar newQS = isServer || noMergeQS ? {} : _qs2['default'].parse(location.search.substr(1));\n\tif (queryString) {\n\t\tnewQS = Object.assign(newQS, typeof queryString === 'string' ? _qs2['default'].parse(queryString) : queryString);\n\t}\n\tvar newQSString = (0, _utils.toQueryString)(newQS);\n\thref = href + newQSString;\n\tif (hash && typeof hash === 'string') {\n\t\thref += (hash[0] === '#' ? '' : '#') + hash;\n\t}\n\n\t_store2['default'].emit(actions.SET_ACTIVE_PAGE, page);\n\t(0, _route2['default'])(href, pageId);\n}\nif (typeof window !== 'undefined') {\n\twindow.goToPage = goToPage;\n}\n\nfunction handlePageLinkClick(pageId, mergeQS, trackId, trackLabel, event) {\n\tif (event.stopImmediatePropagation) event.stopImmediatePropagation();\n\tevent.stopPropagation();\n\tevent.preventDefault();\n\n\tif (typeof window.beforePageChange === 'function') {\n\t\tvar confirmation = window.beforePageChange();\n\t\tif (confirmation && typeof confirmation === 'string' && !confirm(confirmation)) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar page = (0, _utils.accessNested)(_store2['default'].get(), ['appData', 'pages', pageId]);\n\tif (page) {\n\t\t_store2['default'].emit(actions.SET_ACTIVE_PAGE, page);\n\t}\n\tvar href = event.currentTarget.getAttribute('href');\n\t(0, _route2['default'])(href, pageId);\n\n\ttrackId = trackId || 'clicked-' + pageId;\n\tvar trackData = { a: trackId };\n\tif (trackLabel) trackData.l = trackLabel;\n\t(0, _tracking.track)(trackData);\n\n\t_store2['default'].emit(actions.LINK_CLICKED, { trackId: trackId, pageId: pageId, link: href });\n\treturn false;\n}\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Geo = function () {\n\t_createClass(Geo, [{\n\t\tkey: 'setGoogleLatLng',\n\t\tvalue: function setGoogleLatLng() {\n\t\t\tif (typeof window !== 'undefined' && window.google && window.google.maps) {\n\t\t\t\tthis.googleLatLng = new window.google.maps.LatLng(this.lat, this.lon);\n\t\t\t}\n\n\t\t\treturn this.googleLatLng;\n\t\t}\n\t}, {\n\t\tkey: 'toGoogleLatLng',\n\t\tvalue: function toGoogleLatLng() {\n\t\t\treturn this.googleLatLng || this.setGoogleLatLng();\n\t\t}\n\t}]);\n\n\tfunction Geo(_ref) {\n\t\tvar lat = _ref.lat,\n\t\t    lon = _ref.lon,\n\t\t    countryCode = _ref.countryCode,\n\t\t    city = _ref.city,\n\t\t    src = _ref.src;\n\n\t\t_classCallCheck(this, Geo);\n\n\t\tthis.lat = lat;\n\t\tthis.lon = lon;\n\t\tthis.city = city;\n\t\tthis.countryCode = countryCode;\n\t\tthis.src = src;\n\n\t\tthis.setGoogleLatLng();\n\t}\n\n\t_createClass(Geo, [{\n\t\tkey: 'update',\n\t\tvalue: function update(_ref2) {\n\t\t\tvar lat = _ref2.lat,\n\t\t\t    lon = _ref2.lon;\n\n\t\t\tthis.lat = lat;\n\t\t\tthis.lon = lon;\n\n\t\t\tthis.setGoogleLatLng();\n\t\t}\n\t}, {\n\t\tkey: 'toString',\n\t\tvalue: function toString() {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlat: this.lat,\n\t\t\t\tlon: this.lon,\n\t\t\t\tcity: this.city,\n\t\t\t\tcountryCode: this.countryCode\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'equals',\n\t\tvalue: function equals(otherGeo) {\n\t\t\tif (!(otherGeo instanceof Geo)) return undefined;\n\t\t\treturn otherGeo.lat === this.lat && otherGeo.lon === this.lon;\n\t\t}\n\t}, {\n\t\tkey: 'quickDistIndicator',\n\t\tvalue: function quickDistIndicator(otherGeo) {\n\t\t\tvar dl = otherGeo.lat - this.lat;\n\t\t\tvar dL = otherGeo.lon - this.lon;\n\n\t\t\treturn dl * dl + dL * dL;\n\t\t}\n\t}, {\n\t\tkey: 'distanceFrom',\n\t\tvalue: function distanceFrom(otherGeo, unit, precision) {\n\t\t\tif (!(otherGeo instanceof Geo)) return undefined;\n\n\t\t\tvar R = 6371; // km\n\t\t\tif (unit === 'mi') R *= 0.621371192;\n\t\t\tvar deg2rad = Math.PI / 180;\n\t\t\tvar φ1 = otherGeo.lat * deg2rad;\n\t\t\tvar φ2 = this.lat * deg2rad;\n\t\t\t// let Δφ = (this.lat - otherGeo.lat) * deg2rad;\n\t\t\tvar Δφ = φ2 - φ1;\n\t\t\tvar Δλ = (this.lon - otherGeo.lon) * deg2rad;\n\n\t\t\tvar sinφ = Math.sin(Δφ / 2),\n\t\t\t    sinλ = Math.sin(Δλ / 2);\n\t\t\tvar a = sinφ * sinφ + Math.cos(φ1) * Math.cos(φ2) * sinλ * sinλ;\n\t\t\tvar c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n\t\t\tvar value = R * c;\n\n\t\t\tif (precision != undefined) {\n\t\t\t\tvar roundTo = Math.pow(10, ~~precision);\n\t\t\t\tvalue = Math.round(value * roundTo) / roundTo;\n\t\t\t\t// .toFixed ?\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\t}]);\n\n\treturn Geo;\n}();\n\nexports['default'] = Geo;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.generateCardNumPlaceholder = exports.getPrintYourTicketUrl = exports.getIframeCommunicatorUrl = exports.hasUniqueSeatLabels = exports.getSeatLayoutBoundingBox = exports.getPickedSeats = exports.getSeats = exports.isSofa = exports.findWheelchairInGroup = exports.getSeatAtPosition = exports.createSeatLookup = exports.isSeatForDisablePeople = exports.isCompanionSeat = exports.isWheelchair = exports.areSeatsEqual = exports.areSeatPositionsEqual = exports.getTicketsText = exports.getAreaCategories = exports.getFallbackUrl = exports.isDirectTicketingEnabled = exports.isPowErrorObject = exports.isMxErrorObject = exports.getPowErrorKey = exports.getMxErrorKey = exports.powErrors = exports.mxErrors = exports.seatStatus = exports.defaultGateway = exports.gateways = exports.isDemoTicketing = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /**\n                                                                                                                                                                                                                                                                               * Base file for all ticketing stuff\n                                                                                                                                                                                                                                                                               * Contains MX enums and structures, typedefs and helpers.\n                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                               * @module ticketing/public\n                                                                                                                                                                                                                                                                               */\n\nvar _preact = __webpack_require__(0);\n\nvar _utils = __webpack_require__(2);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _link = __webpack_require__(7);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar IS_DEMO = typeof window !== 'undefined' && (0, _utils.accessNested)(window, '__INITIAL_STATE__.' + 'appData.options.isDemoTicketing', false);\n\nvar IFRAME_COMMUNICATOR_PAGE_SLUG = 'iframe-communicator';\nvar PRINT_YOUR_TICKET_PAGE_SLUG = 'print-your-ticket';\n\n/** Fallback deeplinks providers (ordered by preference) */\nvar deeplinkProviders = ['cinema', 'fandango', 'movietickets', 'atom'];\n\n/**\n * Return whether ticketing is in demo mode.\n * Demo ticketing does use test data.\n *\n * @function\n * @return {!boolean} true if demo ticketing is enabled, false otherwise\n */\nvar isDemoTicketing = exports.isDemoTicketing = function isDemoTicketing() {\n\treturn IS_DEMO;\n};\n\n/**\n * Available gateway identifiers\n * If you add a gateway here, then every exhibitor using this gateway will have direct\n * ticketing enable on the platform.\n *\n * @readonly\n * @enum {string}\n */\nvar gateways = exports.gateways = {\n\tAUTHNET: 'authnet',\n\tVANTIV: 'vantiv',\n\tPXPAY: 'pxpay',\n\tVERIFONE2: 'verifone2',\n\tBRAINTREE: 'braintree',\n\tMASTERCARD: 'mastercard'\n\t// PAYEEZY:   'payeezy'\n};\n\n/**\n * Temporary default gateway for ticketing.\n * As the gateway is not available in the doc yet, you can use this for test purposes.\n *\n * @type {string}\n */\nvar defaultGateway = exports.defaultGateway = gateways.AUTHNET;\n\n/**\n * Indicate the current status of the seat\n *\n * @readonly\n * @enum {number}\n * @see {@link https://bit.ly/2GKuww5|MX Ticketing Documentation}\n */\nvar seatStatus = exports.seatStatus = {\n\tAVAILABLE: 0,\n\tSOLD: 1,\n\tHOUSE: 2,\n\tWHEELCHAIR: 3,\n\tRESERVED: 4,\n\tBROKEN: 5,\n\tPLACEHOLDER: 6,\n\tCOMPANION: 7\n};\n\n/**\n * Enumeration of MX errors.\n * Can be used for localisation.\n *\n * @readonly\n * @enum {number}\n * @see {@link https://goo.gl/AuhR9D|MX Documentation}\n */\nvar mxErrors = exports.mxErrors = {\n\tUNEXPECTED_ERROR: 10000, // An unexpected error/database error/component error has occurred\n\tCINEMA_CHAIN_CONFIG_ISSUE: 10001, // There's a configuration issue with the cinema chain requested\n\tAUTHORISATION_EXCEPTION: 10002, // An internal error occurred while trying to authorise the request\n\tVENDOR_CONFIGURATION_EXCEPTION: 10003, // There's a configuration issue with the authenticated vendor\n\n\tCINEMA_TICKET_SERVICE_ACCESS_ERROR: 20000, // Unable to reach the cinema's ticketing service\n\tCINEMA_TICKET_SERVICE_TIMEOUT: 20001, // Cinema’s ticketing service failed to respond in a timely manner\n\tCANT_CONNECT_TO_SITE: 20002, // The Cinema’s ticketing service failed to connect to the specified site\n\tCANT_CONNECT_TO_LOYALTY: 20003, // The cinema’s ticketing service failed to connect to its loyalty system\n\n\tUNEXPECTED_CINEMA_TICKET_SERVICE_ERROR: 30000, // An unexpected error occurred at the cinema’s ticketing service\n\tFAILED_TO_RETRIEVE_SEATS_FOR_ORDER: 30001, // Seats were booked, but an unexpected error occurred while trying to retrieve seat information. Try to retrieve the order again\n\tFAILED_TO_PROCESS_ORDER_VALUE: 30002, // An unexpected error occurred while trying to calculate the order total. The order was cancelled\n\tREFUND_BOOKING_FAILED: 30003, // The cinema's ticketing service was unable to refund this booking.\n\n\tCINEMA_TICKET_SERVICE_CONFIG_ERROR: 31001, // The cinema’s ticketing service has not been correctly configured with MXTransact\n\tCINEMA_TICKET_SERVICE_NOT_FOUND: 31002, // A site existing in MXTransact does not exist at cinema\n\n\tBOOKING_FEE_CONFIG_ERROR: 32001, // There’s a problem with the cinema’s ticketing service booking fee configuration\n\tPAYMENT_CONFIG_ERROR: 32002, // There’s a problem with the cinema’s ticketing service payment configuration\n\n\tCINEMA_CHAIN_NOT_FOUND: 40001, // The requested cinema chain cannot be found\n\tSITE_NOT_FOUND: 40002, // The specified site cannot be found\n\tSHOWTIME_NOT_FOUND: 40003, // The specified Showtime cannot be found\n\tTICKET_TYPES_MANDATORY: 40004, // The client must provide the ticket types for the request.\n\tCONCESSIONS_NOT_SUPPORTED: 40005, // An attempt to purchase concessions was made, but Concessions are not supported in the API\n\tSHOWTIME_DOES_NOT_SUPPORT_SEATING: 40006, // An attempt to get screen layout was made, however, the Showtime is not configured to be seat-allocated\n\tTOTAL_PAYMENT_AMOUNT_IS_INSUFFICIENT: 40007, // The total payment amount specified doesn’t match the order total\n\tMULTI_SITE_ORDER_NOT_SUPPORTED: 40008, // A single order cannot contain sessions at more than one site\n\tORDER_DOES_NOT_EXISTS: 40009, // Could not find an order with the specified ID\n\tNO_SEAT_MAP_FOR_SOLD_OUT_SHOWTIMES: 40010, // Seat map data was requested for a showtime that is already sold out\n\tTICKET_TYPE_NOT_FOUND: 40011, // The requested ticket type was not found for the showtime\n\tREQUEST_TOO_LARGE: 40012, // The request was too large.\n\tCUSTOMER_DETAILS_NOT_SET: 40013, // Customer details were not set for the order.\n\tVENDOR_ACCESS_NOT_ALLOWED: 40014, // You have no access to the Cinema Chain requested.\n\tREFUND_PAST_SCREENINGS_NOT_ALLOWED: 40015, // Cannot refund a booking when one or more tickets that are part of the booking are for screenings that have already screened.\n\tREFUND_CINEMA_CHAIN_NOT_ALLOWED: 40016, // The cinema chain does not allow refunds\n\tBOOKINS_BELONGS_TO_ANOTHER_VEND0R: 40017, // Cannot refund a booking made through a different vendor.\n\tINSUFFICIENT_CUSTOMER_DETAILS: 40018, // An email, name and/or phone number must be provided.\n\tLOYALTY_NOT_ALLOWED_FOR_CINEMA_CHAIN: 40019, // The cinema chain does not allow loyalty.\n\tINSUFFICIENT_LOYALTY_MEMBER_DETAILS: 40020, // Insufficient loyalty membership details.\n\tTICKET_TYPES_FOR_PAST_SCREENINGS: 40021, // Ticket types not available for past screenings.\n\n\tSEATS_UNAVAILABLE: 41001, // The requested seats are not available\n\tNO_CONTIGUOUS_SEATS: 41002, // The selected seats could not be automatically allocated in a single row\n\tBOOKING_DOES_NOT_EXIST: 41003, // A booking with the specified ID does not exist\n\tBOOKING_ALREADY_CANCELLED: 41004, // The specified booking has already been cancelled\n\tSHOWTIME_UNAVAILABLE: 41005, // The requested showtime is not available at the cinema’s ticketing service\n\tTICKET_NOT_FOR_SALE: 41006, // Selected tickets are not currently for sale for this showtime\n\tSELECTED_SEATS_INVALID_FOR_THE_TICKET: 41007, // Selected seats are not valid for the tickets in the order\n\tORDER_ALREADY_BEING_COMPLETED: 41008, // A request to complete the order was already made and is currently in progress.\n\tORDER_CANNOT_BE_UNIQUELY_IDENTIFIED: 41009, // The cinema's ticketing service was not able to identify the requested order\n\tCOULD_NOT_GET_TICKET_TYPES_FOR_SESSION: 41010, // Could not get ticket types for the requested session. Please make sure the session is still available\n\tLOYALTY_MEMBER_NOT_FOUND: 41011 // Loyalty member could not be found.\n};\n\n/**\n * Enumeration of Powster ticketing server errors.\n * Can be used for localisation.\n *\n * @readonly\n * @enum {number}\n * @see {@link https://goo.gl/55yo3T|Powster Ticketing Error codes}\n */\nvar powErrors = exports.powErrors = {\n\tINVALID_API_KEY: 101, // Invalid API developer key\n\tAUTH_FAIL: 102, // Authentication failed\n\tAUTH_EXPIRED: 103, // Authentication expired\n\n\tINVALID_EXHIBITOR: 301, // Unknown or incorrect exhibitor\n\n\tINVALID_ORDER: 501, // The order structure returned by MX is not valid\n\tNO_ORDER: 502, // The provided order does not exist in the ticketing database\n\tCOMPLETE_ORDER_FAIL: 503, // Failed to complete the order and get a proper booking reference\n\tNO_BOOKING_REF: 504, // The provided order does not have any booking reference\n\tNOT_YOUR_ORDER: 507, // You don't have access to this order\n\tPRIVATE_SCREENING: 508, // You don't have access to this screening\n\tTOO_MANY_ORDERS: 509, // Number of bookings for promotion exceeded\n\tTOO_MANY_TICKETS: 510, // Number of available tickets for promotion exceeded\n\n\tTRANSACTION_FAIL: 601, // The transaction was rejected\n\tNO_MERCHANT: 602, // The merchant does not exist\n\tTRANSACTION_VOID_FAIL: 603, // The given transaction cannot be voided\n\tNO_MERCHANT_CREDENTIALS: 604, // Could not acquire merchant credentials for the given site\n\n\tINVALID_PRICE: 901, // The price returned by MX is not a valid amount\n\tINVALID_BOOKING_FEE: 902 // Incorrect custom booking fee\n};\n\n/**\n * Return the key associated with a MX error code for localisation.\n *\n * @function\n * @param {!number} code - the MX error code\n * @return {string} the key associated with the given error id, or undefined if not found\n */\nvar getMxErrorKey = exports.getMxErrorKey = function getMxErrorKey(code) {\n\treturn Object.keys(mxErrors).find(function (key) {\n\t\treturn mxErrors[key] === code;\n\t});\n};\n\n/**\n * Return the key associated with a Powster Ticketing error code for localisation.\n *\n * @function\n * @param {!number} code - the Powster Ticketing error code\n * @return {string} the key associated with the given error id, or undefined if not found\n */\nvar getPowErrorKey = exports.getPowErrorKey = function getPowErrorKey(code) {\n\treturn Object.keys(powErrors).find(function (key) {\n\t\treturn powErrors[key] === code;\n\t});\n};\n\n/**\n * Return whether the given object is a valid error (as defined in the ticketing API)\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is an error object, false otherwise\n */\nvar isErrorObject = function isErrorObject(obj) {\n\tif (!(0, _utils.isObject)(obj) || !(0, _utils.isObject)(obj.data)) return false;\n\treturn (0, _utils.isObject)(obj.data.error) && typeof obj.data.from === 'string';\n};\n\n/**\n * Return whether the given object is a valid MX error (as defined in the MX API)\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is an MX error object, false otherwise\n */\nvar isMxErrorObject = exports.isMxErrorObject = function isMxErrorObject(obj) {\n\treturn isErrorObject(obj) && obj.data.from === 'mx' && typeof obj.data.error.errorCode === 'number' && typeof obj.data.error.errorCodeDescription === 'string';\n};\n\n/**\n * Return whether the given object is a valid Powster Ticketing error.\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is a Powster Ticketing error object, false otherwise\n */\nvar isPowErrorObject = exports.isPowErrorObject = function isPowErrorObject(obj) {\n\treturn isErrorObject(obj) && obj.data.from === 'pow' && typeof obj.data.error.code === 'number';\n};\n\n/**\n * @global\n * @typedef {Object} SeatLayout\n * @property {number} boundaryRight - the rightmost position of the map, in percentage 0-100\n * @property {number} boundaryLeft - the leftmost position of the map, in percentage 0-100\n * @property {number} boundaryTop - the topmost position of the map, in percentage 0-100\n * @property {number} screenStart - the leftmost position of the screen, in percentage 0-100\n * @property {number} screenWidth - the width of the screen, in percentage 0-100\n * @property {Array.<AreaCategory>} areaCategories - list of AreaCategories in the screen layout\n * @property {Array.<Area>} areas - list of Areas in the screen layout\n */\n\n/**\n * @global\n * @typedef {Object} AreaCategory\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {number} seatsToAllocate - number of seats that must be allocated for the area category\n * @property {number} seatsAllocatedCount - number of seats that have been automatically allcoated\n * @property {number} seatsNotAllocatedCount - number of seats that have not been allocated\n * @property {Array.<SeatPosition>} selectedSeats - list of SeatPositions for the allocated seats\n */\n\n/**\n * @global\n * @typedef {Object} SeatPosition\n * @property {number} areaNumber - identifies which area the seat belongs to (1 based)\n * @property {number} rowIndex - the row within the area the seat belongs to (0 based)\n * @property {number} columnIndex - the column within the area the seat belongs to (0 based)\n */\n\n/**\n * @global\n * @typedef {Object} Area\n * @property {number} number - uniquely identifies the area within the seat layout\n * @property {string} areaCategoryCode - the area category code this area belong to\n * @property {number} numberOfSeats - total number of seats within this area\n * @property {number} columnCount - number of columns of seats in the area\n * @property {number} rowCount - number of rows of seats in the area\n * @property {string} description - textual description of the area (e.g. \"Premium\", \"Stalls\")\n * @property {number} left - the leftmost position of the area within the screen layout (0-100)\n * @property {number} top - the topmost position of the area within the screen layout (0-100)\n * @property {number} width - the width of the area within the screen layout (0-100)\n * @property {number} height - the height of the area within the screen layout (0-100)\n * @property {Array.<Row>} rows - list of Rows in the area\n */\n\n/**\n * @global\n * @typedef {Object} Row\n * @property {string} rowLabel - the name of the row\n * @property {Array.<Seat>} seats - list of seats in the row\n */\n\n/**\n * @global\n * @typedef {Object} Seat\n * @property {SeatPosition} position - the seat position object\n * @property {Array.<SeatPosition>} seatsInGroup - list of seat positions for grouped seats (sofas)\n * @property {string} seatLabel - name of the seat (commonly rowLable + seatLabel, e.g. \"A12\")\n * @property {SeatStatus} status - the current seat status\n * @property {SeatStatus} originalStatus - the seat status before being reserved\n */\n\n/**\n * Return whether direct ticketing is enabled for a specific theater.\n *\n * @function\n * @param {Theater} theater - the theater of the active screening\n * @return {boolean} true if direct ticketing is enabled, false otherwise\n */\nvar isDirectTicketingEnabled = exports.isDirectTicketingEnabled = function () {\n\tvar store_ = void 0;\n\n\treturn function (theater) {\n\t\tif (!store_) store_ = _store2['default'].get();\n\n\t\tif (!store_.appData.options.enableDirectTicketing) return false;\n\t\tif (store_.appData.options.forceDirectTicketing) return true;\n\n\t\tvar exhibitor = theater.exhibitor;\n\t\tif (!exhibitor) return false;\n\n\t\t// Check if ticketing is explicitly disabled in the theater master doc\n\t\tvar ticketingEnabled = (0, _utils.accessNested)(theater, 'masterDoc.ticketing.enabled', true);\n\t\tif (!ticketingEnabled) return false;\n\n\t\t// Check that ticketing is explicitly enabled in the exhibitor doc\n\t\tticketingEnabled = (0, _utils.accessNested)(exhibitor, 'doc.ticketing.enabled', false);\n\t\tvar paymentEnabled = (0, _utils.accessNested)(exhibitor, 'doc.payment.enabled', false);\n\n\t\t// TODO: Override on theater level\n\t\tif (!ticketingEnabled || !paymentEnabled) return false;\n\n\t\t// Make sure the payment gateway is known and supported\n\t\tvar gateway = (0, _utils.accessNested)(exhibitor, 'doc.payment.gateway', '');\n\t\tif (Object.values(gateways).indexOf(gateway) === -1) return false;\n\n\t\treturn true;\n\t};\n}();\n\n/**\n * Return a fallback url to be used in case of problem during the ticketing.\n *\n * @param {!Theater} theater - the theater of the screening\n * @param {!Screening} screening - the screening object\n * @return {string} a fallback URL\n */\nvar getFallbackUrl = exports.getFallbackUrl = function getFallbackUrl(theater, screening) {\n\tvar fallbackUrl = theater.website;\n\tvar urls = screening.urls;\n\n\n\tif (Object.keys(urls).length > 0) {\n\t\tvar _iteratorNormalCompletion = true;\n\t\tvar _didIteratorError = false;\n\t\tvar _iteratorError = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator = deeplinkProviders[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\t\tvar providerName = _step.value;\n\n\t\t\t\tvar url = urls[providerName];\n\t\t\t\tif (url) {\n\t\t\t\t\tfallbackUrl = url;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t_didIteratorError = true;\n\t\t\t_iteratorError = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion && _iterator['return']) {\n\t\t\t\t\t_iterator['return']();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError) {\n\t\t\t\t\tthrow _iteratorError;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fallbackUrl;\n};\n\n/**\n * @global\n * @typedef {Object} TicketType\n * @property {string} id - the ID of the ticket type\n * @property {string} description - the name of the type of the ticket\n * @property {string} areaCategoryCode - the ID of the area category\n */\n\n/**\n * @global\n * @typedef {Object} AreaCategoryDef\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {Array.<string>} descriptions - an array of all the ticket types names in this area\n */\n\n/**\n * Return an array of all the different area categories found.\n *\n * @param {!Array.<TicketType>} ticketTypes - the array of all ticket types\n * @return {!Array.<AreaCategoryDef>} an array of area category definitions\n */\nvar getAreaCategories = exports.getAreaCategories = function getAreaCategories(ticketTypes) {\n\tvar areaCategories = [];\n\n\tvar _loop = function _loop(_ref) {\n\t\tvar areaCategoryCode = _ref.areaCategoryCode,\n\t\t    description = _ref.description;\n\n\t\tvar areaCategory = areaCategories.find(function (category) {\n\t\t\treturn category.areaCategoryCode === areaCategoryCode;\n\t\t});\n\t\tif (areaCategory) {\n\t\t\tareaCategory.descriptions.push(description);\n\t\t} else {\n\t\t\tareaCategories.push({ areaCategoryCode: areaCategoryCode, descriptions: [description] });\n\t\t}\n\t};\n\n\tvar _iteratorNormalCompletion2 = true;\n\tvar _didIteratorError2 = false;\n\tvar _iteratorError2 = undefined;\n\n\ttry {\n\t\tfor (var _iterator2 = ticketTypes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\tvar _ref = _step2.value;\n\n\t\t\t_loop(_ref);\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError2 = true;\n\t\t_iteratorError2 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion2 && _iterator2['return']) {\n\t\t\t\t_iterator2['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError2) {\n\t\t\t\tthrow _iteratorError2;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn areaCategories;\n};\n\n/**\n * Return the tickets reserved by the user as a formatted string.\n *\n * @param {Object} tickets - the map of tickets selected by the user\n * @param {string=} areaCategoryCode - filter the tickets in a specific area category\n * @return {string} a textual representation of the booked tickets\n */\nvar getTicketsText = exports.getTicketsText = function getTicketsText(tickets, areaCategoryCode) {\n\tvar ticketTypeStrs = [];\n\n\tfor (var ticketTypeId in tickets) {\n\t\tvar ticketType = tickets[ticketTypeId];\n\t\tif (!areaCategoryCode || ticketType.areaCategoryCode === areaCategoryCode) {\n\t\t\tticketTypeStrs.push(ticketType.description + ' \\xD7 ' + ticketType.quantity);\n\t\t}\n\t}\n\n\treturn ticketTypeStrs.join(', ');\n};\n\n/**\n * Return the number of ticket selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of ticket purchased by the user\n */\nvar getTicketCount = function getTicketCount(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar ticketCount = 0;\n\tfor (var ticketType in tickets) {\n\t\tticketCount += tickets[ticketType].quantity;\n\t}\n\n\treturn ticketCount;\n};\n\n/**\n * @typedef {Object.<string, TicketType>} TicketsMap\n */\n\n/**\n * Return the number of seat selectable by the user.\n *\n * @param {!Object.<string, TicketType>} tickets - the ticketing state\n * @return {!number} the numbe of seat selectable by the user\n */\nvar getTicketWithSeatCount = function getTicketWithSeatCount(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar seatCount = 0;\n\tfor (var ticketType in tickets) {\n\t\tif (tickets[ticketType].isAllocatedSeating) {\n\t\t\tseatCount += tickets[ticketType].quantity;\n\t\t}\n\t}\n\n\treturn seatCount;\n};\n\n/**\n * Return whether two seats position are equal.\n *\n * @function\n * @param {!SeatPosition} seatPos1 - the first seat position\n * @param {!SeatPosition} seatPos2 - the second seat position\n * @return {!boolean} true if the seat positions are equal, false otherwise\n */\nvar areSeatPositionsEqual = exports.areSeatPositionsEqual = function areSeatPositionsEqual(seatPos1, seatPos2) {\n\treturn seatPos1.areaNumber === seatPos2.areaNumber && seatPos1.rowIndex === seatPos2.rowIndex && seatPos1.columnIndex === seatPos2.columnIndex;\n};\n\n/**\n * Return whether two seats objects reference the same seat.\n *\n * @function\n * @param {!Seat} seat1 - the first seat\n * @param {!Seat} seat2 - the second seat\n * @return {!boolean} true if the seats are equal, false otherwise\n */\nvar areSeatsEqual = exports.areSeatsEqual = function areSeatsEqual(seat1, seat2) {\n\treturn areSeatPositionsEqual(seat1.position, seat2.position);\n};\n\n/**\n * Return whether a seat is a wheelchair.\n *\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a wheelchair, false otherwise\n */\nvar isWheelchair = exports.isWheelchair = function isWheelchair(seat) {\n\treturn seat.status === seatStatus.WHEELCHAIR || seat.originalStatus === seatStatus.WHEELCHAIR;\n};\n\n/**\n * Return whether a seat is a companion seat.\n *\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a companion seat, false otherwise\n */\nvar isCompanionSeat = exports.isCompanionSeat = function isCompanionSeat(seat) {\n\treturn seat.status === seatStatus.COMPANION || seat.originalStatus === seatStatus.COMPANION;\n};\n\n/**\n * Return whether the seat is reserved for a disabled person/companion.\n *\n * @function\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a wheelchair or a companion seat, false otherwise\n */\nvar isSeatForDisablePeople = exports.isSeatForDisablePeople = function isSeatForDisablePeople(seat) {\n\treturn isWheelchair(seat) || isCompanionSeat(seat);\n};\n\n/**\n * Return whether all seats in a array are adjacent ot each other.\n *\n * @function\n * @param {!Array.<SeatPosition>} positions - an array of seat positions\n * @return {!boolean} true if all seat positions are contiguous\n */\nvar areSeatPositionsContiguous = function areSeatPositionsContiguous(positions) {\n\tvar count = positions.length;\n\tif (count < 2) return true;\n\n\tvar areaNumber = positions[0].areaNumber;\n\tvar rowIndex = positions[0].rowIndex;\n\n\t// check area and row\n\tfor (var i = 0; i < count; i++) {\n\t\tvar position = positions[i];\n\t\tif (position.areaNumber !== areaNumber || position.rowIndex !== rowIndex) return false;\n\t}\n\n\t// check contiguity\n\tvar columnIndices = positions.map(function (_ref2) {\n\t\tvar columnIndex = _ref2.columnIndex;\n\t\treturn columnIndex;\n\t});\n\tcolumnIndices.sort(function (a, b) {\n\t\treturn a - b;\n\t});\n\tfor (var _i = 1; _i < count; _i++) {\n\t\tif (columnIndices[_i] !== columnIndices[_i - 1] + 1) return false;\n\t}\n\n\treturn true;\n};\n\n/**\n * @typedef {Function} BinaryComparator\n * @param {!*} element - the element to compare\n * @param {*=} objective - the objective to reach\n * @return {!number} a negative if the objective is in the upper bound, a positive for the lower bound\n */\n\n/**\n * Perform a binary search on an array of element to reach the given objective\n *\n * @function\n * @param {!Array.<*>} array - an array of elements to search in\n * @param {!BinaryComparator} compare - a binary search comparator\n * @param {*=} objective - an optional parameter to the comparator\n * @return {*} the element, if found\n */\nvar binarySearch = function binarySearch(array, compare, objective) {\n\tvar minIndex = 0;\n\tvar maxIndex = array.length - 1;\n\tvar currentIndex = void 0;\n\n\twhile (minIndex <= maxIndex) {\n\t\tcurrentIndex = minIndex + maxIndex >> 1;\n\t\tvar result = compare(array[currentIndex], objective);\n\t\tif (result < 0) {\n\t\t\tminIndex = currentIndex + 1;\n\t\t} else if (result > 0) {\n\t\t\tmaxIndex = currentIndex - 1;\n\t\t} else {\n\t\t\treturn array[currentIndex];\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Compare a seat with a column index to perform a binary comparison.\n *\n * @function\n * @type {BinaryComparator}\n * @param {!Seat} seat - the seat to test\n * @param {!number} columnIndex - the column index we're looking for\n * @return {!number} a negative if the objective is in the upper bound, a positive for the lower bound\n */\nvar compareSeatAtPosition = function compareSeatAtPosition(seat, columnIndex) {\n\treturn seat.position.columnIndex - columnIndex;\n};\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nvar getSeatAtPositionLayout = function getSeatAtPositionLayout(seatLayout, seatPosition) {\n\tvar areaNumber = seatPosition.areaNumber,\n\t    rowIndex = seatPosition.rowIndex,\n\t    columnIndex = seatPosition.columnIndex;\n\n\n\tvar area = seatLayout.areas.find(function (_ref3) {\n\t\tvar number = _ref3.number;\n\t\treturn number === areaNumber;\n\t});\n\tif (!area) return null;\n\n\tvar rows = area.rows;\n\n\tvar row = void 0;\n\t// Attempt to guess the row in constant time\n\tif (rowIndex > 0 && rows.length > rowIndex && rows[rowIndex].seats.length > 0 && rows[rowIndex].seats[0].position.rowIndex === rowIndex) {\n\t\trow = rows[rowIndex];\n\t} else {\n\t\trow = rows.find(function (_ref4) {\n\t\t\tvar seats = _ref4.seats;\n\t\t\treturn seats.length > 0 && seats[0].position.rowIndex === rowIndex;\n\t\t});\n\t}\n\tif (!row) return null;\n\n\t// We'll rarely be able to find the seat in constant time, it's not worth trying\n\treturn binarySearch(row.seats, compareSeatAtPosition, columnIndex);\n};\n\n/**\n * @global\n * @typedef {Array.<Array.<Array.<Seat>>>} SeatLookup\n */\n\n/**\n * Return a seat lookup from a seat layout, that can be used to speed us seat search.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @return {!SeatLookup} the corresponding seat lookup structure\n */\nvar createSeatLookup = exports.createSeatLookup = function createSeatLookup(seatLayout) {\n\tvar lookup = [];\n\tlookup.isSeatLookup = true;\n\n\t// Create the structure\n\tvar areas = seatLayout.areas;\n\tvar _iteratorNormalCompletion3 = true;\n\tvar _didIteratorError3 = false;\n\tvar _iteratorError3 = undefined;\n\n\ttry {\n\t\tfor (var _iterator3 = areas[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n\t\t\tvar _ref5 = _step3.value;\n\t\t\tvar rowCount = _ref5.rowCount,\n\t\t\t    columnCount = _ref5.columnCount;\n\n\t\t\tvar areaLookup = [];\n\t\t\tfor (var i = 0; i < rowCount; i++) {\n\t\t\t\tvar rowLookup = [];\n\t\t\t\tfor (var j = 0; j < columnCount; j++) {\n\t\t\t\t\trowLookup.push(null);\n\t\t\t\t}\n\t\t\t\tareaLookup.push(rowLookup);\n\t\t\t}\n\t\t\tlookup.push(areaLookup);\n\t\t}\n\t\t// Fill in the seats\n\t} catch (err) {\n\t\t_didIteratorError3 = true;\n\t\t_iteratorError3 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion3 && _iterator3['return']) {\n\t\t\t\t_iterator3['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError3) {\n\t\t\t\tthrow _iteratorError3;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar _iteratorNormalCompletion4 = true;\n\tvar _didIteratorError4 = false;\n\tvar _iteratorError4 = undefined;\n\n\ttry {\n\t\tfor (var _iterator4 = areas[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n\t\t\tvar _ref6 = _step4.value;\n\t\t\tvar rows = _ref6.rows;\n\t\t\tvar _iteratorNormalCompletion5 = true;\n\t\t\tvar _didIteratorError5 = false;\n\t\t\tvar _iteratorError5 = undefined;\n\n\t\t\ttry {\n\t\t\t\tfor (var _iterator5 = rows[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n\t\t\t\t\tvar _ref7 = _step5.value;\n\t\t\t\t\tvar seats = _ref7.seats;\n\t\t\t\t\tvar _iteratorNormalCompletion6 = true;\n\t\t\t\t\tvar _didIteratorError6 = false;\n\t\t\t\t\tvar _iteratorError6 = undefined;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (var _iterator6 = seats[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n\t\t\t\t\t\t\tvar seat = _step6.value;\n\t\t\t\t\t\t\tvar _seat$position = seat.position,\n\t\t\t\t\t\t\t    areaNumber = _seat$position.areaNumber,\n\t\t\t\t\t\t\t    rowIndex = _seat$position.rowIndex,\n\t\t\t\t\t\t\t    columnIndex = _seat$position.columnIndex;\n\n\t\t\t\t\t\t\tlookup[areaNumber - 1][rowIndex][columnIndex] = seat;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t_didIteratorError6 = true;\n\t\t\t\t\t\t_iteratorError6 = err;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (!_iteratorNormalCompletion6 && _iterator6['return']) {\n\t\t\t\t\t\t\t\t_iterator6['return']();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tif (_didIteratorError6) {\n\t\t\t\t\t\t\t\tthrow _iteratorError6;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t_didIteratorError5 = true;\n\t\t\t\t_iteratorError5 = err;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tif (!_iteratorNormalCompletion5 && _iterator5['return']) {\n\t\t\t\t\t\t_iterator5['return']();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tif (_didIteratorError5) {\n\t\t\t\t\t\tthrow _iteratorError5;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError4 = true;\n\t\t_iteratorError4 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion4 && _iterator4['return']) {\n\t\t\t\t_iterator4['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError4) {\n\t\t\t\tthrow _iteratorError4;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lookup;\n};\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nvar getSeatAtPositionLookup = function getSeatAtPositionLookup(seatLookup, seatPosition) {\n\tvar areaLookup = seatLookup[seatPosition.areaNumber - 1];\n\tif (!areaLookup) return null;\n\n\tvar rowLookup = areaLookup[seatPosition.rowIndex];\n\tif (!rowLookup) return null;\n\n\treturn rowLookup[seatPosition.columnIndex] || null;\n};\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nvar getSeatAtPosition = exports.getSeatAtPosition = function getSeatAtPosition(seatLayout, seatPosition) {\n\tif (seatLayout.lookup && seatLayout.lookup.isSeatLookup) {\n\t\treturn getSeatAtPositionLookup(seatLayout.lookup, seatPosition);\n\t}\n\treturn getSeatAtPositionLayout(seatLayout, seatPosition);\n};\n\n/**\n * Return the first wheelchair found in an array of seat positions.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!Array.<SeatPosition>} seatsInGroup - array of seat positions in a disabled seats group\n * @return {Seat} the wheelchair of the group, or null if not found\n */\nvar findWheelchairInGroup = exports.findWheelchairInGroup = function findWheelchairInGroup(seatLayout, seatsInGroup) {\n\tif (!Array.isArray(seatsInGroup)) {\n\t\tconsole.error('ticketingPublic.js: findWheelchairInGroup(): seatsInGroup is not an array', seatsInGroup);\n\t\treturn null;\n\t}\n\tif (seatsInGroup.length === 0) return null;\n\n\tvar _iteratorNormalCompletion7 = true;\n\tvar _didIteratorError7 = false;\n\tvar _iteratorError7 = undefined;\n\n\ttry {\n\t\tfor (var _iterator7 = seatsInGroup[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n\t\t\tvar seatPosition = _step7.value;\n\n\t\t\tvar seat = getSeatAtPosition(seatLayout, seatPosition);\n\t\t\tif (seat && isWheelchair(seat)) {\n\t\t\t\treturn seat;\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError7 = true;\n\t\t_iteratorError7 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion7 && _iterator7['return']) {\n\t\t\t\t_iterator7['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError7) {\n\t\t\t\tthrow _iteratorError7;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Return whether the given seat is a sofa.\n *\n * @function\n * @param {!Seat} seat - the seat to test\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @return {!boolean} true if the given seat is a sofa, false otherwise\n */\nvar isSofa = exports.isSofa = function isSofa(seat, seatLayout) {\n\tvar seatsInGroup = seat.seatsInGroup;\n\n\tif (seatsInGroup.length < 2) return false;\n\tif (isWheelchair(seat)) return false;\n\tif (isCompanionSeat(seat) && findWheelchairInGroup(seatLayout, seatsInGroup)) return false;\n\treturn areSeatPositionsContiguous(seatsInGroup);\n};\n\n/**\n * @global\n * @typedef {Object} SelectedSeat\n * @property {string} rowName - the label of the row containing the seat\n * @property {string} seatName - the label of the seat selected\n * @property {number} ticketId - the identifier of the ticket used to reserve this seat\n */\n\n/**\n * @global\n * @typedef {Object} GroupedTicket\n * @property {string} ticketTypeId - the ID of the ticket type\n * @property {string} ticketTypeDescription - the name of the type of the ticket\n * @property {number} priceEach - the price for one ticket of this type\n * @property {number} quantity - the number of ticket of this type\n * @property {Array.<number>} ticketIds - the list of ticket identifiers in this group\n */\n\n/**\n * @global\n * @typedef {Object} TicketingSeat\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {string} label - the full label of the seat\n * @property {string} rowName - the name of the seat row\n * @property {string} seatName - the name of the seat\n */\n\n/**\n * Return an array of selected seat labels per area category.\n *\n * @function\n * @param {!Array.<SelectedSeat>} selectedSeats - the array of selected seats, as returned by MX\n * @param {!Array.<GroupedTicket>} groupedTickets - the array of grouped tickets, as returned by MX\n * @param {!Array.<TicketType>} ticketTypes - the array of ticket types, as returned by MX\n * @return {!Array.<TicketingSeat>} an array of selected seat\n */\nvar getSeats = exports.getSeats = function getSeats(selectedSeats, groupedTickets, ticketTypes) {\n\tvar seats = [];\n\n\tvar _loop2 = function _loop2(selectedSeat) {\n\t\tvar rowName = selectedSeat.rowName,\n\t\t    seatName = selectedSeat.seatName,\n\t\t    ticketId = selectedSeat.ticketId;\n\n\n\t\tvar areaCategory = groupedTickets.find(function (_ref8) {\n\t\t\tvar ticketIds = _ref8.ticketIds;\n\t\t\treturn ticketIds.indexOf(ticketId) > -1;\n\t\t});\n\t\tif (areaCategory) {\n\t\t\tvar ticketTypeId = areaCategory.ticketTypeId;\n\n\n\t\t\tvar ticketType = ticketTypes.find(function (_ref9) {\n\t\t\t\tvar id = _ref9.id;\n\t\t\t\treturn id === ticketTypeId;\n\t\t\t});\n\t\t\tif (ticketType) {\n\t\t\t\tseats.push({\n\t\t\t\t\tareaCategoryCode: ticketType.areaCategoryCode,\n\t\t\t\t\tlabel: rowName + seatName,\n\t\t\t\t\trowName: rowName,\n\t\t\t\t\tseatName: seatName\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsole.warn('ticketingPublic:getSeats(): Could not find ticket type for ' + 'the area category:', areaCategory, 'in:', ticketTypes);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('ticketingPublic:getSeats(): Could not find the grouped ' + 'tickets for the selected seat:', selectedSeat, 'in:', groupedTickets);\n\t\t}\n\t};\n\n\tvar _iteratorNormalCompletion8 = true;\n\tvar _didIteratorError8 = false;\n\tvar _iteratorError8 = undefined;\n\n\ttry {\n\t\tfor (var _iterator8 = selectedSeats[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {\n\t\t\tvar selectedSeat = _step8.value;\n\n\t\t\t_loop2(selectedSeat);\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError8 = true;\n\t\t_iteratorError8 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion8 && _iterator8['return']) {\n\t\t\t\t_iterator8['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError8) {\n\t\t\t\tthrow _iteratorError8;\n\t\t\t}\n\t\t}\n\t}\n\n\tseats.sort(function (seat1, seat2) {\n\t\tvar area1 = seat1.areaCategoryCode;\n\t\tvar area2 = seat2.areaCategoryCode;\n\n\t\tif (area1 !== area2) {\n\t\t\treturn area1.localeCompare(area2, undefined, { numeric: true });\n\t\t}\n\t\tif (seat1.rowName !== seat2.rowName) {\n\t\t\treturn seat1.rowName.localeCompare(seat2.rowName);\n\t\t}\n\t\treturn seat1.seatName - seat2.seatName;\n\t});\n\n\treturn seats;\n};\n\n/**\n * @global\n * @typedef {Object} PickedSeat\n * @property {Seat} seat - the MX structure holding the seat\n * @property {number} lastAction - the timestamp of the last move for this seat\n */\n\n/**\n * Return whether all the seats of a sofa are picked.\n *\n * @param {!Array.<SeatPosition>} seatsInGroup - position of each seat in the sofa\n * @param {!Array.<PickedSeat>} pickedSeat - the array of picked seats\n * @return {!boolean} true if all seats are picked, false otherwise\n */\nvar areAllSeatsInSofaPicked = function areAllSeatsInSofaPicked(seatsInGroup, pickedSeats) {\n\tvar _loop3 = function _loop3(seatPosition) {\n\t\tvar pickedSeat = pickedSeats.find(function (pickedSeat) {\n\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPosition);\n\t\t});\n\t\tif (!pickedSeat) return {\n\t\t\t\tv: false\n\t\t\t};\n\t};\n\n\tvar _iteratorNormalCompletion9 = true;\n\tvar _didIteratorError9 = false;\n\tvar _iteratorError9 = undefined;\n\n\ttry {\n\t\tfor (var _iterator9 = seatsInGroup[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {\n\t\t\tvar seatPosition = _step9.value;\n\n\t\t\tvar _ret3 = _loop3(seatPosition);\n\n\t\t\tif ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === \"object\") return _ret3.v;\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError9 = true;\n\t\t_iteratorError9 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion9 && _iterator9['return']) {\n\t\t\t\t_iterator9['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError9) {\n\t\t\t\tthrow _iteratorError9;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Remove every seat of a sofa from the array of picked seats.\n *\n * @param {!Array.<SeatPosition>} seatsInGroup - position of each seat in the sofa\n * @param {!Array.<PickedSeat>} pickedSeats - the array of picked seats\n */\nvar removeSofaFromPickedSeats = function removeSofaFromPickedSeats(seatsInGroup, pickedSeats) {\n\tvar _loop4 = function _loop4(seatPosition) {\n\t\tvar index = pickedSeats.findIndex(function (pickedSeat) {\n\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPosition);\n\t\t});\n\t\tif (index > -1) pickedSeats.splice(index, 1);\n\t};\n\n\tvar _iteratorNormalCompletion10 = true;\n\tvar _didIteratorError10 = false;\n\tvar _iteratorError10 = undefined;\n\n\ttry {\n\t\tfor (var _iterator10 = seatsInGroup[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {\n\t\t\tvar seatPosition = _step10.value;\n\n\t\t\t_loop4(seatPosition);\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError10 = true;\n\t\t_iteratorError10 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion10 && _iterator10['return']) {\n\t\t\t\t_iterator10['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError10) {\n\t\t\t\tthrow _iteratorError10;\n\t\t\t}\n\t\t}\n\t}\n};\n\n/**\n * Handler used for sorting an array of picked seats.\n *\n * @function\n * @param {PickedSeat} pickedSeat1 - the first picked seat\n * @param {PickedSeat} pickedSeat2 - the second picked seat\n * @return {number} how to sort the given picked seats.\n */\nvar pickedSeatsSorterStable = function pickedSeatsSorterStable(pickedSeat1, pickedSeat2) {\n\tvar pos1 = pickedSeat1.seat.position;\n\tvar pos2 = pickedSeat2.seat.position;\n\n\tvar diff = pos1.areaNumber - pos2.areaNumber;\n\tif (diff !== 0) return diff;\n\n\tdiff = pos1.rowIndex - pos2.rowIndex;\n\tif (diff !== 0) return diff;\n\n\t// NOTE: column indices are in reverse order\n\treturn pos2.columnIndex - pos1.columnIndex;\n};\n\n/**\n * Return the array of picked seats from the given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {boolean=} removeIncompleteSofas - whether to discard incompletely picked sofas\n * @param {boolean=} sort - whether to sort the picked seats array\n * @return {!Array.<PickedSeat>} the array of picked seats taken from the seating map\n */\nvar getPickedSeats = exports.getPickedSeats = function getPickedSeats(seatLayout) {\n\tvar removeIncompleteSofas = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\tvar sort = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n\tvar pickedSeats = [];\n\tvar lastAction = Date.now();\n\n\tvar _iteratorNormalCompletion11 = true;\n\tvar _didIteratorError11 = false;\n\tvar _iteratorError11 = undefined;\n\n\ttry {\n\t\tfor (var _iterator11 = seatLayout.areaCategories[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {\n\t\t\tvar _areaCategory = _step11.value;\n\t\t\tvar _iteratorNormalCompletion14 = true;\n\t\t\tvar _didIteratorError14 = false;\n\t\t\tvar _iteratorError14 = undefined;\n\n\t\t\ttry {\n\t\t\t\tfor (var _iterator14 = _areaCategory.selectedSeats[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {\n\t\t\t\t\tvar seatPosition = _step14.value;\n\n\t\t\t\t\tvar _seat = getSeatAtPosition(seatLayout, seatPosition);\n\t\t\t\t\tif (_seat) {\n\t\t\t\t\t\tpickedSeats.push({ seat: _seat, lastAction: lastAction });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('ticketingPublic:getPickedSeats(): Could not find seat at position:', seatPosition, 'in layout:', seatLayout);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t_didIteratorError14 = true;\n\t\t\t\t_iteratorError14 = err;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tif (!_iteratorNormalCompletion14 && _iterator14['return']) {\n\t\t\t\t\t\t_iterator14['return']();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tif (_didIteratorError14) {\n\t\t\t\t\t\tthrow _iteratorError14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError11 = true;\n\t\t_iteratorError11 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion11 && _iterator11['return']) {\n\t\t\t\t_iterator11['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError11) {\n\t\t\t\tthrow _iteratorError11;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (removeIncompleteSofas) {\n\t\t// Remove any picked sofa that doesn't have all its seats picked\n\t\tvar sofas = new Set();\n\t\t// TODO: The Set is useless in this case because all sofa arrays have independent refs\n\t\tvar _iteratorNormalCompletion12 = true;\n\t\tvar _didIteratorError12 = false;\n\t\tvar _iteratorError12 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator12 = pickedSeats[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {\n\t\t\t\tvar _ref10 = _step12.value;\n\t\t\t\tvar seat = _ref10.seat;\n\n\t\t\t\tif (isSofa(seat, seatLayout)) sofas.add(seat.seatsInGroup);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t_didIteratorError12 = true;\n\t\t\t_iteratorError12 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion12 && _iterator12['return']) {\n\t\t\t\t\t_iterator12['return']();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError12) {\n\t\t\t\t\tthrow _iteratorError12;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar _iteratorNormalCompletion13 = true;\n\t\tvar _didIteratorError13 = false;\n\t\tvar _iteratorError13 = undefined;\n\n\t\ttry {\n\t\t\tfor (var _iterator13 = sofas[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {\n\t\t\t\tvar sofa = _step13.value;\n\n\t\t\t\tif (!areAllSeatsInSofaPicked(sofa, pickedSeats)) {\n\t\t\t\t\tremoveSofaFromPickedSeats(sofa, pickedSeats);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t_didIteratorError13 = true;\n\t\t\t_iteratorError13 = err;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!_iteratorNormalCompletion13 && _iterator13['return']) {\n\t\t\t\t\t_iterator13['return']();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (_didIteratorError13) {\n\t\t\t\t\tthrow _iteratorError13;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sort) {\n\t\tpickedSeats.sort(pickedSeatsSorterStable);\n\t}\n\n\treturn pickedSeats;\n};\n\n/**\n * @global\n * @typedef {Object} SeatBoundingBox\n * @property {number} left - the leftmost position in the seating areas\n * @property {number} right - the rightmost position in the seating areas\n * @property {number} top - the topmost position in the seating areas\n * @property {number} bottom - the bottommost position in the seating areas\n */\n\n/**\n * Return the actual bounding box of the given seat layout.\n * The bounding box returned by MX does include:\n * <ul>\n *   <li>space between the screen and the seating areas</li>\n *   <li>empty seating rows</li>\n *   <li>screen width</li>\n * </ul>\n * The bounding box returned by this function only includes the seating area.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as returned by MX\n * @return {!SeatBoundingBox} the bounding box of the seating areas\n */\nvar getSeatLayoutBoundingBox = exports.getSeatLayoutBoundingBox = function getSeatLayoutBoundingBox(seatLayout) {\n\tvar box = {\n\t\tleft: 100.0,\n\t\tright: 0.0,\n\t\ttop: 100.0,\n\t\tbottom: 0.0\n\t};\n\n\tseatLayout.areas.forEach(function (area) {\n\t\tvar left = area.left,\n\t\t    top = area.top,\n\t\t    width = area.width,\n\t\t    height = area.height,\n\t\t    columnCount = area.columnCount,\n\t\t    rowCount = area.rowCount,\n\t\t    rows = area.rows;\n\n\t\tvar cellWidth = width / columnCount;\n\t\tvar cellHeight = height / rowCount;\n\n\t\tfor (var i = 0, il = rows.length; i < il; i++) {\n\t\t\tvar seats = rows[i].seats;\n\n\t\t\tfor (var j = 0, jl = seats.length; j < jl; j++) {\n\t\t\t\tvar _seats$j$position = seats[j].position,\n\t\t\t\t    columnIndex = _seats$j$position.columnIndex,\n\t\t\t\t    rowIndex = _seats$j$position.rowIndex;\n\n\t\t\t\tbox.left = Math.min(left + columnIndex * cellWidth, box.left);\n\t\t\t\tbox.right = Math.max(left + (columnIndex + 1) * cellWidth, box.right);\n\t\t\t\tbox.top = Math.min(top + rowIndex * cellHeight, box.top);\n\t\t\t\tbox.bottom = Math.max(top + (rowIndex + 1) * cellHeight, box.bottom);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Clip the bounding box in case of incorrect size\n\tif (box.left > box.right) box.left = box.right;\n\tif (box.top > box.bottom) box.top = box.bottom;\n\n\treturn box;\n};\n\n/**\n * Return whether the seats of a seat layout have a unique name.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as returned by MX\n * @return {!boolean} true if each seat has a unique name, false otherwise\n */\nvar hasUniqueSeatLabels = exports.hasUniqueSeatLabels = function hasUniqueSeatLabels(seatLayout) {\n\tvar set = new Set();\n\tvar areas = seatLayout.areas;\n\n\n\tfor (var i = 0, il = areas.length; i < il; i++) {\n\t\tvar rows = areas[i].rows;\n\n\n\t\tfor (var j = 0, jl = rows.length; j < jl; j++) {\n\t\t\tvar seats = rows[j].seats;\n\n\n\t\t\tfor (var k = 0, kl = rows.length; k < kl; k++) {\n\t\t\t\tvar seatLabel = seats[k].seatLabel;\n\n\n\t\t\t\tif (set.has(seatLabel)) return false;\n\t\t\t\tset.add(seatLabel);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Return the URL of the \"Print your ticket\" page.\n *\n * @return {string} the URL of the showtime ticket.\n */\nvar getRelativeUrl = function getRelativeUrl(pageSlug) {\n\tvar store = _store2['default'].get();\n\n\tvar page = (0, _utils.accessNested)(store, ['appData', 'pages', pageSlug], '');\n\tvar activePage = (0, _utils.accessNested)(store, 'activePage');\n\tvar activePath = (0, _link.getRelativeRoot)(activePage.path);\n\n\t// On staging https, we need to append index.html\n\tvar appendIndex = window.location.pathname.split('/').pop() === 'index.html';\n\n\tvar url = (0, _utils.joinPaths)((0, _utils.pathOnly)(window.location.href), activePath, page.path);\n\tif (appendIndex) url = (0, _utils.joinPaths)(url, 'index.html');\n\n\treturn url;\n};\n\n/**\n* Return the URL of the payment notification page.\n*\n* @return {string} the URL to give to payment gateways as a callback.\n*/\nvar getIframeCommunicatorUrl = exports.getIframeCommunicatorUrl = function getIframeCommunicatorUrl() {\n\treturn getRelativeUrl(IFRAME_COMMUNICATOR_PAGE_SLUG);\n};\nif (typeof window !== 'undefined') window.getIframeCommunicatorUrl = getIframeCommunicatorUrl;\n\n/**\n * Return the URL of the \"Print your ticket\" page.\n *\n * @return {string} the URL of the showtime ticket.\n */\nvar getPrintYourTicketUrl = exports.getPrintYourTicketUrl = function getPrintYourTicketUrl() {\n\treturn getRelativeUrl(PRINT_YOUR_TICKET_PAGE_SLUG);\n};\n\n/**\n * Generate the card number placeholder to be used in payment forms.\n * This function is here to prevent security softwares from flagging raw card numbers as an issue.\n *\n * @return {!string} the card number placeholder\n */\nvar generateCardNumPlaceholder = exports.generateCardNumPlaceholder = function generateCardNumPlaceholder() {\n\tvar a = [];\n\tfor (var i = 0; i < 19; i++) {\n\t\ta[i] = (i + 1) % 5 === 0 ? 0x20 : 0x31 + 3 * (i === 0);\n\t}\n\treturn String.fromCharCode.apply(null, a);\n};\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getCopy = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// Utils related to copy\n\nvar copy = {};\nvar isCopySet = false;\n\n/**\n * Gets copy for the provided key + replace variables inside that copy.\n *\n * @example\n * getCopy('GALLERY_ALT_TITLE', { movieName: 'Rogue One', studioName: 'Disney' });\n * // returns 'Rogue One: Gallery | Disney'\n *\n * getCopy('CURRENCY', { value: 20 });\n * // returns £20\n *\n * getCopy('GET_TICKETS');\n * // returns Get Tickets\n *\n * getCopy('DYNAMIC_TITLE', { movieName: 'Star Trek' });\n * // returns: Star Trek: Hello There | Star Trek\n *\n * getCopy('TICKETS', {}, 'tickets');\n * // TICKETS isn't in the copy object, so it will return the fallback\n * // returns: tickets\n *\n * @note If there are two keys KEY and $KEY defined in copy, you WON'T be able to access\n *       KEY with this function. Use appData instead (or find a different name).\n *\n * @param {string} copyKey - the copy key (with or without the starting $)\n * @param {Object} [opts={}] - options\n * @param {string} [fallback=''] - the fallback value\n * @return {string} the localized string\n */\nvar getCopy = exports.getCopy = function getCopy(copyKey) {\n\tvar opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\tvar fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\tvar fromCopy = arguments[3];\n\n\tif (fromCopy && (typeof fromCopy === 'undefined' ? 'undefined' : _typeof(fromCopy)) !== 'object') {\n\t\tfromCopy = null;\n\t}\n\n\tif (!fromCopy && !isCopySet) {\n\t\t// Haven't retrieved copy yet, so lets do that first\n\t\tvar store = _store2['default'].get();\n\t\tcopy = (store.appData && store.appData.copy ? store.appData.copy : store.copy) || {};\n\t\tisCopySet = true;\n\t}\n\n\tif (!fromCopy) {\n\t\tfromCopy = copy;\n\t}\n\n\tvar copyItem = null;\n\tif (copyKey) {\n\t\tif (copyKey.charAt(0) !== '$') {\n\t\t\tcopyItem = fromCopy['$' + copyKey];\n\t\t\tif (copyItem === undefined) copyItem = fromCopy[copyKey];\n\t\t} else {\n\t\t\tcopyItem = fromCopy[copyKey];\n\t\t\tif (copyItem === undefined) copyItem = fromCopy[copyKey.substr(1)];\n\t\t}\n\t}\n\tif (copyItem === undefined) copyItem = fallback;\n\n\t// Loop through all the options to see replace\n\tObject.keys(opts).forEach(function (key) {\n\t\t// Transform movieName to MOVIE_NAME\n\t\tvar realKey = key;\n\t\tif (key.toUpperCase() !== key) {\n\t\t\trealKey = key.replace(/([A-Z])/g, ' $1').replace(/ /g, '_').toUpperCase();\n\t\t}\n\n\t\tvar regex = new RegExp('%' + realKey + '%', 'g');\n\t\t// Replace the keys with what was provided\n\t\tcopyItem = copyItem.replace(regex, opts[key]);\n\t});\n\n\treturn copyItem;\n};\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// TODO: use Object.assign ?\nvar objectAssign = __webpack_require__(25);\n\n// Live testing http://jsfiddle.net/es9qy5v0/2/\n//   (see documentation/dateFormat.md for more info)\n\n// Based on .Net DateTimeFormat.Format\n// See https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx for list of format specifiers\n// MODIFICATIONS :\n//  - unsupported: g (Era), K (time zone info)\n//  - f and F are only precise up to 3 (= milliseconds)\n//  - t/tt is lowercase and supports T/TT for uppercase alternative\n//  - added oo for ordinal version of the date (e.g. 12th)\n//  - adding more M or d changes the case:\n//     - 1 = number            1\n//     - 2 = padded number     01\n//     - 3 = standard short    Jan\n//     - 4 = standard long     January\n//     - 5 = uppercase short   JAN\n//     - 6 = uppercase long    JANUARY\n//     - 7 = lowercase short   jan\n//     - 8 = lowercase long    january\n// Be careful to use \\\\ instead of \\ when in a json/js string literal to prevent default backslash behaviour\n// (Base implementation used as reference :\n//   'FormatCustomized' @ http://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeformat.cs,429)\nmodule.exports = function formatDateTime(date, format, copy) {\n\tif (!date || !format) return '';\n\tif (!(date instanceof Date)) {\n\t\tdate = new Date(date);\n\t}\n\tif (copy) {\n\t\tcopy = objectAssign({}, localeDefaults, copy);\n\t} else {\n\t\tcopy = localeDefaults;\n\t}\n\tvar result = '';\n\tvar i = void 0,\n\t    l = void 0,\n\t    ch = void 0,\n\t    tokenLen = void 0;\n\tfor (i = 0, l = format.length; i < l; i += tokenLen) {\n\t\ttokenLen = 1;\n\t\tch = format[i];\n\t\tif (baseFunctions.hasOwnProperty(ch)) {\n\t\t\ttokenLen = parseRepeatPattern(format, i, ch, l);\n\t\t\tresult += baseFunctions[ch](date, tokenLen, copy);\n\t\t} else {\n\t\t\tswitch (ch) {\n\t\t\t\tcase ':':\n\t\t\t\t\tresult += copy.$TIME_SEPARATOR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '/':\n\t\t\t\t\tresult += copy.$DATE_SEPARATOR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\'':\n\t\t\t\tcase '\"':\n\t\t\t\t\ttokenLen = parseQuoted(format, i); // Length including quotes\n\t\t\t\t\t// Add the string without quotes\n\t\t\t\t\tresult += format.substr(i + 1, tokenLen - 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\\\':\n\t\t\t\t\ttokenLen = 2;\n\t\t\t\t\tif (i < l - 1) {\n\t\t\t\t\t\tresult += format[i + 1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If \\ is the last character of the string, add it as a literal\n\t\t\t\t\t\tresult += '\\\\';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tresult += ch;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n};\n\n// Default that should be used if no copy is specified\nvar localeDefaults = {\n\t\"$AM\": \"am\",\n\t\"$PM\": \"pm\",\n\t\"$TIME_SEPARATOR\": \":\",\n\t\"$DATE_SEPARATOR\": \"/\",\n\t\"$DAYS_SHORT\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\"$DAYS_FULL\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\"$MONTHS_SHORT\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\"$MONTHS_FULL\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\"$ORD\": [\n\t//0     1     2     3     4     5     6     7     8     9\n\t\"th\", \"st\", \"nd\", \"rd\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t//10   11    12    13    14    15    16    17    18    19\n\t\"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t//20   21    22    23    24    25    26    27    28    29\n\t\"th\", \"st\", \"nd\", \"rd\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t//30   31\n\t\"th\", \"st\"]\n};\n\nvar transforms = [function (str) {\n\treturn str;\n}, function (str) {\n\treturn (str || '').toUpperCase();\n}, function (str) {\n\treturn (str || '').toLowerCase();\n}];\n// Specifiers implementations\nvar baseFunctions = {\n\th: function h(d, l) {\n\t\treturn pad(d.getHours() % 12 || 12, l);\n\t},\n\tH: function H(d, l) {\n\t\treturn pad(d.getHours(), l);\n\t},\n\tm: function m(d, l) {\n\t\treturn pad(d.getMinutes(), l);\n\t},\n\ts: function s(d, l) {\n\t\treturn pad(d.getSeconds(), l);\n\t},\n\tf: function f(d, l, copy, noZeroes) {\n\t\tvar v = d.getMilliseconds();\n\t\tvar vl = l;\n\t\twhile (vl++ < 3) {\n\t\t\tv = ~~(v / 10);\n\t\t}while (vl-- > 4) {\n\t\t\tv *= 10;\n\t\t}if (noZeroes && !v) return '';\n\t\treturn pad(v, l);\n\t},\n\tF: function F(d, l, copy) {\n\t\treturn baseFunctions.f(d, l, copy, true);\n\t},\n\tt: function t(d, l, copy, isUppercase) {\n\t\tvar designator = d.getHours() < 12 ? copy.$AM : copy.$PM;\n\t\tdesignator = isUppercase ? designator.toUpperCase() : designator.toLowerCase();\n\t\tif (l == 1) designator = designator.slice(0, 1);\n\t\treturn designator;\n\t},\n\tT: function T(d, l, copy) {\n\t\treturn baseFunctions.t(d, l, copy, true);\n\t},\n\td: function d(_d, l, copy) {\n\t\tif (l <= 2) return pad(_d.getDate(), l);\n\t\tl -= 3;\n\t\tvar mode = l % 2,\n\t\t    trf = transforms[(l >> 1) % transforms.length];\n\t\treturn trf(copy[mode ? '$DAYS_FULL' : '$DAYS_SHORT'][_d.getDay()]);\n\t},\n\to: function o(d, l, copy) {\n\t\tvar day = d.getDate();\n\t\treturn pad(day, l) + copy.$ORD[day];\n\t},\n\tM: function M(d, l, copy) {\n\t\tif (l <= 2) return pad(d.getMonth() + 1, l);\n\t\tl -= 3;\n\t\tvar mode = l % 2,\n\t\t    trf = transforms[(l >> 1) % transforms.length];\n\t\treturn trf(copy[mode ? '$MONTHS_FULL' : '$MONTHS_SHORT'][d.getMonth()]);\n\t},\n\ty: function y(d, l) {\n\t\tvar v = d.getFullYear();\n\t\tif (l <= 2) v %= 100;\n\t\treturn pad(v, l);\n\t},\n\tz: function z(d, l, copy) {\n\t\tvar v = d.getTimezoneOffset();\n\t\tvar ret = v < 0 ? '-' : '+';\n\t\tv = Math.abs(v);\n\t\tvar hours = ~~(v / 60);\n\t\tret += pad(hours, l <= 2 ? l : 2);\n\t\t// Add minutes\n\t\tif (l > 2) ret += copy.$TIME_SEPARATOR + pad(v - 60 * hours, 2);\n\t\treturn ret;\n\t}\n};\n\n// Detect how many of the same character are in a row\nfunction parseRepeatPattern(format, pos, ch, l) {\n\tvar i = pos + 1;\n\tif (l == undefined) l = format.length;\n\tfor (; i < l && format[i] === ch; i++) {}\n\treturn i - pos;\n}\n// Detect a quoted string length (starting at a specified position)\nfunction parseQuoted(format, pos) {\n\tvar quote = format[pos];\n\tvar next = pos;\n\tdo {\n\t\tnext = format.indexOf(quote, next + 1);\n\t} while (next !== -1 && format[next - 1] === '\\\\');\n\tif (next === -1) next = format.length;\n\treturn next - pos + 1;\n}\n\n// Cast a positive int to string making sure it is at least the specified length\n// If the string representation of the number is less than desired, 0s are added in front of it\nfunction pad(n, l) {\n\tvar v = n + '',\n\t    vl = v.length;\n\twhile (vl++ < l) {\n\t\tv = '0' + v;\n\t}return v;\n}\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar state = {\n\tcategories: [],\n\tchangeListeners: []\n};\n\nvar STRICTLY_NECESSARY = exports.STRICTLY_NECESSARY = 'STRICTLY_NECESSARY';\nvar FUNCTIONAL = exports.FUNCTIONAL = 'FUNCTIONAL';\nvar TARGETING = exports.TARGETING = 'TARGETING';\nvar ADVERTISING = exports.ADVERTISING = 'ADVERTISING';\n\nvar dict = {\n\t'1': STRICTLY_NECESSARY,\n\t'3': FUNCTIONAL,\n\t'4': TARGETING\n};\n\nvar set = exports.set = function set(ids) {\n\tstate.categories = (Array.isArray(ids) ? ids : ids.split(',')).map(function (id) {\n\t\treturn dict[id];\n\t}).filter(function (a) {\n\t\treturn !!a;\n\t});\n\tstate.changeListeners.forEach(function (listener) {\n\t\treturn listener(state.categories);\n\t});\n};\n\nvar get = exports.get = function get() {\n\treturn state.categories;\n};\n\nvar has = exports.has = function has(categories, category) {\n\tif (typeof categories === 'string') {\n\t\treturn has(state.categories, categories);\n\t}\n\n\treturn categories.indexOf(category) !== -1;\n};\n\nvar addChangeListener = exports.addChangeListener = function addChangeListener(fn) {\n\tstate.changeListeners = [].concat(_toConsumableArray(state.changeListeners), [fn]);\n};\n\nvar removeChangeListener = exports.removeChangeListener = function removeChangeListener(fn) {\n\tstate.changeListeners = state.changeListeners.filter(function (a) {\n\t\treturn a !== fn;\n\t});\n};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(process) {\n\n//#build\nvar global = typeof global !== 'undefined' ?\n\tglobal :\n\ttypeof self !== 'undefined' ?\n\t\tself :\n\t\ttypeof window !== 'undefined' ?\n\t\t\twindow :\n\t\t\t{};\n\nvar Utils = {\n\textend: function( ob, props ){\n\t\tfor( var p in props ){\n\t\t\tob[p] = props[p];\n\t\t}\n\t\treturn ob;\n\t},\n\n\tcreateNonEnumerable: function( obj, proto ){\n\t\tvar ne = {};\n\t\tfor( var key in obj )\n\t\t\tne[key] = {value: obj[key] };\n\t\treturn Object.create( proto || {}, ne );\n\t},\n\n\terror: function( message ){\n\t\tvar err = new Error( message );\n\t\tif( console )\n\t\t\treturn console.error( err );\n\t\telse\n\t\t\tthrow err;\n\t},\n\n\teach: function( o, clbk ){\n\t\tvar i,l,keys;\n\t\tif( o && o.constructor === Array ){\n\t\t\tfor (i = 0, l = o.length; i < l; i++)\n\t\t\t\tclbk( o[i], i );\n\t\t}\n\t\telse {\n\t\t\tkeys = Object.keys( o );\n\t\t\tfor( i = 0, l = keys.length; i < l; i++ )\n\t\t\t\tclbk( o[ keys[i] ], keys[i] );\n\t\t}\n\t},\n\n\taddNE: function( node, attrs ){\n\t\tfor( var key in attrs ){\n\t\t\tObject.defineProperty( node, key, {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t\tvalue: attrs[ key ]\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Creates non-enumerable property descriptors, to be used by Object.create.\n\t * @param  {Object} attrs Properties to create descriptors\n\t * @return {Object}       A hash with the descriptors.\n\t */\n\tcreateNE: function( attrs ){\n\t\tvar ne = {};\n\n\t\tfor( var key in attrs ){\n\t\t\tne[ key ] = {\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: attrs[ key ]\n\t\t\t}\n\t\t}\n\n\t\treturn ne;\n\t},\n\n\t// nextTick - by stagas / public domain\n\tnextTick: (function () {\n    var queue = [],\n\t\tdirty = false,\n\t\tfn,\n\t\thasPostMessage = !!global.postMessage && (typeof Window !== 'undefined') && (global instanceof Window),\n\t\tmessageName = 'nexttick',\n\t\ttrigger = (function () {\n\t\t\treturn hasPostMessage\n\t\t\t\t? function trigger () {\n\t\t\t\tglobal.postMessage(messageName, '*');\n\t\t\t}\n\t\t\t: function trigger () {\n\t\t\t\tsetTimeout(function () { processQueue() }, 0);\n\t\t\t};\n\t\t}()),\n\t\tprocessQueue = (function () {\n\t\t\treturn hasPostMessage\n\t\t\t\t? function processQueue (event) {\n\t\t\t\t\tif (event.source === global && event.data === messageName) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tflushQueue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t: flushQueue;\n    \t})()\n    ;\n\n    function flushQueue () {\n\t\t\t\tdirty = false;\n        while (fn = queue.shift()) {\n            fn();\n        }\n    }\n\n    function nextTick (fn) {\n        queue.push(fn);\n        if (dirty) return;\n        dirty = true;\n        trigger();\n    }\n\n    if (hasPostMessage) global.addEventListener('message', processQueue, true);\n\n    nextTick.removeListener = function () {\n        global.removeEventListener('message', processQueue, true);\n    }\n\n    return nextTick;\n  })(),\n\n  findPivot: function( node ){\n  \t\tif( !node || !node.__ )\n  \t\t\treturn;\n\n  \t\tif( node.__.pivot )\n  \t\t\treturn node;\n\n  \t\tvar found = 0,\n  \t\t\tparents = node.__.parents,\n  \t\t\ti = 0,\n  \t\t\tparent\n  \t\t;\n\n  \t\t// Look up for the pivot in the parents\n  \t\twhile( !found && i < parents.length ){\n  \t\t\tparent = parents[i];\n  \t\t\tif( parent.__.pivot )\n  \t\t\t\tfound = parent;\n  \t\t\ti++;\n  \t\t}\n\n  \t\tif( found ){\n  \t\t\treturn found;\n  \t\t}\n\n  \t\t// If not found, try with the parent's parents\n  \t\ti=0;\n  \t\twhile( !found && i < parents.length ){\n\t  \t\tfound = this.findPivot( parents[i] );\n\t  \t\ti++;\n\t  \t}\n\n  \t\treturn found;\n  },\n\n\tisLeaf: function( node, freezeInstances ){\n\t\tvar cons;\n\t\treturn !node || !(cons = node.constructor) || (freezeInstances ?\n\t\t\t(cons === String || cons === Number || cons === Boolean) :\n\t\t\t(cons !== Object && cons !== Array)\n\t\t);\n\t},\n\n\twarn: function(){\n\t\tvar args;\n\t\tif( typeof process === 'undefined' || \"production\" !== 'production' ){\n\t\t\tif( !arguments[0] && typeof console !== 'undefined' ){\n\t\t\t\targs = Array.prototype.slice.call( arguments, 1 );\n\t\t\t\targs[0] = 'Freezer.js WARNING: ' + args[0];\n\t\t\t\tconsole.warn.apply( console, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n//#build\n\n\nmodule.exports = Utils;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(24)))\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/*** IMPORTS FROM imports-loader ***/\n(function() {\n\n(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ]\n\n    var isDataView = function(obj) {\n      return obj && DataView.prototype.isPrototypeOf(obj)\n    }\n\n    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    }\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1])\n      }, this)\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var oldValue = this.map[name]\n    this.map[name] = oldValue ? oldValue+','+value : value\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name)\n    return this.has(name) ? this.map[name] : null\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value)\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this)\n      }\n    }\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsArrayBuffer(blob)\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsText(blob)\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf)\n    var chars = new Array(view.length)\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i])\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength)\n      view.set(new Uint8Array(buf))\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (!body) {\n        this._bodyText = ''\n      } else if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer)\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer])\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body)\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      }\n    }\n\n    this.text = function() {\n      var rejected = consumed(this)\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = String(input)\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, { body: this._bodyInit })\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers()\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':')\n      var key = parts.shift().trim()\n      if (key) {\n        var value = parts.join(':').trim()\n        headers.append(key, value)\n      }\n    })\n    return headers\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = options.status === undefined ? 200 : options.status\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n    this.headers = new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init)\n      var xhr = new XMLHttpRequest()\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        }\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = global.fetch;\n}.call(global));\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _shallowEquals = __webpack_require__(28);\n\nvar _shallowEquals2 = _interopRequireDefault(_shallowEquals);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Tells if a component should update given it's next props\n * and state.\n *\n * @param object nextProps Next props.\n * @param object nextState Next state.\n */\nfunction shouldComponentUpdate(nextProps, nextState) {\n  return !(0, _shallowEquals2['default'])(nextProps, this.props, isSameProp) || !(0, _shallowEquals2['default'])(nextState, this.state);\n}\n\n/**\n * Makes the given component \"pure\".\n *\n * @param object component Component.\n */\nfunction pureRenderDecorator(component) {\n  component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n}\n\nfunction isSameProp(a, b) {\n  return a === b || Array.isArray(a) && Array.isArray(b) && !a.length && !b.length;\n}\n\nmodule.exports = pureRenderDecorator;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = route;\nfunction route(url, pageId) {\n\tif (typeof history !== 'undefined') {\n\t\t// Push the new url to the pushState\n\t\t// the history listen even in the update file will take care of the rest\n\t\t// debugger;\n\t\thistory.pushState({ pageId: pageId }, '', url);\n\t}\n}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.filterTheater = filterTheater;\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _Geo = __webpack_require__(8);\n\nvar _Geo2 = _interopRequireDefault(_Geo);\n\nvar _ticketingPublic = __webpack_require__(9);\n\nvar _utils = __webpack_require__(2);\n\nvar _formatDateTime = __webpack_require__(11);\n\nvar _formatDateTime2 = _interopRequireDefault(_formatDateTime);\n\nvar _dataProviderToTicketProvider = __webpack_require__(19);\n\nvar _dataProviderToTicketProvider2 = _interopRequireDefault(_dataProviderToTicketProvider);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Finds the first non-undefined and non-null value (equivalent to v1 || v2 || v3 ... except returns the value if it's not null/undefined, even if falsy like 0, '' or false)\nfunction customDefault() {\n\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\targs[_key] = arguments[_key];\n\t}\n\n\treturn args.find(function (v) {\n\t\treturn v != undefined;\n\t});\n}\n\n// Makes sure mainTheater has fandango and movietickets ids from alternateTheater if it doesn't have its own\nfunction checkTicketProviderIds(mainTheater, alternateTheater) {\n\tif (_dataProviderToTicketProvider2['default'][alternateTheater.providerId]) {\n\t\treturn attachTicketProvider(mainTheater, alternateTheater);\n\t}\n\tif (!mainTheater.tms_id) mainTheater.tms_id = alternateTheater.tms_id;\n\tif (!mainTheater.fandango) mainTheater.fandango = alternateTheater.fandango;\n\tif (!mainTheater.movietickets) mainTheater.movietickets = alternateTheater.movietickets;\n\tmainTheater.movies.forEach(function (m) {\n\t\tif (m.fandango && m.movietickets) return;\n\t\tmainTheater.screenings.find(function (screening) {\n\t\t\tif (screening.movie.id !== m.id || !screening.datetime) return;\n\t\t\tvar matching = alternateTheater.screenings.filter(function (sc2) {\n\t\t\t\treturn +sc2.datetime === +screening.datetime;\n\t\t\t});\n\t\t\tif (matching.length !== 1) return;\n\t\t\tif (!m.fandango) m.fandango = matching[0].movie.fandango;\n\t\t\tif (!m.movietickets) m.movietickets = matching[0].movie.movietickets;\n\t\t\treturn true;\n\t\t});\n\t});\n}\nfunction attachTicketProvider(theater, alternateTheater) {\n\talternateTheater.screenings.forEach(function (screening) {\n\t\tif (!screening.srcTicketProviders) {\n\t\t\treturn;\n\t\t}\n\t\tvar matching = theater.screenings.find(function (s2) {\n\t\t\treturn s2.date === screening.date && s2.time24 === screening.time24;\n\t\t});\n\t\tif (matching) {\n\t\t\tmatching.srcTicketProviders = Object.assign({}, matching.srcTicketProviders, screening.srcTicketProviders);\n\t\t}\n\t});\n}\n\nvar Theater = function () {\n\t// TODO: pass in currentPage to avoid hardcoded \"pages.showtimes.data\"\n\tfunction Theater(id, attr, _ref) {\n\t\tvar screenings = _ref.screenings,\n\t\t    exhibitor = _ref.exhibitor,\n\t\t    clientGeo = _ref.clientGeo,\n\t\t    appData = _ref.appData,\n\t\t    theaterMasters = _ref.theaterMasters,\n\t\t    theaterMasterDoc = _ref.theaterMasterDoc,\n\t\t    firstBatch = _ref.firstBatch,\n\t\t    pinned = _ref.pinned,\n\t\t    activePage = _ref.activePage;\n\n\t\t_classCallCheck(this, Theater);\n\n\t\tvar copy = appData.copy;\n\t\tvar providers = (0, _utils.accessNested)(activePage, 'data.providers') || (0, _utils.accessNested)(appData, 'pages.showtimes.data.providers') || {};\n\t\tvar regionProviders = (0, _utils.accessNested)(appData, 'pages.showtimes.data.providerLocation');\n\t\tthis.id = id;\n\t\tthis.pinned = attr.pinned !== undefined ? attr.pinned : !!pinned;\n\t\tthis.active = false;\n\t\tthis.name = attr.name;\n\t\tvar addr = attr.address;\n\t\tvar city = attr.city;\n\t\tif (appData.options.useEnglishCopy) {\n\t\t\tthis.name = attr.name_en || attr.name;\n\t\t\taddr = attr.address_en || attr.address;\n\t\t\tcity = attr.city_en || attr.city;\n\t\t}\n\t\tthis.screenings = screenings;\n\t\tvar addedMoviesCache = {};\n\t\tthis.movies = screenings.reduce(function (a, s) {\n\t\t\tif (!s.movie || addedMoviesCache[s.movie.id]) return a;\n\t\t\taddedMoviesCache[s.movie.id] = true;\n\t\t\ta.push(s.movie);\n\t\t\treturn a;\n\t\t}, []);\n\n\t\tthis.activeScreenings = screenings;\n\t\t// if (filters) {\n\t\t// \tthis.activeScreenings = this.activeScreenings.filter((s) => {\n\t\t// \t\tlet passes = inactiveScreeningsFilter(filters.format, s.movie.format);\n\t\t// \t\treturn passes;\n\t\t// \t});\n\t\t// }\n\t\tthis.filteredScreenings = screenings;\n\t\tthis.filterPass = this.filteredScreenings.length ? true : false;\n\t\tthis.exhibitor = exhibitor;\n\t\tthis.logo = exhibitor && exhibitor.logo ? exhibitor.logo : 'default.png';\n\t\tthis.activeExhibitor = true;\n\t\tthis.activeScreening = null;\n\t\tvar addressParts = [addr, city];\n\t\t// For webedia US, also add the state to the displayed address\n\t\tif (attr.country === 'us' && (attr.provider_id === 'webus' || attr.provider_id === 'wwm' || attr.provider_id === 'mx') && attr.state) {\n\t\t\taddressParts.push(attr.state);\n\t\t}\n\t\tvar fullAddress = addressParts.filter(function (e) {\n\t\t\treturn e;\n\t\t}).join(', ');\n\t\tthis.location = {\n\t\t\t'country': attr.country,\n\t\t\t'fullAddress': fullAddress,\n\t\t\t'address': addr,\n\t\t\t'city': city,\n\t\t\t'state': attr.state\n\t\t};\n\t\tvar website = attr.url;\n\t\tif (website) {\n\t\t\t// Apparently sometimes the importers are giving us multiple websites separated by , or space\n\t\t\t// (think this should rather be fixed in the backend)\n\t\t\twebsite = website.split(',')[0].split(' ')[0];\n\t\t\tif (website.lastIndexOf('http://', 0) !== 0 && website.lastIndexOf('https://', 0) !== 0) website = 'http://' + website;\n\t\t\tthis.website = website;\n\t\t}\n\t\t// if(!this.website && exhibitor && exhibitor.domain) {\n\t\t// \tthis.website = 'http://' + exhibitor.domain;\n\t\t// }\n\t\tthis.masterId = attr.theater_master_id;\n\t\tthis.masterDoc = theaterMasterDoc || {};\n\t\tthis.providerId = attr.provider_id;\n\t\tthis.providerTheaterId = attr.provider_theater_id;\n\t\tthis.pid = this.providerId + ':' + this.providerTheaterId;\n\t\tthis.providerExhibitorId = attr.provider_exhibitor_id;\n\t\tthis.geo = new _Geo2['default']({ lat: attr.lat, lon: attr.lon, countryCode: attr.country, city: city });\n\t\tthis.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT);\n\t\tthis.distanceUnit = copy.$DISTANCE_UNIT;\n\t\tthis.enabled = this.screenings.length > 0;\n\n\t\tvar disabledList = (0, _utils.asList)((0, _utils.accessNested)(appData, 'pages.showtimes.data.disabledTheaters', []));\n\t\tif (disabledList.indexOf(this.id) !== -1 || disabledList.indexOf(this.pid) !== -1) {\n\t\t\tthis.enabled = false;\n\t\t}\n\n\t\tif (attr.wwm_ticketing) {\n\t\t\tif (attr.wwm_tickettype === 'MTC') {\n\t\t\t\tthis.movietickets = attr.movietickets_theater_id;\n\t\t\t}\n\t\t\tthis.fandango = attr.fandango_theater_id;\n\t\t\tthis.tms_id = attr.tms_id;\n\t\t}\n\t\tthis.atom = attr.atom_theater_id;\n\t\tthis.firstBatch = firstBatch;\n\n\t\tvar getRank = function getRank(t) {\n\t\t\treturn +customDefault((0, _utils.accessNested)(regionProviders, [t.location.country, t.providerId, 'rank']), (providers[t.providerId] || {}).rank, 100);\n\t\t};\n\n\t\tif (theaterMasters && this.masterId && this.enabled) {\n\t\t\tvar currMaster = theaterMasters[this.masterId];\n\t\t\tif (currMaster && providers) {\n\t\t\t\tvar currRank = getRank(this);\n\t\t\t\tvar masterRank = getRank(currMaster);\n\t\t\t\tif (this.hasBadDeeplinks()) {\n\t\t\t\t\tcurrRank = Infinity;\n\t\t\t\t}\n\t\t\t\tif (currMaster.hasBadDeeplinks()) {\n\t\t\t\t\tmasterRank = Infinity;\n\t\t\t\t}\n\t\t\t\tif (currRank < masterRank) {\n\t\t\t\t\tcheckTicketProviderIds(this, currMaster);\n\t\t\t\t\tcurrMaster.enabled = false;\n\t\t\t\t\ttheaterMasters[this.masterId] = this;\n\t\t\t\t} else {\n\t\t\t\t\tcheckTicketProviderIds(currMaster, this);\n\t\t\t\t\t// After potentially getting new fandango ids, recalculate the urls\n\t\t\t\t\tcurrMaster.computeUrls(appData, activePage);\n\t\t\t\t\tthis.enabled = false;\n\t\t\t\t}\n\t\t\t} else theaterMasters[this.masterId] = this;\n\t\t}\n\n\t\t// TODO: currentPage\n\t\tvar exhibitorDomain = (0, _utils.accessNested)(this, 'exhibitor.domain', '');\n\t\tvar mfixList = (0, _utils.asList)((0, _utils.accessNested)(appData, 'pages.showtimes.data.midnightFix', {}));\n\t\tvar midnightFix = mfixList.indexOf(exhibitorDomain) !== -1;\n\t\tthis.screenings.forEach(function (screening) {\n\t\t\tif (midnightFix && screening.nextDayDatetime) {\n\t\t\t\tscreening.offsetDate(-1, 0, 0, appData.copy);\n\t\t\t}\n\t\t});\n\t\tthis.computeUrls(appData, activePage);\n\t}\n\n\t// Returns whether this theater has bad quality deeplinks\n\t// For instance, MX without instant ticketing may have theater homepage links only\n\t// Those theater should have the lowest priority in the ranking\n\n\n\t_createClass(Theater, [{\n\t\tkey: 'hasBadDeeplinks',\n\t\tvalue: function hasBadDeeplinks() {\n\t\t\tif (this.providerId === 'mx' && !(0, _ticketingPublic.isDirectTicketingEnabled)(this)) {\n\t\t\t\tvar mxLinks = (0, _utils.accessNested)(this.masterDoc, 'mxLinks');\n\t\t\t\tif (typeof mxLinks === 'undefined') {\n\t\t\t\t\tmxLinks = (0, _utils.accessNested)(this.masterDoc, 'mx_links', false);\n\t\t\t\t}\n\t\t\t\treturn mxLinks !== true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Computes the screenings urls of a theater (fandango etc.)\n\n\t}, {\n\t\tkey: 'computeUrls',\n\t\tvalue: function computeUrls(appData, activePage) {\n\t\t\tvar _this = this;\n\n\t\t\tvar exhibitorDomain = (0, _utils.accessNested)(this, 'exhibitor.domain', '');\n\n\t\t\t// TODO: currentPage\n\t\t\tvar deeplinksObj = (0, _utils.accessNested)(appData, 'pages.showtimes.data.overrideDeeplinks', {});\n\t\t\tvar overrideDeeplinks = deeplinksObj[exhibitorDomain] || deeplinksObj['*'] || deeplinksObj;\n\t\t\tvar isValidDLContext = function isValidDLContext(ctx) {\n\t\t\t\treturn ctx.url || ctx.url === false || ctx.movietickets;\n\t\t\t};\n\n\t\t\tif (typeof overrideDeeplinks === 'string') {\n\t\t\t\toverrideDeeplinks = [{ url: overrideDeeplinks }];\n\t\t\t} else if (isValidDLContext(overrideDeeplinks)) {\n\t\t\t\toverrideDeeplinks = [overrideDeeplinks];\n\t\t\t} else if (!Array.isArray(overrideDeeplinks)) {\n\t\t\t\toverrideDeeplinks = Object.keys(overrideDeeplinks).map(function (k) {\n\t\t\t\t\t// If it's a domain obj, do not list it\n\t\t\t\t\tif (k.match(/^\\w{2,}\\.\\w{2,}$/)) return;\n\t\t\t\t\treturn overrideDeeplinks[k];\n\t\t\t\t});\n\t\t\t}\n\t\t\toverrideDeeplinks = overrideDeeplinks.filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t}).sort(function (a, b) {\n\t\t\t\tif (a.order == b.order) return 0;\n\t\t\t\tif (a.order == undefined) return 1;\n\t\t\t\tif (b.order == undefined) return -1;\n\t\t\t\treturn b.order - a.order;\n\t\t\t});\n\n\t\t\t// Checks an overrideDeeplink context object\n\t\t\tvar checkDLContext = function checkDLContext(ctx, s) {\n\t\t\t\tif (!isValidDLContext(ctx)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Check that every recognized key in the context object is validated for this screening\n\t\t\t\treturn Object.keys(ctx).every(function (key) {\n\t\t\t\t\tvar val = ctx[key];\n\t\t\t\t\tif (!val) return true;\n\t\t\t\t\tswitch (key) {\n\t\t\t\t\t\tcase 'exhibitor':\n\t\t\t\t\t\tcase 'domain':\n\t\t\t\t\t\t\treturn val.split(',').map(function (e) {\n\t\t\t\t\t\t\t\treturn e.trim();\n\t\t\t\t\t\t\t}).indexOf(exhibitorDomain) !== -1;\n\t\t\t\t\t\tcase 'movie':\n\t\t\t\t\t\t\tvar movie = s.movie;\n\t\t\t\t\t\t\treturn val === movie.id || val === movie.provider_id + ':' + movie.provider_movie_id;\n\t\t\t\t\t\tcase 'format':\n\t\t\t\t\t\t\treturn val === s.movie.format.slug;\n\t\t\t\t\t\tcase 'hour':\n\t\t\t\t\t\t\tif (val.length > 2) {\n\t\t\t\t\t\t\t\treturn +val.slice(0, 2) === s.hour && +val.slice(2) === s.minute;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn +val === s.hour;\n\t\t\t\t\t\tcase 'minute':\n\t\t\t\t\t\t\treturn +val === s.minute;\n\t\t\t\t\t\tcase 'day':\n\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\tvar dateFormat = 'ddMM';\n\t\t\t\t\t\t\tif (val.match(/^\\d{2}-\\d{2}$/)) {\n\t\t\t\t\t\t\t\tdateFormat = 'MM-dd';\n\t\t\t\t\t\t\t} else if (val.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n\t\t\t\t\t\t\t\tdateFormat = 'yyyy-MM-dd';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn val === (0, _formatDateTime2['default'])(s.stDate.date, dateFormat);\n\t\t\t\t\t\tcase 'theater':\n\t\t\t\t\t\t\tvar potentialMatches = [_this.id, _this.pid];\n\t\t\t\t\t\t\treturn val.split(',').find(function (val) {\n\t\t\t\t\t\t\t\treturn potentialMatches.indexOf(val.trim()) !== -1;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase 'nameContains':\n\t\t\t\t\t\t\treturn _this.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;\n\t\t\t\t\t}\n\t\t\t\t\t// Not a valid condition, ignore\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tvar affiliate = appData.meta.affiliate || 'pow';\n\t\t\tvar tProviders = this.providers = [];\n\t\t\tvar ticketProviders = (0, _utils.accessNested)(appData, 'pages.showtimes.data.ticketProviders', {});\n\n\t\t\tif (activePage && activePage.data && activePage.data.ticketProviders && _typeof(activePage.data.ticketProviders) === 'object' && activePage.data.ticketProviders.override) {\n\t\t\t\tticketProviders = activePage.data.ticketProviders;\n\t\t\t}\n\n\t\t\t// Retro-compatibility for apps that relied on the global showtimes page value (TODO: remove that when not needed anymore)\n\t\t\tvar useCinemaUrls = customDefault((0, _utils.accessNested)(activePage, 'data.useCinemaUrls'), (0, _utils.accessNested)(appData, 'pages.showtimes.data.useCinemaUrls'), true);\n\t\t\tif (_dataProviderToTicketProvider2['default'][this.providerId]) {\n\t\t\t\tuseCinemaUrls = false;\n\t\t\t}\n\n\t\t\tvar affiliateCodeExhibitors = ['amccinemas.co.uk', 'amctheatres.com', 'amccinemas.com.hk'];\n\t\t\tvar movieSlug = (0, _utils.accessNested)(appData, 'meta.title.slug', '');\n\t\t\tvar addAffiliateCode = function addAffiliateCode(url) {\n\t\t\t\t// (Vue only at the moment - add the movie name to the affiliate code)\n\t\t\t\treturn url.replace(/([?&])SC_CMP=AFF_POW(&|$)/, '$1SC_CMP=AFF_POW_' + movieSlug + '$2');\n\t\t\t};\n\t\t\tif (affiliateCodeExhibitors.indexOf(exhibitorDomain) !== -1) {\n\t\t\t\taddAffiliateCode = function addAffiliateCode(url) {\n\t\t\t\t\tvar parts = url.split('#');\n\t\t\t\t\turl = parts.shift();\n\t\t\t\t\tvar hash = parts.length ? '#' + parts.join('#') : '';\n\t\t\t\t\tvar qsPos = url.indexOf('?');\n\n\t\t\t\t\tvar parsedQS = {};\n\t\t\t\t\tif (qsPos !== -1) {\n\t\t\t\t\t\tparsedQS = _qs2['default'].parse(url.slice(qsPos + 1), { strictNullHandling: true });\n\t\t\t\t\t\turl = url.slice(0, qsPos);\n\t\t\t\t\t}\n\t\t\t\t\tparsedQS.affiliateCode = 'pow';\n\t\t\t\t\treturn url + '?' + _qs2['default'].stringify(parsedQS, { strictNullHandling: true }) + hash;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.screenings.forEach(function (screening) {\n\t\t\t\tvar matchingDeeplink = overrideDeeplinks.find(function (dl) {\n\t\t\t\t\treturn checkDLContext(dl, screening);\n\t\t\t\t}) || overrideDeeplinks;\n\t\t\t\tif (!screening.preventDeeplinkOverride && matchingDeeplink && (matchingDeeplink.url || matchingDeeplink.url === false)) {\n\t\t\t\t\tscreening.url = matchingDeeplink.url;\n\t\t\t\t}\n\n\t\t\t\tvar urls = screening.urls = {};\n\t\t\t\tvar screeningUrl = screening.url;\n\t\t\t\t// If we the screeningsUrl is not set to false, but we want to use cinema url.\n\t\t\t\tif (!screeningUrl && screeningUrl !== false && useCinemaUrls && _this.website) {\n\t\t\t\t\tscreeningUrl = _this.website;\n\t\t\t\t}\n\t\t\t\tif (screeningUrl && urlContainsBlacklistTheater(screeningUrl) === false) {\n\t\t\t\t\tif (tProviders.indexOf('cinema') === -1) tProviders.push('cinema');\n\t\t\t\t\turls.cinema = addAffiliateCode(screeningUrl);\n\t\t\t\t}\n\n\t\t\t\tif (screening.srcTicketProviders) {\n\t\t\t\t\tObject.keys(screening.srcTicketProviders).forEach(function (ticketProvider) {\n\t\t\t\t\t\turls[ticketProvider] = screening.srcTicketProviders[ticketProvider];\n\t\t\t\t\t\tif (tProviders.indexOf(ticketProvider) === -1) tProviders.push(ticketProvider);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tvar movie = screening.movie;\n\n\t\t\t\tvar movieFandango = screening.doc && screening.doc.movie_code_id || movie.fandango;\n\t\t\t\tif (screening.fandangoUrl) {\n\t\t\t\t\tif (tProviders.indexOf('fandango') === -1) tProviders.push('fandango');\n\t\t\t\t\turls.fandango = screening.fandangoUrl;\n\t\t\t\t} else if (_this.fandango && !!ticketProviders.fandango && movieFandango && screening.datetime && _this.tms_id) {\n\t\t\t\t\tif (tProviders.indexOf('fandango') === -1) tProviders.push('fandango');\n\t\t\t\t\tvar formattedDate = (0, _formatDateTime2['default'])(screening.datetime, 'MM\\\\-dd\\\\-yyyy\\\\+HH\\\\:mm');\n\t\t\t\t\turls.fandango = 'http://www.fandango.com/redirect.aspx?&mid=' + movieFandango + '&a=&tid=' + _this.tms_id + '&dte=0&date=' + formattedDate;\n\t\t\t\t}\n\n\t\t\t\tif (_this.movietickets && !!ticketProviders.movietickets && movie.movietickets && screening.datetime) {\n\t\t\t\t\tif (tProviders.indexOf('movietickets') === -1) tProviders.push('movietickets');\n\t\t\t\t\tif (matchingDeeplink && matchingDeeplink.movietickets) {\n\t\t\t\t\t\turls.movietickets = matchingDeeplink.movietickets;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (_this.location.country === 'ca') {\n\t\t\t\t\t\t\t// Hacky: movietickets CA uses webedia 2d ids, like atom. Use atom id.\n\t\t\t\t\t\t\tvar movieId = screening.movieticketsMovieId || movie.atom || movie.movietickets;\n\t\t\t\t\t\t\tvar dateTime = (0, _formatDateTime2['default'])(screening.datetime, 'MM\\\\-dd\\\\-yyyy+HH\\\\:mm');\n\t\t\t\t\t\t\t// Do not encodeURIComponent... Encoded + is not recognized\n\t\t\t\t\t\t\turls.movietickets = 'http://www.movietickets.ca/purchase/?theater-id=' + _this.movietickets + '&movie-id=' + movieId + '&date-time=' + dateTime;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar _movieId = screening.movieticketsMovieId || movie.movietickets;\n\t\t\t\t\t\t\tvar day = (0, _formatDateTime2['default'])(screening.datetime, 'MMddyyyy');\n\t\t\t\t\t\t\tvar time = (0, _formatDateTime2['default'])(screening.datetime, 'HH\\\\:mm');\n\t\t\t\t\t\t\turls.movietickets = 'http://www.movietickets.com/purchase.asp?house_id=' + _this.movietickets + '&movie_id=' + _movieId + '&perfd=' + day + '&perft=' + time + '&afid=' + affiliate;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (_this.atom && !!ticketProviders.atom && movie.atom && screening.datetime && screening.tz_offset) {\n\t\t\t\t\tif (tProviders.indexOf('atom') === -1) tProviders.push('atom');\n\t\t\t\t\t// urls.atom = `atom:///ViewVenueDetails?venueId=${this.atom}`;\n\t\t\t\t\tvar _formattedDate = void 0;\n\t\t\t\t\tif (screening.nextDayDatetime) {\n\t\t\t\t\t\t_formattedDate = (0, _formatDateTime2['default'])(screening.nextDayDatetime, 'yyyy\\\\-MM\\\\-dd\\\\THH\\\\:mm\\\\:ss');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_formattedDate = (0, _formatDateTime2['default'])(screening.datetime, 'yyyy\\\\-MM\\\\-dd\\\\THH\\\\:mm\\\\:ss');\n\t\t\t\t\t}\n\t\t\t\t\tif (movie.hasOwnProperty('customAtomURL')) {\n\t\t\t\t\t\turls.atom = movie.customAtomURL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\turls.atom = 'https://www.atomtickets.com/checkout/redirect?venueId=' + _this.atom + '&productionId=' + movie.atom + '&showtime=' + _formattedDate + screening.tz_offset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t// let ticketProviders = appData.pages.showtimes.data.ticketProviders;\n\t\t\ttProviders.sort(function (a, b) {\n\t\t\t\treturn (ticketProviders[a] && ticketProviders[a].order || 0) - (ticketProviders[b] && ticketProviders[b].order || 0);\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn Theater;\n}();\n\n// Update the screenings\n\n\nexports['default'] = Theater;\nfunction validateFilter(filter, obj, tester) {\n\tif (!filter) return true;\n\tif (!obj) return filter.allowNulls || !filter.current || !filter.current.length;\n\tvar mp = filter.matchProp || 'id';\n\tif (typeof tester !== 'function') {\n\t\tvar isArray = Array.isArray(obj);\n\t\ttester = function tester(v) {\n\t\t\treturn isArray ? obj.indexOf(v[mp]) !== -1 : obj[mp] === v[mp];\n\t\t};\n\t}\n\tif (filter.excluded && filter.excluded.find(function (v) {\n\t\treturn tester(v, obj, filter);\n\t})) return false;\n\treturn !filter.current || !filter.current.length || filter.current.find(function (v) {\n\t\treturn tester(v, obj, filter);\n\t});\n}\n\nfunction inactiveScreeningsFilter(filter, obj) {\n\tif (!obj || !filter || !filter.disabled || !filter.disabled.length) return true;\n\tvar mp = filter.matchProp || 'id';\n\tvar val = obj[mp];\n\n\treturn !filter.disabled.find(function (v) {\n\t\treturn v[mp] == val;\n\t});\n}\n\nfunction validateMovie(val, obj) {\n\tif (!val) return false;\n\tif (obj.id === val.id || obj.provider_id + ':' + obj.provider_movie_id === val.id) return true;\n\treturn val.slug && val.slug === obj.slug;\n}\n\nfunction validateFormat(theater) {\n\treturn function (val, obj, filter) {\n\t\tvar mp = filter.matchProp || 'id';\n\t\tif (val.reald && !(0, _utils.accessNested)(theater, 'masterDoc.reald')) return false;\n\t\treturn obj[mp] === val[mp];\n\t};\n}\n\n// Tester function for theater filter - check id and provider id\nfunction validateTheater(val, obj) {\n\tif (!val || !val.id) return false;\n\tval = val.id;\n\tif (obj.id === val) return true;\n\tvar vals = val.split(':');\n\tvar prov = vals.shift();\n\tvar pid = vals.join(':');\n\tif (!prov || !pid) return false;\n\treturn obj.providerId === prov && (pid === '*' || obj.providerTheaterId === pid);\n}\n\nfunction filterTheater(theater, filters) {\n\n\ttheater.activeScreenings = theater.screenings.filter(function (s) {\n\t\tvar passes = inactiveScreeningsFilter(filters.format, s.movie.format);\n\t\treturn passes;\n\t});\n\n\ttheater.filteredScreenings = theater.activeScreenings.filter(function (s) {\n\t\tvar passes = validateFilter(filters.timeOfDay, s.timeOfDay) && validateFilter(filters.movie, s.movie, validateMovie) && validateFilter(filters.format, s.movie.format, validateFormat(theater)) && validateFilter(filters.stDate, s.nextDaySTDate || s.stDate) && validateFilter(filters.hour, { id: s.hour }) && validateFilter(filters.minute, { id: s.minute }) &&\n\t\t// validateFilter(filters.exhibitor, theater.exhibitor) &&\n\t\tvalidateFilter(filters.ticketProvider, theater.providers);\n\t\treturn passes;\n\t}).sort(function (a, b) {\n\t\treturn a.datetime < b.datetime ? -1 : 1;\n\t});\n\n\tvar filterPass = theater.filteredScreenings.length ? true : false;\n\n\t// remove active if doesn't pass filter (no filtered screenings)\n\ttheater.active = theater.active && !filterPass ? false : theater.active;\n\n\t// Is it active\n\ttheater.activeExhibitor = validateFilter(filters.exhibitor, theater.exhibitor) && validateFilter(filters.theater, theater, validateTheater);\n\tvar pid = theater.providerId;\n\tif (pid === 'wwm' || pid === 'webuk' || pid === 'webus') {\n\t\ttheater.activeExhibitor = theater.activeExhibitor && validateFilter(filters.webedia, theater);\n\t}\n\n\t// Edit the instance but also return the properties to update the store object properly\n\n\t// in case we need to sort by date instead of distance\n\t// let firstDatetime = theater.firstDatetime = theater.filteredScreenings.length && theater.filteredScreenings[0].datetime;\n\t// let firstDate = theater.firstDate = accessNested(theater, 'filteredScreenings.0.stDate.date');\n\tvar firstDate = theater.firstDate = theater.filteredScreenings.reduce(function (p, s) {\n\t\tvar date = (0, _utils.accessNested)(s, 'stDate.date');\n\t\tif (!p) return +date;\n\t\treturn date ? Math.min(p, date) : p;\n\t}, undefined);\n\n\treturn {\n\t\tfilteredScreenings: theater.filteredScreenings,\n\t\tactiveExhibitor: theater.activeExhibitor,\n\t\t// firstDatetime,\n\t\tfirstDate: firstDate,\n\t\tfilterPass: filterPass,\n\t\tactive: theater.active\n\t};\n}\n\n/**\n * Test if URL contains blacklisted theater.\n *\n * @param {string} url The url to test for.\n * @returns {boolean} True is the url contains the theater hostname.\n */\nfunction urlContainsBlacklistTheater(url) {\n\tvar matcher = /((\\w*\\.)?(arclightcinemas\\.com|pacifictheatres\\.com))/i;\n\treturn matcher.test(url);\n}\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n\tcinepapaya: 'fandango',\n\tyandex: 'yandex',\n\tkinohod: 'kinohod',\n\trambler: 'rambler'\n};\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar cleanCategoryName = function cleanCategoryName(s) {\n\t\treturn typeof s === 'string' && s.trim().length ? s.trim().toUpperCase() : undefined;\n};\n\nmodule.exports = cleanCategoryName;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _queue = __webpack_require__(22);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class representing managed pixel\n */\nvar Pixel = function () {\n\tfunction Pixel(category, pixel) {\n\t\tvar shouldQueue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t\t_classCallCheck(this, Pixel);\n\n\t\tthis.category = category;\n\t\tthis.pixel = pixel;\n\t\tthis.shouldQueue = shouldQueue;\n\t}\n\n\t_createClass(Pixel, [{\n\t\tkey: 'createTrigger',\n\t\tvalue: function createTrigger() {\n\t\t\tvar _this = this;\n\n\t\t\treturn function () {\n\t\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\t\targs[_key] = arguments[_key];\n\t\t\t\t}\n\n\t\t\t\t(0, _queue.triggerOrQueue)(_this, _this.shouldQueue, args);\n\t\t\t};\n\t\t}\n\t}]);\n\n\treturn Pixel;\n}();\n\nexports['default'] = Pixel;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.drain = exports.add = exports.triggerOrQueue = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _categories = __webpack_require__(12);\n\nvar categories = _interopRequireWildcard(_categories);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar _queue = [];\n\nvar triggerOrQueue = exports.triggerOrQueue = function triggerOrQueue(managed, shouldQueue, args) {\n\tif (categories.has(managed.category)) {\n\t\treturn managed.pixel.apply(managed, args);\n\t}\n\n\tif (shouldQueue) {\n\t\treturn add(managed, args);\n\t}\n};\n\nvar add = exports.add = function add(managed, args) {\n\t_queue = [].concat(_toConsumableArray(_queue), [[managed, args]]);\n};\n\nvar drain = exports.drain = function drain() {\n\tvar prevQueue = [].concat(_toConsumableArray(_queue));\n\t_queue = [];\n\tprevQueue.forEach(function (_ref) {\n\t\tvar _ref2 = _slicedToArray(_ref, 2),\n\t\t    managed = _ref2[0],\n\t\t    args = _ref2[1];\n\n\t\treturn triggerOrQueue(managed, managed.shouldQueue, args);\n\t});\n};\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Utils = __webpack_require__( 13 );\n\n\n\n//#build\n\n\nvar BEFOREALL = 'beforeAll',\n\tAFTERALL = 'afterAll'\n;\nvar specialEvents = [BEFOREALL, AFTERALL];\n\n// The prototype methods are stored in a different object\n// and applied as non enumerable properties later\nvar emitterProto = {\n\ton: function( eventName, listener, once ){\n\t\tvar listeners = this._events[ eventName ] || [];\n\n\t\tlisteners.push({ callback: listener, once: once});\n\t\tthis._events[ eventName ] =  listeners;\n\n\t\treturn this;\n\t},\n\n\tonce: function( eventName, listener ){\n\t\treturn this.on( eventName, listener, true );\n\t},\n\n\toff: function( eventName, listener ){\n\t\tif( typeof eventName === 'undefined' ){\n\t\t\tthis._events = {};\n\t\t}\n\t\telse if( typeof listener === 'undefined' ) {\n\t\t\tthis._events[ eventName ] = [];\n\t\t}\n\t\telse {\n\t\t\tvar listeners = this._events[ eventName ] || [],\n\t\t\t\ti\n\t\t\t;\n\n\t\t\tfor (i = listeners.length - 1; i >= 0; i--) {\n\t\t\t\tif( listeners[i].callback === listener )\n\t\t\t\t\tlisteners.splice( i, 1 );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\temit: function( eventName ){\n\t\tvar args = [].slice.call( arguments, 1 ),\n\t\t\tlisteners = this._events[ eventName ] || [],\n\t\t\tonceListeners = [],\n\t\t\tspecial = specialEvents.indexOf( eventName ) !== -1,\n\t\t\ti, listener, returnValue, lastValue\n\t\t;\n\n\t\tspecial || this.emit.apply( this, [BEFOREALL, eventName].concat( args ) );\n\n\t\t// Call listeners\n\t\tfor (i = 0; i < listeners.length; i++) {\n\t\t\tlistener = listeners[i];\n\n\t\t\tif( listener.callback )\n\t\t\t\tlastValue = listener.callback.apply( this, args );\n\t\t\telse {\n\t\t\t\t// If there is not a callback, remove!\n\t\t\t\tlistener.once = true;\n\t\t\t}\n\n\t\t\tif( listener.once )\n\t\t\t\tonceListeners.push( i );\n\n\t\t\tif( lastValue !== undefined ){\n\t\t\t\treturnValue = lastValue;\n\t\t\t}\n\t\t}\n\n\t\t// Remove listeners marked as once\n\t\tfor( i = onceListeners.length - 1; i >= 0; i-- ){\n\t\t\tlisteners.splice( onceListeners[i], 1 );\n\t\t}\n\n\t\tspecial || this.emit.apply( this, [AFTERALL, eventName].concat( args ) );\n\n\t\treturn returnValue;\n\t},\n\n\ttrigger: function(){\n\t\tUtils.warn( false, 'Method `trigger` is deprecated and will be removed from freezer in upcoming releases. Please use `emit`.' );\n\t\treturn this.emit.apply( this, arguments );\n\t}\n};\n\n// Methods are not enumerable so, when the stores are\n// extended with the emitter, they can be iterated as\n// hashmaps\nvar Emitter = Utils.createNonEnumerable( emitterProto );\n//#build\n\nmodule.exports = Emitter;\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n    'default': 'RFC3986',\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return value;\n        }\n    },\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    var obj;\n\n    while (queue.length) {\n        var item = queue.pop();\n        obj = item.obj[item.prop];\n\n        if (Array.isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n\n    return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        } else if (typeof target === 'object') {\n            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (Array.isArray(target) && !Array.isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                if (target[i] && typeof target[i] === 'object') {\n                    target[i] = merge(target[i], item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str) {\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\nvar encode = function encode(str) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = typeof str === 'string' ? str : String(str);\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    merge: merge\n};\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\nmodule.exports = shallow\n\nfunction shallow(a, b, compare) {\n  var aIsArray = Array.isArray(a)\n  var bIsArray = Array.isArray(b)\n\n  if (aIsArray !== bIsArray) return false\n\n  var aTypeof = typeof a\n  var bTypeof = typeof b\n\n  if (aTypeof !== bTypeof) return false\n  if (flat(aTypeof)) return compare\n    ? compare(a, b)\n    : a === b\n\n  return aIsArray\n    ? shallowArray(a, b, compare)\n    : shallowObject(a, b, compare)\n}\n\nfunction shallowArray(a, b, compare) {\n  var l = a.length\n  if (l !== b.length) return false\n\n  if (compare) {\n    for (var i = 0; i < l; i++)\n      if (!compare(a[i], b[i])) return false\n  } else {\n    for (var i = 0; i < l; i++) {\n      if (a[i] !== b[i]) return false\n    }\n  }\n\n  return true\n}\n\nfunction shallowObject(a, b, compare) {\n  var ka = 0\n  var kb = 0\n\n  if (compare) {\n    for (var key in a) {\n      if (\n        a.hasOwnProperty(key) &&\n        !compare(a[key], b[key])\n      ) return false\n\n      ka++\n    }\n  } else {\n    for (var key in a) {\n      if (\n        a.hasOwnProperty(key) &&\n        a[key] !== b[key]\n      ) return false\n\n      ka++\n    }\n  }\n\n  for (var key in b) {\n    if (b.hasOwnProperty(key)) kb++\n  }\n\n  return ka === kb\n}\n\nfunction flat(type) {\n  return (\n    type !== 'function' &&\n    type !== 'object'\n  )\n}\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(65);\n\nvar _embed = __webpack_require__(66);\n\nvar _embed2 = _interopRequireDefault(_embed);\n\nvar _preact = __webpack_require__(0);\n\nvar _link = __webpack_require__(7);\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _dynamicTheaterSentence = __webpack_require__(40);\n\nvar _dynamicTheaterSentence2 = _interopRequireDefault(_dynamicTheaterSentence);\n\nvar _copy = __webpack_require__(10);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar isServer = typeof window === 'undefined';\n\nvar EmbedApp = function (_Component) {\n\t_inherits(EmbedApp, _Component);\n\n\tfunction EmbedApp(props) {\n\t\t_classCallCheck(this, EmbedApp);\n\n\t\tvar _this = _possibleConstructorReturn(this, (EmbedApp.__proto__ || Object.getPrototypeOf(EmbedApp)).call(this));\n\n\t\t_this.state.appState = props.initialStore;\n\t\t_store2['default'].set(props.initialStore);\n\t\tif (!isServer) {\n\t\t\t_this.state.query = _qs2['default'].parse(location.search.substr(1));\n\t\t}\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\t_store2['default'].emit(actions.PAGE_STATE_LOADED);\n\t\t\twindow.Store = _store2['default'];\n\t\t}\n\n\t\t_store2['default'].on('update', function () {\n\t\t\t_this.setState({ appState: _store2['default'].get() });\n\t\t});\n\t\treturn _this;\n\t}\n\n\t_createClass(EmbedApp, [{\n\t\tkey: 'render',\n\t\tvalue: function render(props, _ref) {\n\t\t\tvar appState = _ref.appState;\n\n\n\t\t\t// no query found in store, so means we're on the server\n\t\t\tif (!this.state.query) return;\n\n\t\t\tvar appUrl = appState.appData.meta.url || '';\n\n\t\t\t// Make sure the url ends with a slash\n\t\t\tif (appUrl[appUrl.length - 1] !== '/') {\n\t\t\t\tappUrl += '/';\n\t\t\t}\n\n\t\t\tvar settings = {};\n\n\t\t\tsettings = {\n\t\t\t\ttextColor: this.state.query.textColor || '000000',\n\t\t\t\thighlightTextColor: this.state.query.highlightTextColor || '0B87EE',\n\t\t\t\tbuttonTextColor: this.state.query.buttonTextColor || 'FFFFFF',\n\t\t\t\tbuttonBackgroundColor: this.state.query.buttonBackgroundColor || '0B87EE',\n\t\t\t\tbackgroundColor: this.state.query.backgroundColor || 'FFFFFF',\n\t\t\t\ttextFontSize: this.state.query.textFontSize || '24',\n\t\t\t\tbuttonFontSize: this.state.query.buttonFontSize || '14',\n\t\t\t\tlocation: this.state.query.location\n\t\t\t};\n\n\t\t\tif (appState.client.deviceSize === 'mobile') {\n\t\t\t\t// Settings for mobile\n\t\t\t\tsettings = {\n\t\t\t\t\ttextColor: this.state.query.mobileTextColor || settings.textColor,\n\t\t\t\t\thighlightTextColor: this.state.query.mobileHighlightTextColor || settings.highlightTextColor,\n\t\t\t\t\tbuttonTextColor: this.state.query.mobileButtonTextColor || settings.buttonTextColor,\n\t\t\t\t\tbuttonBackgroundColor: this.state.query.mobileButtonBackgroundColor || settings.buttonBackgroundColor,\n\t\t\t\t\tbackgroundColor: this.state.query.mobileBackgroundColor || settings.backgroundColor,\n\t\t\t\t\ttextFontSize: this.state.query.mobileTextFontSize || settings.textFontSize,\n\t\t\t\t\tbuttonFontSize: this.state.query.mobileButtonFontSize || settings.buttonFontSize\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Get the extra query Parameters\n\t\t\tvar extraQueryParameters = _extends({}, this.state.query);\n\t\t\t// Delete all of the styling variables\n\t\t\tdelete extraQueryParameters.textColor;\n\t\t\tdelete extraQueryParameters.mobileTextColor;\n\t\t\tdelete extraQueryParameters.highlightTextColor;\n\t\t\tdelete extraQueryParameters.mobileHighlightTextColor;\n\t\t\tdelete extraQueryParameters.buttonTextColor;\n\t\t\tdelete extraQueryParameters.mobileButtonTextColor;\n\t\t\tdelete extraQueryParameters.buttonBackgroundColor;\n\t\t\tdelete extraQueryParameters.mobileButtonBackgroundColor;\n\t\t\tdelete extraQueryParameters.backgroundColor;\n\t\t\tdelete extraQueryParameters.mobileBackgroundColor;\n\t\t\tdelete extraQueryParameters.textFontSize;\n\t\t\tdelete extraQueryParameters.mobileTextFontSize;\n\t\t\tdelete extraQueryParameters.buttonFontSize;\n\t\t\tdelete extraQueryParameters.mobileButtonFontSize;\n\n\t\t\t// Format to right format\n\t\t\tsettings.textColor = '#' + settings.textColor;\n\t\t\tsettings.highlightTextColor = '#' + settings.highlightTextColor;\n\t\t\tsettings.buttonTextColor = '#' + settings.buttonTextColor;\n\t\t\tsettings.buttonBackgroundColor = '#' + settings.buttonBackgroundColor;\n\t\t\tsettings.backgroundColor = '#' + settings.backgroundColor;\n\t\t\tsettings.textFontSize = settings.textFontSize + 'px';\n\t\t\tsettings.buttonFontSize = settings.buttonFontSize + 'px';\n\n\t\t\t// Styling embed\n\t\t\tvar containerStyles = {\n\t\t\t\tbackground: settings.backgroundColor\n\t\t\t};\n\n\t\t\t// Styling button\n\t\t\tvar buttonStyles = {\n\t\t\t\tbackground: settings.buttonBackgroundColor,\n\t\t\t\tcolor: settings.buttonTextColor,\n\t\t\t\tfontSize: settings.buttonFontSize\n\t\t\t};\n\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\t'class': _embed2['default'].container,\n\t\t\t\t\tstyle: containerStyles\n\t\t\t\t},\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': _embed2['default'].content },\n\t\t\t\t\t(0, _preact.h)(_dynamicTheaterSentence2['default'], {\n\t\t\t\t\t\tshowtimes: appState.showtimes,\n\t\t\t\t\t\ttextColor: settings.textColor,\n\t\t\t\t\t\tlocation: settings.location,\n\t\t\t\t\t\ttextFontSize: settings.textFontSize,\n\t\t\t\t\t\thighlight: settings.highlightTextColor,\n\t\t\t\t\t\thref: appUrl,\n\t\t\t\t\t\treleaseDate: new Date(appState.appData.meta.dates.release),\n\t\t\t\t\t\textraQueryParameters: extraQueryParameters\n\t\t\t\t\t}),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': _embed2['default'].linkContainer },\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t_link.Link,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\thref: appUrl + '?' + _qs2['default'].stringify(extraQueryParameters),\n\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t'class': _embed2['default'].button,\n\t\t\t\t\t\t\t\tstyle: buttonStyles,\n\t\t\t\t\t\t\t\ttrackId: 'embed-tickets-click'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(0, _copy.getCopy)('GET_TICKETS')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn EmbedApp;\n}(_preact.Component);\n\nexports['default'] = EmbedApp;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _preact = __webpack_require__(0);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar Embed = function Embed(_ref) {\n\tvar children = _ref.children,\n\t    path = _ref.path,\n\t    initialState = _ref.initialState,\n\t    appData = _ref.appData,\n\t    relativeRoot = _ref.relativeRoot,\n\t    reload = _ref.reload;\n\n\n\tvar initialData = (0, _preact.h)('script', { dangerouslySetInnerHTML: { __html: '\\nwindow.__INITIAL_STATE__ = ' + JSON.stringify(initialState) + ';\\nwindow.__BUILD_DATE__ = ' + Date.now() + ';'\n\t\t} });\n\n\tvar copy = appData.copy;\n\n\tvar pageTitle = (0, _clientUtils.getCopyWithParams)(copy, copy.$DYNAMIC_TITLE.replace(/%PAGE_NAME%/, ''));\n\treturn (0, _preact.h)(\n\t\t'html',\n\t\tnull,\n\t\t(0, _preact.h)(\n\t\t\t'head',\n\t\t\tnull,\n\t\t\t(0, _preact.h)(\n\t\t\t\t'title',\n\t\t\t\tnull,\n\t\t\t\tpageTitle\n\t\t\t),\n\t\t\t(0, _preact.h)('meta', { charset: 'UTF-8' }),\n\t\t\t(0, _preact.h)('meta', { name: 'viewport', content: 'minimal-ui, initial-scale=1' }),\n\t\t\t(0, _preact.h)('link', { rel: 'stylesheet', type: 'text/css', href: relativeRoot + 'css/embed.css' }),\n\t\t\t(0, _preact.h)('link', { href: 'https://fonts.googleapis.com/css?family=Noto+Sans:400,700', rel: 'stylesheet' })\n\t\t),\n\t\t(0, _preact.h)(\n\t\t\t'body',\n\t\t\tnull,\n\t\t\t(0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ id: 'app' },\n\t\t\t\tchildren\n\t\t\t),\n\t\t\tinitialData,\n\t\t\t!reload && (0, _preact.h)('script', { src: 'https://cdn.ravenjs.com/3.16.0/raven.min.js', crossorigin: 'anonymous' }),\n\t\t\treload,\n\t\t\t(0, _preact.h)('script', { src: relativeRoot + 'js/embed.js', charset: 'utf-8' })\n\t\t)\n\t);\n};\n\nexports['default'] = Embed;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _preact = __webpack_require__(0);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _gdpr = __webpack_require__(53);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _tracking = __webpack_require__(6);\n\nvar _utils = __webpack_require__(2);\n\nvar _smoothScroll = __webpack_require__(62);\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _route = __webpack_require__(17);\n\nvar _route2 = _interopRequireDefault(_route);\n\n__webpack_require__(50);\n\nvar _geoFencing = __webpack_require__(58);\n\nvar _geoFencing2 = _interopRequireDefault(_geoFencing);\n\nvar _cookiesModal = __webpack_require__(39);\n\nvar _cookiesModal2 = _interopRequireDefault(_cookiesModal);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n// NOTE: SHOWTIMES EVENTS NOT INCLUDED IN THIS\n\n/** Listen to event triggers and update the store in reaction */\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Base events\n\n/**\n * Will be triggered every time an event is fired.\n * NOTE: This should be in store.js\n * @param {string} reactionName - the name of the event\n * @param {*} data - the first argument when the event was called\n */\n_store2['default'].on('afterAll', function (reactionName, data) {\n\tif (reactionName !== 'update') {\n\t\t// console.debug('TRIGGERED:', reactionName);\n\t}\n});\n\n/**\n * Update something in the store.\n * Should be used with care! to update anything irregular in the store.\n * NOTE: This is only used by the Warner Bros DE pixels to set movie genres.\n *       I think It should be a more explicit event like \"UPDATE_GENRES\"\n * @param {Object} storeData - the changes to apply on the store\n */\n_store2['default'].on(actions.UPDATE_STORE, function (storeData) {\n\tvar store = _store2['default'].get();\n\tstore.set(storeData);\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Loader events\n\n/**\n * Update loader data.\n * This is only used in Doctor Strange AFAIK.\n * @param {Object} loader - the loader data\n */\n_store2['default'].on(actions.UPDATE_LOADER, function (loader) {\n\tvar store = _store2['default'].get();\n\n\tif (store.hasOwnProperty('loader')) {\n\t\tstore.loader.set(loader);\n\t} else {\n\t\tstore.set({ loader: loader });\n\t}\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Page interactions\n\n/**\n * Update the active page.\n * This event is fired by the \"PAGE_STATE_LOADED\", which will automatically detect the active\n * page based on the page url.\n * @param {Object} activePage - the active page object\n */\n_store2['default'].on(actions.SET_ACTIVE_PAGE, function (activePage) {\n\tif (!activePage) return;\n\t// console.log('Navigating to', activePage.path);\n\t(0, _tracking.gaCustom)('set', 'page', activePage.path);\n\t(0, _tracking.gaCustom)('send', 'pageview');\n\ttrackPageView(activePage.id, null, false);\n\n\tvar state = _store2['default'].get();\n\n\tif (activePage.data && state.background && state.background.videoEnabled !== activePage.data.allowBgVideo) {\n\t\t// Update the allowBgVideo\n\t\tvar data = activePage.data;\n\n\t\t_store2['default'].emit(actions.SET_BACKGROUND_VIDEO_ENABLED, data && data.allowBgVideo);\n\t}\n\n\t// Close the sidenav\n\t_store2['default'].emit(actions.SET_SIDE_NAV_OPEN, false);\n\n\tvar sideNavBelow = (0, _utils.accessNested)(activePage, 'data.header.breakpoint') || (0, _utils.accessNested)(state, 'appData.header.breakpoint');\n\tif (typeof window !== 'undefined' && state.activePage.id !== activePage.id && !activePage.order) {\n\t\t// Scroll to top ?\n\t\t// (will change the scroll if the new page is smaller anyway)\n\t\t// If we keep that, add delay so that some pages can save their leaving state scroll position\n\t\tsetTimeout(function () {\n\t\t\treturn (0, _smoothScroll.smoothScrollTo)('root', 0, 200);\n\t\t}, 0);\n\t}\n\n\t// Set the document title to the active page one\n\tdocument.title = (0, _clientUtils.getPageTitle)(activePage, state.appData);\n\tvar header = state.header;\n\t_store2['default'].get().set({ activePage: activePage });\n\n\t// Have to re-get() since the reference is changed after the first set\n\tif (state.header && state.header.sideNavBelow !== sideNavBelow) {\n\t\t_store2['default'].get().header.set({ sideNavBelow: sideNavBelow });\n\t\t_store2['default'].emit(actions.SET_SIDE_NAV_ACTIVE, state.client.deviceSize);\n\t}\n\n\t_store2['default'].emit(actions.CLOSE_TICKETING);\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Background interactions\n\n/**\n * Update any of the background settings.\n * @param {Object} values - object with new background settings\n */\nfunction updateBackground(values) {\n\tvar bg = _store2['default'].get().background;\n\tif (bg) {\n\t\tbg.set(values);\n\t}\n}\n_store2['default'].on(actions.UPDATE_BACKGROUND_SETTINGS, updateBackground);\n\n/**\n * Set whether the background video should play.\n * @param {boolean} videoPlaying - whether the background video is playing\n */\n_store2['default'].on(actions.SET_BACKGROUND_VIDEO_PLAYING, function (videoPlaying) {\n\tupdateBackground({ videoPlaying: videoPlaying });\n});\n\n/**\n * Set whether the video background is enabled.\n * @param {boolean} videoEnabled - true to enable the video background\n */\n_store2['default'].on(actions.SET_BACKGROUND_VIDEO_ENABLED, function (videoEnabled) {\n\tupdateBackground({ videoEnabled: videoEnabled });\n});\n\n/**\n * Mute or unmute the background video.\n * @param {boolean} muted - true to mute the video, false to unmute\n */\n_store2['default'].on(actions.SET_BACKGROUND_VIDEO_MUTED, function (muted) {\n\tupdateBackground({ muted: muted });\n});\n\n/**\n * Set the currently displayed background DOM element\n * @param {HTMLElement} element - current DOM element being the background\n */\n_store2['default'].on(actions.SET_BACKGROUND_ELEMENT, function (element) {\n\tupdateBackground({ element: element });\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Header interactions\n\n/**\n * Set whether the header menu is opened.\n * @param {boolean} sideNavOpen - true to open the menu, false to close it\n */\n_store2['default'].on(actions.SET_SIDE_NAV_OPEN, function (sideNavOpen) {\n\tvar header = _store2['default'].get().header;\n\tif (!header) return;\n\tif (!!sideNavOpen === !!header.sideNavOpen) return;\n\t(0, _tracking.track)({ a: sideNavOpen ? 'nav-open' : 'nav-closed' });\n\theader.set({ sideNavOpen: sideNavOpen });\n});\n\n/**\n * Set whether the header is hidden.\n * @param {boolean} hidden - true to hide the menu, false to show it\n */\n_store2['default'].on(actions.HEADER_HIDDEN, function (hidden) {\n\t_store2['default'].get().header.set({ hidden: hidden });\n});\n\n/**\n * Set whether the side nav is active\n * @param {string} deviceSize - the current device size\n */\n_store2['default'].on(actions.SET_SIDE_NAV_ACTIVE, function (deviceSize) {\n\tvar store = _store2['default'].get();\n\tvar headerStore = store.header;\n\n\tvar sideNavBelow = headerStore.sideNavBelow;\n\n\tvar sideNavActive = false;\n\n\tif (sideNavBelow === 'desktop' || sideNavBelow === 'tablet' && (deviceSize === 'tablet' || deviceSize === 'mobile') || sideNavBelow === deviceSize) {\n\t\tsideNavActive = true;\n\t}\n\n\tvar device = store.client.device;\n\tvar isTablet = device === 'ipad' || device === 'android' && deviceSize === 'tablet';\n\tif ((0, _utils.accessNested)(store, 'appData.header.sideNavOnTablet') && isTablet) {\n\t\tsideNavActive = true;\n\t}\n\n\tif (headerStore.hideHeader) {\n\t\tsideNavActive = true;\n\t}\n\n\theaderStore.set({ sideNavActive: sideNavActive });\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Footer interactions\n\n/**\n * Store the current size of the footer.\n * FIXME: Commented 3 months ago, can we remove the handler + event?\n * @param {number} size - the current size of the footer in pixels\n */\n// Store.on(actions.FOOTER_SIZE, (size) => {\n// \tStore.get().footer.set({ size });\n// });\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Quizz interactions\n\n/**\n * Set wheter a quiz is started.\n * @param {boolean} started - true to start the quizz\n * @param {string=} quizId - the page id of the quizz started, by default it's the active page\n */\n_store2['default'].on(actions.QUIZ_STARTED, function (started, quizId) {\n\tvar quiz = quizId ? _store2['default'].get().appData.pages[quizId] : _store2['default'].get().activePage;\n\tif (quiz) {\n\t\tquiz.set({ started: started });\n\t}\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Client interactions\n\n/**\n * Update the stored client dimensions.\n * @param {Object} dimensions - the new client dimensions\n */\n_store2['default'].on(actions.SET_CLIENT_SIZE, function (dimensions) {\n\tvar store = _store2['default'].get();\n\tvar clientStore = store.client;\n\n\tvar deviceSize = (0, _clientUtils.getSize)(dimensions);\n\tvar orientation = dimensions.width > dimensions.height ? 'landscape' : 'portrait';\n\n\tif (deviceSize !== clientStore.deviceSize) {\n\t\t_store2['default'].emit(actions.SET_SIDE_NAV_ACTIVE, deviceSize);\n\t}\n\n\tclientStore.set({\n\t\tdimensions: dimensions,\n\t\tdeviceSize: deviceSize,\n\t\torientation: orientation\n\t});\n});\n\n(function () {\n\tvar validOrientations = ['portrait', 'landscape'];\n\tvar refCount = 0;\n\n\t// NOTE: This system is not perfect: it is too permissive.\n\t//       Basically, you can aquire a lock for landscape while a lock on portrait is still active.\n\t//       Perhaps we could add a priority like 'portrait' > 'landscape'?\n\n\t/**\n  * Start forcing the orientation of the device.\n  * @param {string} orientation - the device orientation, either 'portrait' or 'landscape'\n  */\n\t_store2['default'].on(actions.START_FORCE_CLIENT_ORIENTATION, function (orientation) {\n\t\tif (validOrientations.indexOf(orientation) === -1) {\n\t\t\tconsole.error('FORCE_ORIENTATION: unknown device orientation \"' + orientation + '\"');\n\t\t\treturn;\n\t\t}\n\t\tvar uiState = _store2['default'].get().header.uiState;\n\t\tvar overlayOrientation = uiState.overlayOrientation;\n\n\t\tvar orientationChanged = orientation !== overlayOrientation;\n\n\t\tif (refCount > 0 && orientationChanged) {\n\t\t\tconsole.error('FORCE_ORIENTATION: received a \"' + orientation + '\" orienation force request but ' + ('there are still ' + refCount + ' ongoing requests for \"' + overlayOrientation + '\". The behavior ') + 'is now undefined.');\n\t\t\trefCount = 0; // accept the request anyway\n\t\t}\n\n\t\trefCount++;\n\t\tif (orientationChanged) {\n\t\t\tuiState.set({ overlayOrientation: orientation });\n\t\t}\n\t});\n\n\t/**\n  * Stop forcing the orientation of the device.\n  * Note that this function has effects only when it's called the same number of times\n  * the function to start forcing the orientation has been called.\n  * @param {boolean=} force - ignore the previous orientation requests and stop forcing it\n  */\n\t_store2['default'].on(actions.STOP_FORCE_CLIENT_ORIENTATION, function (force) {\n\t\tvar uiState = _store2['default'].get().header.uiState;\n\t\tvar overlayOrientation = uiState.overlayOrientation;\n\n\n\t\tif (force) refCount = 0;\n\t\tif (refCount > 0) refCount--;\n\t\tif (refCount === 0 && overlayOrientation) {\n\t\t\tuiState.set({ overlayOrientation: false });\n\t\t}\n\t});\n})();\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Page load\n\nfunction detectCurrentPage(state, url) {\n\tstate = state || _store2['default'].get();\n\turl = url || location.pathname;\n\n\tif (location.hostname === 'localhost') {\n\t\t// to prevent pages with /preview/ path to automatically be selected on local builds\n\t\turl = url.replace('/preview', '');\n\t}\n\n\tvar bestMatch = null;\n\tvar bestMatchCount = 0;\n\tvar pages = state.appData.pages;\n\tObject.keys(pages).forEach(function (pageId) {\n\t\tvar page = pages[pageId];\n\t\tvar path = page.path.slice(0, -1);\n\t\tif (path === '') {\n\t\t\tpath = '/';\n\t\t}\n\t\tif (url.indexOf(path) >= 0 && !page.baseHtml) {\n\t\t\tif (bestMatchCount < path.length) {\n\t\t\t\tbestMatch = page;\n\t\t\t\tbestMatchCount = path.length;\n\t\t\t}\n\t\t}\n\t});\n\treturn bestMatch;\n}\n\nvar originalSetItem = void 0;\nvar setItemQueue = [];\nvar originalCookieDescriptor = void 0;\nvar cookieQueue = [];\n_store2['default'].on(actions.SHOW_COOKIES_MODAL, function (callback) {\n\t// Delay all potential localStorage.setItem && document.cookie = stuff to after the user has accepted\n\t// (not foolproof, only works for same-domain cookies not for things like youtube iframes etc.)\n\ttry {\n\t\tif (!originalSetItem) {\n\t\t\toriginalSetItem = localStorage.setItem;\n\t\t}\n\t\tlocalStorage.setItem = function () {\n\t\t\tsetItemQueue.push([this].concat(Array.prototype.slice.call(arguments)));\n\t\t};\n\t} catch (e) {}\n\ttry {\n\t\tif (!originalCookieDescriptor) {\n\t\t\toriginalCookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') || Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');\n\t\t\tObject.defineProperty(document, 'cookie', {\n\t\t\t\tget: originalCookieDescriptor.get.bind(document),\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t}\n\t\tObject.defineProperty(document, 'cookie', {\n\t\t\tset: function set(value) {\n\t\t\t\treturn cookieQueue.push(value);\n\t\t\t}\n\t\t});\n\t} catch (e) {}\n\t_store2['default'].emit(actions.SHOW_MODAL, _cookiesModal2['default'], function (accept) {\n\t\twindow.preventCookies = !accept;\n\t\t_store2['default'].get().client.set({ cookies: accept });\n\t\tif (accept) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem = originalSetItem;\n\t\t\t\tsetItemQueue.forEach(function (elem) {\n\t\t\t\t\tvar _localStorage$setItem;\n\n\t\t\t\t\treturn (_localStorage$setItem = localStorage.setItem).call.apply(_localStorage$setItem, _toConsumableArray(elem));\n\t\t\t\t});\n\t\t\t\t// Empty the array without changing the ref\n\t\t\t\tsetItemQueue.length = 0;\n\t\t\t} catch (e) {}\n\t\t\ttry {\n\t\t\t\tObject.defineProperty(document, 'cookie', {\n\t\t\t\t\tset: originalCookieDescriptor.set.bind(document)\n\t\t\t\t});\n\t\t\t\tcookieQueue.forEach(function (elem) {\n\t\t\t\t\treturn document.cookie = elem;\n\t\t\t\t});\n\t\t\t\tcookieQueue.length = 0;\n\t\t\t} catch (e) {}\n\t\t}\n\t\tif (typeof callback === 'function') {\n\t\t\tcallback(accept);\n\t\t}\n\t}, {\n\t\ttype: 'cookieModal',\n\t\tblockClose: true,\n\t\tbackdropColor: 'rgba(0, 0, 0, .8)',\n\t\tfadeIn: 600,\n\t\tappData: _store2['default'].get().appData\n\t});\n});\n\n/**\n * Called when a new page is loaded.\n */\n_store2['default'].on(actions.BEFORE_LOAD, function () {\n\tvar state = _store2['default'].get().toJS();\n\tvar appData = state.appData;\n\n\t_store2['default'].emit(actions.SET_SIDE_NAV_ACTIVE, state.client.deviceSize);\n\n\tvar detectedPage = detectCurrentPage(state);\n\tif (detectedPage && detectedPage.id !== state.activePage.id) {\n\t\t_store2['default'].emit(actions.SET_ACTIVE_PAGE, detectedPage);\n\t\t// Temp update it in our object to be able to work with it\n\t\tstate.activePage = detectedPage;\n\t}\n\n\tvar parsedQS = _qs2['default'].parse(location.search.slice(1));\n\tif (parsedQS.referrer) {\n\t\twindow.customReferrer = parsedQS.referrer;\n\t}\n\n\tvar showbarebones = parsedQS.showbarebones;\n\tvar embedmode = parsedQS.embedmode;\n\t// if (embedmode) {\n\t// \t// enable showbarebones\n\t// \tshowbarebones = true;\n\t// }\n\tif (appData.options.showbarebones) {\n\t\twindow.showbarebones = true;\n\t}\n\tif (window.showbarebones !== undefined) showbarebones = window.showbarebones;\n\tif (showbarebones) {\n\t\t_store2['default'].get().header.set({\n\t\t\thideHeader: true,\n\t\t\tsideNavActive: true\n\t\t});\n\n\t\tdocument.body.classList.add('bodyBarebones');\n\t\tif ((0, _utils.accessNested)(state, 'appData.pages.showtimes.data')) {\n\t\t\t_store2['default'].get().appData.pages.showtimes.data.set({\n\t\t\t\tforceFullHeader: true\n\t\t\t});\n\t\t}\n\t}\n\n\tif (parsedQS.iframe) {\n\t\t// Apply fixes specific to iframe bugs\n\t\t_store2['default'].get().client.set({\n\t\t\tiframe: true\n\t\t});\n\n\t\t// if (state.client.isIOS) {\n\t\t// \t// Due to iframe bugs on ios, let's enable the embedMode\n\t\t// \tembedmode = true;\n\t\t// }\n\t}\n\n\tif (embedmode) {\n\t\t// Add in global class to body\n\t\tdocument.body.classList.add('embedMode');\n\t\t// Update the store\n\t\t_store2['default'].get().client.set({\n\t\t\tembedMode: true\n\t\t});\n\t}\n\n\tvar onUrlChange = function onUrlChange(e) {\n\t\tvar state = _store2['default'].get();\n\n\t\tvar activePage = null;\n\t\tif (e && e.state && e.state.hasOwnProperty('pageId')) {\n\t\t\tactivePage = state.appData.pages[e.state.pageId];\n\t\t} else {\n\t\t\tactivePage = detectCurrentPage(state);\n\t\t}\n\n\t\tif (activePage && activePage.id !== (0, _utils.accessNested)(state, 'activePage.id')) {\n\t\t\t_store2['default'].emit(actions.SET_ACTIVE_PAGE, activePage);\n\t\t}\n\n\t\t_store2['default'].emit(actions.URL_CHANGED, e);\n\t};\n\twindow.addEventListener('popstate', onUrlChange);\n\thistory.onpushstate = onUrlChange;\n\thistory.onreplacestate = onUrlChange;\n\n\tvar showtimesStatus = false;\n\tif (state.appData.pages && state.appData.pages.showtimes) {\n\t\tvar dates = (0, _utils.accessNested)(state, 'appData.meta.dates', {});\n\t\tvar activeDate = (0, _utils.parseDate)(dates.live || dates.release || 0);\n\t\tshowtimesStatus = (0, _clientUtils.calculateShowtimesStatus)(activeDate, state.appData.options.forceLive, state.appData.pages);\n\t\t_store2['default'].get().showtimes.set({ status: showtimesStatus }).now();\n\t}\n\n\tvar updateSize = function updateSize() {\n\t\treturn _store2['default'].emit(actions.SET_CLIENT_SIZE, {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight\n\t\t});\n\t};\n\twindow.addEventListener('resize', updateSize, false);\n\twindow.addEventListener('orientationchange', (0, _utils.dbounce)(updateSize, 350), false);\n\n\tvar isFirstVisit = true;\n\ttry {\n\t\t// See notes below regarding weird format\n\t\t// isFirstVisit = localStorage.getItem('isFirstVisit') !== 'false';\n\t\tisFirstVisit = !localStorage.getItem('isFirstVisit');\n\t} catch (e) {}\n\n\tPromise.resolve((0, _geoFencing2['default'])()).then(function (redirected) {\n\t\tif (redirected) {\n\t\t\treturn;\n\t\t}\n\t\tvar checkCookies = isFirstVisit && (0, _utils.accessNested)(appData, 'options.cookiesModal');\n\t\tif (!checkCookies) {\n\t\t\twindow.preventCookies = typeof window.preventCookies == \"undefined\" ? false : window.preventCookies;\n\t\t\t_store2['default'].emit(actions.PAGE_STATE_LOADED);\n\t\t} else {\n\t\t\t_store2['default'].emit(actions.SHOW_COOKIES_MODAL, function () {\n\t\t\t\treturn _store2['default'].emit(actions.PAGE_STATE_LOADED);\n\t\t\t});\n\t\t}\n\t});\n});\n\n// TODO: utils\n// Using innerHTML with script doesn't execute them. This \"fixes\" it\n// Inspired by https://stackoverflow.com/a/20584396/1336843\nfunction execScripts(node) {\n\tif (!node || !node.children) return;\n\tvar children = [].slice.call(node.children);\n\tchildren.forEach(function (child) {\n\t\tif (child.tagName !== 'SCRIPT') {\n\t\t\t// Not a script? Recurse\n\t\t\treturn execScripts(child);\n\t\t}\n\t\t// Make it executable\n\t\ttry {\n\t\t\tvar copy = document.createElement('script');\n\t\t\tcopy.text = child.innerHTML;\n\t\t\t[].forEach.call(child.attributes, function (attr) {\n\t\t\t\tcopy.setAttribute(attr.name, attr.value);\n\t\t\t});\n\t\t\t// child.parentElement.replaceChild(copy, child);\n\t\t\t// GTM doesn't like being included in a div (the tag helper extension complains)\n\t\t\t// Move all scripts out, directly in the body\n\t\t\tchild.parentElement.removeChild(child);\n\t\t\tdocument.body.appendChild(copy);\n\t\t} catch (e) {\n\t\t\tconsole.log('error while loading custom script', e);\n\t\t}\n\t});\n}\n\n/**\n * Called when a new page is loaded and preliminary checks are done (e.g. cookie or not).\n */\n_store2['default'].on(actions.PAGE_STATE_LOADED, function () {\n\tif (window.STATIC_PIXELS && !window.preventCookies) {\n\t\tvar pixelsElem = document.createElement('div');\n\t\tpixelsElem.innerHTML = window.STATIC_PIXELS;\n\t\tdocument.body.appendChild(pixelsElem);\n\t\texecScripts(pixelsElem);\n\t}\n\n\tvar state = _store2['default'].get().toJS();\n\tvar appData = state.appData;\n\n\tvar parsedQS = _qs2['default'].parse(location.search.slice(1));\n\tvar preventCookies = window.preventCookies;\n\n\tif (!appData.options.preventTrackingOnLoad) {\n\t\t(0, _tracking.initTracker)(state.appData, { noCookies: preventCookies });\n\t}\n\tif (!preventCookies) {\n\t\t// check if user visits for the first time\n\t\tvar isFirstVisit = true;\n\t\tvar regionModalDismissed = false;\n\t\ttry {\n\t\t\t// A bit counter-intuitive to store firstVisit = false in the local storage\n\t\t\t// Would make more sense IMO to store visited = true, this also avoids issue with falsy values conversion (false / undefined differentiation)\n\t\t\tisFirstVisit = localStorage.getItem('isFirstVisit') !== 'false';\n\t\t\tif (isFirstVisit) {\n\t\t\t\tlocalStorage.setItem('isFirstVisit', 'false');\n\t\t\t}\n\n\t\t\tregionModalDismissed = !!localStorage.getItem('regionModalDismissed');\n\t\t} catch (err) {\n\t\t\t// No local storage available\n\t\t}\n\t\tvar user = _store2['default'].get().user;\n\n\t\tif (user) {\n\t\t\tuser.set({\n\t\t\t\tisFirstVisit: !!isFirstVisit,\n\t\t\t\tregionModalDismissed: regionModalDismissed\n\t\t\t});\n\t\t}\n\t}\n\n\ttrackPageView(state.activePage.id, null, true);\n\n\t// fix landing url error usually caused by missing trailing slash\n\tif (parsedQS.err && parsedQS.err === '404' && parsedQS.path) {\n\t\tvar appBasePath = '/' + appData.meta.studio.slug + '/' + appData.meta.title.slug + '/' + appData.meta.region.slug;\n\t\tvar missedPath = parsedQS.path.replace(appBasePath, '');\n\t\tvar missedPageId = void 0;\n\t\tfor (var pageId in appData.pages) {\n\t\t\tvar page = appData.pages[pageId];\n\t\t\tif (missedPath === page.path) {\n\t\t\t\tmissedPageId = pageId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (missedPageId) {\n\t\t\tvar _page = state.appData.pages[missedPageId];\n\t\t\t// TODO: current base instead of hardcoded showtimes\n\t\t\tif (_page.base && _page.base !== 'showtimes') {\n\t\t\t\tif (!parsedQS.from404) {\n\t\t\t\t\tlocation.href = missedPath.substring(1) + '?from404=1';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t(0, _route2['default'])(missedPath.substring(1), missedPageId);\n\t\t\t\t(0, _tracking.track)({ a: 'found_page_from_404', missedPageId: missedPageId });\n\t\t\t\tstate.activePage = state.appData.pages[missedPageId];\n\t\t\t}\n\t\t}\n\t}\n\n\tvar showtimesStatus = state.showtimes && state.showtimes.status;\n\tvar redirectTo = showtimesStatus && state.activePage.redirectOnLoadAfterShowtimes || state.activePage.redirectOnLoad;\n\tif (redirectTo) {\n\t\tif (redirectTo.match(/^(https?:)?\\/\\//)) {\n\t\t\tlocation.href = redirectTo;\n\t\t}\n\t\tvar path = (0, _clientUtils.getPath)(redirectTo);\n\t\tif (path && path[0] === '/') {\n\t\t\tpath = path.substring(1);\n\t\t\tpath = ((0, _clientUtils.getPath)(state.activePage).substring(1).match(/\\//g) || []).map(function () {\n\t\t\t\treturn '../';\n\t\t\t}).join('') + path;\n\t\t}\n\t\thistory.pushState({ pageId: redirectTo }, '', path);\n\t}\n\n\t// CHECK PAGE VISIBILITY - ONLY LOAD APIS ONCE VISIBLE\n\tvar loaded = false;\n\tvar beforeLoad = Date.now();\n\tvar loadAPI = function loadAPI() {\n\t\tif (loaded) return;\n\t\tloaded = true;\n\t\t_store2['default'].emit(actions.START_API);\n\t\tvar time = ~~((Date.now() - beforeLoad) / 1000);\n\t\t(0, _tracking.track)({ a: 'page_visible', l: time, ni: true });\n\t};\n\tvar hidden = void 0;\n\tvar visibilityChange = void 0;\n\tif (typeof document.hidden !== 'undefined') {\n\t\thidden = 'hidden';\n\t\tvisibilityChange = 'visibilitychange';\n\t} else if (typeof document.msHidden !== 'undefined') {\n\t\thidden = 'msHidden';\n\t\tvisibilityChange = 'msvisibilitychange';\n\t} else if (typeof document.webkitHidden !== 'undefined') {\n\t\thidden = 'webkitHidden';\n\t\tvisibilityChange = 'webkitvisibilitychange';\n\t}\n\tif (!hidden || !document[hidden]) {\n\t\tloadAPI();\n\t} else {\n\t\t// TODO: COPY !\n\t\tvar inactiveModal = (0, _preact.h)(\n\t\t\t'div',\n\t\t\tnull,\n\t\t\t(0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ style: { fontSize: '.8rem', maxWidth: '25rem', margin: '0 auto', padding: '0 1rem', textAlign: 'center', textTransform: 'none' } },\n\t\t\t\t'The content of this page has not been loaded yet because you seem to be inactive'\n\t\t\t),\n\t\t\t(0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ style: { textAlign: 'center', margin: '.5rem 0 1rem' } },\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ type: 'button', onClick: function onClick() {\n\t\t\t\t\t\t\treturn _store2['default'].emit(actions.HIDE_MODAL);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstyle: { background: 'none', border: '1px solid #ccc', borderRadius: '3px', fontSize: '1rem', lineHeight: '2rem', padding: '0 .5rem', cursor: 'pointer' } },\n\t\t\t\t\t'I am here'\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\t_store2['default'].emit(actions.SHOW_MODAL, inactiveModal, loadAPI, {\n\t\t\ttitle: 'Are you here?',\n\t\t\ttype: 'inactiveModal'\n\t\t});\n\n\t\tdocument.addEventListener(visibilityChange, function () {\n\t\t\tif (loaded || document[hidden]) return;\n\t\t\tvar modal = _store2['default'].get().modal;\n\t\t\tif (modal && modal.type === 'inactiveModal') _store2['default'].emit(actions.HIDE_MODAL);\n\t\t\tloadAPI();\n\t\t}, false);\n\t}\n});\n\n// Simple helper function to make sure we\n// don't fire a pageview track event multiple times on the same page\nvar lastTrackedPage = '';\nfunction trackPageView(pageId, extraOptions, firstLoad) {\n\tif (pageId === lastTrackedPage) {\n\t\treturn;\n\t}\n\textraOptions = Object.assign({ ni: true }, extraOptions);\n\t(0, _tracking.track)(_extends({}, extraOptions, {\n\t\ta: pageId + '-view'\n\t}));\n\n\t(0, _tracking.updateDataLayerPageView)(pageId, firstLoad);\n\n\tif (pageId === 'showtimes') {\n\t\t(0, _tracking.track)({ once: true, a: 'start_dimensions', l: document.documentElement.offsetWidth + 'x' + document.documentElement.offsetHeight, ni: 1 });\n\t} else if (pageId === 'videos') {\n\t\t(0, _tracking.updateDataLayer)({ event: 'trailer-view' });\n\t}\n\n\tlastTrackedPage = pageId;\n}\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Modal events\n\n/**\n * Show the modal dialog with a custom content.\n * @param {string|JSX} content - the content of the modal\n * @param {Function=} callback - function called when the modal is closed\n * @param {Object=} extra - extra modal property\n */\n_store2['default'].on(actions.SHOW_MODAL, function (content, callback, extra) {\n\tvar state = _store2['default'].get();\n\t// if (!state.modal) state = state.set({ modal: {} });\n\t// TODO: Find a way to clear previous content maybe?\n\tstate.set({\n\t\tmodal: _extends({\n\t\t\tactive: true,\n\t\t\tcontent: content,\n\t\t\tcallback: callback\n\t\t}, extra)\n\t});\n});\n\n/**\n * Close the modal and notify the caller.\n * @param {Object} result -\n * @param {Object} data -\n */\n_store2['default'].on(actions.HIDE_MODAL, function (result, data) {\n\tvar state = _store2['default'].get();\n\t// if (!state.modal) state = state.set({modal: {}});\n\tvar cb = state.modal && state.modal.callback;\n\tstate.set({\n\t\tmodal: {\n\t\t\tactive: false,\n\t\t\tresult: result,\n\t\t\tdata: data\n\t\t}\n\t});\n\tif (typeof cb === 'function') {\n\t\tcb(result, data);\n\t}\n});\n\n/**\n * Update the content of the modal.\n * @param {string|JSX} content - the new content\n */\n_store2['default'].on(actions.UPDATE_MODAL, function (content) {\n\tvar state = _store2['default'].get();\n\tstate.modal.set('content', content);\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Dynamic data\n\n_store2['default'].on(actions.UPDATE_DYNAMIC_DATA, function (dynamicData) {\n\t// Update the dynamic data\n\t_store2['default'].get().dynamicData.set(dynamicData);\n});\n\n/**\n * Register that the region modal was dismissed by the user.\n */\n_store2['default'].on(actions.SET_USER_REGION_MODAL_DISMISSED, function () {\n\tvar user = _store2['default'].get().user;\n\t// Update localstorage\n\tlocalStorage.setItem('regionModalDismissed', true);\n\tif (user) {\n\t\t// Update the store\n\t\tuser.set({ regionModalDismissed: true });\n\t}\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Misc events\n\n/**\n * Set the current state of an iOS fix?\n * Bound to the \"blur\" and \"focus events.\n * @param {number} state - a height? in pixels\n */\n_store2['default'].on(actions.SET_IOSFIXEDFIX, function (state) {\n\t_store2['default'].get().set({ iosFixedFix: state });\n});\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Tracking events\n\n/**\n * Set the current state of an iOS fix?\n * Bound to the \"blur\" and \"focus events.\n * @param {number} state - a height? in pixels\n */\n_store2['default'].on(actions.ONETRUST_SHOW, function () {\n\treturn _gdpr.oneTrust.displayModal();\n});\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(fetch) {\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n// TODO: only when needed ?\n\n\nvar _objectAssign = __webpack_require__(25);\n\nvar _objectAssign2 = _interopRequireDefault(_objectAssign);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _tracking = __webpack_require__(6);\n\nvar _utils = __webpack_require__(2);\n\nvar _formatDateTime = __webpack_require__(11);\n\nvar _formatDateTime2 = _interopRequireDefault(_formatDateTime);\n\nvar _regionModal = __webpack_require__(61);\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _Theater = __webpack_require__(18);\n\n__webpack_require__(51);\n\nvar _City = __webpack_require__(44);\n\nvar _City2 = _interopRequireDefault(_City);\n\nvar _Geo = __webpack_require__(8);\n\nvar _Geo2 = _interopRequireDefault(_Geo);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/* Basic Setup\n--------------------------------*/\n\n_store2['default'].on(actions.START_API, function () {\n\tvar state = _store2['default'].get();\n\n\tvar apiRoot = (0, _utils.accessNested)(state, 'appData.apis.stdata.root');\n\n\tif (!(0, _utils.accessNested)(state, 'appData.options.disableDynamicData')) {\n\t\tfetch(apiRoot + '/app_data/dynamic/' + (0, _utils.accessNested)(state, 'appData.meta.id'), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { 'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json' }\n\t\t}).then(function (res) {\n\t\t\treturn res.json();\n\t\t}).then(function (o) {\n\t\t\tif (!o) return;\n\t\t\tdelete o.meta;\n\t\t\t_store2['default'].emit(actions.UPDATE_DYNAMIC_DATA, o);\n\t\t\t// Store.get().dynamicData.set(o);\n\t\t})['catch'](function (err) {\n\t\t\treturn console.log('Error getting dynamic app data', err);\n\t\t});\n\t}\n\n\tvar opts = (0, _utils.accessNested)(state, 'appData.options', {});\n\tvar needsRegions = opts.autoBoundingRegions || opts.useRegionSwitcher || opts.useRegionMismatchModal || opts.useAlternateLanguages;\n\t// Should merge that with dynamicData probably\n\tvar appRegionsUrl = apiRoot + '/app_data/title_regions/' + (0, _utils.accessNested)(state, 'appData.meta.title.slug', '');\n\tvar regionPromise = void 0;\n\tvar demoLinkedRegions = (0, _utils.accessNested)(state, 'appData.meta.demoLinkedRegions');\n\tif (needsRegions && window.__IS_DEMO__ && demoLinkedRegions) {\n\t\tvar currentRegion = (0, _utils.accessNested)(state, 'appData.meta.region.slug', '');\n\t\tvar regions = demoLinkedRegions.split(',').map(function (r) {\n\t\t\treturn r.trim().toLowerCase();\n\t\t}).filter(function (r) {\n\t\t\treturn r;\n\t\t}).reduce(function (acc, region) {\n\t\t\t// if (region === currentRegion) return acc;\n\t\t\tacc[region] = {\n\t\t\t\turl: window.location.href.replace('/' + currentRegion + '/', '/' + region + '/')\n\t\t\t};\n\t\t\treturn acc;\n\t\t}, {});\n\t\tregionPromise = Promise.resolve(regions);\n\t} else {\n\t\tregionPromise = !needsRegions ? Promise.resolve() : fetch(appRegionsUrl, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { 'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json' }\n\t\t}).then(function (res) {\n\t\t\treturn res.json();\n\t\t})['catch'](function (err) {\n\t\t\treturn console.log('Error getting app regions', err);\n\t\t}).then(function (regions) {\n\t\t\tif (!regions) regions = {};\n\t\t\tdelete regions.meta;\n\t\t\treturn regions;\n\t\t});\n\t}\n\n\tregionPromise = regionPromise.then(function (regions) {\n\t\t_store2['default'].emit(actions.UPDATE_DYNAMIC_DATA, { regions: regions });\n\t});\n\n\t//  No Showtimes Page is found, so will probably not need any of this data\n\t//  If you do then enable features -> noShowtimesPageForceGeo in Thundr\n\tif (!(0, _utils.accessNested)(state, 'appData.pages.showtimes') && !(0, _utils.accessNested)(state, 'appData.options.noShowtimesPageForceGeo')) {\n\t\treturn;\n\t}\n\n\tvar useClientGeo = function useClientGeo(geo, source) {\n\t\treturn regionPromise.then(function () {\n\t\t\treturn _store2['default'].emit(actions.SET_CLIENT_GEO, new _Geo2['default'](geo), source);\n\t\t});\n\t};\n\n\tvar parsedQS = _qs2['default'].parse(location.search.slice(1));\n\tparsedQS = (0, _utils.encodeHtmlRecursively)(parsedQS);\n\t// NOTE: All characters <, > are replaced with HTML entities to prevent XSS\n\t//       this might be too restrictive for us in the future, but for now this is the most\n\t//       secure solutions\n\n\tvar forceStartGeo = (0, _utils.accessNested)(state.appData, 'pages.showtimes.data.forceStartGeo');\n\tvar localStorageGeo = void 0;\n\ttry {\n\t\tlocalStorageGeo = JSON.parse(window.localStorage.getItem(state.appData.meta.id + '_lastHouse'));\n\t} catch (e) {}\n\tif (forceStartGeo) {\n\t\tif (typeof forceStartGeo === 'string') {\n\t\t\t(0, _clientUtils.rawSearchLocation)(forceStartGeo, state.appData.apis.gmaps.key, state.appData.region).then(function (data) {\n\t\t\t\tuseClientGeo(data, 'forceStart');\n\t\t\t});\n\t\t} else {\n\t\t\tuseClientGeo(forceStartGeo, 'forceStart');\n\t\t}\n\t} else {\n\t\tvar locationResolveChain = Promise.resolve();\n\t\tvar addLocationOption = function addLocationOption(fn) {\n\t\t\tlocationResolveChain = locationResolveChain.then(function (value) {\n\t\t\t\tif (value) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\treturn typeof fn === 'function' ? fn() : fn;\n\t\t\t});\n\t\t};\n\t\tif (parsedQS.location) {\n\t\t\tvar loc = parsedQS.location;\n\t\t\tif (parsedQS.lat && parsedQS.lon) {\n\t\t\t\taddLocationOption({\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tlat: parsedQS.lat,\n\t\t\t\t\t\tlon: parsedQS.lon,\n\t\t\t\t\t\tcountryCode: parsedQS.cc || (0, _utils.accessNested)(state, 'appData.meta.region.slug'),\n\t\t\t\t\t\tcity: loc\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'queryString'\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\taddLocationOption(function () {\n\t\t\t\t\treturn (0, _clientUtils.rawSearchLocation)(loc, state.appData.apis.gmaps.key, state.appData.region).then(function (result) {\n\t\t\t\t\t\treturn { data: result, type: 'queryString' };\n\t\t\t\t\t})['catch'](function (e) {});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (localStorageGeo && (typeof localStorageGeo === 'undefined' ? 'undefined' : _typeof(localStorageGeo)) === 'object') {\n\t\t\taddLocationOption({ data: localStorageGeo, type: 'storage' });\n\t\t}\n\t\taddLocationOption(function () {\n\t\t\tvar cancel = false;\n\t\t\tvar cancelGeo = function cancelGeo() {\n\t\t\t\treturn cancel = true;\n\t\t\t};\n\t\t\t_store2['default'].once(actions.SET_CLIENT_GEO, cancelGeo);\n\t\t\treturn (0, _clientUtils.getGeoFromIPAsync)().then(function (data) {\n\t\t\t\tif (cancel) return;\n\n\t\t\t\tvar countryCode = data.countryCode.toLowerCase();\n\t\t\t\treturn { data: { lat: data.lat, lon: data.lon, countryCode: countryCode, city: data.city }, type: 'geoip' };\n\t\t\t});\n\t\t});\n\n\t\tlocationResolveChain.then(function (result) {\n\t\t\tif (result) {\n\t\t\t\tuseClientGeo(result.data, result.type);\n\t\t\t}\n\t\t})['catch'](function (err) {\n\t\t\tconsole.log('Error getting geo', err);\n\t\t\t_store2['default'].get().showtimes.set({ loading: false, error: 'UNKNOWN' });\n\t\t});\n\t}\n});\n\n/* Theaters\n--------------------------------*/\n\n_store2['default'].on(actions.SET_THEATERS, function (theaters, noRemainingCheck) {\n\tvar showtimesState = _store2['default'].get().showtimes;\n\t// Not sure why we make a copy of the theaters but I'm scared to remove it\n\tvar total = (theaters || []).map(function (t) {\n\t\treturn (0, _objectAssign2['default'])({}, t);\n\t});\n\t// Make sure we are using objects and not instances\n\tshowtimesState.set({ theaters: total, firstDataLoaded: true, loading: false });\n\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS, theaters && theaters.map(function (t) {\n\t\treturn t.id;\n\t}));\n\tif (!showtimesState.firstDataLoaded) _store2['default'].emit(actions.FIRST_DATA_LOADED);\n});\n\n_store2['default'].on(actions.ADD_THEATERS, function (newTheaters) {\n\tvar showtimesState = _store2['default'].get().showtimes;\n\t// Breaks the thing\n\tif (showtimesState.loading || showtimesState.error) return;\n\tvar theaters = showtimesState.theaters || [];\n\tnewTheaters = newTheaters.filter(function (nt) {\n\t\treturn !theaters.find(function (t) {\n\t\t\treturn t.id === nt.id;\n\t\t});\n\t});\n\n\tif (!newTheaters.length) return;\n\t_store2['default'].emit(actions.SET_THEATERS, theaters.concat(newTheaters), true);\n});\n\n_store2['default'].on(actions.SELECT_THEATER, function (theaterId) {\n\tvar state = _store2['default'].get();\n\tvar theaters = state.showtimes.theaters;\n\tif (!theaters) return;\n\tvar currentActive = theaters.find(function (t) {\n\t\treturn t.active;\n\t});\n\tif (currentActive) currentActive.set({ active: false });\n\tvar newActive = theaterId && theaters.find(function (t) {\n\t\treturn t.id === theaterId;\n\t});\n\tif (newActive) {\n\t\tnewActive.set({ active: true });\n\t\ttry {\n\t\t\twindow.localStorage.setItem(state.appData.meta.id + '_lastHouse', newActive.geo.toString());\n\t\t} catch (e) {}\n\t}\n\t(0, _tracking.track)({ a: 'list_click', l: theaterId, useCustomPageTrack: true });\n});\n\n_store2['default'].on(actions.SET_THEATER_STATE, function (theater, state, data) {\n\t// let theaters = Store.get().showtimes.theaters;\n\t// if(!theaters) return;\n\tif (!theater) return;\n\ttheater.set({ state: state, stateData: data });\n\t// track({a: 'theater_step', l: theaterId});\n});\n\n_store2['default'].on(actions.UPDATE_THEATER_FILTERED_SCREENINGS, function (newIds) {\n\tvar state = _store2['default'].get();\n\tvar showtimesState = state.showtimes;\n\n\tvar sortTheatersByDate = (0, _utils.accessNested)(state, 'appData.options.sortTheatersByDate');\n\t// Copy them to be able to sort them\n\t// let theaters = showtimesState.theaters.map(t => objectAssign({}, t));\n\tvar theaters = showtimesState.theaters.toJS();\n\tvar filters = showtimesState.filters;\n\n\tif (theaters) {\n\t\ttheaters.forEach(function (t) {\n\t\t\t(0, _objectAssign2['default'])(t, (0, _Theater.filterTheater)(t, filters));\n\t\t});\n\t\t// let pinned = asList(accessNested(state, 'activePage.data.pinnedTheaters'));\n\t\t// let isPinned = (t) => pinned.indexOf(t && t.id) !== -1;\n\t\tvar compProp = 'distance',\n\t\t    undefinedFirst = false;\n\t\tif (sortTheatersByDate) {\n\t\t\tcompProp = 'firstDate';\n\t\t}\n\t\tif (showtimesState.sortBy) {\n\t\t\tcompProp = showtimesState.sortBy;\n\t\t}\n\t\tvar compare = function compare(a, b, p, undefinedFirst) {\n\t\t\tvar aPinned = a.pinned,\n\t\t\t    bPinned = b.pinned;\n\t\t\tif (aPinned !== bPinned) return aPinned ? -1 : 1;\n\t\t\tvar va = a[p],\n\t\t\t    vb = b[p];\n\t\t\t// == and not === to also check null\n\t\t\tif (va == vb) {\n\t\t\t\t// Always end up sorting equivalent theaters by distance\n\t\t\t\treturn p !== 'distance' ? compare(a, b, 'distance', false) : 0;\n\t\t\t}\n\t\t\tif (va == undefined) return undefinedFirst ? -1 : 1;\n\t\t\tif (vb == undefined) return undefinedFirst ? 1 : -1;\n\t\t\tvar compareAsString = typeof a === 'string' && typeof b === 'string' && (isNaN(a) || isNaN(b));\n\t\t\treturn compareAsString ? a.localeCompare(b) : va - vb; // ASC (should we make that an option ?)\n\t\t};\n\t\tvar sortFunc = function sortFunc(a, b) {\n\t\t\treturn !!a.filteredScreenings.length !== !!b.filteredScreenings.length ? !!a.filteredScreenings.length ? -1 : 1 : // Theaters with unfiltered screenings first\n\t\t\tcompare(a, b, compProp, undefinedFirst);\n\t\t}; // Then by distance (or date)\n\t\ttheaters.sort(sortFunc);\n\t\tvar currentActive = theaters.find(function (t) {\n\t\t\treturn t.active && t.enabled;\n\t\t});\n\t\tif (!currentActive) {\n\t\t\tvar first = theaters.find(function (t) {\n\t\t\t\treturn t.enabled && (!newIds || newIds.indexOf(t.id) !== -1) && t.filterPass && t.activeExhibitor;\n\t\t\t});\n\t\t\tif (first) {\n\t\t\t\t// Store.emit(actions.SELECT_FIRST_THEATER, first);\n\t\t\t\t// track({a: 'list_click', l: first.id, ni: 1});\n\t\t\t\tfirst.active = true;\n\t\t\t\t// Update last house ?\n\t\t\t\t// try {\n\t\t\t\t// \twindow.localStorage.setItem(state.appData.meta.id + '_lastHouse', first.geo.toString());\n\t\t\t\t// } catch(e) { }\n\t\t\t}\n\t\t}\n\t}\n\t// showtimesState.set({theaters});\n\t_store2['default'].get().showtimes.set({ theaters: theaters }).now();\n\t_store2['default'].emit(actions.AFTER_THEATERS_UPDATE);\n});\n\n/* Map\n--------------------------------*/\n\n_store2['default'].on(actions.SET_MAP_OPEN, function (open) {\n\tvar showtimesState = _store2['default'].get().showtimes;\n\tshowtimesState.set({ mapOpen: open });\n\tdocument.body.style.overflow = open ? \"hidden\" : \"visible\";\n});\n\n/* Cities\n--------------------------------*/\n\n_store2['default'].on(actions.SET_CITIES, function (cities) {\n\t_store2['default'].get().showtimes.set({ cities: cities, cityShowCount: 10 });\n});\n\n_store2['default'].on(actions.SET_CITY_SHOW_COUNT, function (cityShowCount) {\n\t_store2['default'].get().showtimes.set({ cityShowCount: cityShowCount });\n});\n\n/* Filters\n--------------------------------*/\n\n// TODO: WE SHOULD HAVE DIFFERENT SUBOBJECT IN THE STORE FOR EACH PAGE\n// Instead of just a \"showtimes\" prop\n\n// Make sure filters are what they need to be on the current page\n_store2['default'].on(actions.CHECK_FILTERS, function (noRefresh) {\n\tvar state = _store2['default'].get();\n\tvar filters = state.showtimes.filters;\n\n\tvar hiddenFilters = (0, _utils.accessNested)(state, 'activePage.data.hiddenFilters', {});\n\n\tfilters.timeOfDay.set({ visible: !hiddenFilters.time });\n\t// Should we reset current ? I guess so\n\tfilters.stDate.set({ visible: !hiddenFilters.date, current: [] });\n\tif (hiddenFilters.format) filters.format.set({ visible: false });\n\tfilters.hour.set({ current: [] });\n\n\tvar disabledFilters = (0, _utils.accessNested)(state, 'activePage.data.disabledFilters');\n\tif (disabledFilters) {\n\t\tvar disabledFormats = (0, _utils.asList)(disabledFilters.format);\n\t\tif (disabledFormats) {\n\t\t\tvar options = disabledFormats.map(function (k) {\n\t\t\t\treturn { slug: k.toLowerCase().replace(/\\s+/g, '') };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.FILTER_DISABLE, 'format', options, true);\n\t\t}\n\n\t\tvar disabledExhib = disabledFilters.exhibitor;\n\t\tif (disabledExhib) {\n\t\t\tvar _options = (0, _utils.asList)(disabledExhib).map(function (dom) {\n\t\t\t\treturn { domain: dom };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.FILTER_EXCLUDE, 'exhibitor', _options, true);\n\t\t}\n\n\t\tvar disabledWebediaTheater = disabledFilters.webediaTheater;\n\t\tif (disabledWebediaTheater) {\n\t\t\t// let allTheaters = state.showtimes.theaters || [];\n\t\t\t// let desired = asList(disabledWebediaTheater);\n\t\t\t// let providers = ['wwm', 'webus', 'webuk'];\n\t\t\t// TODO: also check providerId\n\t\t\t// let options = allTheaters.filter(t => desired.indexOf(t.providerTheaterId) !== -1);\n\t\t\t// console.log('?', options, desired, state.showtimes);\n\t\t\tvar _options2 = (0, _utils.asList)(disabledWebediaTheater).map(function (id) {\n\t\t\t\treturn { providerTheaterId: id };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.FILTER_EXCLUDE, 'webedia', _options2, true);\n\t\t}\n\n\t\tvar disabledTheater = disabledFilters.theater;\n\t\tif (disabledTheater) {\n\t\t\tvar _options3 = (0, _utils.asList)(disabledTheater).map(function (id) {\n\t\t\t\treturn { id: id };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.FILTER_EXCLUDE, 'theater', _options3, true);\n\t\t}\n\t}\n\n\tvar defaultFilters = (0, _utils.accessNested)(state, 'activePage.data.defaultFilters');\n\n\tif (defaultFilters) {\n\t\tvar defaultDate = defaultFilters.date;\n\t\tif (defaultDate) {\n\t\t\tvar active = true;\n\t\t\tvar datesList = filters.stDate.options;\n\t\t\tif ((typeof defaultDate === 'undefined' ? 'undefined' : _typeof(defaultDate)) === 'object') {\n\t\t\t\tif (defaultDate.from) {\n\t\t\t\t\tvar from = (0, _utils.parseDate)(defaultDate.from);\n\t\t\t\t\tif (from) datesList = datesList.filter(function (d) {\n\t\t\t\t\t\treturn d.date >= from;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (defaultDate.to) {\n\t\t\t\t\tvar to = (0, _utils.parseDate)(defaultDate.to);\n\t\t\t\t\tif (to && to < Date.now()) active = false;\n\t\t\t\t\tif (to) datesList = datesList.filter(function (d) {\n\t\t\t\t\t\treturn d.date <= to;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif ((defaultDate.from || defaultDate.to) && !datesList.length) {\n\t\t\t\t\tif (defaultDate.from && defaultDate.to) {\n\t\t\t\t\t\tvar date1 = (0, _utils.parseDate)(defaultDate.from);\n\t\t\t\t\t\tvar date2 = (0, _utils.parseDate)(defaultDate.to);\n\t\t\t\t\t\tvar _from = Math.min(date1, date2);\n\t\t\t\t\t\tvar _to = Math.max(date1, date2);\n\t\t\t\t\t\tvar currentDate = new Date(_from);\n\t\t\t\t\t\tdatesList = [];\n\t\t\t\t\t\twhile (currentDate <= _to) {\n\t\t\t\t\t\t\tdatesList.push({ id: +currentDate });\n\t\t\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar desired = (0, _utils.parseDate)(defaultDate.from || defaultDate.to);\n\t\t\t\t\t\tif (desired) datesList = [{ id: +desired }];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar _desired = (0, _utils.parseDate)(defaultDate);\n\t\t\t\t// if(desired) datesList = datesList.filter(d => {\n\t\t\t\t// \treturn +d.date === +desired;\n\t\t\t\t// });\n\t\t\t\tif (_desired && _desired < Date.now()) active = false;\n\t\t\t\tif (_desired) datesList = [{ id: +_desired }];\n\t\t\t}\n\t\t\tif (active) {\n\t\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'stDate', datesList, true);\n\t\t\t\t_store2['default'].emit(actions.SET_FILTER_VISIBILITY, 'stDate', !!defaultDate.visible);\n\t\t\t}\n\t\t}\n\n\t\tvar defaultHour = defaultFilters.hour;\n\t\tif (defaultHour) {\n\t\t\tvar _options4 = [];\n\t\t\tif ((typeof defaultHour === 'undefined' ? 'undefined' : _typeof(defaultHour)) === 'object') {\n\t\t\t\tvar _from2 = +defaultHour.from || 0,\n\t\t\t\t    _to2 = 24;\n\t\t\t\tif (defaultHour.to && !isNaN(+defaultHour.to)) _to2 = +defaultHour.to;\n\t\t\t\tif (_to2 < _from2) {\n\t\t\t\t\tvar tmp = _to2;_to2 = _from2;_from2 = tmp;\n\t\t\t\t}\n\t\t\t\tfor (var i = _from2; i <= _to2; i++) {\n\t\t\t\t\t_options4.push({ id: i });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_options4 = [{ id: +defaultHour }];\n\t\t\t}\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'hour', _options4, true);\n\t\t}\n\t\tvar defaultMinute = defaultFilters.minute;\n\t\tif (defaultMinute) {\n\t\t\tvar _options5 = [];\n\t\t\tif ((typeof defaultMinute === 'undefined' ? 'undefined' : _typeof(defaultMinute)) === 'object') {\n\t\t\t\tvar _from3 = +defaultMinute.from || 0,\n\t\t\t\t    _to3 = 60;\n\t\t\t\tif (defaultMinute.to && !isNaN(+defaultMinute.to)) _to3 = +defaultMinute.to;\n\t\t\t\tif (_to3 < _from3) {\n\t\t\t\t\tvar _tmp = _to3;_to3 = _from3;_from3 = _tmp;\n\t\t\t\t}\n\t\t\t\tfor (var _i = _from3; _i <= _to3; _i++) {\n\t\t\t\t\t_options5.push({ id: _i });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_options5 = [{ id: +defaultMinute }];\n\t\t\t}\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'minute', _options5, true);\n\t\t}\n\n\t\tvar defaultFormat = defaultFilters.format;\n\t\tif (defaultFormat) {\n\t\t\tvar _options6 = (0, _utils.asList)(defaultFormat).map(function (format) {\n\t\t\t\treturn { slug: format.toLowerCase().replace(/\\s/g, '') };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'format', _options6, true);\n\t\t}\n\n\t\tvar defaultExhib = defaultFilters.exhibitor;\n\t\tif (defaultExhib) {\n\t\t\tvar _options7 = (0, _utils.asList)(defaultExhib).map(function (dom) {\n\t\t\t\treturn { domain: dom };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'exhibitor', _options7, true);\n\t\t}\n\n\t\tvar defaultTheater = defaultFilters.theater;\n\t\tif (defaultTheater) {\n\t\t\tvar _options8 = (0, _utils.asList)(defaultTheater).map(function (id) {\n\t\t\t\treturn { id: id };\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'theater', _options8, true);\n\t\t}\n\n\t\tif (defaultFilters.pidmod) {\n\t\t\t// Reset the cities filter to\n\t\t\t//NOTE: this should be probably be done somewhere else, but it needs to work with multiple showtimes pages\n\t\t\tstate.showtimes.citiesFilters.set({\n\t\t\t\tpidmod: defaultFilters.pidmod\n\t\t\t});\n\n\t\t\tif (state.client.geo) {\n\t\t\t\t// Only reload cities if geo has actually been set\n\t\t\t\t_store2['default'].emit(actions.SCREENINGS_LOADED);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (state.showtimes.citiesFilters && state.showtimes.citiesFilters.pidmod && (!defaultFilters || !defaultFilters.pidmod)) {\n\t\t// Remove the pidmod again from the state because we don't have a set\n\t\t// default filter\n\t\tstate.showtimes.citiesFilters.set({\n\t\t\tpidmod: null\n\t\t});\n\n\t\t// Reset cities with the new pidmod\n\t\t_store2['default'].emit(actions.SCREENINGS_LOADED);\n\t}\n\n\tif (typeof document !== 'undefined') {\n\t\tvar qs = _qs2['default'].parse(document.location.search.slice(1));\n\t\tif (qs.format || qs.reald) {\n\t\t\t// Formats coming fron the Query String\n\t\t\tvar desiredFormat = (qs.format || '').toLowerCase().split(',');\n\t\t\t// Formats that are available through the api\n\t\t\tvar srcOptions = filters.format.options;\n\t\t\tvar _options9 = [];\n\t\t\t// Even when the desired format isn't available,\n\t\t\t// still filter on it\n\t\t\tif (state.appData.options.formatFilterIsStrict) {\n\t\t\t\t_options9 = srcOptions.filter(function (f) {\n\t\t\t\t\treturn desiredFormat.indexOf(f.slug) !== -1;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t_options9 = srcOptions.filter(function (f) {\n\t\t\t\t\treturn desiredFormat.find(function (df) {\n\t\t\t\t\t\treturn f.slug.replace(/&/g, '').indexOf(df) !== -1;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (qs.reald) {\n\t\t\t\tvar newOptions = srcOptions.filter(function (f) {\n\t\t\t\t\treturn f.slug.indexOf('imax') === -1 && f.slug.match(/(reald\\s*)?\\b3d\\b/i);\n\t\t\t\t}).map(function (option) {\n\t\t\t\t\treturn Object.assign({ reald: true }, option);\n\t\t\t\t});\n\t\t\t\t_options9 = _options9.concat(newOptions);\n\t\t\t}\n\t\t\tif (!_options9.length) {\n\t\t\t\tif (qs.reald) {\n\t\t\t\t\t_options9 = desiredFormat.map(function (f) {\n\t\t\t\t\t\treturn { slug: 'reald3d', label: 'RealD 3D', reald: true };\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// The desired format doesn't exist in the existing options\n\t\t\t\t\t_options9 = desiredFormat.map(function (f) {\n\t\t\t\t\t\treturn { slug: f, label: f };\n\t\t\t\t\t});\n\t\t\t\t\t// Make the format filter visible,\n\t\t\t\t\t// so people can disable it again\n\t\t\t\t\t_store2['default'].emit(actions.SET_FILTER_VISIBILITY, 'format', true);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'format', _options9, true);\n\t\t}\n\t\tif (qs.exhibitor) {\n\t\t\tvar desiredExhib = qs.exhibitor.toLowerCase().replace(/^https?:\\/\\/(www\\.)?/, '');\n\t\t\t// Store.emit(actions.TOGGLE_FILTER, 'exhibitor', filters.exhibitor.options.filter(e => e.domain.toLowerCase().indexOf(desiredExhib) !== -1), true);\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'exhibitor', [{ domain: desiredExhib }], true);\n\t\t\t_store2['default'].emit(actions.SET_FILTER_VISIBILITY, 'exhibitor', true);\n\t\t}\n\t\tif (qs.provider) {\n\t\t\t// let desired = qs.provider.split(',').map(e => ({id: e, name: e}));\n\t\t\tvar _desired2 = qs.provider.split(',');\n\t\t\tvar result = filters.ticketProvider.options.filter(function (e) {\n\t\t\t\treturn _desired2.indexOf(e.id) !== -1;\n\t\t\t});\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'ticketProvider', result, true);\n\t\t\t_store2['default'].emit(actions.SET_FILTER_VISIBILITY, 'ticketProvider', true);\n\t\t}\n\t\tif (qs.date) {\n\t\t\tvar arr = qs.date.split(',');\n\t\t\tvar _options10 = filters.stDate.options.filter(function (e) {\n\t\t\t\tvar ddmmyyyy = e.ddmmyyyy;\n\t\t\t\tvar std = (0, _formatDateTime2['default'])(e.date, 'yyyy-MM-dd');\n\t\t\t\treturn arr.find(function (desired) {\n\t\t\t\t\treturn desired === ddmmyyyy || desired === std;\n\t\t\t\t});\n\t\t\t});\n\t\t\tif (!_options10.length) {\n\t\t\t\t_options10 = arr.map(function (elem) {\n\t\t\t\t\treturn { id: +(0, _utils.parseDate)(elem) };\n\t\t\t\t});\n\t\t\t}\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'stDate', _options10, true);\n\t\t}\n\t\tif (qs.timeofday) {\n\t\t\tvar _arr = qs.timeofday.toUpperCase().split(',');\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'timeOfDay', filters.timeOfDay.options.filter(function (e) {\n\t\t\t\treturn _arr.indexOf(e.id.slice(1)) !== -1;\n\t\t\t}), true);\n\t\t}\n\t\tif (qs.title) {\n\t\t\tvar _desired3 = qs.title.toLowerCase().split(',');\n\t\t\t// let comp = m => desired.indexOf(m.slug) !== -1; // exact match\n\t\t\tvar comp = function comp(m) {\n\t\t\t\treturn _desired3.find(function (d) {\n\t\t\t\t\treturn m.slug.indexOf(d) !== -1;\n\t\t\t\t});\n\t\t\t}; // contains\n\t\t\tvar _options11 = filters.movie.options.filter(comp);\n\t\t\tif (!_options11.length) {\n\t\t\t\t_options11 = _desired3.map(function (e) {\n\t\t\t\t\treturn { slug: e, title: e };\n\t\t\t\t});\n\t\t\t}\n\t\t\t_store2['default'].emit(actions.TOGGLE_FILTER, 'movie', _options11, true);\n\t\t}\n\t}\n\n\tif (!noRefresh) _store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n_store2['default'].on(actions.RELOAD_FILTERS, function (data, keepCurrent) {\n\tif (!data) {\n\t\t// No data specified, reload the filters based on the existing showtimes data\n\t\tvar store = _store2['default'].get();\n\t\tvar _theaters = store.showtimes.theaters || [];\n\t\tvar _screenings = [];\n\t\tvar _exhibitors = {};\n\t\tvar _movies = {};\n\t\tvar _formats = {};\n\t\t_theaters.forEach(function (theater) {\n\t\t\t_screenings.push(theater.screenings);\n\t\t\tif (theater.exhibitor) {\n\t\t\t\t_exhibitors[theater.exhibitor.id] = theater.exhibitor;\n\t\t\t}\n\t\t\ttheater.movies.forEach(function (movie) {\n\t\t\t\t_movies[movie.id] = movie;\n\t\t\t\tif (movie.format) {\n\t\t\t\t\t_formats[movie.format.id] = movie.format;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t_exhibitors = Object.values(_exhibitors);\n\t\t_movies = Object.values(_movies);\n\t\t_formats = Object.values(_formats);\n\t\tdata = { theaters: _theaters, screenings: _screenings, exhibitors: _exhibitors, movies: _movies, formats: _formats };\n\t}\n\n\tvar _data = data,\n\t    theaters = _data.theaters,\n\t    screenings = _data.screenings,\n\t    exhibitors = _data.exhibitors,\n\t    _data$movies = _data.movies,\n\t    movies = _data$movies === undefined ? [] : _data$movies,\n\t    _data$formats = _data.formats,\n\t    formats = _data$formats === undefined ? [] : _data$formats;\n\n\tvar timeOfDayOptions = [];\n\tvar stDateOptions = [];\n\tvar ticketProviders = [];\n\t// let blockedExhibitors = accessNested(state, 'appData.pageData.showtimes.blockedExhibitors', []);\n\tvar state = _store2['default'].get();\n\tvar filters = state.showtimes.filters;\n\tvar screeningsMovieIds = [];\n\t// Use the theaters screenings rather than the list of all screenings to not get the ones removed by the provider merging\n\ttheaters.forEach(function (t) {\n\t\treturn t.screenings.forEach(function (s) {\n\t\t\t// Only add it if it is supposed to be displayed\n\t\t\tif (s.timeOfDay && s.timeOfDay.label && timeOfDayOptions.indexOf(s.timeOfDay) === -1) {\n\t\t\t\ttimeOfDayOptions.push(s.timeOfDay);\n\t\t\t}\n\t\t\tif (s.stDate && stDateOptions.indexOf(s.stDate) === -1) {\n\t\t\t\tstDateOptions.push(s.stDate);\n\t\t\t}\n\t\t\tif (screeningsMovieIds.indexOf(s.movie.id) === -1) {\n\t\t\t\tscreeningsMovieIds.push(s.movie.id);\n\t\t\t}\n\t\t\tvar sTicketProviders = s.urls ? Object.keys(s.urls) : [];\n\t\t\tsTicketProviders.forEach(function (tp) {\n\t\t\t\treturn ticketProviders.indexOf(tp) === -1 && ticketProviders.push(tp);\n\t\t\t});\n\t\t});\n\t});\n\tmovies = movies.filter(function (m) {\n\t\treturn screeningsMovieIds.includes(m.id);\n\t}).sort(function (a, b) {\n\t\t// TODO option to have custom order in thundr\n\t\treturn a.title.localeCompare(b.title);\n\t});\n\tvar timeOfDayOrder = ['$MORNING', '$AFTERNOON', '$EVENING', '$LATE'];\n\t// timeOfDayOptions.sort((a, b) => timeOfDayOrder.indexOf(a.id) - timeOfDayOrder.indexOf(b.id));\n\n\t// reverse order to easily put the unknow formats at the end of the list\n\tvar formatOrder = ['imax 3d', '3d imax', 'imax 70mm', 'imax 2d', '2d imax', 'imax', 'dolby cinema', 'dolby', '3d', '70mm', '35mm', '2d'].reverse();\n\tvar disabledFormats = (0, _utils.asList)((0, _utils.accessNested)(state, 'activePage.data.disabledFilters.format', {})).map(function (e) {\n\t\treturn e.toLowerCase().replace(/\\s+/g, '');\n\t});\n\tformats = formats.filter(function (f) {\n\t\treturn f && disabledFormats.indexOf(f.slug) === -1;\n\t}).sort(function (a, b) {\n\t\tvar nameA = a.name.toLowerCase();\n\t\tvar nameB = b.name.toLowerCase();\n\t\tvar detectedOrder = formatOrder.indexOf(nameB) - formatOrder.indexOf(nameA);\n\t\treturn detectedOrder || nameA.localeCompare(nameB);\n\t});\n\n\tfilters.timeOfDay.set({\n\t\toptions: timeOfDayOptions.sort(function (a, b) {\n\t\t\treturn timeOfDayOrder.indexOf(a.id) - timeOfDayOrder.indexOf(b.id);\n\t\t})\n\t});\n\tfilters.stDate.set({\n\t\toptions: stDateOptions.sort(function (a, b) {\n\t\t\treturn a.date - b.date;\n\t\t})\n\t});\n\tfilters.exhibitor.set({\n\t\toptions: exhibitors.filter(function (exhib) {\n\t\t\treturn exhib.domain;\n\t\t})\n\t});\n\tfilters.movie.set({\n\t\toptions: movies,\n\t\tvisible: state.appData.options.useTitleFilter && movies.length > 1\n\t});\n\tfilters.format.set({\n\t\toptions: formats,\n\t\tvisible: state.appData.options.useFormatFilter && formats.length > 1\n\t});\n\tvar providerNames = { // TODO copy or something ?\n\t\tfandango: 'Fandango',\n\t\tatom: 'Atom',\n\t\tmovietickets: 'Movie Tickets',\n\t\tcinema: 'Direct to cinema'\n\t};\n\tfilters.ticketProvider.set({\n\t\toptions: ticketProviders.map(function (tp) {\n\t\t\treturn { id: tp, name: providerNames[tp] || tp };\n\t\t})\n\t});\n\tif (!keepCurrent) {\n\t\tfilters = _store2['default'].get().showtimes.filters;\n\t\t['timeOfDay', 'stDate', 'exhibitor', 'movie', 'format', 'ticketProvider'].forEach(function (filter) {\n\t\t\treturn filters[filter].set({\n\t\t\t\tcurrent: [],\n\t\t\t\tdisabled: []\n\t\t\t});\n\t\t});\n\t}\n\t// var excludedList = [];\n\t// blockedExhibitors.forEach(ex => {\n\t// \tif(!ex) return;\n\t// \tex = ex.toLowerCase();\n\t// \tvar match = exhibitors.find(e => e.domain.toLowerCase() === ex);\n\t// \tif(match && excludedList.indexOf(match) === -1)\n\t// \t\texcludedList.push(match);\n\t// });\n\t// Store.emit(actions.FILTER_EXCLUDE, 'exhibitor', excludedList, true);\n\n\t_store2['default'].emit(actions.CHECK_FILTERS);\n\t// Store.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n_store2['default'].on(actions.TOGGLE_FILTER, function (id, options, preventReload) {\n\tvar storeFilter = _store2['default'].get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ current: options });\n\tif (!preventReload) {\n\t\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\n_store2['default'].on(actions.FILTER_EXCLUDE, function (id, options, preventReload) {\n\tvar storeFilter = _store2['default'].get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ excluded: options });\n\tif (!preventReload) {\n\t\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\n_store2['default'].on(actions.FILTER_DISABLE, function (id, options, preventReload) {\n\tvar storeFilter = _store2['default'].get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ disabled: options });\n\tif (!preventReload) {\n\t\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\n_store2['default'].on(actions.SET_FILTER_VISIBILITY, function (id, visible) {\n\tvar storeFilter = _store2['default'].get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tstoreFilter.set({ visible: !!visible });\n\t// if(!preventReload)\n\t// \tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n_store2['default'].on(actions.SELECT_ST_DATE, function (stDate) {\n\t_store2['default'].get().showtimes.set({ selectedDate: stDate });\n\t(0, _tracking.track)({ a: 'date_click', l: stDate.ddmmyyyy, useCustomPageTrack: true });\n});\n\n_store2['default'].on(actions.SELECT_PROVIDER, function (provider) {\n\t_store2['default'].get().showtimes.set({ provider: provider });\n});\n\n_store2['default'].on(actions.RESET_FILTER, function (id) {\n\t_store2['default'].get().showtimes.filters[id].set({ current: [] });\n\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n_store2['default'].on(actions.RESET_FILTERS, function () {\n\tvar showtimesState = _store2['default'].get().showtimes;\n\tObject.keys(showtimesState.filters).forEach(function (key) {\n\t\treturn showtimesState.filters[key].set({ current: [] });\n\t});\n\t_store2['default'].emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n/* Screenings\n--------------------------------*/\n\nvar thMasters = {};\n_store2['default'].on(actions.SET_CLIENT_GEO, function (geo, source, keepCurrentFilters) {\n\t// Save the client geo\n\tif (geo && window.dataLayer && typeof dataLayer.push === 'function') {\n\t\t(0, _tracking.updateDataLayer)({ city: geo.city, event: 'city_changed' });\n\t}\n\n\tvar state = _store2['default'].get();\n\tstate.client.set({ geo: geo, geoSource: source }).now();\n\n\t(0, _regionModal.displayRegionModalIfNeeded)();\n\t// let toCapital = () => {\n\t// \tif(source !== 'geoip') return false;\n\t// \tlet capital = accessNested(state, 'appData.meta.region.capital');\n\t// \tif(!capital || !capital.lat || !capital.lon || !capital.name) return false;\n\t// \tStore.emit(actions.SET_CLIENT_GEO, new Geo({lat: capital.lat, lon: capital.lon, city: capital.name, countryCode: state.appData.meta.region.slug}));\n\t// \treturn true;\n\t// };\n\t_store2['default'].emit(actions.GET_SCREENINGS, geo, keepCurrentFilters);\n});\n\n_store2['default'].on(actions.GET_SCREENINGS, function (geo, keepCurrentFilters) {\n\tif (!geo) {\n\t\tgeo = (0, _utils.accessNested)(_store2['default'].get(), 'client.geo');\n\t}\n\tif (!geo) return;\n\n\tvar state = _store2['default'].get();\n\tvar isFirstBatch = !state.showtimes.theaters || !state.showtimes.theaters.length;\n\n\tvar version = Date.now();\n\tvar loadingPage = (0, _utils.accessNested)(state, 'activePage.id') || 'showtimes';\n\tvar activePage = (0, _utils.accessNested)(state, ['appData', 'pages', loadingPage]);\n\tstate.showtimes.set({ loading: true, error: null, cities: [], theaters: [], version: version, loadingPage: loadingPage }).now();\n\tthMasters = {};\n\treturn (0, _clientUtils.getGeoScreeningsAsync)(geo, _store2['default'].get()).then(function (data) {\n\t\tvar store = _store2['default'].get();\n\t\tif (store.showtimes.version !== version) throw 'version';\n\t\tif (data.errors && data.errors.length) {\n\t\t\tthrow new Error('screenings:' + data.errors[0].detail);\n\t\t}\n\t\tif (!data.data) {\n\t\t\t// throw new Error('NO_DATA');\n\t\t\tdata.data = [];\n\t\t}\n\n\t\treturn (0, _clientUtils.processScreeningsApi)(data, geo, store.appData, activePage, thMasters, isFirstBatch);\n\t}).then(function (all) {\n\t\tvar state = _store2['default'].get();\n\t\tif (state.showtimes.version !== version) throw 'version';\n\t\tvar pinned = (0, _utils.asList)((0, _utils.accessNested)(state, 'activePage.data.pinnedTheaters')).filter(function (id) {\n\t\t\treturn !all.theaters.find(function (t) {\n\t\t\t\treturn t.id === id;\n\t\t\t});\n\t\t});\n\t\tif (pinned.length) {\n\t\t\t// Store.emit(actions.EXTRA_THEATERS, pinned);\n\t\t\treturn (0, _clientUtils.getTheatersScreeningsAsync)(state, pinned).then(function (data) {\n\t\t\t\tif (data.errors && data.errors.length || !data.data) return all;\n\t\t\t\tvar processedPinned = (0, _clientUtils.processScreeningsApi)(data, geo, _store2['default'].get().appData, activePage, thMasters, isFirstBatch);\n\t\t\t\tvar allKeys = Object.keys(all);\n\t\t\t\tallKeys.forEach(function (k) {\n\t\t\t\t\tif (Array.isArray(all[k]) && processedPinned[k]) {\n\t\t\t\t\t\tall[k] = all[k].concat(processedPinned[k]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tObject.keys(processedPinned).filter(function (k) {\n\t\t\t\t\treturn allKeys.indexOf(k) === -1;\n\t\t\t\t}).forEach(function (k) {\n\t\t\t\t\treturn all[k] = processedPinned[k];\n\t\t\t\t});\n\t\t\t\treturn all;\n\t\t\t});\n\t\t}\n\t\treturn all;\n\t}).then(function (_ref) {\n\t\tvar formats = _ref.formats,\n\t\t    movies = _ref.movies,\n\t\t    screenings = _ref.screenings,\n\t\t    exhibitors = _ref.exhibitors,\n\t\t    theaters = _ref.theaters;\n\n\t\tvar state = _store2['default'].get();\n\t\tif (state.showtimes.version !== version) throw 'version';\n\t\t// if(!theaters.length && toCapital()) return;\n\t\texhibitors = (exhibitors || []).filter(function (e) {\n\t\t\treturn theaters.find(function (t) {\n\t\t\t\treturn t.exhibitor === e;\n\t\t\t});\n\t\t});\n\t\t_store2['default'].emit(actions.RELOAD_FILTERS, { theaters: theaters, screenings: screenings, exhibitors: exhibitors, movies: movies, formats: formats }, keepCurrentFilters);\n\t\t_store2['default'].emit(actions.SET_THEATERS, theaters);\n\t\t_store2['default'].emit(actions.SCREENINGS_LOADED, geo);\n\t})['catch'](function (err) {\n\t\tif (err === 'version') return;\n\t\tconsole.log('GET_SCREENINGS error', err);\n\t\t// if (toCapital()) return;\n\t\t_store2['default'].emit(actions.RESET_FILTERS);\n\t\t_store2['default'].emit(actions.SET_THEATERS, []);\n\t\tvar store = _store2['default'].get();\n\t\tif (store.client.geo !== geo) {\n\t\t\treturn;\n\t\t}\n\t\tvar errCode = 'UNKNOWN';\n\t\tswitch (err) {\n\t\t\tcase 'BOUNDING_REGION':\n\t\t\t\terrCode = 'BOUNDING_REGION';\n\t\t\t\tif (store.client.geo) {\n\t\t\t\t\t// Find cities in the current country\n\t\t\t\t\t_store2['default'].emit(actions.SCREENINGS_LOADED, geo, (0, _utils.accessNested)(store, 'appData.meta.region.slug'));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// console.log(\"showtimes_request_error\", err);\n\t\t\t\t(0, _tracking.track)({ a: 'showtimes_request_error', l: err.message, ni: 1 });\n\t\t}\n\t\t// Store.emit(actions.SET_THEATERS, []);\n\t\t_store2['default'].get().showtimes.set({ loading: false, error: errCode });\n\t});\n});\n\n_store2['default'].on(actions.SCREENINGS_LOADED, function (geo, overrideCountry) {\n\tvar state = _store2['default'].get();\n\tvar citiesProps = _extends({}, state);\n\tif (overrideCountry) {\n\t\tcitiesProps.overrideCountry = overrideCountry;\n\t\t// Nah let's not do that, makes client.geo wrong\n\t\t// geo.countryCode = overrideCountry;\n\t}\n\n\tif (!geo) {\n\t\t// If no geo is set, grab the current one from the store\n\t\tgeo = state.client.geo;\n\t}\n\n\t(0, _clientUtils.getCitiesAsync)(citiesProps).then(function (data) {\n\t\tif (data.errors && data.errors.length) {\n\t\t\tthrow new Error(data.errors[0].detail);\n\t\t}\n\t\tif (!data.data) {\n\t\t\t// throw new Error(NO_DATA);\n\t\t}\n\t\treturn data;\n\t})['catch'](function (err) {\n\t\t(0, _tracking.track)({ a: 'cities_request_error', l: err.message, ni: 1 });\n\t\tconsole.log(\"cities_request_error\", err);\n\t}).then(function (res) {\n\t\tif (!res) return; //if no response then escape\n\t\tvar data = res.data || [];\n\n\t\t// let cities = data.data.map((c)=>(new City(c.attributes, geo, state.appData.copy)));\n\t\tvar cities = [];\n\t\tvar citiesCache = {};\n\t\tvar copy = (0, _utils.accessNested)(state, 'appData.copy') || {};\n\t\tvar useEnglishCopy = (0, _utils.accessNested)(state, 'appData.options.useEnglishCopy');\n\t\tdata.forEach(function (c) {\n\t\t\t// let newCity = new City(c.attributes, geo, copy, useEnglishCopy);\n\t\t\t// // let existingCity = cities.find((exCity)=>(exCity.name === newCity.name && exCity.geo.distanceFrom(newCity.geo, copy.$DISTANCE_UNIT) < 100));\n\t\t\t// let existingCity = cities.find((exCity)=>(exCity.name === newCity.name && exCity.geo.quickDistIndicator(newCity.geo) <= 2));\n\t\t\t// // <= 2 gives indicates the distance is approx. <= 83 mi (130 km)\n\t\t\t// if(existingCity) {\n\t\t\t// \t// newCity.merge(c.attributes, geo, copy)\n\t\t\t// } else {\n\t\t\t// \tcities.push(newCity);\n\t\t\t// }\n\n\t\t\t// For the US (2000 cities) we are iterating 4 million times (complexity close to O(n²), because for every city we are using find on the others).\n\t\t\t// Even if we don't check the distance for all of them, it takes some time to go through\n\t\t\t// Using a cache makes it (basically) O(n).\n\t\t\t// 2000 cities = 4892.872ms (using find) -> 16.420ms (using cache)\n\t\t\t// Results are the same, it just uses more memory while working (but that should be garbage collected afterwards)\n\t\t\tif (!c.attributes.country && overrideCountry) {\n\t\t\t\tc.attributes.country = overrideCountry;\n\t\t\t}\n\t\t\tvar newCity = new _City2['default'](c.attributes, geo, copy, useEnglishCopy);\n\t\t\tvar append = true,\n\t\t\t    key = newCity.name;\n\t\t\tif (citiesCache.hasOwnProperty(key)) {\n\t\t\t\tvar cachedCities = citiesCache[key];\n\t\t\t\tfor (var i = 0, l = cachedCities.length; i < l; i++) {\n\t\t\t\t\tvar cachedCity = cachedCities[i];\n\t\t\t\t\tif (cachedCity.geo.distanceFrom(newCity.geo) < 100) {\n\t\t\t\t\t\t// < 100 km\n\t\t\t\t\t\t// cachedCity.merge(c.attributes, geo);\n\t\t\t\t\t\tappend = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcitiesCache[key] = [];\n\t\t\t}\n\t\t\tif (append) {\n\t\t\t\tcities.push(newCity);\n\t\t\t\tcitiesCache[key].push(newCity);\n\t\t\t}\n\t\t});\n\t\tcitiesCache = null; // make sure to garbage-collect this \"big\" object (~same size as data and cities)\n\t\t_store2['default'].emit(actions.SET_CITIES, cities);\n\t});\n});\n\n// SET CONTAINING TO TRUE IF ids ARE SCREENINGS IDS AND YOU WANT THE THEATERS CONTAINING THEM\n// Issue : we might request things multiple times since previous results aren't always loaded when we check again\n_store2['default'].on(actions.EXTRA_THEATERS, function (ids, containing) {\n\tvar store = _store2['default'].get();\n\tvar showtimesState = store.showtimes;\n\t// Find theaters containing the screenings with the specified id\n\tif (containing) {\n\t\tids = ids.filter(function (id) {\n\t\t\treturn id && !showtimesState.theaters.find(function (t) {\n\t\t\t\treturn t.screenings.find(function (sc) {\n\t\t\t\t\treturn sc.id === id;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// Or theaters themselves with the specified id\n\t\tids = ids.filter(function (id) {\n\t\t\treturn id && !showtimesState.theaters.find(function (t) {\n\t\t\t\treturn t.id === id;\n\t\t\t});\n\t\t});\n\t}\n\tif (!ids.length) {\n\t\treturn;\n\t}\n\n\t// var loadingScreenings =\n\t// showtimesState.set({loading});\n\n\t(0, _clientUtils.getTheatersScreeningsAsync)(store, ids, containing)\n\t// .then(processScreeningsApi)\n\t.then(function (data) {\n\t\tif (data.errors && data.errors.length) {\n\t\t\tthrow new Error(data.errors[0].detail);\n\t\t}\n\t\tif (!data.data) {\n\t\t\t// throw new Error(NO_DATA);\n\t\t}\n\t\treturn (0, _clientUtils.processScreeningsApi)(data, store.client.geo, store.appData, store.activePage, thMasters);\n\t}).then(function (_ref2) {\n\t\tvar formats = _ref2.formats,\n\t\t    movies = _ref2.movies,\n\t\t    screenings = _ref2.screenings,\n\t\t    exhibitors = _ref2.exhibitors,\n\t\t    theaters = _ref2.theaters;\n\n\t\t// Add a property to make sure we don't use it on the main page\n\t\t// Store.emit(actions.ADD_THEATERS, theaters.map(t => {t.extra = true; return t;}));\n\t\t_store2['default'].emit(actions.ADD_THEATERS, theaters);\n\t})['catch'](function (err) {\n\t\t(0, _tracking.track)({ a: 'showtimes_request_error', l: err.message, ni: 1 });\n\t\tconsole.log(\"showtimes_request_error\", err);\n\t});\n});\n\n_store2['default'].on(actions.SELECT_SCREENING, function (_ref3) {\n\tvar screening = _ref3.screening,\n\t    theater = _ref3.theater;\n\n\t// // Find the right theater\n\t// let theater = Store.get().showtimes.theaters.find((theater) => theater.id === theaterId);\n\t// set the screening for it\n\ttheater.set({ activeScreening: screening });\n});\n\n_store2['default'].on(actions.SHOW_SCREENING_AUTH, function (_ref4) {\n\tvar screening = _ref4.screening,\n\t    theater = _ref4.theater;\n\n\t// TODO: Maybe we should use activeScreening and check the authToken in the render\n\tvar store = _store2['default'].get();\n\tif (screening) {\n\t\tif (store.user.authToken) {\n\t\t\t_store2['default'].emit(actions.SELECT_SCREENING, { theater: theater, screening: screening });\n\t\t\t_store2['default'].emit(actions.OPEN_TICKETING, { theater: theater, screening: screening });\n\t\t\treturn;\n\t\t} else {\n\t\t\tstore.showtimes.theaters.forEach(function (t) {\n\t\t\t\tif (t !== theater && t.authScreening) {\n\t\t\t\t\tt.set({ authScreening: null });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\ttheater.set({ authScreening: screening });\n});\n\n_store2['default'].on(actions.AUTH_RESPONSE, function (data) {\n\tvar token = data && data.token;\n\t_store2['default'].get().user.set({ authToken: data && data.token });\n\tif (token) {\n\t\tvar theater = _store2['default'].get().showtimes.theaters.find(function (theater) {\n\t\t\treturn theater.active && theater.authScreening;\n\t\t});\n\t\tif (theater) {\n\t\t\tvar screening = theater.authScreening;\n\t\t\ttheater = theater.set({ authScreening: null, activeScreening: screening });\n\t\t\t_store2['default'].emit(actions.OPEN_TICKETING, { theater: theater, screening: screening });\n\t\t}\n\t}\n});\n\n_store2['default'].on(actions.AUTH_CLEAR, function () {\n\t_store2['default'].get().user.remove('authToken');\n});\n\n/* EXTRA INTEGRATIONS\n--------------------------------*/\n\n_store2['default'].on(actions.PAGE_STATE_LOADED, function () {\n\tvar appData = _store2['default'].get().appData.toJS();\n\tvar mailchimp = (0, _utils.accessNested)(appData, 'apis.mailchimp');\n\tif (mailchimp && mailchimp.baseUrl && mailchimp.uuid && mailchimp.lid) {\n\t\tvar finalObject = {\n\t\t\tbaseUrl: mailchimp.baseUrl,\n\t\t\tuuid: mailchimp.uuid,\n\t\t\tlid: mailchimp.lid\n\t\t};\n\t\tvar script = document.createElement('script');\n\t\tscript.onload = function () {\n\t\t\ttry {\n\t\t\t\twindow.require([\"mojo/signup-forms/Loader\"], function (L) {\n\t\t\t\t\treturn L.start(finalObject);\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log('MAILCHIMP ERROR', e);\n\t\t\t}\n\t\t};\n\t\tscript.setAttribute('data-dojo-config', 'usePlainJson: true, isDebug: false');\n\t\tscript.src = '//downloads.mailchimp.com/js/signup-forms/popup/embed.js';\n\t\tdocument.body.appendChild(script);\n\t}\n});\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14)))\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nif (typeof window !== 'undefined') {\n\t(function (history) {\n\t\tvar pushState = history.pushState;\n\t\t// Do not change that to arrow function ! (we use `arguments`)\n\t\thistory.pushState = function (state) {\n\t\t\tvar returnValue = pushState.apply(history, arguments);\n\t\t\tif (typeof history.onpushstate == 'function') {\n\t\t\t\thistory.onpushstate({ state: state });\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t};\n\n\t\tvar replaceState = history.replaceState;\n\t\thistory.replaceState = function (state) {\n\t\t\tvar returnValue = replaceState.apply(history, arguments);\n\t\t\tif (typeof history.onreplacestate == 'function') {\n\t\t\t\thistory.onreplacestate({ state: state });\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t};\n\t})(window.history);\n}\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Here there used to be some polyfill for things like:\n// String.prototype.startsWith\n// Object.prototype.assign\n// But these are already included in babel-polyfill\n// No need to include it twice\n\n// Fix console.debug on IE10\n/* eslint-disable no-console */\nif (console && typeof console.debug !== 'function') {\n\tconsole.debug = console.info;\n}\n/* eslint-enable no-console */\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(setImmediate) {(function (root) {\n\n  // Store setTimeout reference so promise-polyfill will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var setTimeoutFunc = setTimeout;\n\n  function noop() {}\n  \n  // Polyfill for Function.prototype.bind\n  function bind(fn, thisArg) {\n    return function () {\n      fn.apply(thisArg, arguments);\n    };\n  }\n\n  function Promise(fn) {\n    if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');\n    if (typeof fn !== 'function') throw new TypeError('not a function');\n    this._state = 0;\n    this._handled = false;\n    this._value = undefined;\n    this._deferreds = [];\n\n    doResolve(fn, this);\n  }\n\n  function handle(self, deferred) {\n    while (self._state === 3) {\n      self = self._value;\n    }\n    if (self._state === 0) {\n      self._deferreds.push(deferred);\n      return;\n    }\n    self._handled = true;\n    Promise._immediateFn(function () {\n      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n      if (cb === null) {\n        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n        return;\n      }\n      var ret;\n      try {\n        ret = cb(self._value);\n      } catch (e) {\n        reject(deferred.promise, e);\n        return;\n      }\n      resolve(deferred.promise, ret);\n    });\n  }\n\n  function resolve(self, newValue) {\n    try {\n      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n        var then = newValue.then;\n        if (newValue instanceof Promise) {\n          self._state = 3;\n          self._value = newValue;\n          finale(self);\n          return;\n        } else if (typeof then === 'function') {\n          doResolve(bind(then, newValue), self);\n          return;\n        }\n      }\n      self._state = 1;\n      self._value = newValue;\n      finale(self);\n    } catch (e) {\n      reject(self, e);\n    }\n  }\n\n  function reject(self, newValue) {\n    self._state = 2;\n    self._value = newValue;\n    finale(self);\n  }\n\n  function finale(self) {\n    if (self._state === 2 && self._deferreds.length === 0) {\n      Promise._immediateFn(function() {\n        if (!self._handled) {\n          Promise._unhandledRejectionFn(self._value);\n        }\n      });\n    }\n\n    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n      handle(self, self._deferreds[i]);\n    }\n    self._deferreds = null;\n  }\n\n  function Handler(onFulfilled, onRejected, promise) {\n    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n    this.promise = promise;\n  }\n\n  /**\n   * Take a potentially misbehaving resolver function and make sure\n   * onFulfilled and onRejected are only called once.\n   *\n   * Makes no guarantees about asynchrony.\n   */\n  function doResolve(fn, self) {\n    var done = false;\n    try {\n      fn(function (value) {\n        if (done) return;\n        done = true;\n        resolve(self, value);\n      }, function (reason) {\n        if (done) return;\n        done = true;\n        reject(self, reason);\n      });\n    } catch (ex) {\n      if (done) return;\n      done = true;\n      reject(self, ex);\n    }\n  }\n\n  Promise.prototype['catch'] = function (onRejected) {\n    return this.then(null, onRejected);\n  };\n\n  Promise.prototype.then = function (onFulfilled, onRejected) {\n    var prom = new (this.constructor)(noop);\n\n    handle(this, new Handler(onFulfilled, onRejected, prom));\n    return prom;\n  };\n\n  Promise.all = function (arr) {\n    return new Promise(function (resolve, reject) {\n      if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');\n      var args = Array.prototype.slice.call(arr);\n      if (args.length === 0) return resolve([]);\n      var remaining = args.length;\n\n      function res(i, val) {\n        try {\n          if (val && (typeof val === 'object' || typeof val === 'function')) {\n            var then = val.then;\n            if (typeof then === 'function') {\n              then.call(val, function (val) {\n                res(i, val);\n              }, reject);\n              return;\n            }\n          }\n          args[i] = val;\n          if (--remaining === 0) {\n            resolve(args);\n          }\n        } catch (ex) {\n          reject(ex);\n        }\n      }\n\n      for (var i = 0; i < args.length; i++) {\n        res(i, args[i]);\n      }\n    });\n  };\n\n  Promise.resolve = function (value) {\n    if (value && typeof value === 'object' && value.constructor === Promise) {\n      return value;\n    }\n\n    return new Promise(function (resolve) {\n      resolve(value);\n    });\n  };\n\n  Promise.reject = function (value) {\n    return new Promise(function (resolve, reject) {\n      reject(value);\n    });\n  };\n\n  Promise.race = function (values) {\n    return new Promise(function (resolve, reject) {\n      for (var i = 0, len = values.length; i < len; i++) {\n        values[i].then(resolve, reject);\n      }\n    });\n  };\n\n  // Use polyfill for setImmediate for performance gains\n  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||\n    function (fn) {\n      setTimeoutFunc(fn, 0);\n    };\n\n  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n    if (typeof console !== 'undefined' && console) {\n      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n    }\n  };\n\n  /**\n   * Set the immediate function to execute callbacks\n   * @param fn {function} Function to execute\n   * @deprecated\n   */\n  Promise._setImmediateFn = function _setImmediateFn(fn) {\n    Promise._immediateFn = fn;\n  };\n\n  /**\n   * Change the function to execute on unhandled rejection\n   * @param {function} fn Function to execute on unhandled rejection\n   * @deprecated\n   */\n  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n    Promise._unhandledRejectionFn = fn;\n  };\n  \n  if (typeof module !== 'undefined' && module.exports) {\n    module.exports = Promise;\n  } else if (!root.Promise) {\n    root.Promise = Promise;\n  }\n\n})(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(81).setImmediate))\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _preact = __webpack_require__(0);\n\nvar _clientUtils = __webpack_require__(4);\n\n__webpack_require__(31);\n\n__webpack_require__(32);\n\n__webpack_require__(33);\n\nvar _embedDoc = __webpack_require__(30);\n\nvar _embedDoc2 = _interopRequireDefault(_embedDoc);\n\nvar _embedApp = __webpack_require__(29);\n\nvar _embedApp2 = _interopRequireDefault(_embedApp);\n\nvar _promisePolyfill = __webpack_require__(35);\n\nvar _promisePolyfill2 = _interopRequireDefault(_promisePolyfill);\n\n__webpack_require__(34);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// Add promises to window if it doesn't exist (polyfill)\n// Add events for when you do history.push\n\n// TODO: we should not be using the whole showtimes store for this\nif (typeof window !== 'undefined' && !window.Promise) {\n\twindow.Promise = _promisePolyfill2['default'];\n}\n\n// Client render\nif (typeof document !== 'undefined') {\n\n\t/* Setting up the store\n -----------------------------*/\n\n\tvar initialState = window.__INITIAL_STATE__;\n\tvar initialStore = (0, _clientUtils.buildClientStoreData)(initialState);\n\n\t// Initialize error tracking\n\tif (typeof Raven !== 'undefined') Raven.config('https://050f2a45780848589e3ed4668bbf62dc@sentry.io/182205').install();\n\n\tif (window.__START_PAGE_ID__) {\n\t\t// console.log('custom start page id', window.__START_PAGE_ID__);\n\n\t\tinitialState.activePage = initialState.appData.pages[window.__START_PAGE_ID__];\n\t\t// Also update the background state of the new page\n\t\tinitialState.background = {\n\t\t\tvideoPlaying: initialState.activePage.data ? initialState.activePage.data.allowBgVideo : true,\n\t\t\tvideoEnabled: initialState.activePage.data ? initialState.activePage.data.allowBgVideo : true\n\t\t};\n\t}\n\n\t/* Initial render of the app\n ----------------------------------*/\n\t(0, _preact.render)((0, _preact.h)(_embedApp2['default'], { initialStore: initialStore }), document.body, document.getElementById(\"app\"));\n}\n\nmodule.exports = {\n\tApp: _embedApp2['default'],\n\tDoc: _embedDoc2['default']\n};\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _preact = __webpack_require__(0);\n\nvar _transitionStates = __webpack_require__(38);\n\nvar transitionStates = _interopRequireWildcard(_transitionStates);\n\nvar _shallowEquals = __webpack_require__(28);\n\nvar _shallowEquals2 = _interopRequireDefault(_shallowEquals);\n\nvar _transition = __webpack_require__(68);\n\nvar _transition2 = _interopRequireDefault(_transition);\n\nvar _utils = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar isServer = typeof window === 'undefined';\n\n/**\n* Transition between children changing\n* All the children involved should have an id set as a property!\n* @prop {string} class - The class on the transitionWrapper\n* @prop {Number} duration[!] - The duration for the whole transitionWrapper\n* @prop {string} enteringClass - Extra class added when child is entering\n* @prop {string} leavingClass - Extra class added when child is leaving\n* @prop {string} visibleClass - Extra class added when child is visible\n* @prop {string} emptyClass - Extra class added once child has left\n*/\n\nvar Transition = function (_Component) {\n\t_inherits(Transition, _Component);\n\n\tfunction Transition(props) {\n\t\t_classCallCheck(this, Transition);\n\n\t\tvar _this = _possibleConstructorReturn(this, (Transition.__proto__ || Object.getPrototypeOf(Transition)).call(this, props));\n\n\t\t_this.getStyles = function () {\n\t\t\treturn {\n\t\t\t\t'transition-duration': _this.props.duration / 2 + 'ms',\n\t\t\t\t'animation-duration': _this.props.duration / 2 + 'ms'\n\t\t\t};\n\t\t};\n\n\t\t_this.setTimer = function (f, d) {\n\t\t\t_this.endTimer();\n\t\t\t_this.timerFunc = f;\n\t\t\t_this.timer = setTimeout(function () {\n\t\t\t\tf();\n\t\t\t\t_this.timer = null;\n\t\t\t\tif (_this.afterTimer) {\n\t\t\t\t\t_this.afterTimer();\n\t\t\t\t\t_this.afterTimer = null;\n\t\t\t\t}\n\t\t\t}, d);\n\t\t};\n\n\t\t_this.endTimer = function (preventExecution) {\n\t\t\tif (!_this.timer) return;\n\t\t\tclearTimeout(_this.timer);\n\n\t\t\t// Call the function early\n\t\t\tif (!preventExecution) {\n\t\t\t\t_this.timerFunc();\n\t\t\t}\n\n\t\t\t_this.timer = null;\n\t\t\tif (_this.afterTimer) {\n\t\t\t\t_this.afterTimer();\n\t\t\t\t_this.afterTimer = null;\n\t\t\t}\n\t\t};\n\n\t\tvar childGenerator = _this.getChildGenerator(props);\n\t\tvar children = childGenerator();\n\n\t\tvar initialState = {\n\t\t\tfirstChild: childGenerator,\n\t\t\tfirstChildState: transitionStates.STATE_CHILD_ENTERING,\n\t\t\tsecondChild: null,\n\t\t\tsecondChildState: transitionStates.STATE_CHILD_EMPTY,\n\t\t\tupcomingChild: childGenerator\n\t\t};\n\n\t\tvar disableInit = _this.props.noInitialTransition;\n\t\tif (disableInit) {\n\t\t\tinitialState.firstChildState = transitionStates.STATE_CHILD_VISIBLE;\n\t\t}\n\t\t_this.state = initialState;\n\n\t\tif (!disableInit) {\n\t\t\t_this.setTimer(function () {\n\t\t\t\t_this.setState({\n\t\t\t\t\tfirstChildState: _this.getNextStep('firstChild', _this.state.firstChildState)\n\t\t\t\t});\n\t\t\t}, props.duration / 2);\n\t\t}\n\t\treturn _this;\n\t}\n\n\t_createClass(Transition, [{\n\t\tkey: 'componentWillReceiveProps',\n\t\tvalue: function componentWillReceiveProps(_ref) {\n\t\t\tvar waitBeforeNext = _ref.waitBeforeNext,\n\t\t\t    props = _objectWithoutProperties(_ref, ['waitBeforeNext']);\n\n\t\t\tvar childGenerator = this.getChildGenerator(props);\n\t\t\tvar child = childGenerator();\n\n\t\t\tvar newChildId = this.getId(child);\n\t\t\tvar oldChildId = this.getId(this.state.upcomingChild());\n\n\t\t\tif (newChildId !== oldChildId) {\n\t\t\t\tthis.setState({ upcomingChild: childGenerator });\n\t\t\t\tif (!waitBeforeNext || this.state.firstChildState === transitionStates.STATE_CHILD_VISIBLE || this.state.secondChildState === transitionStates.STATE_CHILD_VISIBLE) {\n\t\t\t\t\tthis.goToNextPage();\n\t\t\t\t} else {\n\t\t\t\t\tthis.afterTimer = this.goToNextPage;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Update the current child so it gets it new props\n\t\t\t\tif (this.state.firstChild && this.getId(this.state.firstChild()) === newChildId) {\n\t\t\t\t\tthis.setState({ firstChild: childGenerator });\n\t\t\t\t}\n\t\t\t\tif (this.state.secondChild && this.getId(this.state.secondChild()) === newChildId) {\n\t\t\t\t\tthis.setState({ secondChild: childGenerator });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getChildGenerator',\n\t\tvalue: function getChildGenerator(props) {\n\t\t\treturn typeof props.renderChildren === 'function' ? props.renderChildren : function () {\n\t\t\t\treturn props.children[0];\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'getId',\n\t\tvalue: function getId(vNode) {\n\t\t\treturn vNode && vNode.attributes && vNode.attributes.id;\n\t\t}\n\t}, {\n\t\tkey: 'goToNextPage',\n\t\tvalue: function goToNextPage() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.endTimer();\n\n\t\t\tvar _state = this.state,\n\t\t\t    firstChild = _state.firstChild,\n\t\t\t    secondChild = _state.secondChild,\n\t\t\t    upcomingChild = _state.upcomingChild,\n\t\t\t    firstChildState = _state.firstChildState,\n\t\t\t    secondChildState = _state.secondChildState;\n\n\t\t\t// Ugly quickfix to prevent same -> same transition\n\n\t\t\tvar firstChildVisible = firstChildState === transitionStates.STATE_CHILD_VISIBLE;\n\t\t\tvar secondChildVisible = secondChildState === transitionStates.STATE_CHILD_VISIBLE;\n\n\t\t\tif (firstChildVisible && this.getId(upcomingChild()) === this.getId(firstChild()) || secondChildVisible && this.getId(upcomingChild()) === this.getId(secondChild())) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setState({\n\t\t\t\tfirstChildState: this.getNextStep('firstChild', firstChildState),\n\t\t\t\tsecondChildState: this.getNextStep('secondChild', secondChildState)\n\t\t\t});\n\n\t\t\tthis.setTimer(function () {\n\t\t\t\t_this2.setState({\n\t\t\t\t\tfirstChildState: _this2.getNextStep('firstChild', _this2.state.firstChildState),\n\t\t\t\t\tsecondChildState: _this2.getNextStep('secondChild', _this2.state.secondChildState)\n\t\t\t\t});\n\t\t\t}, this.props.duration / 2);\n\t\t}\n\t}, {\n\t\tkey: 'getNextStep',\n\t\tvalue: function getNextStep(childType, currentState) {\n\t\t\tvar newState = {};\n\n\t\t\tswitch (currentState) {\n\t\t\t\tcase transitionStates.STATE_CHILD_ENTERING:\n\t\t\t\t\treturn transitionStates.STATE_CHILD_VISIBLE;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_VISIBLE:\n\t\t\t\t\treturn transitionStates.STATE_CHILD_LEAVING;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_LEAVING:\n\t\t\t\t\tnewState[childType] = null;\n\t\t\t\t\tthis.setState(newState);\n\t\t\t\t\treturn transitionStates.STATE_CHILD_EMPTY;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_EMPTY:\n\t\t\t\t\tnewState[childType] = this.state.upcomingChild;\n\t\t\t\t\tthis.setState(newState);\n\t\t\t\t\treturn transitionStates.STATE_CHILD_ENTERING;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getActiveClass',\n\t\tvalue: function getActiveClass(currentState) {\n\t\t\tvar _props = this.props,\n\t\t\t    enteringClass = _props.enteringClass,\n\t\t\t    visibleClass = _props.visibleClass,\n\t\t\t    leavingClass = _props.leavingClass,\n\t\t\t    emptyClass = _props.emptyClass;\n\n\t\t\tvar baseClass = (0, _utils.condClass)(this.props.baseClass);\n\n\t\t\tswitch (currentState) {\n\t\t\t\tcase transitionStates.STATE_CHILD_ENTERING:\n\t\t\t\t\treturn _transition2['default'].entering + (0, _utils.condClass)(enteringClass) + baseClass;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_VISIBLE:\n\t\t\t\t\treturn _transition2['default'].visible + (0, _utils.condClass)(visibleClass) + baseClass;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_LEAVING:\n\t\t\t\t\treturn _transition2['default'].leaving + (0, _utils.condClass)(leavingClass) + baseClass;\n\n\t\t\t\tcase transitionStates.STATE_CHILD_EMPTY:\n\t\t\t\t\treturn _transition2['default'].empty + (0, _utils.condClass)(emptyClass) + baseClass;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn baseClass;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render(_ref2, _ref3) {\n\t\t\tvar firstChild = _ref3.firstChild,\n\t\t\t    firstChildState = _ref3.firstChildState,\n\t\t\t    secondChild = _ref3.secondChild,\n\t\t\t    secondChildState = _ref3.secondChildState;\n\n\t\t\tvar duration = _ref2.duration,\n\t\t\t    props = _objectWithoutProperties(_ref2, ['duration']);\n\n\t\t\tvar child = this.getChildGenerator(props)();\n\n\t\t\tvar firstChildNode = void 0;\n\t\t\tvar secondChildNode = void 0;\n\n\t\t\tvar styles = this.getStyles();\n\n\t\t\tfirstChild = firstChild && firstChild();\n\n\t\t\t// Set the current state\n\t\t\tif (firstChild && firstChild.attributes) {\n\t\t\t\tfirstChild.attributes.transitionState = isServer ? transitionStates.STATE_CHILD_VISIBLE : firstChildState;\n\t\t\t}\n\n\t\t\tsecondChild = secondChild && secondChild();\n\t\t\tif (secondChild && secondChild.attributes) {\n\t\t\t\tsecondChild.attributes.transitionState = secondChildState;\n\t\t\t}\n\n\t\t\tvar firstChildClass = this.getActiveClass(isServer ? transitionStates.STATE_CHILD_VISIBLE : firstChildState);\n\t\t\tfirstChildNode = (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': firstChildClass, style: styles },\n\t\t\t\tfirstChild\n\t\t\t);\n\n\t\t\tvar secondChildClass = this.getActiveClass(secondChildState);\n\t\t\tsecondChildNode = (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': secondChildClass, style: styles },\n\t\t\t\tsecondChild\n\t\t\t);\n\n\t\t\tvar containerProps = {};\n\n\t\t\tif (props['class']) containerProps['class'] = props['class'];\n\t\t\tif (props.id) containerProps.id = props.id;\n\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\tcontainerProps,\n\t\t\t\tfirstChildNode,\n\t\t\t\tsecondChildNode\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn Transition;\n}(_preact.Component);\n\nexports['default'] = Transition;\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar STATE_CHILD_ENTERING = exports.STATE_CHILD_ENTERING = 'STATE_CHILD_ENTERING';\nvar STATE_CHILD_VISIBLE = exports.STATE_CHILD_VISIBLE = 'STATE_CHILD_VISIBLE';\nvar STATE_CHILD_LEAVING = exports.STATE_CHILD_LEAVING = 'STATE_CHILD_LEAVING';\nvar STATE_CHILD_EMPTY = exports.STATE_CHILD_EMPTY = 'STATE_CHILD_EMPTY';\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class;\n\nvar _preact = __webpack_require__(0);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _pure = __webpack_require__(15);\n\nvar _pure2 = _interopRequireDefault(_pure);\n\nvar _cookiesModal = __webpack_require__(69);\n\nvar _cookiesModal2 = _interopRequireDefault(_cookiesModal);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nexports['default'] = (0, _pure2['default'])(_class = function (_Component) {\n\t_inherits(Modal, _Component);\n\n\tfunction Modal(props) {\n\t\t_classCallCheck(this, Modal);\n\n\t\tvar _this = _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, props));\n\n\t\t_this.acceptCookies = _this.sendResult.bind(_this, true);\n\t\t_this.rejectCookies = _this.sendResult.bind(_this, false);\n\t\treturn _this;\n\t}\n\n\t_createClass(Modal, [{\n\t\tkey: 'sendResult',\n\t\tvalue: function sendResult(value) {\n\t\t\t_store2['default'].emit(actions.HIDE_MODAL, value === true);\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render(props) {\n\t\t\tvar appData = props.appData || _store2['default'].get().appData || {};\n\t\t\tvar copy = appData.copy || {};\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': _cookiesModal2['default'].container },\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'h3',\n\t\t\t\t\t{ 'class': _cookiesModal2['default'].title },\n\t\t\t\t\tcopy.$COOKIES_MODAL_TITLE\n\t\t\t\t),\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': _cookiesModal2['default'].text },\n\t\t\t\t\tcopy.$COOKIES_MODAL_TEXT\n\t\t\t\t),\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': _cookiesModal2['default'].buttons },\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ 'class': _cookiesModal2['default'].yes, type: 'button', onClick: this.acceptCookies },\n\t\t\t\t\t\tcopy.$COOKIES_MODAL_ACCEPT\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ 'class': _cookiesModal2['default'].no, type: 'button', onClick: this.rejectCookies },\n\t\t\t\t\t\tcopy.$COOKIES_MODAL_DENY\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn Modal;\n}(_preact.Component)) || _class;\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class;\n\nvar _preact = __webpack_require__(0);\n\nvar _pure = __webpack_require__(15);\n\nvar _pure2 = _interopRequireDefault(_pure);\n\nvar _copy = __webpack_require__(10);\n\nvar _link = __webpack_require__(7);\n\nvar _transition = __webpack_require__(37);\n\nvar _transition2 = _interopRequireDefault(_transition);\n\nvar _dynamicTheaterSentence = __webpack_require__(70);\n\nvar _dynamicTheaterSentence2 = _interopRequireDefault(_dynamicTheaterSentence);\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nexports['default'] = (0, _pure2['default'])(_class = function (_Component) {\n\t_inherits(DynamicTheaterSentence, _Component);\n\n\tfunction DynamicTheaterSentence(props) {\n\t\t_classCallCheck(this, DynamicTheaterSentence);\n\n\t\tvar _this = _possibleConstructorReturn(this, (DynamicTheaterSentence.__proto__ || Object.getPrototypeOf(DynamicTheaterSentence)).call(this, props));\n\n\t\t_this.switchActive = function () {\n\t\t\tvar newState = {\n\t\t\t\tshowTheater: !_this.state.showTheater\n\t\t\t};\n\n\t\t\tif (!_this.state.showTheater) {\n\t\t\t\t// let's show the new theater\n\t\t\t\tif (_this.state.activeTheater < _this.props.showtimes.theaters.length - 1) {\n\t\t\t\t\tnewState.activeTheater = _this.state.activeTheater + 1;\n\t\t\t\t} else {\n\t\t\t\t\tnewState.activeTheater = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Update the state\n\t\t\t_this.setState(newState);\n\n\t\t\t// prepare for the next one, make sure we show the sentence longer then the theater\n\t\t\t_this.timer = setTimeout(_this.switchActive, newState.showTheater ? _this.theaterTime : _this.nearbyTime);\n\t\t};\n\n\t\t_this.theaterTime = 4000;\n\t\t_this.nearbyTime = 4000;\n\n\t\t_this.state = {\n\t\t\tactiveTheater: 0,\n\t\t\tshowTheater: false\n\t\t};\n\t\treturn _this;\n\t}\n\n\t_createClass(DynamicTheaterSentence, [{\n\t\tkey: 'componentWillReceiveProps',\n\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\tif (!nextProps.showtimes.loading && !this.loadingFinished) {\n\t\t\t\t// Loading is finished,\n\t\t\t\t// so we'll hopefully have some theaters now\n\t\t\t\tthis.loadingFinished = true;\n\n\t\t\t\tif (nextProps.showtimes.theaters.length > 1) {\n\t\t\t\t\t// Start the rotation when there are theaters\n\t\t\t\t\tthis.timer = setTimeout(this.switchActive, 3000);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'componentWillUnmount',\n\t\tvalue: function componentWillUnmount() {\n\t\t\tif (this.timer) {\n\t\t\t\tclearInterval(this.timer);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render(props) {\n\t\t\tvar showtimes = props.showtimes,\n\t\t\t    textColor = props.textColor,\n\t\t\t    location = props.location,\n\t\t\t    textFontSize = props.textFontSize,\n\t\t\t    highlight = props.highlight,\n\t\t\t    href = props.href,\n\t\t\t    releaseDate = props.releaseDate,\n\t\t\t    extraQueryParameters = props.extraQueryParameters;\n\n\n\t\t\tvar linkQueryParameters = _extends({}, extraQueryParameters);\n\n\t\t\tvar nrTheaters = showtimes.theaters.length;\n\t\t\tvar sentence = '';\n\t\t\tvar beforeRelease = new Date().getTime() < releaseDate.getTime();\n\n\t\t\tvar nowPlaying = beforeRelease ? (0, _copy.getCopy)('TICKETS_AVAILABLE') : (0, _copy.getCopy)('NOW_PLAYING_IN_THEATERS');\n\t\t\t// Show different copy when movie isn't out yet\n\t\t\t// TODO: replaceWithVNode instead of split (also we split nowPlayingTheater but never use the second half)\n\t\t\tvar nowPlayingTheater = (beforeRelease ? (0, _copy.getCopy)('TICKETS_AVAILABLE_AT_THEATER') : (0, _copy.getCopy)('NOW_PLAYING_IN_THEATER')).split('%THEATER%');\n\t\t\tvar nowPlayingTheaters = (beforeRelease ? (0, _copy.getCopy)('TICKETS_AVAILABLE_AT_THEATER_COUNT') : (0, _copy.getCopy)('NOW_PLAYING_IN_THEATER_COUNT')).split('%THEATER_COUNT%');\n\n\t\t\t// max 10 theaters\n\t\t\tif (nrTheaters > 10) {\n\t\t\t\tnrTheaters = 10;\n\t\t\t}\n\t\t\t// Some weird behaviour with Math.max not always working in some browsers\n\t\t\t// nrTheaters = Math.max(nrTheaters, 10);\n\n\n\t\t\tif (nrTheaters > 1) {\n\t\t\t\t// Basic sentence with cinemas nearby\n\t\t\t\tif (this.state.showTheater) {\n\t\t\t\t\tvar activeTheater = showtimes.theaters[this.state.activeTheater];\n\t\t\t\t\tlinkQueryParameters.location = activeTheater.geo.lat + ',' + activeTheater.geo.lon;\n\n\t\t\t\t\t// Display the actual theater name\n\t\t\t\t\tsentence = (0, _preact.h)(\n\t\t\t\t\t\t_link.Link,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'theaters-' + activeTheater.id,\n\t\t\t\t\t\t\tkey: 'theaters-' + activeTheater.id,\n\t\t\t\t\t\t\thref: href + '?' + _qs2['default'].stringify(linkQueryParameters),\n\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\tlinkClass: _dynamicTheaterSentence2['default'].sentence\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].intro,\n\t\t\t\t\t\t\t\tstyle: { color: textColor }\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnowPlayingTheater\n\t\t\t\t\t\t),\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].theater,\n\t\t\t\t\t\t\t\tstyle: { color: highlight }\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tactiveTheater.name\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tsentence = (0, _preact.h)(\n\t\t\t\t\t\t_link.Link,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'theaters-' + nrTheaters,\n\t\t\t\t\t\t\tkey: 'theaters-' + nrTheaters,\n\t\t\t\t\t\t\thref: href + '?' + _qs2['default'].stringify(linkQueryParameters),\n\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\tlinkClass: _dynamicTheaterSentence2['default'].sentence\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{ 'class': _dynamicTheaterSentence2['default'].intro, style: { color: textColor } },\n\t\t\t\t\t\t\tnowPlayingTheaters[0]\n\t\t\t\t\t\t),\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].theater,\n\t\t\t\t\t\t\t\tstyle: { color: highlight }\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnrTheaters,\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\tnowPlayingTheaters[1]\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (nrTheaters === 1) {\n\t\t\t\tvar selectedTheater = showtimes.theaters[0];\n\t\t\t\tlinkQueryParameters.location = selectedTheater.geo.lat + ',' + selectedTheater.geo.lon;\n\n\t\t\t\t// Only one cinema available\n\t\t\t\tsentence = (0, _preact.h)(\n\t\t\t\t\t_link.Link,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'theaters-1-' + nrTheaters,\n\t\t\t\t\t\tkey: 'theaters-' + selectedTheater.id,\n\t\t\t\t\t\thref: href + '?' + _qs2['default'].stringify(linkQueryParameters),\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\tlinkClass: _dynamicTheaterSentence2['default'].sentence\n\t\t\t\t\t},\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].intro,\n\t\t\t\t\t\t\tstyle: { color: textColor }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnowPlayingTheater\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].theater,\n\t\t\t\t\t\t\tstyle: { color: highlight }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselectedTheater.name\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if (nrTheaters === 0) {\n\t\t\t\t// No cinemas available\n\t\t\t\tsentence = (0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ id: 'theaters-' + nrTheaters },\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ style: { color: textColor } },\n\t\t\t\t\t\tnowPlaying\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (showtimes.loading) {\n\t\t\t\tsentence = (0, _preact.h)('span', { id: 'empty' });\n\t\t\t}\n\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].container,\n\t\t\t\t\tstyle: { fontSize: textFontSize }\n\t\t\t\t},\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t_transition2['default'],\n\t\t\t\t\t{\n\t\t\t\t\t\t'class': _dynamicTheaterSentence2['default'].transitionContainer,\n\t\t\t\t\t\tvisibleClass: _dynamicTheaterSentence2['default'].transition,\n\t\t\t\t\t\tleavingClass: _dynamicTheaterSentence2['default'].transition,\n\t\t\t\t\t\tenteringClass: _dynamicTheaterSentence2['default'].transition,\n\t\t\t\t\t\tduration: 1000\n\t\t\t\t\t},\n\t\t\t\t\tsentence\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn DynamicTheaterSentence;\n}(_preact.Component)) || _class;\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class;\n\nvar _preact = __webpack_require__(0);\n\nvar _pure = __webpack_require__(15);\n\nvar _pure2 = _interopRequireDefault(_pure);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _exitModal = __webpack_require__(71);\n\nvar _exitModal2 = _interopRequireDefault(_exitModal);\n\nvar _tracking = __webpack_require__(6);\n\nvar _copy = __webpack_require__(10);\n\nvar _link = __webpack_require__(7);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nexports['default'] = (0, _pure2['default'])(_class = function (_Component) {\n\t_inherits(ExitModal, _Component);\n\n\tfunction ExitModal() {\n\t\t_classCallCheck(this, ExitModal);\n\n\t\tvar _this = _possibleConstructorReturn(this, (ExitModal.__proto__ || Object.getPrototypeOf(ExitModal)).call(this));\n\n\t\t_this.closeModal = _this.closeModal.bind(_this);\n\t\t_this.openLink = _this.openLink.bind(_this);\n\t\treturn _this;\n\t}\n\n\t_createClass(ExitModal, [{\n\t\tkey: 'closeModal',\n\t\tvalue: function closeModal() {\n\t\t\t_store2['default'].emit(actions.HIDE_MODAL);\n\t\t\t(0, _tracking.track)({ a: 'exit_modal_click_cancel' });\n\t\t}\n\t}, {\n\t\tkey: 'openLink',\n\t\tvalue: function openLink() {\n\t\t\t_store2['default'].emit(actions.HIDE_MODAL);\n\t\t}\n\t}, {\n\t\tkey: 'getTitle',\n\t\tvalue: function getTitle() {\n\t\t\t// Should we use the current location.host instead of meta > vanity ?\n\t\t\t// Would be a bit weird if multiple vanities are available\n\t\t\tvar vanity = this.props.vanity || '';\n\t\t\t// get rid of the http://\n\t\t\tvar strippedVanity = vanity.split('://').pop();\n\t\t\tvar content = (0, _copy.getCopy)('EXIT_MODAL_TITLE', { vanity: strippedVanity });\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'h2',\n\t\t\t\t{ 'class': _exitModal2['default'].title },\n\t\t\t\tcontent\n\t\t\t);\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render(props) {\n\t\t\tvar href = props.href,\n\t\t\t    _props$vanity = props.vanity,\n\t\t\t    vanity = _props$vanity === undefined ? '' : _props$vanity;\n\n\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': _exitModal2['default'].container },\n\t\t\t\tthis.getTitle(),\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t_link.Link,\n\t\t\t\t\t{\n\t\t\t\t\t\thref: href,\n\t\t\t\t\t\textraOnClick: this.openLink,\n\t\t\t\t\t\tignoreExitModal: true,\n\t\t\t\t\t\ttrackId: 'exit_modal_click_ok',\n\t\t\t\t\t\ttrackLabel: href,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t'class': _exitModal2['default'].button\n\t\t\t\t\t},\n\t\t\t\t\t(0, _copy.getCopy)('OK')\n\t\t\t\t),\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ onClick: this.closeModal, 'class': _exitModal2['default'].button },\n\t\t\t\t\t(0, _copy.getCopy)('CANCEL')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn ExitModal;\n}(_preact.Component)) || _class;\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(fetch) {\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _preact = __webpack_require__(0);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _utils = __webpack_require__(2);\n\nvar _link = __webpack_require__(7);\n\nvar _changeRegionModal = __webpack_require__(72);\n\nvar _changeRegionModal2 = _interopRequireDefault(_changeRegionModal);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar formatUrlWithoutProtocol = function formatUrlWithoutProtocol(url) {\n\treturn (/^(?:http:\\/\\/)?(?:www\\.)?(.+)$/.exec(url)[1]\n\t);\n};\n\nvar codeToCountryName = function codeToCountryName(code, countryNames) {\n\treturn countryNames && countryNames[code] || code;\n};\n\n// const getUrl = ({ url }) => url;\n\n\nvar ChangeRegionModal = function (_Component) {\n\t_inherits(ChangeRegionModal, _Component);\n\n\tfunction ChangeRegionModal() {\n\t\tvar _ref;\n\n\t\tvar _temp, _this, _ret;\n\n\t\t_classCallCheck(this, ChangeRegionModal);\n\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\treturn _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ChangeRegionModal.__proto__ || Object.getPrototypeOf(ChangeRegionModal)).call.apply(_ref, [this].concat(args))), _this), _this.closeHandler = function () {\n\t\t\t// TODO: Save in localstorage, so we don't\n\t\t\t// show again next time user visits platform\n\n\t\t\t// Update Store to let them know user has dismissed region modal\n\t\t\t_store2['default'].emit(actions.SET_USER_REGION_MODAL_DISMISSED);\n\t\t\t// Hide the modal\n\t\t\t_store2['default'].emit(actions.HIDE_MODAL);\n\t\t}, _temp), _possibleConstructorReturn(_this, _ret);\n\t}\n\n\t_createClass(ChangeRegionModal, [{\n\t\tkey: 'componentWillMount',\n\n\n\t\t/* LifeCycle\n  ------------------------*/\n\n\t\tvalue: function componentWillMount() {\n\t\t\tthis.requireRegionCopy();\n\t\t}\n\n\t\t/* Data handlers\n  ------------------------*/\n\n\t}, {\n\t\tkey: 'requireRegionCopy',\n\t\tvalue: function requireRegionCopy() {\n\t\t\tvar _this2 = this;\n\n\t\t\t// TODO: should this be moved to the store because the data will be thrown away on rerender?\n\t\t\t// if (this.dataRequest) return this.dataRequest;\n\t\t\tvar regionCode = this.props.userRegionApp.regionCode;\n\n\t\t\tif (regionCode === 'other') {\n\t\t\t\t// if we are showing a global popup, then use english\n\t\t\t\tthis.setState({ dynamicCopy: this.props.copy });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfetch(this.props.apiRoot + \"/app_data/region_mismatch/\" + regionCode, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/vnd.api+json\",\n\t\t\t\t\t\"Content-Type\": \"application/vnd.api+json\"\n\t\t\t\t}\n\t\t\t}).then(function (r) {\n\t\t\t\treturn r.json();\n\t\t\t}).then(function (data) {\n\t\t\t\t// console.log('what is the data', data);\n\t\t\t\t_this2.setState({ dynamicCopy: data.copy });\n\t\t\t})['catch'](function (e) {\n\t\t\t\treturn console.log(e);\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getFlagPath',\n\t\tvalue: function getFlagPath(countryCode) {\n\t\t\treturn this.props.imagePath + '/flags/' + countryCode + '.png';\n\t\t}\n\n\t\t/* Event Handlers\n  ------------------------*/\n\n\t}, {\n\t\tkey: 'render',\n\n\n\t\t/* Render Methods\n  ------------------------*/\n\n\t\tvalue: function render(props) {\n\t\t\tvar _props = this.props,\n\t\t\t    geo = _props.geo,\n\t\t\t    appRegionCode = _props.appRegionCode,\n\t\t\t    appCountryCode = _props.appCountryCode,\n\t\t\t    imagePath = _props.imagePath,\n\t\t\t    apiRoot = _props.apiRoot,\n\t\t\t    currentApp = _props.currentApp,\n\t\t\t    userRegionApp = _props.userRegionApp;\n\t\t\tvar dynamicCopy = this.state.dynamicCopy;\n\n\t\t\t// Copy\n\n\t\t\tvar titleCopy = (0, _utils.accessNested)(dynamicCopy, \"$REGION_MISMATCH_MODAL_MAIN\", \"\").replace(/%LOCATION%/g, geo.city).replace(/%REGION%/g, geo.city);\n\t\t\tvar subTitleCopy = (0, _utils.accessNested)(dynamicCopy, \"$REGION_MISMATCH_MODAL_SECONDARY\", \"\");\n\t\t\tvar stayCopy = (0, _utils.accessNested)(dynamicCopy, \"$REGION_MISMATCH_MODAL_STAY\", \"\").replace(/%APP_URL%/g, formatUrlWithoutProtocol(currentApp.url));\n\n\t\t\tvar userRegionUrl = userRegionApp.url;\n\n\t\t\tif (window.location && window.location.search) {\n\t\t\t\tuserRegionUrl += '/' + window.location.search;\n\t\t\t}\n\n\t\t\treturn (0, _preact.h)(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': _changeRegionModal2['default'].modalBox },\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': _changeRegionModal2['default'].locationBar },\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': _changeRegionModal2['default'].locationBarTitle },\n\t\t\t\t\t\t(0, _preact.h)('img', {\n\t\t\t\t\t\t\tsrc: this.getFlagPath(this.props.appCountryCode),\n\t\t\t\t\t\t\talt: this.props.appCountryCode\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tformatUrlWithoutProtocol(currentApp.url)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)('button', {\n\t\t\t\t\t\t'class': _changeRegionModal2['default'].closeModalButton,\n\t\t\t\t\t\tonClick: this.closeHandler\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': _changeRegionModal2['default'].contentBox },\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'h1',\n\t\t\t\t\t\t{ 'class': _changeRegionModal2['default'].heading },\n\t\t\t\t\t\ttitleCopy\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)('hr', { 'class': _changeRegionModal2['default'].line }),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ 'class': _changeRegionModal2['default'].info },\n\t\t\t\t\t\tsubTitleCopy\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': _changeRegionModal2['default'].gotoButtonContainer },\n\t\t\t\t\t\t(0, _preact.h)('img', { src: this.getFlagPath(geo.countryCode), alt: '' }),\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t_link.Link,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'class': _changeRegionModal2['default'].gotoButton,\n\t\t\t\t\t\t\t\thref: userRegionUrl,\n\t\t\t\t\t\t\t\ttrackId: 'geo-region-redirect',\n\t\t\t\t\t\t\t\ttrackLabel: appRegionCode\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tformatUrlWithoutProtocol(userRegionApp.url),\n\t\t\t\t\t\t\t(0, _preact.h)('div', { 'class': _changeRegionModal2['default'].arrowRight })\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': _changeRegionModal2['default'].remainLinkBox },\n\t\t\t\t\t\t(0, _preact.h)(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tonClick: this.closeHandler,\n\t\t\t\t\t\t\t\t'class': _changeRegionModal2['default'].remainLink\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstayCopy\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn ChangeRegionModal;\n}(_preact.Component);\n\nexports['default'] = ChangeRegionModal;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14)))\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.SVGContent = exports.SvgPlay = exports.SvgCart = exports.SvgCompass = exports.SvgLinkOut = exports.SvgGuy = exports.SvgCar = exports.SvgTrain = exports.SvgBin = exports.SvgArrowRight = exports.SvgTick = exports.SvgRealD = exports.SvgImax3d = exports.SvgImax = exports.SvgMuted = exports.SvgSpeaker = exports.SvgCarrotUp = exports.SvgCarrotDown = exports.SvgFullScreenClose = exports.SvgFullScreenOpen = exports.SvgStar = exports.SvgMarker = exports.SvgSearch = exports.SvgEdit = exports.SvgCopy = exports.SvgHeart = exports.SvgUser = exports.SvgLink = exports.SvgShare = exports.SvgShowtimes = exports.SvgSynopsis = exports.SvgVideos = exports.svgRenderer = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _preact = __webpack_require__(0);\n\nvar _svgIcons = __webpack_require__(73);\n\nvar _svgIcons2 = _interopRequireDefault(_svgIcons);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// --- try to use https://jakearchibald.github.io/svgomg/ to reduce the size of your svgs ---\n// --- Also (see more details above the exports), if a SVG is very specific to a movie, use svgRenderer instead of adding it to this file ---\n\n\n// Creates an immutable svg element\n// Avoids using innerHTML (slow)\nvar SVGContent = function (_Component) {\n\t_inherits(SVGContent, _Component);\n\n\tfunction SVGContent() {\n\t\t_classCallCheck(this, SVGContent);\n\n\t\treturn _possibleConstructorReturn(this, (SVGContent.__proto__ || Object.getPrototypeOf(SVGContent)).apply(this, arguments));\n\t}\n\n\t_createClass(SVGContent, [{\n\t\tkey: 'refresh',\n\t\tvalue: function refresh(props) {\n\t\t\tif (typeof document === 'undefined') return;\n\t\t\tprops = props || this.props;\n\t\t\tthis.inner = this.createSVGTree(props.content);\n\t\t\tif (this.inner && this.base) {\n\t\t\t\tthis.base.appendChild(this.inner);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'componentDidMount',\n\t\tvalue: function componentDidMount() {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\t// shouldComponentUpdate() {\n\t\t// \treturn false;\n\t\t// }\n\n\t}, {\n\t\tkey: 'componentDidUpdate',\n\t\tvalue: function componentDidUpdate(oldProps) {\n\t\t\tif (oldProps.children !== this.props.children) {\n\t\t\t\tthis.refresh();\n\t\t\t} else if (this.base && this.inner && this.base.childNodes.length !== 1) {\n\t\t\t\twhile (this.base.firstChild) {\n\t\t\t\t\tthis.base.removeChild(this.base.firstChild);\n\t\t\t\t}\n\t\t\t\tthis.base.appendChild(this.inner);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'setAttributes',\n\t\tvalue: function setAttributes(el, attrs) {\n\t\t\tif (!el || !attrs) return;\n\t\t\tvar names = Object.keys(attrs);\n\t\t\tfor (var i = 0, l = names.length; i < l; i++) {\n\t\t\t\tvar name = names[i];\n\t\t\t\tel.setAttribute(name, attrs[name]);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'createSVGTree',\n\t\tvalue: function createSVGTree(source) {\n\t\t\tif (!source) return null;\n\t\t\tvar el = document.createElementNS('http://www.w3.org/2000/svg', source.nodeName);\n\t\t\tthis.setAttributes(el, source.attributes);\n\t\t\tif (source.children) {\n\t\t\t\tfor (var i = 0, l = source.children.length; i < l; i++) {\n\t\t\t\t\tvar ch = this.createSVGTree(source.children[i]);\n\t\t\t\t\tif (ch) el.appendChild(ch);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn el;\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render(props) {\n\t\t\tvar containerProps = Object.assign({}, props);\n\t\t\tdelete containerProps.content;\n\t\t\treturn (0, _preact.h)('div', containerProps);\n\t\t}\n\t}]);\n\n\treturn SVGContent;\n}(_preact.Component);\n\nfunction svgRenderer(svgContent) {\n\t// http://stackoverflow.com/a/25184858/1336843\n\t// To reduce document size, we should probably inline it (body.appendChild and display: none) the first time, and use the `use` tag !\n\n\treturn function (_ref) {\n\t\tvar props = _objectWithoutProperties(_ref, []);\n\n\t\treturn (0, _preact.h)(SVGContent, _extends({}, props, { 'class': [_svgIcons2['default'].wrapper].concat(props['class']).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t}).join(' '), content: svgContent }));\n\t};\n}\n\nvar SvgVideos = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgIcon, viewBox: '0 0 50 50' },\n\t(0, _preact.h)('path', { d: 'M 20 18 L 34 25 L 20 33 L 20 18 ZM 10 12 C 7.1494 12 5 14.2457 5 17 L 5 34 C 5 36.7542 7.1494 39 10 39 L 40 39 C 42.8503 39 45 36.7542 45 34 L 45 17 C 45 14.2457 42.8503 12 40 12 L 10 12 Z' })\n));\n\nvar SvgSynopsis = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgIcon, viewBox: '0 0 50 50' },\n\t(0, _preact.h)('path', { d: 'M 30.9396 10.3793 C 30.9396 11.1035 30.4849 11.5172 30 12 C 26.6056 15.3793 23.3937 18.6205 20 22 C 21.0945 18.293 16.9395 17.2758 15 18 C 18.1516 14.3794 22.3635 10.6207 26 7 C 26.4847 7 26.8182 7 27.3027 7 C 29.9695 7 30.9396 8.931 30.9396 10.3793 ZM 37 27 C 37 28.6898 28.9092 36.8278 26 39 C 25.7578 38.7588 26 38.4828 26 38 C 26 35.8276 14 24.2414 14 24 C 13.7576 23.5172 13 22.6897 13 22.207 C 13 20.2758 14.0609 19 16 19 C 19.152 19 19 22.069 19 24 L 28 16 C 29.4549 17.4484 37 23.8621 37 27 ZM 25 39 C 25 40.6896 23.2119 42 22 42 C 19.333 42 19 39.2068 19 38 C 19 37.2758 19.8177 34 22 34 C 23.4543 34 25 38.2758 25 39 Z' })\n));\n\nvar SvgShowtimes = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgIcon, viewBox: '0 0 50 50' },\n\t(0, _preact.h)('path', { d: 'M 25.3158 11.6842 L 38.3158 24.6842 L 18 45 L 14.3438 41.3438 C 14.3438 41.3438 16.6093 39.1685 13.6316 36.3684 C 10.7015 33.6131 8.7465 35.7465 8.7465 35.7465 L 5 32 L 25.3158 11.6842 Z' }),\n\t(0, _preact.h)('path', { d: 'M 40.0263 22.9737 L 27.0263 9.9737 L 32 5 L 35.6563 8.6563 C 35.6563 8.6563 33.3907 10.8315 36.3684 13.6316 C 39.2985 16.3869 41.2535 14.2535 41.2535 14.2535 L 45 18 L 40.0263 22.9737 Z' })\n));\n\nvar SvgShare = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgShareIcon, viewBox: '0 0 50 50' },\n\t(0, _preact.h)('path', { d: 'M 6 25 C 6 21.9624 8.4624 19.5 11.5 19.5 C 14.5376 19.5 17 21.9624 17 25 C 17 28.0376 14.5376 30.5 11.5 30.5 C 8.4624 30.5 6 28.0376 6 25 Z' }),\n\t(0, _preact.h)('path', { d: 'M 30 14 C 30 10.9624 32.4624 8.5 35.5 8.5 C 38.5376 8.5 41 10.9624 41 14 C 41 17.0376 38.5376 19.5 35.5 19.5 C 32.4624 19.5 30 17.0376 30 14 Z' }),\n\t(0, _preact.h)('path', { d: 'M 30.5 36.5 C 30.5 33.7385 32.7385 31.5 35.5 31.5 C 38.2615 31.5 40.5 33.7385 40.5 36.5 C 40.5 39.2615 38.2615 41.5 35.5 41.5 C 32.7385 41.5 30.5 39.2615 30.5 36.5 Z' }),\n\t(0, _preact.h)('path', { d: 'M 35.5 13.9375 L 11.4375 25 L 35.5625 36.5625 ' })\n));\n\nvar SvgLink = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgIcon, viewBox: '0 0 380 380', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M345.5 318.5q-20 20-47 20t-47-19l-105-105q-19-20-19-47t20-47l13-13q20-20 47.5-20t47.5 19l105 105q19 20 19 47t-20 47l-14 13zm-14-14l13-14q14-13 14.5-32.5t-13.5-32.5l-105-105q-14-13-32.5-13t-32.5 14l-14 14q-14 13-14.5 32.5t13.5 32.5l105 105q14 13 33 13t33-14zm-112-31q-20 20-47.5 20t-47.5-19l-105-105q-19-20-19-47t20-47l14-14q20-20 47-20t47 19l105 105q19 20 19 47.5t-20 47.5l-13 13zm-15-14l14-14q14-13 14.5-32.5t-13.5-32.5l-105-105q-14-13-33-13t-33 14l-13 13q-14 13-14.5 33t13.5 33l105 105q14 13 32.5 13t32.5-14z' })\n));\n\nvar SvgUser = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgUserIcon, viewBox: '0 0 100.33333 137.33333' },\n\t(0, _preact.h)('rect', { x: '2.5', y: '63.83333', width: '95.33333', height: '71', rx: '27', ry: '27' }),\n\t(0, _preact.h)('circle', { cx: '50', cy: '33.33333', r: '30.83333' })\n));\n\nvar SvgHeart = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ viewBox: '0 0 769 705', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M385.026 705.052C784.07 391.477 769.052 279.985 769.052 193.026S697.075 1 577.026 1s-192 128.026-192 128.026S313.076 1 193.026 1 1 106.067 1 193.026s-15.02 198.45 384.026 512.026z' })\n));\n\nvar SvgCopy = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M3.2 4c-.1 0-.2.1-.2.2v18.6c0 .1.1.2.2.2h14.6c.1 0 .2-.1.2-.2V4.2c0-.1-.1-.2-.2-.2H3.2zM4 5v17h13V5H4zm2-2h1V2h13v17h-1v1h2V1H6v2z', 'fill-rule': 'evenodd' })\n));\n\nvar SvgEdit = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgBase, viewBox: '0 0 528.899 528.899' },\n\t(0, _preact.h)('path', { d: 'M328.883,89.125l107.59,107.589l-272.34,272.34L56.604,361.465L328.883,89.125z M518.113,63.177l-47.981-47.981c-18.543-18.543-48.653-18.543-67.259,0l-45.961,45.961l107.59,107.59l53.611-53.611C532.495,100.753,532.495,77.559,518.113,63.177z M0.3,512.69c-1.958,8.812,5.998,16.708,14.811,14.565l119.891-29.069L27.473,390.597L0.3,512.69z' })\n));\n\nvar SvgSearch = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ 'class': _svgIcons2['default'].svgBase, viewBox: '0 0 512 512' },\n\t(0, _preact.h)('path', { d: 'M496.131 435.698l-121.276-103.147c-12.537-11.283-25.945-16.463-36.776-15.963 28.628-33.534 45.921-77.039 45.921-124.588 0-106.039-85.961-192-192-192s-192 85.961-192 192 85.961 192 192 192c47.549 0 91.054-17.293 124.588-45.922-0.5 10.831 4.68 24.239 15.963 36.776l103.147 121.276c17.661 19.623 46.511 21.277 64.11 3.678s15.946-46.449-3.677-64.11zM192 320c-70.692 0-128-57.308-128-128s57.308-128 128-128 128 57.308 128 128-57.307 128-128 128z' })\n));\n\nvar SvgMarker = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ viewBox: '0 0 200 200', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M173.57 75.26q0 18.18-19.02 49.47T116.5 178l-19.04 22q-2.96-3.38-7.6-9.3t-16.92-22.62-21.78-31.5-17.12-32.35-7.6-28.97q0-30.87 21.55-52.64T100 .84t52 21.78 21.57 52.64z' })\n));\n\nvar SvgStar = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M8.28 7.92s-4.46.492-7.434.823c-.268.032-.505.21-.594.484s0 .556.197.735c2.21 2.016 5.53 5.036 5.53 5.036-.004 0-.912 4.392-1.516 7.323-.05.266.045.547.276.715.23.168.526.17.76.04 2.6-1.48 6.5-3.703 6.5-3.703l6.495 3.704c.237.13.533.127.763-.04.232-.17.328-.45.276-.713-.604-2.933-1.512-7.325-1.512-7.325s3.32-3.02 5.53-5.032c.198-.185.285-.468.198-.74s-.325-.45-.593-.48c-2.974-.334-7.435-.827-7.435-.827l-3.08-6.817C12.526.86 12.284.688 12 .688s-.53.173-.64.415C10.125 3.83 8.28 7.92 8.28 7.92z' })\n));\n\nvar SvgFullScreenOpen = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 8 8' },\n\t(0, _preact.h)('path', { d: 'M0 0v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4zm5 4l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5z' })\n));\n\nvar SvgFullScreenClose = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 8 8' },\n\t(0, _preact.h)('path', { d: 'M1 0l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5zm3 4v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4z' })\n));\n\n// Just a triangle. Is it supposed to be 'caret' ?\nvar SvgCarrotDown = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 8 8' },\n\t(0, _preact.h)('path', { d: 'M0 0l4 4 4-4h-8z', transform: 'translate(0 2)' })\n));\n\nvar SvgCarrotUp = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 8 8' },\n\t(0, _preact.h)('path', { d: 'M4 0l-4 4h8l-4-4z', transform: 'translate(0 2)' })\n));\n\nvar SvgTick = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ viewBox: '0 0 16 13', xmlns: 'http://www.w3.org/2000/svg' },\n\t(0, _preact.h)('path', { d: 'M5 8.993l-3-3-2 2 5.008 5.01 2.005-1.996L15.993 2l-2-2', 'fill-rule': 'evenodd' })\n));\n\n// Flip it using CSS transforms\nvar SvgArrowRight = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 18 18' },\n\t(0, _preact.h)('path', { d: 'M8.5 17.5c-.3 0-.5-.1-.7-.3s-.3-.4-.3-.7.1-.5.3-.7l5.7-5.7H1.4c-.6 0-1-.4-1-1s.4-1 1-1h12.1L7.7 2.3c-.2-.2-.3-.4-.3-.7s.1-.5.3-.7c.4-.4 1-.4 1.4 0l7.5 7.5c.4.4.4 1 0 1.4l-7.5 7.5c0 .1-.3.2-.6.2z' })\n));\n\nvar SvgBin = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 18 21' },\n\t(0, _preact.h)('path', { d: 'M17.5 3H14V1c0-.5-.5-1-1-1H5c-.5 0-1 .5-1 1v2H.5c-.3 0-.5.2-.5.5v2c0 .3.2.5.5.5h.6l1.8 14.5c.1.3.3.5.6.5h11c.3 0 .5-.2.6-.5L16.9 6h.6c.3 0 .5-.2.5-.5v-2c0-.3-.2-.5-.5-.5zM5 1h8v2H5V1zm9.1 19h-1.5l.9-10.4c0-.3-.2-.6-.5-.6s-.5.2-.5.5L11.6 20H9.5V9.5c0-.3-.2-.5-.5-.5s-.5.2-.5.5V20H6.4L5.5 9.5c0-.3-.2-.5-.5-.5s-.5.3-.5.6L5.4 20H3.9L2.2 6h13.6l-1.7 14zM17 5H1V4h16v1z' })\n));\n\nvar SvgSpeaker = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', version: '1', viewBox: '0 0 75 75' },\n\t(0, _preact.h)(\n\t\t'g',\n\t\t{ 'stroke-width': '5', style: 'stroke: currentColor' },\n\t\t(0, _preact.h)('path', { style: 'fill: currentColor', 'stroke-linejoin': 'round', d: 'M39.39 13.77L22.234 28.605H6V47.7h15.99l17.4 15.05V13.77z' }),\n\t\t(0, _preact.h)('path', { d: 'M48.128 49.03c1.93-3.096 3.062-6.74 3.062-10.653 0-3.978-1.164-7.674-3.147-10.8m7.04-7.04c3.694 4.986 5.883 11.157 5.883 17.84 0 6.62-2.15 12.738-5.788 17.7m6.532 6.533c5.267-6.665 8.418-15.08 8.418-24.232 0-9.217-3.192-17.682-8.52-24.368', fill: 'none', 'stroke-linecap': 'round' })\n\t)\n));\n\nvar SvgMuted = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', version: '1', viewBox: '0 0 75 75' },\n\t(0, _preact.h)(\n\t\t'g',\n\t\t{ style: 'stroke: currentColor', 'stroke-width': '5' },\n\t\t(0, _preact.h)('path', { 'stroke-linejoin': 'round', style: 'fill: currentColor', d: 'M39.39 13.77L22.234 28.605H6V47.7h15.99l17.4 15.05V13.77z' }),\n\t\t(0, _preact.h)('path', { d: 'M48.652 50.27l20.743-24.3m0 24.3l-20.743-24.3', fill: 'none', 'stroke-linecap': 'round' })\n\t)\n));\n\nvar SvgImax = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 305.55 57.175' },\n\t(0, _preact.h)('path', { d: 'M46.982 56.985l.022-40.99h2.983l20.02 40.946h12.95l20.02-40.923 3.158-.066-.11 41.035h16.02L122 .947l-27.974.088-17.545 32.97L59.865.99l-28.86.09-.043 55.905zM0 0h18.992v57.002H0zM154.25.77l-28.624 56.217 18.03.188 5.657-10.094 35.53-.186 4.94 9.906 18.75.187L179.906.77zM167 12.8l12 21.937-23.156.157zM235.938.943l-21.125.125 21.75 25.625-26.375 30.25 22.625.125 18.5-20.625 17.625 20.625 23.375-.125-26.375-30.125 21.625-25.625-21.75-.375-14.5 18.125z' }),\n\t(0, _preact.h)('path', { d: 'M295.608 8.126h2.083c.747 0 1.277-.122 1.59-.365.316-.243.473-.642.473-1.2 0-.25-.05-.48-.15-.682-.1-.202-.238-.363-.417-.48-.143-.1-.316-.17-.52-.212-.202-.043-.542-.065-1.02-.065h-2.038zm-1.018 4.64v-8.56h2.904c.646 0 1.12.028 1.424.084.303.056.567.147.792.272.35.198.62.47.808.813.187.344.28.732.28 1.164 0 .533-.12.985-.365 1.356-.243.372-.57.6-.98.69.313.05.55.203.708.456.16.252.27.742.33 1.47l.11 1.25c.013.185.04.335.08.45.042.116.104.208.186.278v.277h-1.055c-.072-.14-.125-.282-.156-.427-.03-.145-.055-.323-.07-.532l-.097-1.104c-.054-.735-.178-1.196-.37-1.383-.192-.186-.594-.28-1.205-.28h-2.304v3.727z', style: 'line-height:125%;-inkscape-font-specification:Swis721 Lt BT Bold', 'font-family': 'Swis721 Lt BT', 'font-size': '11.811', 'font-weight': 'bold', 'letter-spacing': '0', 'word-spacing': '0' }),\n\t(0, _preact.h)('path', { d: 'M506.563 464.3c0 4.383-3.806 7.937-8.5 7.937-4.695 0-8.5-3.554-8.5-7.937 0-4.384 3.805-7.938 8.5-7.938 4.694 0 8.5 3.554 8.5 7.938z', transform: 'matrix(.88297 0 0 .94554 -142.227 -430.4)', fill: 'none', stroke: 'currentColor', 'stroke-width': '1.094' })\n));\n\nvar SvgImax3d = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 400 49' },\n\t(0, _preact.h)(\n\t\t'g',\n\t\t{ 'fill-rule': 'evenodd' },\n\t\t(0, _preact.h)('path', { d: 'M286.878.243c-9.088.883-12.223 4.09-12.72 13.018l-.187 3.36H288v-1.54c0-4.68.62-4.9 14.06-4.84 12.654.05 13.147.23 13.134 4.86-.012 3.98-.932 4.33-11.38 4.33H296v9.52l8.7.15c11.218.19 11.68.4 11.695 5.19.003 1.24-.25 2.17-.76 2.8l-.764.95-12.47.098-12.47.094-1.16-1.165c-1.03-1.03-1.16-1.444-1.16-3.594v-2.43h-14l.01 3.7c.01 8.355 3.24 12.35 10.95 13.55 5.48.85 36.03.23 38.85-.79 5.16-1.87 6.73-4.67 6.76-12.06.02-7.542-1.573-9.81-7.75-11-1.42-.272-1.34-.433.496-.974 5.09-1.51 6.1-3.16 6.1-10.01 0-7.075-1.08-9.606-4.89-11.446-1.664-.803-1.56-.77-4.112-1.402-2.183-.542-28.28-.81-33.122-.34M181.27 1.37c13.814 16.197 17.884 21.43 17.62 21.624l-22.225 25.22h19.407l15.8-17.717 15.193 17.73 19.766-.213-22.56-24.967C240.05 3.96 241.64 2.112 242.23 1.53c1.2-1.2.468-1.315-8.402-1.315h-8.975l-2.28 2.7-10.742 12.887c-6.86-8.16-9.63-11.37-12.65-15.087-.3-.374-2.73-.5-9.62-.5h-9.22l.94 1.154M247.2.48c-3.76 1.467-2.844 7.086 1.6 6.932 1.275-.232 1.65-.455 2.2-1.2 2.198-2.98-.484-7.026-3.8-5.732M336 24.215V48.26l25.1-.15c13.805-.08 25.64-.28 26.3-.44 11.118-2.713 12.4-5.2 12.4-24.055 0-16.66-1.816-20.564-10.4-22.362-.66-.138-1.65-.373-2.2-.52-.55-.15-12.295-.336-26.1-.416L336 .17M0 24.416v23.8h15.2V.616H0v23.8m25.6 0v23.8h13.6v-34.4h2.817l4.63 9.5c2.547 5.224 5.873 12.01 7.392 15.08 3.48 7.22 4.04 8.97 4.4 9.6.51.436.08.22 5.94.22h5.48l1.06-2.176 15.65-32.16 3.01-.286v34.62h13.2V.604L90.5.71c-11.93.1-11.84.078-12.44.904-10.795 21.524-13.49 26.696-13.66 26.8-5.338-9.79-7.69-14.413-10-19.147L50.2.66 37.9.637 25.6.615m103.675.3c-22.988 45.697-23.04 46.06-23.275 46.5-.422.788-.304.8 7.565.8h7.993l4.242-8.37 30.123-.048 4.183 8.418c12.318 0 15.894-.06 15.894-.133-18.52-36.55-20.43-40.374-21.692-42.89L152.016.614h-11.408c-6.274 0-11.374.135-11.333.3m121.105.803c1.206.977 1.21 3.03.01 4.306-2.55 2.716-6.667-1.023-4.358-3.96.99-1.258 3.02-1.42 4.348-.346m-3.58 2.145c0 1.073.18 1.952.4 1.952.22 0 .4-.343.4-.763 0-.56.207-.7.8-.55.44.12.8.46.8.76 0 .31.16.56.357.56.196 0 .33-.85.3-1.89l-.057-1.9-1.5-.06-1.5-.05v1.95m2.4-.65c0 .34-.356.6-.8.6-.444 0-.8-.26-.8-.6 0-.33.356-.6.8-.6.444 0 .8.27.8.6M146.1 20.01c2.365 4.72 4.3 8.673 4.3 8.78l-19.485.425 3.2-6.4c7.227-14.448 6.267-14.223 11.985-2.806m235.732-6.9c3.074 1.49 3.458 2.84 3.3 11.59-.208 11.49.88 10.87-19.232 11.02l-15.1.12V12.19l14.63.028c14.135.027 14.687.057 16.402.89' }),\n\t\t(0, _preact.h)('path', { fill: '#fff', d: 'M102.988 24.6c0 13.2.05 18.542.112 11.87.06-6.67.06-17.47 0-24-.062-6.528-.112-1.07-.112 12.13M329.3 13c.005.88.087 1.193.183.695.096-.497.092-1.217-.008-1.6-.1-.382-.18.025-.174.905' })\n\t)\n));\n\n// Path#1 : fill='#231f20'\nvar SvgRealD = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 603.34 69.17' },\n\t(0, _preact.h)('path', { d: 'M502.58 3.05h-49.34v12.76h48.32a6.9 6.9 0 0 1 .37 13.79h-28.45v12.73h28.07a6.9 6.9 0 0 1 .37 13.79h-48.69v12.73h37.33l15.57-.55a19.6 19.6 0 0 0 9.91-32.32 19.67 19.67 0 0 0-13.46-32.92m66.16-.09h-35.53v13.12h34.78c13.05 0 20.24 7.05 20.24 19.87s-7 19.74-20.24 19.74h-20.81V29.52h-14V68.8h35.52c20.7 0 34.6-13.2 34.6-32.85s-13.9-33-34.6-33M259.09 56V3.03h-14.8v66.14h60.06V56h-45.26zM158.47 69.17h45.81l-7.1-12.8h-16.49l16.18-29.17 23.29 41.97h15.09L196.87 0l-38.4 69.17zM81.93 3.03h67.2V16.2h-67.2zm0 26.67v39.47h67.2V56H95.95V42.5h53.18V29.7h-67.2zm-13.65-6.93a19.77 19.77 0 0 0-18.71-19.7H-.01v12.78h48.54a6.93 6.93 0 0 1 .37 13.85H0v39.46h14V42.5h23.5l18.58 26.67h16l-19-27.22a19.58 19.58 0 0 0 15.14-19.17' }),\n\t(0, _preact.h)('path', { fill: '#27aae1', d: 'M369.59 2.97H333.9v13.18h35c13.11 0 20.33 7.09 20.33 20s-7 19.84-20.33 19.84h-20.97V29.65h-14v39.47h35.69c20.81 0 34.77-13.26 34.77-33s-14-33.14-34.77-33.14m31.54.3h4.62v.95h-1.7v4.75h-1.22V4.23h-1.7zm9.67 5.7h-1l-1.51-4.9v4.88h-1.14v-5.7h2l1.19 4.15 1.29-4.15h1.93v5.7h-1.14V4.08z' })\n));\n\nvar SvgTrain = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24' },\n\t(0, _preact.h)('path', { d: 'M16,18h1c0.552,0,1-0.448,1-1V3c0-0.552-0.448-1-1-1H7C6.448,2,6,2.448,6,3v14c0,0.552,0.448,1,1,1h1l-4,4h2l1-1h10l1,1h2 L16,18z M15,15c-0.552,0-1-0.448-1-1c0-0.552,0.448-1,1-1s1,0.448,1,1C16,14.552,15.552,15,15,15z M7.5,11V4h9v7H7.5z M10,14 c0,0.552-0.448,1-1,1s-1-0.448-1-1c0-0.552,0.448-1,1-1S10,13.448,10,14z M8,20l2-2h4l2,2H8z' })\n));\n\nvar SvgCar = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24' },\n\t(0, _preact.h)('path', { d: 'M19,11h-1l-1-6c0-0.552-0.448-1-1-1H8C7.448,4,7,4.448,7,5l-1,6H5c-0.552,0-1,0.448-1,1v5c0,0.552,0.448,1,1,1h1v1 c0,0.552,0.448,1,1,1s1-0.448,1-1v-1h8v1c0,0.552,0.448,1,1,1s1-0.448,1-1v-1h1c0.552,0,1-0.448,1-1v-5C20,11.448,19.552,11,19,11z M7,15c-0.552,0-1-0.448-1-1s0.448-1,1-1s1,0.448,1,1S7.552,15,7,15z M7,11l1-6h8l1,6H7z M17,15c-0.552,0-1-0.448-1-1s0.448-1,1-1 s1,0.448,1,1S17.552,15,17,15z' })\n));\n\nvar SvgGuy = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24' },\n\t(0, _preact.h)('circle', { cx: '12.5', cy: '4.5', r: '1.5' }),\n\t(0, _preact.h)('path', { d: 'M17.304 11.068s-2.137-.395-2.173-.404c0 0-1.52-3.172-1.66-3.332l-.01-.002c-.275-.493-.8-.83-1.402-.83-.276 0-.53.075-.758.197l-.01-.003s-2.056 1.17-2.81 1.594c-.18.1-.32.245-.414.425L6.77 11.146c-.04.092-.063.192-.063.298 0 .415.337.752.752.752.28 0 .52-.165.65-.398l1.2-2.242.74-.416c-.056.16-.738 3.482-.738 3.482l-.69 3.934-2.364 2.97c-.136.156-.227.355-.227.58 0 .494.4.894.895.894.27 0 .5-.124.665-.31 0 0 2.614-3.196 2.83-3.45.238-.284.3-.426.336-.612.034-.186.433-2.587.433-2.587l2.286 2.29v3.78c0 .497.4.897.893.897s.893-.4.893-.893l-.004-4.506c0-.27-.105-.53-.29-.728l-2.234-2.234.49-2.38.65 1.244c.148.28.41.48.72.543.857.176 2.573.51 2.607.51.416 0 .752-.338.752-.753 0-.385-.29-.688-.66-.736z' })\n));\n\nvar SvgLinkOut = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24' },\n\t(0, _preact.h)('path', { d: 'M20.6 2.9h-5.9c-.5 0-.9.4-.9.9s.4.9.9.9h3.9L10.2 13c-.3.3-.3.9 0 1.2.2.2.4.3.6.3.2 0 .4-.1.6-.3l8.3-8.3v3.7c0 .5.4.9.9.9s.9-.4.9-.9V3.7c0-.4-.4-.8-.9-.8z' }),\n\t(0, _preact.h)('path', { d: 'M17.7 11.5c-.5 0-.9.4-.9.9v6.8c0 .3-.3.6-.6.6H5.3c-.3 0-.6-.3-.6-.6v-11c0-.3.3-.6.6-.6h6.8c.5 0 .9-.4.9-.9s-.4-.9-.9-.9H5.3C4 5.9 3 6.9 3 8.2v10.9c0 1.3 1 2.3 2.3 2.3h10.9c1.3 0 2.3-1 2.3-2.3v-6.8c0-.4-.4-.8-.8-.8z' })\n));\n\nvar SvgCompass = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', 'class': _svgIcons2['default'].compass, viewBox: '0 0 24 24' },\n\t(0, _preact.h)('path', { d: 'M16.77 7.098l-6.244 3.387c-.017.01-.03.023-.04.04L7.098 16.77c-.036.083.048.167.13.13l6.245-3.386c.017-.01.03-.023.04-.04L16.9 7.23c.037-.083-.047-.167-.13-.132zM12 13c-.552 0-1-.448-1-1s.448-1 1-1 1 .448 1 1-.448 1-1 1z' }),\n\t(0, _preact.h)('path', { d: 'M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9-4.03-9-9-9zm0 15c-.276 0-.5.224-.5.5v.475C8.04 18.73 5.272 15.96 5.025 12.5H5.5c.276 0 .5-.224.5-.5s-.224-.5-.5-.5h-.475C5.272 8.04 8.04 5.272 11.5 5.025V5.5c0 .276.224.5.5.5s.5-.224.5-.5v-.475c3.46.246 6.228 3.014 6.475 6.475H18.5c-.276 0-.5.224-.5.5s.224.5.5.5h.475c-.246 3.46-3.014 6.228-6.475 6.475V18.5c0-.276-.224-.5-.5-.5z' })\n));\n\nvar SvgCart = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 90 90' },\n\t(0, _preact.h)('circle', { cx: '37.673', cy: '78.012', r: '6.364' }),\n\t(0, _preact.h)('circle', { cx: '73.627', cy: '78.012', r: '6.364' }),\n\t(0, _preact.h)('path', { d: 'M24.758,18.271L21.76,7.149h-3.333H15.74H8.486c-1.885,0-3.412,1.618-3.412,3.614c0,1.997,1.527,3.615,3.412,3.615h7.735   L31.31,70.337l0.03-0.007h48.65v-7.229H36.845l-1.702-6.312H79.99v-0.112l4.918-34.229L24.758,18.271z M76.483,37.167H63.467   l1.062-9.93l13.249,0.909L76.483,37.167z M44.926,37.167l-2.575-11.451L61.071,27l-1.089,10.167H44.926z M59.719,39.616   l-1.17,10.934H47.937l-2.458-10.934H59.719z M38.745,25.467l2.631,11.699H29.853l-3.381-12.54L38.745,25.467z M33.461,50.55   l-2.948-10.934h11.413l2.459,10.934H33.461z M62.034,50.55l1.171-10.934h12.928L74.565,50.55H62.034z' })\n));\n\nvar SvgPlay = svgRenderer((0, _preact.h)(\n\t'svg',\n\t{ xmlns: 'http://www.w3.org/2000/svg', viewBox: '120 200 400 400' },\n\t(0, _preact.h)('path', { d: 'M179.221,269.221c-70.294,70.294-70.293,184.264,0,254.558s184.265,70.294,254.559,0  c70.293-70.293,70.293-184.265,0-254.558C363.485,198.927,249.514,198.928,179.221,269.221z M408.323,498.324  c-56.235,56.229-147.411,56.231-203.646,0c-56.236-56.235-56.235-147.413,0-203.647c56.236-56.236,147.411-56.235,203.647-0.001  C464.559,350.913,464.559,442.088,408.323,498.324z' }),\n\t(0, _preact.h)('path', { d: 'M243.5,324.5c0-9.9,7.168-14.228,15.929-9.617l139.143,73.233c8.761,4.611,8.761,12.156,0,16.767   L259.43,478.115c-8.761,4.609-15.929,0.284-15.929-9.616L243.5,324.5z' })\n));\n\n// For single-use SVG specific to an app, use svgRenderer to avoid making this file too heavy\n// let MySvg = svgRenderer(<svg>your svg markup...</svg>);\n// Then use it as the others\n// <MySvg class={s.myClass} ... />\nexports.svgRenderer = svgRenderer;\nexports.SvgVideos = SvgVideos;\nexports.SvgSynopsis = SvgSynopsis;\nexports.SvgShowtimes = SvgShowtimes;\nexports.SvgShare = SvgShare;\nexports.SvgLink = SvgLink;\nexports.SvgUser = SvgUser;\nexports.SvgHeart = SvgHeart;\nexports.SvgCopy = SvgCopy;\nexports.SvgEdit = SvgEdit;\nexports.SvgSearch = SvgSearch;\nexports.SvgMarker = SvgMarker;\nexports.SvgStar = SvgStar;\nexports.SvgFullScreenOpen = SvgFullScreenOpen;\nexports.SvgFullScreenClose = SvgFullScreenClose;\nexports.SvgCarrotDown = SvgCarrotDown;\nexports.SvgCarrotUp = SvgCarrotUp;\nexports.SvgSpeaker = SvgSpeaker;\nexports.SvgMuted = SvgMuted;\nexports.SvgImax = SvgImax;\nexports.SvgImax3d = SvgImax3d;\nexports.SvgRealD = SvgRealD;\nexports.SvgTick = SvgTick;\nexports.SvgArrowRight = SvgArrowRight;\nexports.SvgBin = SvgBin;\nexports.SvgTrain = SvgTrain;\nexports.SvgCar = SvgCar;\nexports.SvgGuy = SvgGuy;\nexports.SvgLinkOut = SvgLinkOut;\nexports.SvgCompass = SvgCompass;\nexports.SvgCart = SvgCart;\nexports.SvgPlay = SvgPlay;\nexports.SVGContent = SVGContent;\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Geo = __webpack_require__(8);\n\nvar _Geo2 = _interopRequireDefault(_Geo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar City = function () {\n\tfunction City(attr, clientGeo, copy, useEnglishCopy) {\n\t\t_classCallCheck(this, City);\n\n\t\tthis.name = useEnglishCopy && attr.city_en ? attr.city_en : attr.city;\n\t\tthis.nameEn = attr.city_en || attr.city;\n\t\tthis.localName = attr.city;\n\t\tthis.state = attr.state;\n\n\t\tthis.screeningsCount = +attr.count;\n\n\t\tthis.geo = new _Geo2['default']({\n\t\t\tlat: attr.lat,\n\t\t\tlon: attr.lon,\n\t\t\tcountryCode: attr.country || clientGeo.countryCode,\n\t\t\tcity: attr.city\n\t\t});\n\t\tthis.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT);\n\t\tthis.distanceUnit = copy.$DISTANCE_UNIT;\n\n\t\t// add other theater attributes here\n\t}\n\n\t_createClass(City, [{\n\t\tkey: 'merge',\n\t\tvalue: function merge(attr, clientGeo) {\n\t\t\tvar add = +attr.count;\n\t\t\tvar newCount = this.screeningsCount + add;\n\t\t\tthis.screeningsCount = newCount;\n\n\t\t\t// Mean position\n\t\t\t// const newLat = (this.geo.lat * this.screeningsCount + attr.lat * add) / newCount;\n\t\t\t// const newLon = (this.geo.lon * this.screeningsCount + attr.lon * add) / newCount;\n\t\t\t// this.geo.update({ lat: newLat, lon: newLon });\n\t\t\t//\n\t\t\t// this.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT, 1);\n\t\t\t// this.distanceUnit = copy.$DISTANCE_UNIT;\n\t\t}\n\t}]);\n\n\treturn City;\n}();\n\nexports['default'] = City;\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Exhibitor = function Exhibitor(id, attr) {\n\t_classCallCheck(this, Exhibitor);\n\n\tthis.id = id;\n\n\tthis.name = attr.name; // only used for MX so far\n\tthis.domain = attr.domain;\n\tthis.logo = attr.logo_file;\n\n\t// Contains ticketing info, and maybe other things in the future\n\tthis.doc = attr.doc;\n\n\t// add other theater attributes here\n};\n\nexports[\"default\"] = Exhibitor;\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Format = function Format(id, attributes) {\n\t_classCallCheck(this, Format);\n\n\tthis.id = id;\n\tObject.assign(this, attributes);\n\tthis.name = this.name || '?';\n\tthis.label = this.name.toUpperCase(); // use for localised label\n\tthis.slug = this.name.toLowerCase().replace(/\\s/g, '');\n};\n\nexports['default'] = Format;\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// import slug from 'slugify';\n\nvar Movie = function Movie(id, attr, format) {\n\t_classCallCheck(this, Movie);\n\n\tthis.id = id;\n\tthis.title = attr.title;\n\n\t// this.slug = slug(attr.title, { lower: true, remove: /[^\\w\\s\\-\\.\\_~]/g });\n\t// this.slug = attr.title.toLowerCase().replace(/\\s+/g, '-').replace(/[^-_a-z0-9]/g, '');\n\tthis.slug = attr.slug || attr.title.toLowerCase().replace(/\\s+/g, '-').replace(/[^-_a-z0-9]/g, '');\n\n\tthis.format = format;\n\n\t// add other theater attributes here\n\tthis.movietickets = attr.movietickets_movie_id;\n\tthis.atom = attr.atom;\n\n\tthis.provider_movie_id = attr.provider_movie_id;\n\tthis.provider_id = attr.provider_id;\n\n\t// this.meta = attr.meta;\n\n\tthis.fandango = attr.meta && attr.meta.movie_code_id || attr.fandango_movie_id;\n};\n\nexports['default'] = Movie;\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.STDate = exports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _formatDateTime = __webpack_require__(11);\n\nvar _formatDateTime2 = _interopRequireDefault(_formatDateTime);\n\nvar _dataProviderToTicketProvider = __webpack_require__(19);\n\nvar _dataProviderToTicketProvider2 = _interopRequireDefault(_dataProviderToTicketProvider);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar timeOfDayMapping = {};\n\nvar now = new Date();\nvar tomorrow = new Date();\ntomorrow.setDate(tomorrow.getDate() + 1);\nvar todayStr = (0, _formatDateTime2['default'])(now, 'dd\\\\/MM\\\\/yyyy');\nvar tomorrowStr = (0, _formatDateTime2['default'])(tomorrow, 'dd\\\\/MM\\\\/yyyy');\nvar datesCache = {};\n\nvar Screening = function () {\n\t_createClass(Screening, null, [{\n\t\tkey: 'clearDatesCache',\n\t\tvalue: function clearDatesCache() {\n\t\t\tdatesCache = {};\n\t\t}\n\t}]);\n\n\tfunction Screening(id, attr, movie, appData) {\n\t\t_classCallCheck(this, Screening);\n\n\t\tvar copy = appData.copy;\n\n\t\t// Make all attributes from attr available (e.g. time, url, theater_id, cta, ...)\n\t\tObject.assign(this, attr);\n\t\tif (attr.tz_offset) {\n\t\t\tthis.tz_offset = getTZOffsetString(attr.tz_offset);\n\t\t}\n\n\t\tvar ticketProvider = _dataProviderToTicketProvider2['default'][attr.provider_id];\n\t\tif (ticketProvider) {\n\t\t\tif (!this.srcTicketProviders) {\n\t\t\t\tthis.srcTicketProviders = {};\n\t\t\t}\n\t\t\tthis.srcTicketProviders[ticketProvider] = this.url;\n\t\t\tdelete this.url;\n\t\t}\n\n\t\tthis.id = id;\n\t\tthis.movie = movie;\n\n\t\tthis.providerScreeningId = attr.provider_screening_id;\n\n\t\tthis.setDateTime(attr.date, attr.time, copy);\n\t}\n\n\t_createClass(Screening, [{\n\t\tkey: 'getSTDate',\n\t\tvalue: function getSTDate(iso, copy, force) {\n\t\t\t// Force is breaking refs, you should use Screening.clearDatesCache() instead\n\t\t\tforce = false;\n\t\t\tif (force || !datesCache.hasOwnProperty(iso)) {\n\t\t\t\tdatesCache[iso] = new STDate(iso, copy);\n\t\t\t}\n\t\t\treturn datesCache[iso];\n\t\t}\n\t}, {\n\t\tkey: 'createDatetime',\n\t\tvalue: function createDatetime(date, hour, minute) {\n\t\t\tvar datetime = new Date(date);\n\t\t\tdatetime.setHours(hour, minute, 0, 0);\n\t\t\treturn datetime;\n\t\t}\n\t}, {\n\t\tkey: 'setDateTime',\n\t\tvalue: function setDateTime(date, time, copy, force) {\n\t\t\tthis.date = date;\n\t\t\tthis.stDate = date && this.getSTDate(date, copy, force);\n\t\t\tif (time) {\n\t\t\t\tthis.time24 = time;\n\t\t\t\tvar timeSplit = time.split(':');\n\t\t\t\tthis.hour = +timeSplit[0];\n\t\t\t\tthis.minute = +timeSplit[1];\n\n\t\t\t\tvar timeOfDay = new TimeOfDay(this.hour, copy);\n\t\t\t\tif (!force && timeOfDayMapping.hasOwnProperty(timeOfDay.id)) this.timeOfDay = timeOfDayMapping[timeOfDay.id];else {\n\t\t\t\t\tthis.timeOfDay = timeOfDayMapping[timeOfDay.id] = timeOfDay;\n\t\t\t\t}\n\n\t\t\t\tthis.datetime = this.createDatetime(this.stDate ? this.stDate.date : now, this.hour, this.minute);\n\n\t\t\t\tif (this.hour <= 2) {\n\t\t\t\t\tvar nextDay = new Date(date || +now);\n\t\t\t\t\tnextDay.setDate(nextDay.getDate() + 1);\n\t\t\t\t\tthis.nextDaySTDate = this.getSTDate(nextDay.toISOString(), copy);\n\t\t\t\t\tthis.nextDayDatetime = this.createDatetime(this.nextDaySTDate ? this.nextDaySTDate.date : now, this.hour, this.minute);\n\t\t\t\t} else {\n\t\t\t\t\tdelete this.nextDaySTDate;\n\t\t\t\t\tdelete this.nextDayDatetime;\n\t\t\t\t}\n\n\t\t\t\tthis.isPast = (this.nextDayDatetime || this.datetime) < now;\n\t\t\t} else {\n\t\t\t\tdelete this.time24;\n\t\t\t\tdelete this.hour;\n\t\t\t\tdelete this.minute;\n\t\t\t\tdelete this.timeOfDay;\n\t\t\t\tdelete this.datetime;\n\t\t\t\tdelete this.nextDaySTDate;\n\t\t\t\tdelete this.nextDayDatetime;\n\t\t\t\tif (this.stDate) {\n\t\t\t\t\tthis.isPast = this.stDate.date < now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'offsetDate',\n\t\tvalue: function offsetDate(days, months, years, copy) {\n\t\t\tif (!this.date) return;\n\t\t\tvar parts = this.date.slice(0, 10).split('-');\n\t\t\tvar yoff = +years || 0;\n\t\t\tvar moff = +months || 0;\n\t\t\tvar doff = +days || 0;\n\t\t\tvar d = new Date(Date.UTC(+parts[0] + yoff, parts[1] - 1 + moff, +parts[2] + doff));\n\t\t\tthis.setDateTime(d.toISOString(), this.time24, copy);\n\t\t}\n\t}]);\n\n\treturn Screening;\n}();\n\nexports['default'] = Screening;\n\nvar STDate = exports.STDate = function STDate(dateStr, copy) {\n\t_classCallCheck(this, STDate);\n\n\t//2016-08-04\n\tvar year = +dateStr.slice(0, 4);\n\tvar month = +dateStr.slice(5, 7);\n\tvar day = +dateStr.slice(8, 10);\n\tvar date = new Date(year, month - 1, day);\n\n\t//  TESTING: REMOVE THIS\n\t// date.setDate(date.getDate() + ~~(Math.random() * 10));\n\t// !!!!!!!!!!!!!!!!!\n\tthis.id = date.valueOf();\n\tthis.date = date;\n\n\t// this.dayShort = copy.$DATETIME_LOCALE.$DAYS_SHORT[date.getDay()];\n\t// this.monthShort = copy.$DATETIME_LOCALE.$MONTHS_SHORT[date.getMonth()];\n\t// this.dateNum = ('00'+date.getDate()).slice(-2);\n\t// We could format only where needed\n\tthis.dayShort = (0, _formatDateTime2['default'])(date, 'ddd', copy.$DATETIME_LOCALE);\n\tthis.monthShort = (0, _formatDateTime2['default'])(date, 'MMM', copy.$DATETIME_LOCALE);\n\tthis.dateNum = (0, _formatDateTime2['default'])(date, 'dd', copy.$DATETIME_LOCALE);\n\t// \\\\/ because we always want an actual '/' instead of the locale date separator (which is a / anyway because we don't pass a locale)\n\tthis.ddmmyyyy = (0, _formatDateTime2['default'])(date, 'dd\\\\/MM\\\\/yyyy');\n\tthis.yyyymmdd = (0, _formatDateTime2['default'])(date, 'yyyy-MM-dd');\n\n\tthis.label = (0, _formatDateTime2['default'])(date, copy.$DATE_FILTER_FORMAT || 'ddd MMMMM dd', copy.$DATETIME_LOCALE);\n\t// this.label = this.dayShort + ' ' + this.monthShort.toUpperCase() + ' ' + this.dateNum;\n\n\tif (this.ddmmyyyy === todayStr) {\n\t\tthis.label = copy.$TODAY;\n\t} else if (this.ddmmyyyy === tomorrowStr) {\n\t\tthis.label = copy.$TOMORROW;\n\t}\n};\n\nvar TimeOfDay = function TimeOfDay(hour24, copy) {\n\t_classCallCheck(this, TimeOfDay);\n\n\tthis.id = getTimeOfDayId(hour24);\n\tthis.label = copy[this.id];\n};\n\nfunction getTimeOfDayId(hour24) {\n\tif (hour24 >= 22 || hour24 <= 3) {\n\t\treturn '$LATE';\n\t} else if (hour24 >= 18 && hour24 < 22) {\n\t\treturn '$EVENING';\n\t} else if (hour24 >= 12 && hour24 < 18) {\n\t\treturn '$AFTERNOON';\n\t} else if (hour24 > 3 && hour24 < 12) {\n\t\treturn '$MORNING';\n\t} else {\n\t\treturn '$UNKNOWN';\n\t}\n}\n\nfunction getTZOffsetString(offset) {\n\tvar sign = offset.hours && offset.hours < 0 || offset.minutes && offset.minutes < 0 ? '-' : '+';\n\tvar hours = offset.hours ? Math.abs(offset.hours) : 0;\n\thours = hours < 10 ? '0' + hours : hours.toString();\n\tvar minutes = offset.minutes ? Math.abs(offset.hours) : 0;\n\tminutes = minutes < 10 ? '0' + minutes : minutes.toString();\n\n\treturn '' + sign + hours + ':' + minutes;\n}\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(fetch) {\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.completeOrder = exports.startTransaction = exports.getSeatingMap = exports.updateSeats = exports.removeTickets = exports.addTickets = exports.cancelOrder = exports.updateTickets = exports.createOrder = exports.getTicketTypes = undefined;\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _ticketingPublic = __webpack_require__(9);\n\nvar _utils = __webpack_require__(2);\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _handleApi = __webpack_require__(59);\n\nvar _deserialise = __webpack_require__(52);\n\nvar _deserialise2 = _interopRequireDefault(_deserialise);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar IS_DEMO = typeof window !== 'undefined' && window.__INITIAL_STATE__ && window.__INITIAL_STATE__.appData.options.isDemoTicketing;\n\n// const API_BASE = 'http://ticketing.docker.labs:60080/mxt';\n// const API_BASE_DEV = 'https://labs.powster.com/mxt';\n// const API_BASE = 'http://ticketing.192.168.1.11.xip.io/mxt';\n// const API_BASE_DEV = 'https://live-ticketing.labs.powster.io/mxt';\nvar API_BASE_DEV = 'https://ticketing.staging.ticketing.powster.io/mxt'; // since 19-03-2018\nvar API_BASE_PROD = 'https://ticketing.powster.com/mxt';\nvar API_BASE = IS_DEMO ? API_BASE_DEV : API_BASE_PROD;\n// const API_BASE = 'http://ticketing.docker.localhost:60080/mxt'; // When working locally\n// const API_BASE = 'http://192.168.1.24:5000/mxt'; // When working locally\n\nvar API_HEADERS = {\n\t'Accept': 'application/vnd.api+json',\n\t'Content-Type': 'application/vnd.api+json'\n};\n\nvar dummyExhibitor = '00000000-0000-0000-0000-000000000000';\nvar dummyTheater = '00000000-0000-0000-0000-000000000000';\nvar dummyScreening = '00000000-0000-0000-0000-000000000000';\n\n// Load in test data\nif (IS_DEMO) {\n\tvar params = _qs2['default'].parse(window.location.search.substr(1));\n\tvar gateway = params.gateway !== undefined ? params.gateway : _ticketingPublic.defaultGateway;\n\tvar seating = params.seating === 'false' ? false : true;\n\tgetTestData(seating, gateway);\n}\n\n/**\n * @typedef {Object} App\n * @property {!string} studio - the studio slug\n * @property {!string} movie - the movie slug\n * @property {!string} region - the region slug\n */\n\n/**\n * Return an objet representing the application.\n *\n * @return {App} the app object\n */\nvar getApp = function getApp() {\n\tvar meta = (0, _utils.accessNested)(__INITIAL_STATE__, 'appData.meta');\n\tif (!meta) return;\n\n\tvar studio = (0, _utils.accessNested)(meta, 'studio.slug');\n\tvar movie = (0, _utils.accessNested)(meta, 'title.slug');\n\tvar region = (0, _utils.accessNested)(meta, 'region.slug');\n\tif (!studio || !movie || !region) return;\n\n\treturn { studio: studio, movie: movie, region: region };\n};\n\n/**\n * @typedef {Object} TicketingAnalytics\n * @property {!string} piwikId - the Piwik id, taken from the cookies\n * @property {!string} referrer - the page referrer (unchanged)\n * @property {!string} device - the type of device of the user\n * @property {string} campaign - the campaign tag, taken from the query string\n */\n\n/**\n * Return an object with stats for the ticketing database.\n *\n * @return {TicketingAnalytics} an object containing analytics information\n */\nvar getAnalytics = function getAnalytics() {\n\tvar piwikId = (0, _clientUtils.getPiwikId)();\n\tvar referrer = document.referrer;\n\n\tvar deviceWidth = window.innerWidth;\n\tvar device = deviceWidth > 1024 ? 'desktop' : deviceWidth > 768 ? 'tablet' : 'phone';\n\n\tvar params = _qs2['default'].parse(window.location.search.substr(1));\n\tvar campaign = params.campaign;\n\n\tvar analytics = { piwikId: piwikId, referrer: referrer, device: device };\n\tif (typeof campaign === 'string') analytics.campaign = campaign;\n\n\treturn analytics;\n};\n\n/* Api interaction\n---------------------------*/\n\n// TODO: We need some catch() overhere!\n\nvar apiGet = function apiGet(apiPath) {\n\treturn fetch((0, _utils.joinPaths)(API_BASE, apiPath), {\n\t\tmethod: 'GET',\n\t\theaders: API_HEADERS\n\t}).then(_handleApi.handleApiResponse).then(_deserialise2['default']);\n};\n\nvar apiPost = function apiPost(apiPath, body) {\n\treturn fetch((0, _utils.joinPaths)(API_BASE, apiPath), {\n\t\tmethod: 'POST',\n\t\theaders: API_HEADERS,\n\t\tbody: JSON.stringify(body)\n\t}).then(_handleApi.handleApiResponse).then(_deserialise2['default']);\n};\n\nvar apiDelete = function apiDelete(apiPath, body) {\n\treturn fetch((0, _utils.joinPaths)(API_BASE, apiPath), {\n\t\tmethod: 'DELETE',\n\t\theaders: API_HEADERS,\n\t\tbody: JSON.stringify(body)\n\t}).then(_handleApi.handleApiResponse).then(_deserialise2['default']);\n};\n\nvar apiPut = function apiPut(apiPath, body) {\n\treturn fetch((0, _utils.joinPaths)(API_BASE, apiPath), {\n\t\tmethod: 'PUT',\n\t\theaders: API_HEADERS,\n\t\tbody: JSON.stringify(body)\n\t}).then(_handleApi.handleApiResponse).then(_deserialise2['default']);\n};\n\nvar apiPatch = function apiPatch(apiPath, body) {\n\treturn fetch((0, _utils.joinPaths)(API_BASE, apiPath), {\n\t\tmethod: 'PATCH',\n\t\theaders: API_HEADERS,\n\t\tbody: JSON.stringify(body)\n\t}).then(_handleApi.handleApiResponse).then(_deserialise2['default']);\n};\n\nfunction getTestData(seating, gateway) {\n\tvar query = { seating: seating, gateway: gateway };\n\n\tfetch((0, _utils.joinPaths)(API_BASE, '/devget?' + _qs2['default'].stringify(query)), {\n\t\tmethod: 'GET',\n\t\theaders: API_HEADERS\n\t}).then(_handleApi.handleApiResponse).then(function (response) {\n\t\tvar dummy = response.data[0];\n\t\tif (dummy) {\n\t\t\tdummyExhibitor = dummy.provider_exhibitor_id;\n\t\t\tdummyTheater = dummy.provider_theater_id;\n\t\t\tdummyScreening = dummy.provider_screening_id;\n\t\t}\n\t});\n}\n\n/* Ticket Types\n---------------------------*/\n\nvar getTicketTypes = exports.getTicketTypes = function getTicketTypes(exhibitorId, screeningId, authToken) {\n\tvar query = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId\n\t};\n\n\tif (authToken) query.token = authToken;\n\n\treturn apiGet('/ticket_types?' + _qs2['default'].stringify(query));\n};\n\n/* Orders\n---------------------------*/\n\nvar createOrder = exports.createOrder = function createOrder(exhibitorId, theaterId, screeningId, seatingSupported, tickets, authToken) {\n\n\tif (!Array.isArray(tickets)) {\n\t\t// make it an array if it's an object\n\t\ttickets = Object.keys(tickets).map(function (key) {\n\t\t\treturn tickets[key];\n\t\t});\n\t}\n\n\t// Let's get what we need for the push\n\tvar orderTickets = tickets.map(function (ticket) {\n\t\treturn {\n\t\t\ttype: ticket.type,\n\t\t\tquantity: ticket.quantity\n\t\t};\n\t});\n\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater: IS_DEMO ? dummyTheater : theaterId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\tapp: getApp(),\n\t\tseating: seatingSupported,\n\t\ttickets: orderTickets,\n\t\tanalytics: getAnalytics()\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/order?nocache=' + Math.random(), body);\n};\n\nvar updateTickets = exports.updateTickets = function updateTickets(exhibitorId, screeningId, orderId, seatingSupported, ticketsToAdd, ticketIdsToRemove, authToken) {\n\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder: orderId,\n\t\tseating: seatingSupported\n\t};\n\n\tif (Array.isArray(ticketsToAdd) && ticketsToAdd.length > 0) {\n\t\tbody.ticketsToAdd = ticketsToAdd;\n\t}\n\tif (Array.isArray(ticketIdsToRemove) && ticketIdsToRemove.length > 0) {\n\t\tbody.ticketIdsToRemove = ticketIdsToRemove;\n\t}\n\tif (authToken) body.token = authToken;\n\n\treturn apiPatch('/tickets?nocache=' + Math.random(), body);\n};\n\nvar cancelOrder = exports.cancelOrder = function cancelOrder(exhibitorId, orderId, authToken) {\n\tvar async = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\torder: orderId\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\t// We need to send it as a synchronous call because this function gets called on unload\n\t// it won't finish the call if the call is async...\n\t// TODO: make this async if needed (for the close button)\n\tif (async) {\n\t\treturn apiDelete('/order', body);\n\t} else {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('DELETE', (0, _utils.joinPaths)(API_BASE, '/order'), false);\n\t\txhr.setRequestHeader('Accept', 'application/vnd.api+json');\n\t\txhr.setRequestHeader('Content-Type', 'application/vnd.api+json');\n\t\txhr.send(JSON.stringify(body));\n\t}\n};\n\nvar addTickets = exports.addTickets = function addTickets(exhibitorId, screeningId, orderId, seatingSupported, ticketsToAdd) {\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder: orderId,\n\t\tseating: seatingSupported,\n\t\ttickets: ticketsToAdd\n\t};\n\n\treturn apiPost('/tickets?nocache=' + Math.random(), body);\n};\n\nvar removeTickets = exports.removeTickets = function removeTickets(exhibitorId, screeningId, orderId, seatingSupported, ticketIdsToRemove) {\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder: orderId,\n\t\tseating: seatingSupported,\n\t\tids: ticketIdsToRemove\n\t};\n\n\treturn apiDelete('/tickets?nocache=' + Math.random(), body);\n};\n\n/* Seats\n---------------------------*/\n\nvar updateSeats = exports.updateSeats = function updateSeats(exhibitorId, screeningId, orderId, seats, authToken) {\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder: orderId,\n\t\tseats: seats\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPut('/seats', body);\n};\n\nvar getSeatingMap = exports.getSeatingMap = function getSeatingMap(exhibitorId, screeningId, orderId, authToken) {\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder: orderId\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiGet('/seat_map?' + _qs2['default'].stringify(body));\n};\n\n/* Transaction\n---------------------------*/\n\nvar startTransaction = exports.startTransaction = function startTransaction(exhibitorId, theaterId, orderId, paymentArgs) {\n\tvar name = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';\n\tvar email = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '';\n\tvar address = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : '';\n\tvar zip = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : '';\n\tvar city = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : '';\n\tvar loyaltyNumber = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : '';\n\tvar authToken = arguments[10];\n\n\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater: IS_DEMO ? dummyTheater : theaterId,\n\t\torder: orderId,\n\t\tpaymentArgs: paymentArgs\n\t};\n\n\tif (typeof name === 'string' && name.length > 0) {\n\t\tbody.name = name;\n\t}\n\tif (typeof email === 'string' && email.length > 0) {\n\t\tbody.email = email;\n\t}\n\tif (typeof address === 'string' && address.length > 0) {\n\t\tif (address.length > 36) {\n\t\t\tbody.address1 = address.substring(0, 36);\n\t\t\tbody.address2 = address.substring(36, 72);\n\t\t} else {\n\t\t\tbody.address1 = address;\n\t\t}\n\t}\n\tif (typeof zip === 'string' && zip.length > 0) {\n\t\tbody.zip = zip;\n\t}\n\tif (typeof city === 'string' && city.length > 0) {\n\t\tbody.city = city;\n\t}\n\tif (typeof loyaltyNumber === 'string' && loyaltyNumber.length > 0) {\n\t\tbody.loyalty = loyaltyNumber;\n\t}\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/start_transaction?nocache=' + Math.random(), body);\n};\n\nvar completeOrder = exports.completeOrder = function completeOrder(exhibitorId, theaterId, orderId, paymentResponse, authToken) {\n\tvar body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater: IS_DEMO ? dummyTheater : theaterId,\n\t\torder: orderId,\n\t\tpaymentResponse: paymentResponse\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/complete_order?nocache=' + Math.random(), body);\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14)))\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n//\n// Use this file if you need to mutate the store for a specific app\n//\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getSeatSlots = exports.getTheaterOccupancy = exports.getSeatPositionNormalized = exports.getOrderTotalPrice = exports.ticketingOrder = exports.ERROR = exports.COMPLETE = exports.PAYMENT = exports.CONTACT_DETAILS = exports.REVIEW = exports.SELECT_SEATS = exports.SELECT_TICKETS = exports.NOT_ACTIVE = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /**\n                                                                                                                                                                                                                                                                               * Controller for all ticketing interactions\n                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                               * @module ticketing/controller\n                                                                                                                                                                                                                                                                               */\n\nvar _qs = __webpack_require__(5);\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _ticketingPublic = __webpack_require__(9);\n\nvar _tracking = __webpack_require__(6);\n\nvar _timeTracker = __webpack_require__(64);\n\nvar _timeTracker2 = _interopRequireDefault(_timeTracker);\n\nvar _copy = __webpack_require__(10);\n\nvar _utils = __webpack_require__(2);\n\nvar _mxApi = __webpack_require__(49);\n\nvar mxApi = _interopRequireWildcard(_mxApi);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Constants\n\n/** UI States */\nvar NOT_ACTIVE = exports.NOT_ACTIVE = 'NOT_ACTIVE';\nvar SELECT_TICKETS = exports.SELECT_TICKETS = 'SELECT_TICKETS';\nvar SELECT_SEATS = exports.SELECT_SEATS = 'SELECT_SEATS';\nvar REVIEW = exports.REVIEW = 'REVIEW';\nvar CONTACT_DETAILS = exports.CONTACT_DETAILS = 'CONTACT_DETAILS';\nvar PAYMENT = exports.PAYMENT = 'PAYMENT';\nvar COMPLETE = exports.COMPLETE = 'COMPLETE';\nvar ERROR = exports.ERROR = 'ERROR';\n\n/** Order of UI States */\nvar ticketingOrder = exports.ticketingOrder = [NOT_ACTIVE, SELECT_TICKETS, SELECT_SEATS, REVIEW, CONTACT_DETAILS, PAYMENT, COMPLETE];\n\n/** The number of decimals for the heatmap position vectors */\nvar HEATMAP_FLOAT_PRECISION = 7;\n\n/** The number of decimals for the theater occupancy */\nvar OCCUPANCY_FLOAT_PRECISION = 4;\n\n/** The default time allowed to book a ticket (seconds) */\nvar DEFAULT_BOOKING_TIMEOUT_S = 300;\n\n/** Tracking of loading times */\nvar timeTracker = new _timeTracker2['default']('ticketing-');\n\nvar DWELL_TIME = 'dwell-time';\nvar LOADING_TIME_TICKET_TYPES = 'loading-time-ticket-types';\nvar LOADING_TIME_CREATE_ORDER = 'loading-time-create-order';\nvar LOADING_TIME_UPDATE_ORDER = 'loading-time-update-order';\nvar LOADING_TIME_UPDATE_SEATS = 'loading-time-update-seats';\nvar LOADING_TIME_FLUSH_LAYOUT = 'loading-time-flush-layout';\nvar LOADING_TIME_START_TRANSACTION = 'loading-time-start-transaction';\nvar LOADING_TIME_PAYMENTS = 'loading-time-payments';\nvar LOADING_TIME_COMPLETE_ORDER = 'loading-time-complete-order';\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Event list\n\n_store2['default'].on(actions.OPEN_TICKETING, openTicketing);\n_store2['default'].on(actions.REOPEN_TICKETING, reopenTicketing);\n_store2['default'].on(actions.GO_TICKETING_TYPES, goToTicketingTypes);\n_store2['default'].on(actions.UPDATE_TICKET_TYPE_QUANTITY, updateTicketTypeQuantity);\n_store2['default'].on(actions.CREATE_OR_UPDATE_ORDER, createOrUpdateOrder);\n_store2['default'].on(actions.GO_TICKETING_SEATING, goToTicketingSeating);\n_store2['default'].on(actions.PICK_OR_UNPICK_SEATS, pickOrUnpickSeats);\n_store2['default'].on(actions.UPDATE_TICKETING_SEATS, updateTicketingSeats);\n_store2['default'].on(actions.FLUSH_SEAT_LAYOUT, flushSeatLayout);\n_store2['default'].on(actions.GO_TICKETING_REVIEW, goToTicketingReview);\n_store2['default'].on(actions.GO_TICKETING_CONTACT_DETAILS, goToTicketingContactDetails);\n_store2['default'].on(actions.GO_TICKETING_PAYMENT, goToTicketingPayment);\n_store2['default'].on(actions.PAYMENT_MESSAGE_RECEIVED, onPaymentMessageReceived);\n_store2['default'].on(actions.SET_TICKETING_MESSAGE, setTicketingMessage);\n_store2['default'].on(actions.CLEAR_TICKETING_MESSAGE, clearTicketingMessage);\n_store2['default'].on(actions.GO_TICKETING_TIMEOUT, goToTicketingTimeout);\n_store2['default'].on(actions.CLOSE_TICKETING, closeTicketing);\n_store2['default'].on(actions.CLOSE_APP, closeApp);\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Payment gateways constants\n\n// Authorize.net speicific messages while in payment\nvar AUTHNET_MSG_RESIZE_WINDOW = 'resizeWindow';\nvar AUTHNET_MSG_CANCEL = 'cancel';\nvar AUTHNET_MSG_TRANSACTION_RESPONSE = 'transactResponse';\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing sessions\n\n/**\n * The current ticketing session identifier.\n * This identifier will ensure that any response we're receiving from the server is about the\n * current session and not a previously created session.<br>\n * <br>\n * For example, if you send a request to create an order and then open a new ticketing session\n * before you actually receive the response, you need to ignore the response when it arrives,\n * because the response is about the outdated session.\n */\nvar _sessionId = 1;\n\n/**\n * Open a new ticketing session:\n * <ol>\n *   <li>create a new ticketing state object in `showtimes`</li>\n *   <li>display the \"SELECT_TICKETS\" pane</li>\n * </ol>\n *\n * @param {Object} data - data received by the \"OPEN_TICKETING\" event\n * @property {Theater} data.theater - the currently active theater\n * @property {Screening} data.screening - the currently active screening\n */\nfunction openTicketing(_ref) {\n\tvar theater = _ref.theater,\n\t    screening = _ref.screening;\n\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\t// TODO: We MUST check if a ticketing session is already opened, then close it.\n\t//       event if everything has been built to avoid this situation!\n\n\t(0, _tracking.track)({ a: 'ticketing-open' });\n\ttimeTracker.start(DWELL_TIME);\n\n\tvar seatingSupported = (0, _utils.accessNested)(screening, 'doc.isAllocatedSeating');\n\tif (typeof seatingSupported === 'undefined') {\n\t\tseatingSupported = !!(0, _utils.accessNested)(screening, 'doc.is_allocated_seating', true);\n\t}\n\n\tvar paymentGateway = (0, _utils.accessNested)(theater, 'exhibitor.doc.payment.gateway', _ticketingPublic.defaultGateway);\n\tvar loyaltyEnabled = !!(0, _utils.accessNested)(theater, 'exhibitor.doc.ticketing.loyalty.enabled');\n\tvar termsUrl = (0, _utils.accessNested)(theater, 'exhibitor.doc.legals.termsUrl');\n\tvar privacyUrl = (0, _utils.accessNested)(theater, 'exhibitor.doc.legals.privacyUrl');\n\n\t// Override exhibitor properties with theater's own properties\n\tvar theaterPaymentGateway = (0, _utils.accessNested)(theater, 'doc.payment.gateway');\n\tvar theaterLoyaltyEnabled = (0, _utils.accessNested)(theater, 'doc.ticketing.loyalty.enabled');\n\tvar theaterTermsUrl = (0, _utils.accessNested)(theater, 'doc.legals.termsUrl');\n\tvar theaterPrivacyUrl = (0, _utils.accessNested)(theater, 'doc.legals.privacyUrl');\n\n\tif (typeof theaterPaymentGateway !== 'undefined') paymentGateway = theaterPaymentGateway;\n\tif (typeof theaterLoyaltyEnabled !== 'undefined') loyaltyEnabled = !!theaterLoyaltyEnabled;\n\tif (typeof theaterTermsUrl !== 'undefined') termsUrl = theaterTermsUrl;\n\tif (typeof theaterPrivacyUrl !== 'undefined') privacyUrl = theaterPrivacyUrl;\n\n\tif (!termsUrl) console.warn('There is no terms and conditions link setup for this exhibitor');\n\tif (!privacyUrl) console.warn('There is no privacy policy link setup for this exhibitor');\n\n\t// Override payment gateway and seating in demo mode\n\tif ((0, _ticketingPublic.isDemoTicketing)()) {\n\t\tvar params = _qs2['default'].parse(window.location.search.substr(1));\n\t\tif (params.seating !== undefined) seatingSupported = params.seating !== 'false';\n\t\tif (params.gateway !== undefined) paymentGateway = params.gateway;\n\t}\n\n\tticketing.set({\n\t\tsessionId: _sessionId,\n\t\ttheaterId: theater.id,\n\t\ttheaterMxId: theater.providerTheaterId,\n\t\texhibitorId: (0, _utils.accessNested)(theater, 'exhibitor.id'),\n\t\tscreeningId: screening.id,\n\t\tscreeningMxId: screening.provider_screening_id,\n\t\t// ^ NOTE: screening.id and screening.provider_screening_id used to be the same.\n\t\t//         For all MX related stuff, use the screeningMxId\n\t\tmeta: {\n\t\t\tmovieTitle: (0, _utils.accessNested)(screening, 'movie.title'),\n\t\t\tmovieFormat: (0, _utils.accessNested)(screening, 'movie.format.label'),\n\t\t\tmovieDate: screening.nextDayDatetime || screening.datetime,\n\t\t\ttheaterName: theater.name,\n\t\t\ttheaterAddress: (0, _utils.accessNested)(theater, 'location.fullAddress'),\n\t\t\texhibitorName: (0, _utils.accessNested)(theater, 'exhibitor.name'),\n\t\t\ttermsUrl: termsUrl,\n\t\t\tprivacyUrl: privacyUrl\n\t\t},\n\t\tstate: SELECT_TICKETS,\n\t\tseatingSupported: seatingSupported,\n\t\tpaymentGateway: paymentGateway,\n\t\tloyaltyEnabled: loyaltyEnabled,\n\t\tstartDate: Date.now(),\n\t\tsavedTickets: null,\n\t\tfallbackUrl: (0, _ticketingPublic.getFallbackUrl)(theater, screening),\n\t\tisDemo: (0, _ticketingPublic.isDemoTicketing)()\n\t});\n\n\t_store2['default'].emit(actions.GO_TICKETING_TYPES);\n}\n\n/**\n * Reopen a previously opened ticketing session\n * The session will only be reopened if the session was opened before (= has all the necessary\n * infos available).\n *\n * This function will redirect the user to the ticket booking or the seating section based on the\n * previous state.\n */\nfunction reopenTicketing() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\t// If session is up to date, no need to reopen\n\tif (ticketing.sessionId === _sessionId) return;\n\n\t// Check that basic info are there\n\tif (!ticketing.theaterId || !ticketing.exhibitorId) return;\n\tif (!ticketing.screeningMxId && !(0, _ticketingPublic.isDemoTicketing)()) return;\n\n\tif (!ticketing.hasOwnProperty('seatingSupported')) return;\n\tif (!ticketing.hasOwnProperty('paymentGateway')) return;\n\n\t// Reopen accepted: update the sessionId\n\tticketing = ticketing.set({\n\t\tsessionId: _sessionId,\n\t\tstartDate: Date.now()\n\t});\n\n\t// Recover saved tickets\n\tif (ticketing.hasOwnProperty('savedTickets') && (0, _utils.isObject)(ticketing.savedTickets)) {\n\t\tticketing = ticketing.set('tickets', ticketing.savedTickets.toJS());\n\t}\n\n\t// Redirect the user:\n\t// if there are some selected seats, we can directly go to the seating pane.\n\tvar hasAlreadyBookedTickets = ticketing.hasOwnProperty('pickedSeats');\n\t_store2['default'].emit(hasAlreadyBookedTickets ? actions.GO_TICKETING_SEATING : actions.GO_TICKETING_TYPES);\n}\n\n/**\n * Clear the ticketing session:\n * (1) cancel the order, if any\n * (2) reset the ticketing state\n *\n * This function does not make any change to the UI, you need to redirect the user afterward.\n *\n * @param {boolean=} async - whether the cancel order request should be asynchronous or not\n * @return {boolean} true if an order was cancelled, false otherwise\n */\nfunction clearTicketingSession() {\n\tvar async = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\tvar orderCancelled = false;\n\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\tvar _ticketing = ticketing,\n\t    exhibitorId = _ticketing.exhibitorId,\n\t    order = _ticketing.order;\n\n\t// User just left ticketing\n\n\ttimeTracker.end(DWELL_TIME);\n\n\t// Make sure the loading is closed\n\tticketing = ticketing.set({\n\t\tapiLoading: false,\n\t\tapiMessage: '',\n\t\tapiMessageCallback: undefined\n\t});\n\n\t// Cancel the order in case it was created but not complete\n\tvar orderComplete = !!(0, _utils.accessNested)(ticketing, 'payment.bookingId');\n\tif (ticketing.order && !orderComplete) {\n\t\tmxApi.cancelOrder(exhibitorId, order.orderId, authToken, async);\n\t\torderCancelled = true;\n\n\t\t// Save tickets for eventual future recovering\n\t\tif (ticketing.hasOwnProperty('tickets') && (0, _utils.isObject)(ticketing.tickets)) {\n\t\t\tticketing = ticketing.set('savedTickets', ticketing.tickets.toJS());\n\t\t}\n\n\t\tticketing = ticketing.remove(['order', 'timeout', 'allowedTime', 'startDate']);\n\t}\n\n\tif (ticketing.tickets) ticketing = ticketing.remove('tickets');\n\n\t// Clear all pending loading times\n\ttimeTracker.clearAll();\n\n\t_sessionId++;\n\t// ^ now this session is now outdated until we call openTicketing() OR reopenTicketing()\n\n\treturn orderCancelled;\n}\n\n/**\n * Set the ticketing message to display to the user.\n *\n * @param {!Object} data - the event data\n * @property {!string} data.message - the message to show to the user\n * @property {Function=} data.callback - optional function to call when the message box is closed\n */\nfunction setTicketingMessage(_ref2) {\n\tvar message = _ref2.message,\n\t    callback = _ref2.callback;\n\n\tif (callback && typeof callback !== 'function') {\n\t\tcallback = undefined;\n\t}\n\t_store2['default'].get().showtimes.ticketing.set({\n\t\tapiMessage: message,\n\t\tapiMessageCallback: callback\n\t});\n}\n\n/**\n * Hide the ticketing message.\n * This function will clear both the `apiMessage` and the `apiMessageCallback`.\n */\nfunction clearTicketingMessage() {\n\t_store2['default'].get().showtimes.ticketing.set({\n\t\tapiMessage: '',\n\t\tapiMessageCallback: undefined\n\t});\n}\n\n/**\n * Close the ticketing pane.\n * This function clears the ticketing session and prepare the ticketing state for the next session.\n *\n * Note that, after calling this function, the ticketing state will still exist to keep the\n * previously ordered tickets (if any), so you don't have to re-enter your tickets again.\n */\nfunction closeTicketing() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar wasLoading = ticketing.apiLoading;\n\tvar lastStep = ticketing.state;\n\n\tif (!lastStep || lastStep === NOT_ACTIVE) return;\n\n\t(0, _tracking.track)({ a: 'ticketing-close' });\n\n\tif (wasLoading) {\n\t\t(0, _tracking.track)({ a: 'ticketing-close-while-loading' });\n\t}\n\n\tclearTicketingSession();\n\n\tvar showtimes = _store2['default'].get().showtimes;\n\tticketing = showtimes.ticketing;\n\n\tvar newTicketing = {\n\t\tsessionId: ticketing.sessionId,\n\t\tstate: NOT_ACTIVE,\n\t\tauthToken: ticketing.authToken\n\t};\n\n\t// Add in the previously ordered tickets, if any\n\tif (ticketing.tickets) {\n\t\tnewTicketing.tickets = ticketing.tickets;\n\t}\n\n\tif (lastStep === SELECT_SEATS && ticketing.seatingSupported && ticketing.seating) {\n\t\t// Here, the user might give up because there's not enough free seats\n\t\t// So let's track the theater's occupancy\n\t\t(0, _tracking.track)({\n\t\t\ta: 'ticketing-close-occupancy',\n\t\t\tl: getTheaterOccupancy(ticketing.seating).toFixed(OCCUPANCY_FLOAT_PRECISION)\n\t\t});\n\t}\n\n\tshowtimes = showtimes.remove('ticketing');\n\tshowtimes.set('ticketing', newTicketing);\n}\n\n/**\n * Called when the page is closed.\n * This function cancel a previously created order synchronously to make sure the request is sent\n * before the page is closed.\n */\nfunction closeApp() {\n\tvar ticketing = (0, _utils.accessNested)(_store2['default'].get(), 'showtimes.ticketing');\n\tif (!ticketing) return;\n\n\tif (!ticketing.state || ticketing.state === NOT_ACTIVE) return;\n\n\t(0, _tracking.track)({ a: 'ticketing-close' });\n\t(0, _tracking.track)({ a: 'ticketing-close-app' });\n\n\tif (ticketing.order) {\n\t\tclearTicketingSession(false);\n\t\t// ^ synchronous, but intentional\n\t}\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticket types\n\n/**\n * Loads ticket types for the screening stored in the ticketing state then\n * display the \"SELECT_TICKETS\" pane, with the tickets available for that screening.\n */\nfunction goToTicketingTypes() {\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\n\tif (ticketing.ticketTypes) {\n\t\t// We already have ticket types, no need to ask for them again\n\t\tticketing.set({ state: SELECT_TICKETS });\n\t\treturn;\n\t}\n\n\tvar exhibitorId = ticketing.exhibitorId,\n\t    screeningMxId = ticketing.screeningMxId;\n\n\n\tticketing.set({\n\t\tstate: SELECT_TICKETS,\n\t\tapiLoading: true\n\t});\n\n\ttimeTracker.start(LOADING_TIME_TICKET_TYPES);\n\n\tmxApi.getTicketTypes(exhibitorId, screeningMxId, authToken).then(function (data) {\n\t\ttimeTracker.end(LOADING_TIME_TICKET_TYPES);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tvar ticketTypes = void 0;\n\t\tvar maxTickets = void 0;\n\t\tif ((0, _utils.isObject)(data) && data.ticketTypes) {\n\t\t\tticketTypes = data.ticketTypes;\n\t\t\tmaxTickets = data.maxTickets;\n\t\t} else {\n\t\t\tticketTypes = data;\n\t\t}\n\n\t\tif (ticketTypes.length === 0) {\n\t\t\tgoToError((0, _copy.getCopy)('NO_TICKET_AVAIL_AT_THE_MOMENT'));\n\t\t\treturn;\n\t\t}\n\n\t\tvar updatedTicketing = _store2['default'].get().showtimes.ticketing;\n\n\t\tupdatedTicketing = updatedTicketing.set({\n\t\t\tticketTypes: ticketTypes,\n\t\t\tapiLoading: false\n\t\t});\n\n\t\tif (maxTickets) {\n\t\t\tupdatedTicketing.set('maxTickets', maxTickets);\n\t\t}\n\n\t\t(0, _tracking.track)({ a: 'ticketing-go-types' });\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_TICKET_TYPES);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Helper to generate a 41001 MX error.\n */\n/* eslint-disable no-unused-vars */\nvar requestLotOfTicketsToKillMx = function requestLotOfTicketsToKillMx() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar ticketTypes = ticketing.ticketTypes;\n\n\tif (!ticketTypes) return;\n\tvar tickets = (0, _utils.isObject)(ticketing.tickets) ? ticketing.tickets.toJS() : {};\n\n\tticketTypes.forEach(function (ticketType) {\n\t\ttickets[ticketType.id] = {\n\t\t\ttype: ticketType.id,\n\t\t\tquantity: Math.round(573 + Math.random() * 1142)\n\t\t};\n\t});\n\n\tticketing.set({ tickets: tickets });\n};\n/* eslint-enable no-unused-vars */\n\n// if (typeof window !== 'undefined') {\n// \twindow.requestLotOfTicketsToKillMx = requestLotOfTicketsToKillMx;\n// }\n\n/**\n * Update the quantity for a certain ticket type inside the ticketing state.\n *\n * @param {Object} data - data received by the \"UPDATE_TICKET_TYPE_QUANTITY\" event\n * @param {string} data.ticketTypeId - id of the ticket type\n * @param {string} data.quantity - the new quantity of the ticket type\n */\nfunction updateTicketTypeQuantity(_ref3) {\n\tvar ticketTypeId = _ref3.ticketTypeId,\n\t    quantity = _ref3.quantity;\n\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar ticketTypes = ticketing.ticketTypes;\n\tvar tickets = ticketing.tickets;\n\n\n\tif (!ticketTypes) return;\n\n\tvar ticketType = ticketing.ticketTypes.find(function (ticketType) {\n\t\treturn ticketType.id === ticketTypeId;\n\t});\n\n\tif (!tickets) {\n\t\ttickets = ticketing.set('tickets', {}).tickets;\n\t}\n\n\t(0, _tracking.track)({\n\t\ta: 'ticketing-change-type-quantity',\n\t\tl: ticketType.description\n\t});\n\n\t// Do we already have a ticket saved for that type\n\tif (tickets[ticketTypeId]) {\n\t\tif (quantity === 0) {\n\t\t\ttickets.remove(ticketTypeId);\n\t\t} else {\n\t\t\ttickets[ticketTypeId].set({ quantity: quantity });\n\t\t}\n\t} else {\n\t\tif (quantity === 0) return;\n\n\t\ttickets.set(ticketTypeId, {\n\t\t\ttype: ticketTypeId,\n\t\t\tquantity: quantity,\n\t\t\tdescription: ticketType.description,\n\t\t\tprice: ticketType.price,\n\t\t\tareaCategoryCode: ticketType.areaCategoryCode,\n\t\t\tisAllocatedSeating: ticketType.isAllocatedSeating\n\t\t});\n\t}\n}\n\n/**\n * Return the total price of the order.\n *\n * @function\n * @param {Object=} ticketing - the ticketing state\n * @return {!string} the total price of the order, including the booking fee.\n */\nvar getOrderTotalPrice = exports.getOrderTotalPrice = function getOrderTotalPrice(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar tickets = ticketing.tickets;\n\tvar totalPrice = 0;\n\n\tfor (var type in tickets) {\n\t\tvar ticket = tickets[type];\n\t\ttotalPrice += ticket.price * ticket.quantity;\n\t}\n\n\ttotalPrice += ticketing.order.bookingFee;\n\n\treturn totalPrice.toFixed(2);\n};\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ordering tickets\n\n/**\n * Return whether 2 ticket sets are equals.\n *\n * @param {Object} tickets1 - the first ticket set\n * @param {Object} tickets2 - the second ticket set\n * @return {boolean} true if ticket sets are equals, false otherwise\n */\nfunction areTicketsEqual(tickets1, tickets2) {\n\tvar ticketIds = new Set();\n\n\tfor (var ticketId in tickets1) {\n\t\tticketIds.add(ticketId);\n\t\tif (!tickets2[ticketId]) return false;\n\t}\n\n\tfor (var _ticketId in tickets2) {\n\t\tticketIds.add(_ticketId);\n\t\tif (!tickets1[_ticketId]) return false;\n\t}\n\n\tvar _iteratorNormalCompletion = true;\n\tvar _didIteratorError = false;\n\tvar _iteratorError = undefined;\n\n\ttry {\n\t\tfor (var _iterator = ticketIds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t\tvar _ticketId2 = _step.value;\n\n\t\t\tvar ticketType1 = tickets1[_ticketId2];\n\t\t\tvar ticketType2 = tickets2[_ticketId2];\n\n\t\t\tif (ticketType1.areaCategoryCode !== ticketType2.areaCategoryCode) return false;\n\t\t\tif (ticketType1.quantity !== ticketType2.quantity) return false;\n\t\t\tif (ticketType1.price !== ticketType2.price) return false;\n\t\t\tif (ticketType1.description !== ticketType2.description) return false;\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError = true;\n\t\t_iteratorError = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion && _iterator['return']) {\n\t\t\t\t_iterator['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError) {\n\t\t\t\tthrow _iteratorError;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Update the ticketing timeout if a new expiration time is received.\n *\n * @function\n * @param {number=} expiration - the number of minutes before a timeout\n * @param {Object=} ticketing - the ticketing state\n * @return {!Object} the new ticketing state\n */\nvar refreshTimeout = function refreshTimeout(expiration, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar expirationSet = typeof expiration === 'number';\n\tvar timeoutSet = ticketing.timeout && ticketing.allowedTime;\n\n\tif (expirationSet || !timeoutSet) {\n\t\tvar allowedTime = expirationSet ? expiration * 1e-3 : DEFAULT_BOOKING_TIMEOUT_S;\n\t\tticketing = ticketing.set({\n\t\t\ttimeout: Date.now() + allowedTime * 1e3,\n\t\t\tallowedTime: Math.round(allowedTime)\n\t\t});\n\t}\n\n\treturn ticketing;\n};\n\n/**\n * Create a new order from the tickets stored in the ticketing state\n * or update the tickets of a previously created order with the new tickets.\n */\nfunction createOrUpdateOrder() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar tickets = ticketing.tickets.toJS(); // the ordered tickets\n\tvar prevOrder = ticketing.order; // the previously created order, if any\n\n\t// You can't create an order without any ticket\n\tif (!tickets) {\n\t\tif (ticketing.state !== SELECT_TICKETS && ticketing.state !== NOT_ACTIVE) {\n\t\t\t_store2['default'].emit(actions.GO_TICKETING_TYPES);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (prevOrder) {\n\t\tvar prevTickets = prevOrder.tickets.toJS();\n\n\t\tif (areTicketsEqual(tickets, prevTickets)) {\n\t\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t\t} else {\n\t\t\tupdateOrder(tickets, prevTickets);\n\t\t}\n\t} else {\n\t\tcreateOrder();\n\t}\n}\n\n/**\n * Function called before the seating map gets added to the store.\n * You can add any preprocessing here. The seat layout is modified in-place.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout to process\n */\nfunction prepareSeatingMap(seatLayout) {\n\tseatLayout.areas.forEach(function (area) {\n\t\treturn area.rows.forEach(function (row) {\n\t\t\treturn row.seats.forEach(function (seat) {\n\t\t\t\tseat.areaCategoryCode = area.areaCategoryCode;\n\t\t\t\tseat.rowLabel = row.rowLabel;\n\t\t\t});\n\t\t});\n\t});\n}\n\n/**\n * Create a new ticket order then go to the next step.\n * All required info are taken from the ticketing state.\n */\nfunction createOrder() {\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\n\tticketing.set({ apiLoading: true });\n\n\ttimeTracker.start(LOADING_TIME_CREATE_ORDER);\n\n\tvar _ticketing2 = ticketing,\n\t    exhibitorId = _ticketing2.exhibitorId,\n\t    theaterMxId = _ticketing2.theaterMxId,\n\t    screeningMxId = _ticketing2.screeningMxId,\n\t    seatingSupported = _ticketing2.seatingSupported;\n\n\tvar tickets = ticketing.tickets.toJS();\n\n\tmxApi.createOrder(exhibitorId, theaterMxId, screeningMxId, seatingSupported, tickets, authToken).then(function (order) {\n\n\t\ttimeTracker.end(LOADING_TIME_CREATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tvar seatingMap = order.seatingMap,\n\t\t    selectedSeats = order.selectedSeats,\n\t\t    groupedTickets = order.groupedTickets,\n\t\t    expiration = order.expiration;\n\n\t\t// Lets store which tickets we have now, so we can easily compare when they get updated\n\n\t\torder.tickets = ticketing.tickets.toJS();\n\n\t\t// Delete the seating map from the order, so we don't add it inside the store twice\n\t\tdelete order.seatingMap;\n\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\torder: order,\n\t\t\tapiLoading: false\n\t\t});\n\n\t\tticketing = refreshTimeout(expiration, ticketing);\n\n\t\tif (seatingSupported) {\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tvar pickedSeats = (0, _ticketingPublic.getPickedSeats)(seatingMap);\n\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating: seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats: (0, _ticketingPublic.getSeats)(selectedSeats, groupedTickets, ticketing.ticketTypes)\n\t\t\t});\n\t\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t\t}\n\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_CREATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Update a previously created order.\n *\n * @param {Object} nextTickets - the newly ordered tickets\n * @param {Object} prevTickets - the previously ordered tickets\n */\nfunction updateOrder(nextTickets, prevTickets) {\n\t// (1) let's find which ticket was added and which ticket was removed\n\tvar addedTickets = {};\n\tvar removedTickets = {};\n\n\tfor (var ticketTypeId in nextTickets) {\n\t\tif (!prevTickets[ticketTypeId]) {\n\t\t\taddedTickets[ticketTypeId] = nextTickets[ticketTypeId].quantity;\n\t\t} else {\n\t\t\tvar diff = nextTickets[ticketTypeId].quantity - prevTickets[ticketTypeId].quantity;\n\t\t\tif (diff > 0) {\n\t\t\t\taddedTickets[ticketTypeId] = diff;\n\t\t\t} else if (diff < 0) {\n\t\t\t\tremovedTickets[ticketTypeId] = -diff;\n\t\t\t}\n\t\t}\n\t}\n\tfor (var _ticketTypeId in prevTickets) {\n\t\tif (!nextTickets[_ticketTypeId]) {\n\t\t\tremovedTickets[_ticketTypeId] = prevTickets[_ticketTypeId].quantity;\n\t\t}\n\t}\n\n\t// (2) prepare the request parameters\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\tvar groupedTickets = ticketing.order.groupedTickets;\n\n\tvar ticketsToAdd = [];\n\tfor (var _ticketTypeId2 in addedTickets) {\n\t\tticketsToAdd.push({\n\t\t\ttype: _ticketTypeId2,\n\t\t\tquantity: addedTickets[_ticketTypeId2]\n\t\t});\n\t}\n\n\tvar ticketIdsToRemove = [];\n\n\tvar _loop = function _loop(_ticketTypeId3) {\n\t\tvar quantity = removedTickets[_ticketTypeId3];\n\n\t\tvar previouslyOrderedTickets = groupedTickets.find(function (groupedTicket) {\n\t\t\treturn groupedTicket.ticketTypeId === _ticketTypeId3;\n\t\t});\n\n\t\tif (!previouslyOrderedTickets) {\n\t\t\tconsole.error(quantity + ' tickets of type ' + _ticketTypeId3 + ' were removed, but could not be ' + 'found among the previously ordered tickets:', previouslyOrderedTickets);\n\t\t\treturn 'continue';\n\t\t}\n\n\t\tvar previousQuantity = previouslyOrderedTickets.ticketIds.length;\n\n\t\tfor (var i = previousQuantity - quantity; i < previousQuantity; i++) {\n\t\t\tticketIdsToRemove.push(previouslyOrderedTickets.ticketIds[i]);\n\t\t}\n\t};\n\n\tfor (var _ticketTypeId3 in removedTickets) {\n\t\tvar _ret = _loop(_ticketTypeId3);\n\n\t\tif (_ret === 'continue') continue;\n\t}\n\n\tif (ticketsToAdd.length === 0 && ticketIdsToRemove.length === 0) {\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t\treturn;\n\t}\n\n\t// (3) send the needed requests\n\tvar _ticketing3 = ticketing,\n\t    exhibitorId = _ticketing3.exhibitorId,\n\t    screeningMxId = _ticketing3.screeningMxId,\n\t    seatingSupported = _ticketing3.seatingSupported;\n\n\tvar orderId = ticketing.order.orderId;\n\n\tticketing = ticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_UPDATE_ORDER);\n\n\tvar needSeating = seatingSupported && getTicketWithSeatCount(ticketing) > 0;\n\n\tmxApi.updateTickets(exhibitorId, screeningMxId, orderId, seatingSupported, ticketsToAdd, ticketIdsToRemove, authToken).then(function (updatedOrder) {\n\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tvar seatingMap = updatedOrder.seatingMap,\n\t\t    selectedSeats = updatedOrder.selectedSeats,\n\t\t    groupedTickets = updatedOrder.groupedTickets,\n\t\t    expiration = updatedOrder.expiration;\n\n\t\t// (4) update the order with the selectedSeats and the new tickets\n\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\tticketing = ticketing.set('apiLoading', false);\n\n\t\tticketing = refreshTimeout(expiration, ticketing);\n\n\t\tticketing.order.set({\n\t\t\tprice: updatedOrder.price,\n\t\t\tbookingFee: updatedOrder.bookingFee,\n\t\t\tgroupedTickets: updatedOrder.groupedTickets,\n\t\t\tselectedSeats: updatedOrder.selectedSeats,\n\t\t\ttickets: nextTickets\n\t\t});\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\n\t\tif (ticketing.seatingSupported) {\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tvar pickedSeats = (0, _ticketingPublic.getPickedSeats)(seatingMap);\n\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating: seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats: (0, _ticketingPublic.getSeats)(selectedSeats, groupedTickets, ticketing.ticketTypes)\n\t\t\t});\n\t\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t\t}\n\n\t\t// (5) display the next section\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Return the number of ticket selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of ticket purchased by the user\n */\nvar getTicketCount = function getTicketCount(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar ticketCount = 0;\n\tfor (var ticketType in tickets) {\n\t\tticketCount += tickets[ticketType].quantity;\n\t}\n\n\treturn ticketCount;\n};\n\n/**\n * Return the number of seat selectable by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the numbe of seat selectable by the user\n */\nvar getTicketWithSeatCount = function getTicketWithSeatCount(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar seatCount = 0;\n\tfor (var ticketType in tickets) {\n\t\tif (tickets[ticketType].isAllocatedSeating) {\n\t\t\tseatCount += tickets[ticketType].quantity;\n\t\t}\n\t}\n\n\treturn seatCount;\n};\n\n/**\n * Go to the next step once the order is ready.\n * If the \"SELECT_TICKETS\" pane is displayed, this function will redirect:\n * <ul>\n *   <li>to the \"SEATING\" pane if the screening supports seating</li>\n *   <li>to the \"REVIEW\" pane otherwise</li>\n * </ul>\n *\n * @param {Object=} ticketing - the ticketing state\n */\nfunction goToNextSectionAfterOrderCreated(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tif (ticketing.state === SELECT_TICKETS) {\n\t\t_store2['default'].emit(ticketing.seatingSupported && getTicketWithSeatCount(ticketing) > 0 ? actions.GO_TICKETING_SEATING : actions.GO_TICKETING_REVIEW);\n\t}\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Seating\n\n/**\n * Return the normalized position of the given seat for building heatmaps.\n * The point (0.0, 0.0) is the top-left corner.\n *\n * @param {!Seat} seat - the input seat\n * @param {!SeatLayout} seatLayout - the seat layout including the seat\n * @param {SeatBoundingBox=} boundingBox - optional bounding box to use to get the normalized position\n * @return {{x: number, y: number}} the seat position, normalized between 0.0 and 1.0, or null in case of error\n */\nvar getSeatPositionNormalized = exports.getSeatPositionNormalized = function getSeatPositionNormalized(seat, seatLayout, boundingBox) {\n\tvar position = seat.position;\n\tvar areas = seatLayout.areas;\n\n\tif (!position || !areas) return null;\n\n\tvar areaNumber = position.areaNumber,\n\t    columnIndex = position.columnIndex,\n\t    rowIndex = position.rowIndex;\n\n\n\tvar area = areas.find(function (_ref4) {\n\t\tvar number = _ref4.number;\n\t\treturn number === areaNumber;\n\t});\n\tif (!area) return null;\n\n\tvar x = area.left + (columnIndex + 0.5) / area.columnCount * area.width;\n\tvar y = area.top + (rowIndex + 0.5) / area.rowCount * area.height;\n\n\t// Get bounding box parameters\n\tvar left = boundingBox ? boundingBox.left : seatLayout.boundaryLeft;\n\tvar right = boundingBox ? boundingBox.right : seatLayout.boundaryRight;\n\tvar top = boundingBox ? boundingBox.top : seatLayout.boundaryTop;\n\tvar bottom = boundingBox ? boundingBox.bottom : 100.0;\n\tvar width = right - left;\n\tvar height = bottom - top;\n\n\t// Normalize the position using the bounding box\n\tx = (x - left) / width;\n\ty = (y - top) / height;\n\n\t// MX seating map is rotated 180 deg, let's put the screen on the top\n\tx = 1.0 - x;\n\ty = 1.0 - y;\n\n\treturn { x: x, y: y };\n};\n\n/**\n * Return the theater's occupancy based on the given seat layout.\n * The occupancy does not include the user's seats.\n *\n * @param {!SeatLayout} seatLayout - the seating layout, as sent by MX\n * @return {!number} the theater's occupancy, in [0.0, 1.0[, at the time of the booking\n */\nvar getTheaterOccupancy = exports.getTheaterOccupancy = function getTheaterOccupancy(seatLayout) {\n\tvar seatCount = 0;\n\tvar soldSeatCount = 0;\n\n\tseatLayout.areas.forEach(function (area) {\n\t\treturn area.rows.forEach(function (row) {\n\t\t\treturn row.seats.forEach(function (seat) {\n\t\t\t\tif (seat.status === _ticketingPublic.seatStatus.SOLD) {\n\t\t\t\t\tsoldSeatCount++;\n\t\t\t\t}\n\t\t\t\tseatCount++;\n\t\t\t});\n\t\t});\n\t});\n\n\tif (seatCount === 0) return 1.0;\n\treturn soldSeatCount / seatCount;\n};\n\n/**\n * Display the \"SEATING\" pane.\n * This function will call \"CREATE_OR_UPDATE_ORDER\" if there's currently no order.\n */\nfunction goToTicketingSeating() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\t(0, _tracking.track)({ a: 'ticketing-go-seating' });\n\n\tticketing = ticketing.set({ state: SELECT_SEATS });\n\n\tif (!ticketing.order) {\n\t\t_store2['default'].emit(actions.CREATE_OR_UPDATE_ORDER);\n\t}\n}\n\n/**\n * Make a request to reload the seat layout.\n * Calling this function will erase the currently picked seats.\n */\nfunction flushSeatLayout() {\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\tif (!ticketing.order) return;\n\n\tvar _ticketing4 = ticketing,\n\t    exhibitorId = _ticketing4.exhibitorId,\n\t    screeningMxId = _ticketing4.screeningMxId,\n\t    order = _ticketing4.order;\n\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_FLUSH_LAYOUT);\n\n\tmxApi.getSeatingMap(exhibitorId, screeningMxId, order.orderId, authToken).then(function (result) {\n\t\ttimeTracker.end(LOADING_TIME_FLUSH_LAYOUT);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tvar seatingMap = result.seatingMap;\n\n\n\t\tprepareSeatingMap(seatingMap);\n\n\t\tvar pickedSeats = (0, _ticketingPublic.getPickedSeats)(seatingMap);\n\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\tseating: seatingMap,\n\t\t\tpickedSeats: pickedSeats,\n\t\t\tapiLoading: false\n\t\t});\n\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_FLUSH_LAYOUT);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Pick seats from the seating map or unpick them if one of them is already picked.\n *\n * @param {Object} data - data received by the \"PICK_OR_UNPICK_SEATS\" event\n * @property {Array.<Seat>|Seat} data.seats - array of seats to pick or unpick from the seating map\n * @return {boolean} true if the action succeed, false otherwise\n */\nfunction pickOrUnpickSeats(data) {\n\tvar seats = data.seats;\n\n\tif (!seats) return;\n\tif (!Array.isArray(seats)) {\n\t\tseats = [seats];\n\t}\n\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar pickedSeats = ticketing.pickedSeats;\n\n\tvar alreadyPickedSeat = seats.find(function (seat) {\n\t\treturn pickedSeats.find(function (pickedSeat) {\n\t\t\treturn (0, _ticketingPublic.areSeatsEqual)(pickedSeat.seat, seat);\n\t\t});\n\t});\n\n\tif (alreadyPickedSeat) {\n\t\treturn unpickSeats(seats);\n\t}\n\treturn pickSeats(seats);\n}\n\n/**\n * Pick seats from the seating map.\n * This function automatically chooses which seat to move when the user does not have any more\n * ticket available.\n * If the number of seats to pick exceed the number of ticket available for the specific area,\n * an error is displayed to the user.\n *\n * @param {Array.<Seat>} seats - an array of seats to pick from the seating map\n * @return {boolean} true if the action succeed, false otherwise\n */\nfunction pickSeats(seats) {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\t// First, check that the action is valid, then pick the seat\n\t// so we don't have to reverse the operation in case of failure\n\tvar _ticketing$seating = ticketing.seating,\n\t    areas = _ticketing$seating.areas,\n\t    areaCategories = _ticketing$seating.areaCategories;\n\n\n\tvar availablePerArea = {};\n\tareaCategories.forEach(function (areaCategory) {\n\t\tavailablePerArea[areaCategory.areaCategoryCode] = areaCategory.seatsToAllocate;\n\t});\n\n\tvar pickedPerArea = {};\n\tseats.forEach(function (seat) {\n\t\tvar areaCategoryCode = seat.areaCategoryCode;\n\n\n\t\tif (pickedPerArea[areaCategoryCode]) {\n\t\t\tpickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\tpickedPerArea[areaCategoryCode] = 1;\n\t\t}\n\t});\n\n\tvar _loop2 = function _loop2(areaCategoryCode) {\n\t\tvar areaCategory = areaCategories.find(function (area) {\n\t\t\treturn area.areaCategoryCode === areaCategoryCode;\n\t\t});\n\n\t\tvar availCount = areaCategory ? areaCategory.seatsToAllocate : 0;\n\t\tvar pickedCount = pickedPerArea[areaCategoryCode];\n\n\t\tif (pickedCount > availCount) {\n\t\t\tvar errorMessage = void 0;\n\n\t\t\tif (areas.length > 1) {\n\t\t\t\tvar area = areas.find(function (area) {\n\t\t\t\t\treturn area.areaCategoryCode === areaCategoryCode;\n\t\t\t\t});\n\t\t\t\tvar areaName = area && area.description || areaCategoryCode;\n\n\t\t\t\tif (availCount > 0) {\n\t\t\t\t\terrorMessage = (0, _copy.getCopy)('ONLY_N_TICKETS_AVAIL_AREA', {\n\t\t\t\t\t\tNUM_AVAIL: availCount,\n\t\t\t\t\t\tAREA_NAME: areaName\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = (0, _copy.getCopy)('NO_TICKET_AVAIL_AREA', { AREA_NAME: areaName });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (availCount > 0) {\n\t\t\t\t\terrorMessage = (0, _copy.getCopy)('ONLY_N_TICKETS_AVAIL', { NUM_AVAIL: availCount });\n\t\t\t\t} else {\n\t\t\t\t\t// This message should never appear in theory\n\t\t\t\t\terrorMessage = (0, _copy.getCopy)('NO_TICKET_AVAIL');\n\t\t\t\t}\n\t\t\t}\n\t\t\tticketing.set('apiMessage', errorMessage);\n\n\t\t\treturn {\n\t\t\t\tv: false\n\t\t\t};\n\t\t}\n\t};\n\n\tfor (var areaCategoryCode in pickedPerArea) {\n\t\tvar _ret2 = _loop2(areaCategoryCode);\n\n\t\tif ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n\t}\n\n\t// Now we can safely pick the seats\n\tvar pickedSeats = ticketing.pickedSeats.toJS(); // we are gonna modify this one\n\n\tvar alreadyPickedPerArea = {};\n\tpickedSeats.forEach(function (pickedSeat) {\n\t\tvar areaCategoryCode = pickedSeat.seat.areaCategoryCode;\n\t\tif (alreadyPickedPerArea[areaCategoryCode]) {\n\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\talreadyPickedPerArea[areaCategoryCode] = 1;\n\t\t}\n\t});\n\n\t// Sometimes companion seats are not paired with wheelchair space\n\t// If such a seat is picked, we need to send a disclaimer to the user.\n\t// Since this disclaimer doesn't prevent the user action, the message is sent at the very end.\n\tvar loneCompanionSeats = [];\n\n\tvar _loop3 = function _loop3(i) {\n\t\tvar seat = seats[i];\n\n\t\tvar isCompanion = (0, _ticketingPublic.isCompanionSeat)(seat);\n\t\tvar wheelchairSeat = null;\n\n\t\t// If the user picks a companion seat, the corresponding wheelchair should be picked as well\n\t\tif (isCompanion) {\n\t\t\twheelchairSeat = (0, _ticketingPublic.findWheelchairInGroup)(ticketing.seating, seat.seatsInGroup);\n\t\t\tif (wheelchairSeat) {\n\t\t\t\t// Seek the wheelchair among the already picked seats and the newly picked seats\n\t\t\t\tvar pickedWheelchair = pickedSeats.find(function (pickedSeat) {\n\t\t\t\t\treturn (0, _ticketingPublic.areSeatsEqual)(pickedSeat.seat, wheelchairSeat);\n\t\t\t\t});\n\n\t\t\t\tif (!pickedWheelchair) {\n\t\t\t\t\tpickedWheelchair = seats.find(function (seat) {\n\t\t\t\t\t\t(0, _ticketingPublic.areSeatsEqual)(seat, wheelchairSeat);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!pickedWheelchair) {\n\t\t\t\t\t\tvar companionLabel = seat.rowLabel + seat.seatLabel;\n\t\t\t\t\t\tvar wheelchairLabel = wheelchairSeat.rowLabel + wheelchairSeat.seatLabel;\n\n\t\t\t\t\t\tticketing.set('apiMessage', (0, _copy.getCopy)('PICK_THE_WHEELCHAIR', {\n\t\t\t\t\t\t\tCOMP_LABEL: companionLabel,\n\t\t\t\t\t\t\tWLCHR_LABEL: wheelchairLabel\n\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tv: false\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar _companionLabel = seat.rowLabel + seat.seatLabel;\n\t\t\t\tloneCompanionSeats.push(_companionLabel);\n\t\t\t\tconsole.warn('updateTicketing.js: pickSeats(): No wheelchair found in the group of the ' + ('companion seat ' + _companionLabel + ':'), seat.seatsInGroup);\n\t\t\t}\n\t\t}\n\n\t\tvar areaCategoryCode = seat.areaCategoryCode;\n\n\t\t// We need to know whether there are unpicked seats\n\t\t// otherwise we will start moving seats that were picked already\n\n\t\tvar availableCount = availablePerArea[areaCategoryCode] || 0;\n\t\tvar alreadyPickedCount = alreadyPickedPerArea[areaCategoryCode] || 0;\n\t\tvar unpickedCount = availableCount - alreadyPickedCount;\n\n\t\tif (unpickedCount > 0) {\n\t\t\tpickedSeats.push({\n\t\t\t\tseat: seat,\n\t\t\t\tlastAction: Date.now()\n\t\t\t});\n\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\t// Pick the oldest seat among the picked one:\n\t\t\tvar seatToMove = null;\n\t\t\tvar oldestAction = Number.MAX_SAFE_INTEGER;\n\n\t\t\tpickedSeats.forEach(function (pickedSeat) {\n\t\t\t\tif (pickedSeat.seat.areaCategoryCode === areaCategoryCode && pickedSeat.lastAction < oldestAction) {\n\t\t\t\t\tseatToMove = pickedSeat;\n\t\t\t\t\toldestAction = pickedSeat.lastAction;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (isCompanion && wheelchairSeat) {\n\t\t\t\tif ((0, _ticketingPublic.areSeatsEqual)(seatToMove.seat, wheelchairSeat)) {\n\t\t\t\t\t// Trying to move a wheelchair to one of the companion seats in its group\n\t\t\t\t\tticketing.set('apiMessage', (0, _copy.getCopy)('NOT_ENOUGH_TICKET_FOR_COMPANION'));\n\t\t\t\t\treturn {\n\t\t\t\t\t\tv: false\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seatToMove.seat.seatsInGroup.length > 0) {\n\t\t\t\tseatToMove.seat.seatsInGroup.forEach(function (seatPosition) {\n\t\t\t\t\tvar indexToRemove = pickedSeats.findIndex(function (pickedSeat) {\n\t\t\t\t\t\treturn (0, _ticketingPublic.areSeatPositionsEqual)(pickedSeat.seat.position, seatPosition);\n\t\t\t\t\t});\n\t\t\t\t\tif (indexToRemove > -1) {\n\t\t\t\t\t\tpickedSeats.splice(indexToRemove, 1);\n\t\t\t\t\t}\n\t\t\t\t\talreadyPickedPerArea[areaCategoryCode] -= 1;\n\t\t\t\t});\n\n\t\t\t\tpickedSeats.push({\n\t\t\t\t\tseat: seat,\n\t\t\t\t\tlastAction: Date.now()\n\t\t\t\t});\n\t\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t\t} else {\n\t\t\t\tseatToMove.seat = seat;\n\t\t\t\tseatToMove.lastAction = Date.now();\n\t\t\t}\n\t\t}\n\t};\n\n\tfor (var i = 0; i < seats.length; i++) {\n\t\tvar _ret3 = _loop3(i);\n\n\t\tif ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === \"object\") return _ret3.v;\n\t}\n\n\t// If some lone companion seats are picked, show a disclaimer\n\tif (loneCompanionSeats.length > 0) {\n\t\tvar copy = loneCompanionSeats.length > 1 ? 'SEATS_ARE_COMPANION' : 'SEAT_IS_COMPANION';\n\t\tticketing = ticketing.set('apiMessage', (0, _copy.getCopy)(copy, {\n\t\t\tLABEL: loneCompanionSeats.join(', ')\n\t\t}));\n\t}\n\n\tticketing.set('pickedSeats', pickedSeats);\n\n\treturn true;\n}\n\n/**\n * Unpick seats from the seating map.\n *\n * @param {Array.<Seat>} seats - an array of seats to unpick\n * @return {boolean} true if at least one seat was unpicked, false otherwise\n */\nfunction unpickSeats(seats) {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar pickedSeats = ticketing.pickedSeats.toJS();\n\n\tvar modified = false;\n\tseats.forEach(function (seat) {\n\t\t// If a wheelchair is unpicked, unpick all its companion seats too\n\t\tif ((0, _ticketingPublic.isWheelchair)(seat) && seat.seatsInGroup.length > 0) {\n\t\t\tseat.seatsInGroup.forEach(function (seatPos) {\n\t\t\t\tvar index = pickedSeats.findIndex(function (pickedSeat) {\n\t\t\t\t\treturn (0, _ticketingPublic.areSeatPositionsEqual)(pickedSeat.seat.position, seatPos);\n\t\t\t\t});\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tpickedSeats.splice(index, 1);\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvar index = pickedSeats.findIndex(function (pickedSeat) {\n\t\t\t\treturn (0, _ticketingPublic.areSeatsEqual)(pickedSeat.seat, seat);\n\t\t\t});\n\t\t\tif (index > -1) {\n\t\t\t\tpickedSeats.splice(index, 1);\n\t\t\t\tmodified = true;\n\t\t\t}\n\t\t}\n\t});\n\n\tif (modified) {\n\t\tticketing.set('pickedSeats', pickedSeats);\n\t}\n\n\treturn modified;\n}\n\n/**\n * Return whether seats should be updated on the server.\n *\n * @return {boolean} true if seats should be update, false otherwise\n */\nfunction shouldUpdateSeats() {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tif (!ticketing.hasOwnProperty('order')) return false;\n\tif (!ticketing.hasOwnProperty('pickedSeats')) return false;\n\tif (!ticketing.order.hasOwnProperty('pickedSeats')) return true;\n\n\tvar pickedSeats = ticketing.pickedSeats;\n\tvar cachedPickedSeats = ticketing.order.pickedSeats;\n\n\tif (pickedSeats.length !== getTicketWithSeatCount(ticketing)) return true;\n\tif (pickedSeats.length === 0) return true;\n\n\t// return true when no matching seat is found\n\treturn !!pickedSeats.find(function (pickedSeat) {\n\t\treturn !cachedPickedSeats.find(function (cachedSeat) {\n\t\t\treturn (0, _ticketingPublic.areSeatPositionsEqual)(pickedSeat.seat.position, cachedSeat.seat.position);\n\t\t});\n\t});\n}\n\n/**\n * Return the number of seats to pick before updating the order.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of seats not picked yet, or null if no order is created\n */\nvar getNumberOfSeatToPick = function getNumberOfSeatToPick(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar availableSeats = getTicketWithSeatCount(ticketing);\n\tvar alreadyPickedSeat = ticketing.pickedSeats.length;\n\n\treturn availableSeats - alreadyPickedSeat;\n};\n\n/**\n * Return an array of seat slots.\n * Each slot contains a seats picked on the map or null if the slot is empty.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {Array.<Seat>} - an array of seat slots\n */\nvar getSeatSlots = exports.getSeatSlots = function getSeatSlots(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar seatSlots = [];\n\n\tif (!ticketing.hasOwnProperty('pickedSeats')) return seatSlots;\n\tif (!ticketing.hasOwnProperty('tickets')) return seatSlots;\n\n\tvar pickedSeats = ticketing.pickedSeats;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar availableSeats = 0;\n\tfor (var ticketId in tickets) {\n\t\tif (tickets[ticketId].isAllocatedSeating) {\n\t\t\tavailableSeats += tickets[ticketId].quantity;\n\t\t}\n\t}\n\n\tseatSlots.length = availableSeats;\n\tseatSlots.fill(null);\n\n\tfor (var i = 0; i < pickedSeats.length; i++) {\n\t\tseatSlots[i] = pickedSeats[i].seat;\n\t}\n\n\treturn seatSlots;\n};\n\n/**\n * Return whether a seat is available.\n *\n * @param {Seat} seat - the seat to test\n * @param {Array.<PickedSeat>} pickedSeats - the array of currently picked seats\n * @return {boolean} true if the seat is avaiable, false otherwise\n */\nvar isSeatAvailable = function isSeatAvailable(seat, pickedSeats) {\n\tif (seat.status === _ticketingPublic.seatStatus.SOLD) return false;\n\tfor (var i = 0; i < pickedSeats.length; i++) {\n\t\tif ((0, _ticketingPublic.areSeatsEqual)(pickedSeats[i].seat, seat)) return false;\n\t}\n\treturn true;\n};\n\n/**\n * Return the row of a specific seat in the seating map.\n *\n * @function\n * @param {SeatLayout} seatingLayout - the seating layout containing the row to get\n * @param {Seat} seat - the seat in the row to get\n * @return {Row} the row having the given seat, null if not found\n */\nvar getRowForSeat = function getRowForSeat(seatLayout, seat) {\n\tvar position = seat.position;\n\n\n\tvar area = seatLayout.areas.find(function (_ref5) {\n\t\tvar number = _ref5.number;\n\t\treturn number === position.areaNumber;\n\t});\n\tif (!area) return null;\n\n\tvar rows = area.rows;\n\n\tvar row = rows[position.rowIndex];\n\tif (row && row.rowLabel === seat.rowLabel) return row;\n\n\treturn rows.find(function (_ref6) {\n\t\tvar rowLabel = _ref6.rowLabel;\n\t\treturn rowLabel === seat.rowLabel;\n\t}) || null;\n};\n\n/**\n * Return whether the orphan seat policy is respected.\n * Display a message if it's not.\n *\n * @param {SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {Array.<PickedSeat>} pickedSeats - an array of seats picked from the map\n * @return {boolean} true if the orphan seat policy is respected, false otherwise\n */\nvar checkOrphanSeatPolicy = function checkOrphanSeatPolicy(seatLayout, pickedSeats) {\n\tvar orphanSeats = [];\n\n\tvar _loop4 = function _loop4(_ref7) {\n\t\tvar seat = _ref7.seat;\n\n\t\tif (seat.seatsInGroup.length > 1 || (0, _ticketingPublic.isSeatForDisablePeople)(seat)) return 'continue';\n\t\t// NOTE: ^^^ No need to check orphan seats with sofas or wheelchairs\n\t\t//           We're explicitly checking for wheelchair and companion seats because we found\n\t\t//           some cases where those seats are not wrapped in groups (19-04-18, Envision)\n\n\t\tvar position = seat.position;\n\n\n\t\tvar row = getRowForSeat(seatLayout, seat);\n\t\tif (!row) {\n\t\t\tconsole.error('Orphan seats: Row ' + seat.rowLabel + ' not found in map:', seatLayout);\n\t\t\treturn {\n\t\t\t\tv: false\n\t\t\t};\n\t\t}\n\n\t\tvar seats = row.seats;\n\t\tvar columnIndex = position.columnIndex;\n\n\t\t// Check the left-hand side\n\n\t\tvar leftSeat = seats.find(function (seat) {\n\t\t\treturn seat.position.columnIndex === columnIndex - 1;\n\t\t});\n\t\tif (leftSeat && isSeatAvailable(leftSeat, pickedSeats)) {\n\t\t\tvar leftLeftSeat = seats.find(function (seat) {\n\t\t\t\treturn seat.position.columnIndex === columnIndex - 2;\n\t\t\t});\n\t\t\tif (!leftLeftSeat || !isSeatAvailable(leftLeftSeat, pickedSeats)) {\n\t\t\t\tvar orphanSeatLabel = leftSeat.rowLabel + leftSeat.seatLabel;\n\t\t\t\tif (orphanSeats.indexOf(orphanSeatLabel) === -1) orphanSeats.push(orphanSeatLabel);\n\t\t\t}\n\t\t}\n\n\t\t// Check the right-hand side\n\t\tvar rightSeat = seats.find(function (seat) {\n\t\t\treturn seat.position.columnIndex === columnIndex + 1;\n\t\t});\n\t\tif (rightSeat && isSeatAvailable(rightSeat, pickedSeats)) {\n\t\t\tvar rightRightSeat = seats.find(function (seat) {\n\t\t\t\treturn seat.position.columnIndex === columnIndex + 2;\n\t\t\t});\n\t\t\tif (!rightRightSeat || !isSeatAvailable(rightRightSeat, pickedSeats)) {\n\t\t\t\tvar _orphanSeatLabel = rightSeat.rowLabel + rightSeat.seatLabel;\n\t\t\t\tif (orphanSeats.indexOf(_orphanSeatLabel) === -1) orphanSeats.push(_orphanSeatLabel);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _iteratorNormalCompletion2 = true;\n\tvar _didIteratorError2 = false;\n\tvar _iteratorError2 = undefined;\n\n\ttry {\n\t\tfor (var _iterator2 = pickedSeats[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t\t\tvar _ref7 = _step2.value;\n\n\t\t\tvar _ret4 = _loop4(_ref7);\n\n\t\t\tswitch (_ret4) {\n\t\t\t\tcase 'continue':\n\t\t\t\t\tcontinue;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif ((typeof _ret4 === 'undefined' ? 'undefined' : _typeof(_ret4)) === \"object\") return _ret4.v;\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\t_didIteratorError2 = true;\n\t\t_iteratorError2 = err;\n\t} finally {\n\t\ttry {\n\t\t\tif (!_iteratorNormalCompletion2 && _iterator2['return']) {\n\t\t\t\t_iterator2['return']();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (_didIteratorError2) {\n\t\t\t\tthrow _iteratorError2;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (orphanSeats.length > 0) {\n\t\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\t\tticketing.set('apiMessage', (0, _copy.getCopy)('CANNOT_LEAVE_ORPHAN_SEATS', {\n\t\t\tORPHAN_SEATS: orphanSeats.join(', ')\n\t\t}));\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n\n/**\n * Send the currently picked seats to the server.\n * This function will bring the user to the review pane, if no error occured.\n */\nfunction updateTicketingSeats() {\n\t// Check that order has changed\n\tif (!shouldUpdateSeats()) {\n\t\tgoToTicketingReview();\n\t\treturn;\n\t}\n\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\tvar pickedSeats = ticketing.pickedSeats.toJS();\n\n\t// Check that they are no remaining seat\n\tvar numberOfSeatsToPick = getNumberOfSeatToPick(ticketing);\n\tif (numberOfSeatsToPick > 0) {\n\t\tticketing.set('apiMessage', (0, _copy.getCopy)('STILL_N_SEATS_TO_PICK', {\n\t\t\tNUM_SEAT: numberOfSeatsToPick\n\t\t}));\n\t\treturn;\n\t}\n\n\t// Check the orphan seat policy if needed\n\tvar orphanSeatPolicyEnabled = true;\n\t// TODO: ^^^ Starlight-specific policy, please move this somewhere\n\tif (orphanSeatPolicyEnabled && pickedSeats.length === getTicketWithSeatCount(ticketing)) {\n\t\t//                           ^^^ Not sure about the purpose of this condition?\n\t\tif (!checkOrphanSeatPolicy(ticketing.seating, pickedSeats)) return;\n\t}\n\n\t// Tracking of seat movements\n\tvar seatsBefore = ticketing.order.pickedSeats.map(function (_ref8) {\n\t\tvar seat = _ref8.seat;\n\t\treturn seat.rowLabel + seat.seatLabel;\n\t});\n\tvar seatsAfter = ticketing.pickedSeats.map(function (_ref9) {\n\t\tvar seat = _ref9.seat;\n\t\treturn seat.rowLabel + seat.seatLabel;\n\t});\n\tvar seatMovement = seatsBefore + '=>' + seatsAfter;\n\n\t(0, _tracking.track)({\n\t\ta: 'ticketing-seat-move',\n\t\tl: seatMovement\n\t});\n\n\tvar _ticketing5 = ticketing,\n\t    exhibitorId = _ticketing5.exhibitorId,\n\t    screeningMxId = _ticketing5.screeningMxId,\n\t    order = _ticketing5.order;\n\n\t// Create the new array of seats\n\n\tvar seats = pickedSeats.map(function (_ref10) {\n\t\tvar seat = _ref10.seat;\n\t\treturn {\n\t\t\tareaCategoryCode: seat.areaCategoryCode,\n\t\t\tareaNumber: seat.position.areaNumber,\n\t\t\tcolumnId: seat.position.columnIndex,\n\t\t\trowId: seat.position.rowIndex\n\t\t};\n\t});\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_UPDATE_SEATS);\n\n\tmxApi.updateSeats(exhibitorId, screeningMxId, order.orderId, seats, authToken).then(function (order) {\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tmxApi.getSeatingMap(exhibitorId, screeningMxId, order.orderId, authToken).then(function (result) {\n\t\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tvar seatingMap = result.seatingMap;\n\t\t\tvar selectedSeats = order.selectedSeats,\n\t\t\t    groupedTickets = order.groupedTickets,\n\t\t\t    price = order.price,\n\t\t\t    bookingFee = order.bookingFee;\n\n\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tvar pickedSeats = (0, _ticketingPublic.getPickedSeats)(seatingMap);\n\n\t\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating: seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats: (0, _ticketingPublic.getSeats)(selectedSeats, groupedTickets, ticketing.ticketTypes),\n\t\t\t\tapiLoading: false\n\t\t\t});\n\t\t\tticketing.order.set({\n\t\t\t\tprice: price,\n\t\t\t\tbookingFee: bookingFee,\n\t\t\t\tgroupedTickets: groupedTickets,\n\t\t\t\tselectedSeats: selectedSeats,\n\t\t\t\tpickedSeats: pickedSeats\n\t\t\t});\n\n\t\t\tgoToTicketingReview();\n\t\t}, function (response) {\n\t\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tonHttpError(response);\n\t\t});\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t// Handle MX Error 41001: Somebody has taken some of those seats before the user\n\t\tif ((0, _ticketingPublic.isMxErrorObject)(response)) {\n\t\t\tvar errorCode = response.data.error.errorCode;\n\n\t\t\tif (errorCode === _ticketingPublic.mxErrors.SEATS_UNAVAILABLE) {\n\t\t\t\t(0, _tracking.track)({ a: 'ticketing-seats-race' });\n\t\t\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\t\t\tticketing.set({\n\t\t\t\t\tapiLoading: false,\n\t\t\t\t\tapiMessage: (0, _copy.getCopy)('THOSE_SEATS_WERE_RESERVED_RECENTLY'),\n\t\t\t\t\tapiMessageCallback: function apiMessageCallback() {\n\t\t\t\t\t\treturn _store2['default'].emit(actions.FLUSH_SEAT_LAYOUT);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tonHttpError(response);\n\t});\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing review\n\n/**\n * Display the review pane.\n */\nfunction goToTicketingReview() {\n\t(0, _tracking.track)({ a: 'ticketing-go-review' });\n\t_store2['default'].get().showtimes.ticketing.set('state', REVIEW);\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Contact details\n\n/**\n * Display the contact details pane.\n * Required details may be different from one payment gateway to another.\n */\nfunction goToTicketingContactDetails() {\n\t(0, _tracking.track)({ a: 'ticketing-go-contact-details' });\n\t_store2['default'].get().showtimes.ticketing.set('state', CONTACT_DETAILS);\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Payments\n\n/**\n * Display the payment pane.\n * Note that contact details should be valid for the user to be redirected to the payment section.\n *\n * @param {Object} contactDetails - the details provided by the user to prepare the transaction\n */\nfunction goToTicketingPayment(contactDetails) {\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\t// Get contact details\n\n\tvar _ticketing6 = ticketing,\n\t    exhibitorId = _ticketing6.exhibitorId,\n\t    theaterMxId = _ticketing6.theaterMxId;\n\tvar orderId = ticketing.order.orderId;\n\n\tvar paymentArgs = {};\n\tvar name = contactDetails.name,\n\t    email = contactDetails.email,\n\t    address = contactDetails.address,\n\t    zip = contactDetails.zip,\n\t    city = contactDetails.city;\n\n\tvar iframeCommunicatorUrl = (0, _ticketingPublic.getIframeCommunicatorUrl)();\n\n\tvar loyaltyNumber = contactDetails.loyaltyNumber;\n\n\tif (!ticketing.loyaltyEnabled) loyaltyNumber = undefined;\n\n\tswitch (ticketing.paymentGateway) {\n\t\tcase _ticketingPublic.gateways.AUTHNET:\n\t\t\tpaymentArgs.iFramecommunicationsChannel = iframeCommunicatorUrl;\n\t\t\tpaymentArgs.returnUrl = 'https://httpbin.org/get';\n\t\t\t// NOTE: 'about:blank' is giving errors here ^^^\n\t\t\tpaymentArgs.cancelUrl = window.location.href.replace(/&/g, '%26');\n\t\t\t// NOTE: could there be issues with double tracking because we load in  the same page twice\n\t\t\t// Maybe it should redirect to the iframeCommunicator instead\n\t\t\tbreak;\n\n\t\tcase _ticketingPublic.gateways.VANTIV:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl;\n\t\t\tbreak;\n\n\t\tcase _ticketingPublic.gateways.PXPAY:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?succeed';\n\t\t\tpaymentArgs.cancelUrl = iframeCommunicatorUrl + '?cancelled';\n\t\t\tbreak;\n\n\t\tcase _ticketingPublic.gateways.VERIFONE2:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?readytocheck';\n\t\t\tbreak;\n\n\t\tcase _ticketingPublic.gateways.BRAINTREE:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?braintree';\n\t\t\tbreak;\n\t}\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_START_TRANSACTION);\n\n\tmxApi.startTransaction(exhibitorId, theaterMxId, orderId, paymentArgs, name, email, address, zip, city, loyaltyNumber, authToken).then(function (paymentData) {\n\t\ttimeTracker.end(LOADING_TIME_START_TRANSACTION);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t(0, _tracking.track)({ a: 'ticketing-go-payment' });\n\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\tapiLoading: false,\n\t\t\tstate: PAYMENT,\n\t\t\tpaymentData: paymentData,\n\t\t\tusedLoyalty: ticketing.loyaltyEnabled && loyaltyNumber !== undefined\n\t\t});\n\t\tticketing = ticketing.remove('iframeSize');\n\n\t\t// NOTE: This is a trick to track Authorize.net response time\n\t\ttimeTracker.start(LOADING_TIME_PAYMENTS);\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_START_TRANSACTION);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tif ((0, _ticketingPublic.isMxErrorObject)(response)) {\n\t\t\tvar errorCode = response.data.error.errorCode;\n\n\n\t\t\tif (errorCode === _ticketingPublic.mxErrors.CANT_CONNECT_TO_LOYALTY || errorCode === _ticketingPublic.mxErrors.LOYALTY_NOT_ALLOWED_FOR_CINEMA_CHAIN || errorCode === _ticketingPublic.mxErrors.INSUFFICIENT_LOYALTY_MEMBER_DETAILS || errorCode === _ticketingPublic.mxErrors.LOYALTY_MEMBER_NOT_FOUND) {\n\t\t\t\t(0, _tracking.track)({\n\t\t\t\t\ta: 'ticketing-error-from-mx',\n\t\t\t\t\tl: errorCode\n\t\t\t\t});\n\t\t\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\t\t\t\tticketing.set({\n\t\t\t\t\tapiLoading: false,\n\t\t\t\t\tapiMessage: (0, _copy.getCopy)('MX_' + (0, _ticketingPublic.getMxErrorKey)(errorCode))\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Return the list of seats selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {string} a list of tickets by area category, separated by a comma\n */\nfunction getTicketList(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar tickets = ticketing.tickets.toJS();\n\n\tvar ticketList = [];\n\n\tfor (var ticketType in tickets) {\n\t\tticketList.push(ticketType + ':' + tickets[ticketType].quantity);\n\t}\n\n\treturn ticketList.join(';');\n}\n\n/**\n * Return the elapsed time since the ticketing session started.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {number} the elapsed time (in seconds), or null if no session is active\n */\nfunction getElapsedTime(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar elapsedTime = null;\n\n\tif (typeof ticketing.startDate === 'number') {\n\t\telapsedTime = Math.ceil((Date.now() - ticketing.startDate) * 1e-3);\n\t}\n\n\treturn elapsedTime;\n}\n\n/**\n * Track the positions of user's picked seats.\n *\n * @param {Object} ticketing - the ticketing state\n */\nvar trackSeatingHeatmap = function trackSeatingHeatmap(ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar seatLayout = ticketing.seating;\n\tvar _ticketing7 = ticketing,\n\t    pickedSeats = _ticketing7.pickedSeats;\n\n\tif (!seatLayout || !pickedSeats) return;\n\n\tvar boundingBox = (0, _ticketingPublic.getSeatLayoutBoundingBox)(seatLayout);\n\n\tpickedSeats.forEach(function (pickedSeat) {\n\t\tvar position = getSeatPositionNormalized(pickedSeat.seat, ticketing.seating, boundingBox);\n\t\tif (!position) return;\n\t\tvar x = position.x,\n\t\t    y = position.y;\n\n\t\t(0, _tracking.track)({\n\t\t\ta: 'ticketing-purchase-heatmap',\n\t\t\tl: x.toFixed(HEATMAP_FLOAT_PRECISION) + ' ' + y.toFixed(HEATMAP_FLOAT_PRECISION)\n\t\t});\n\t});\n};\n\n/**\n * Complete an order after the payment is done.\n *\n * @param {Object} paymentResponse - the response received from the payment gateway\n */\nvar completeOrderAfterPaymentSucceed = function completeOrderAfterPaymentSucceed(paymentResponse) {\n\tif (!(0, _utils.isObject)(paymentResponse)) goToError();\n\n\t(0, _tracking.track)({ a: 'ticketing-payment-succeed-start-complete-order' });\n\n\tvar store = _store2['default'].get();\n\tvar authToken = store.user.authToken;\n\tvar ticketing = store.showtimes.ticketing;\n\n\tticketing = ticketing.set({\n\t\tapiLoading: true,\n\t\ttransactionDone: true\n\t});\n\n\ttimeTracker.start(LOADING_TIME_COMPLETE_ORDER);\n\n\tvar _ticketing8 = ticketing,\n\t    exhibitorId = _ticketing8.exhibitorId,\n\t    theaterMxId = _ticketing8.theaterMxId;\n\tvar orderId = ticketing.order.orderId;\n\n\n\tmxApi.completeOrder(exhibitorId, theaterMxId, orderId, paymentResponse, authToken).then(function (_ref11) {\n\t\tvar code = _ref11.code,\n\t\t    bookingId = _ref11.bookingId;\n\n\t\ttimeTracker.end(LOADING_TIME_COMPLETE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tticketing = _store2['default'].get().showtimes.ticketing;\n\n\t\tvar paymentSucceed = code === 'approved';\n\n\t\tticketing = ticketing.set({\n\t\t\tstate: COMPLETE,\n\t\t\tapiLoading: false,\n\t\t\tpayment: { code: code, bookingId: bookingId }\n\t\t});\n\t\t// TODO: ^ the payment object needs to be cleaned as well\n\t\t//         when the session is cleared\n\n\t\t(0, _tracking.track)({ a: 'ticketing-go-complete' });\n\n\t\tif (paymentSucceed) {\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: 'ticketing-purchase-complete',\n\t\t\t\tl: ticketing.sessionId\n\t\t\t});\n\t\t\tif (ticketing.loyaltyEnabled && ticketing.usedLoyalty) {\n\t\t\t\t(0, _tracking.track)({ a: 'ticketing-purchase-with-loyalty' });\n\t\t\t}\n\t\t\tvar elapsedTime = getElapsedTime(ticketing);\n\t\t\tif (elapsedTime) {\n\t\t\t\t(0, _tracking.track)({\n\t\t\t\t\ta: 'ticketing-time-to-purchase',\n\t\t\t\t\tl: elapsedTime\n\t\t\t\t});\n\t\t\t}\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: 'ticketing-purchase-theater',\n\t\t\t\tl: ticketing.theaterId\n\t\t\t});\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: 'ticketing-purchase-gateway',\n\t\t\t\tl: ticketing.paymentGateway\n\t\t\t});\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: 'ticketing-purchase-ticket-count',\n\t\t\t\tl: getTicketCount(ticketing)\n\t\t\t});\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: 'ticketing-purchase-tickets',\n\t\t\t\tl: getTicketList(ticketing)\n\t\t\t});\n\t\t\tif (ticketing.seatingSupported) {\n\t\t\t\t(0, _tracking.track)({\n\t\t\t\t\ta: 'ticketing-purchase-occupancy',\n\t\t\t\t\tl: getTheaterOccupancy(ticketing.seating)\n\t\t\t\t});\n\t\t\t\ttrackSeatingHeatmap(ticketing);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t_store2['default'].emit(actions.TICKET_PURCHASE_COMPLETE);\n\t\t\t} catch (err) {\n\t\t\t\t// This was specific to Peter Rabbit and should be changed to something more\n\t\t\t\t// generic in the future\n\t\t\t\twindow.didAbodeTrackerFailed = true;\n\t\t\t\tconsole.error('Adobe tracking for ticket purchase failed');\n\t\t\t}\n\t\t}\n\n\t\t/* eslint-disable no-console */\n\t\tconsole.log('bookingId:', bookingId);\n\t\tconsole.log('orderId:', orderId);\n\t\t/* eslint-enable no-console */\n\n\t\tticketing = ticketing.remove('timeout');\n\t}, function (response) {\n\t\ttimeTracker.end(LOADING_TIME_COMPLETE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n};\n\n/**\n * Handle messages received from the Authorize.net iframe.\n *\n * @param {Object} data - the message data\n * @property {string} data.payload - the message sent from the iframe\n * @property {string} data.referrer - the referrer of the message\n * @param {Object=} ticketing - the ticketing state\n */\nvar handleAuthnetPaymentMessage = function handleAuthnetPaymentMessage(data, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar msgData = _qs2['default'].parse(data.payload);\n\tif (!(0, _utils.isObject)(msgData)) return;\n\n\tvar action = msgData.action;\n\tif (typeof action !== 'string') return;\n\n\tswitch (action) {\n\t\tcase AUTHNET_MSG_RESIZE_WINDOW:\n\t\t\t// Receiving ideal iframe dimensions\n\t\t\tvar width = parseInt(msgData.width);\n\t\t\tvar height = parseInt(msgData.height);\n\t\t\t// Note that this will be called every time the content\n\t\t\t// of the iframe is changing.\n\t\t\tticketing = ticketing.set('iframeSize', { width: width, height: height });\n\t\t\ttimeTracker.end(LOADING_TIME_PAYMENTS); // Authorize.Net specific?\n\t\t\tbreak;\n\t\tcase AUTHNET_MSG_CANCEL:\n\t\t\t// If the user is waiting for the transaction to be confirmed,\n\t\t\t// the user shouldn't be able to cancel the payment.\n\t\t\tif (ticketing.transactionDone) return;\n\t\t\t// TODO: Go back one step\n\t\t\t// FIXME: MX Bug? this one is never called...\n\t\t\tgoToTicketingContactDetails();\n\t\t\tbreak;\n\t\tcase AUTHNET_MSG_TRANSACTION_RESPONSE:\n\t\t\t// --- IMPORTANT ---\n\t\t\t// At this point we know the payment succeed.\n\t\t\t// BUT we MUST NOT tell the user now because the user won't get the tickets\n\t\t\t// until MX confirmed the payment. So just show the loader.\n\t\t\t// -----------------\n\t\t\ttry {\n\t\t\t\tvar response = JSON.parse(msgData.response);\n\t\t\t\tcompleteOrderAfterPaymentSucceed(response);\n\t\t\t} catch (e) {\n\t\t\t\tgoToError();\n\t\t\t\t// TODO: ^^^ Add a message?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbreak;\n\t}\n};\n\n/**\n * Handle messages received from the Vantiv iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nvar handleVantivPaymentMessage = function handleVantivPaymentMessage(data, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar msgData = _qs2['default'].parse(data.payload);\n\tif (!(0, _utils.isObject)(msgData)) return;\n\n\t// The user cancelled the transaction\n\tif (msgData.HostedPaymentStatus === 'Cancelled') {\n\t\tgoToTicketingContactDetails();\n\t\treturn;\n\t}\n\n\tif (msgData.ExpressResponseMessage === 'Approved') {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t} else {\n\t\tgoToError();\n\t\t// TODO: ^^ Improve that section\n\t}\n};\n\n/**\n * Handle messages received from the Payment Express iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nvar handlePxPayPaymentMessage = function handlePxPayPaymentMessage(data, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar msgData = _qs2['default'].parse(data.payload);\n\tif (!(0, _utils.isObject)(msgData)) return;\n\n\t// The user cancelled the transaction\n\tif (msgData.hasOwnProperty('succeed')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t} else if (msgData.hasOwnProperty('cancelled')) {\n\t\tgoToTicketingContactDetails();\n\t} else {\n\t\tgoToError();\n\t\t// TODO: ^^ Improve that section\n\t}\n};\n\n/**\n * Handle messages received from the Verifone PP2 iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nvar handleVerifone2PaymentMessage = function handleVerifone2PaymentMessage(data, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar msgData = _qs2['default'].parse(data.payload);\n\tif (!(0, _utils.isObject)(msgData)) return;\n\n\tif (msgData.hasOwnProperty('readytocheck')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t}\n};\n\n/**\n * Handle messages received from the Braintree API.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nvar handleBraintreePaymentMessage = function handleBraintreePaymentMessage(data, ticketing) {\n\tif (!ticketing) ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tvar msgData = data.payload; // already an object\n\tif (!(0, _utils.isObject)(msgData)) return;\n\n\tif (msgData.hasOwnProperty('nonce')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t}\n};\n\n/**\n * Called when a message is received from an iframe.\n *\n * NOTE: This function is probably specific to Authorize.net\n *       Some refactoring might be needed in the future.\n *\n * @param {Object} data - the message data\n * @property {*} data.payload - the message, sent from the iframe\n * @property {string} data.referrer - the referrer of the message\n */\nfunction onPaymentMessageReceived(data) {\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar paymentGateway = ticketing.paymentGateway;\n\n\n\tswitch (paymentGateway) {\n\t\tcase _ticketingPublic.gateways.AUTHNET:\n\t\t\thandleAuthnetPaymentMessage(data, ticketing);break;\n\t\tcase _ticketingPublic.gateways.VANTIV:\n\t\t\thandleVantivPaymentMessage(data, ticketing);break;\n\t\tcase _ticketingPublic.gateways.PXPAY:\n\t\t\thandlePxPayPaymentMessage(data, ticketing);break;\n\t\tcase _ticketingPublic.gateways.VERIFONE2:\n\t\t\thandleVerifone2PaymentMessage(data, ticketing);break;\n\t\tcase _ticketingPublic.gateways.BRAINTREE:\n\t\t\thandleBraintreePaymentMessage(data, ticketing);break;\n\t\tdefault:\n\t\t\tconsole.error('updateTicketing: unkown payment gateway \"' + paymentGateway + '\", ' + 'discarding payment message');\n\t}\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing timeout\n\n/**\n * Display an error with the timeout message, and cancel the order.\n * This function clears the ticketing session.\n */\nfunction goToTicketingTimeout() {\n\t(0, _tracking.track)({ a: 'ticketing-go-timeout' });\n\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\tvar message = (0, _copy.getCopy)('TICKETING_TIMEOUT_MESSAGE', {\n\t\tMIN: Math.round(ticketing.allowedTime / 60)\n\t});\n\n\tgoToError(message);\n}\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Error in ticketing\n\n/**\n * Function called when an HTTP error occurs\n *\n * @param {Object} error - the error object returned by fetch\n */\nfunction onHttpError(error) {\n\tvar copy = '$UNKNOW_ERROR';\n\n\t// TODO: Track error numbers\n\t// TODO: Branch based on error gravity (display message or error panel)\n\n\tif ((0, _ticketingPublic.isMxErrorObject)(error)) {\n\t\tvar errorCode = error.data.error.errorCode;\n\n\t\tcopy = '$MX_' + (0, _ticketingPublic.getMxErrorKey)(errorCode);\n\t\t(0, _tracking.track)({\n\t\t\ta: 'ticketing-error-from-mx',\n\t\t\tl: errorCode\n\t\t});\n\t} else if ((0, _ticketingPublic.isPowErrorObject)(error)) {\n\t\tvar code = error.data.error.code;\n\n\n\t\tif (code === _ticketingPublic.powErrors.AUTH_FAIL || code === _ticketingPublic.powErrors.AUTH_EXPIRED) {\n\t\t\t_store2['default'].emit(actions.AUTH_CLEAR);\n\t\t}\n\n\t\tcopy = '$POW_' + (0, _ticketingPublic.getPowErrorKey)(code);\n\t\t(0, _tracking.track)({\n\t\t\ta: 'ticketing-error-from-pow',\n\t\t\tl: code\n\t\t});\n\t}\n\n\tgoToError(copy);\n}\n\n/**\n * Display the \"ERROR\" pane.\n * This function clears the ticketing session.\n *\n * Should only be used in extreme cases, where you know won't be able to handle the error.\n *\n * @param {string=} message - the error message to show to the user\n */\nfunction goToError(message) {\n\t(0, _tracking.track)({ a: 'ticketing-error' });\n\n\tclearTicketingSession();\n\n\tvar ticketing = _store2['default'].get().showtimes.ticketing;\n\n\tticketing.set({\n\t\tstate: ERROR,\n\t\tmessage: message,\n\t\tprevState: ticketing.state\n\t});\n}\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (response) {\n  return response.data;\n};\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.oneTrust = undefined;\n\nvar _oneTrust2 = __webpack_require__(56);\n\nvar _oneTrust = _interopRequireWildcard(_oneTrust2);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nexports.oneTrust = _oneTrust;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports['default'] = connectToOneTrust;\n\nvar _preact = __webpack_require__(0);\n\nvar _categories = __webpack_require__(12);\n\nvar categories = _interopRequireWildcard(_categories);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction connectToOneTrust(category, C) {\n\treturn function (_Component) {\n\t\t_inherits(OneTrustComponent, _Component);\n\n\t\tfunction OneTrustComponent(props) {\n\t\t\t_classCallCheck(this, OneTrustComponent);\n\n\t\t\tvar _this = _possibleConstructorReturn(this, (OneTrustComponent.__proto__ || Object.getPrototypeOf(OneTrustComponent)).call(this, props));\n\n\t\t\t_this.onCategoriesChange = _this.onCategoriesChange.bind(_this);\n\t\t\t_this.state.categories = [].concat(_toConsumableArray(categories.get()));\n\t\t\treturn _this;\n\t\t}\n\n\t\t_createClass(OneTrustComponent, [{\n\t\t\tkey: 'componentDidMount',\n\t\t\tvalue: function componentDidMount() {\n\t\t\t\tcategories.addChangeListener(this.onCategoriesChange);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillUnmount',\n\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\tcategories.removeChangeListener(this.onCategoriesChange);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'onCategoriesChange',\n\t\t\tvalue: function onCategoriesChange(nextCategories) {\n\t\t\t\tthis.setState({\n\t\t\t\t\tcategories: [].concat(_toConsumableArray(nextCategories))\n\t\t\t\t});\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'render',\n\t\t\tvalue: function render() {\n\t\t\t\treturn (0, _preact.h)(C, _extends({}, this.props, {\n\t\t\t\t\toneTrustAllowed: categories.has(this.state.categories, category)\n\t\t\t\t}));\n\t\t\t}\n\t\t}]);\n\n\t\treturn OneTrustComponent;\n\t}(_preact.Component);\n}\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports['default'] = createPixelComponent;\n\nvar _preact = __webpack_require__(0);\n\nvar _categories = __webpack_require__(12);\n\nvar categories = _interopRequireWildcard(_categories);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction createPixelComponent() {\n\tfor (var _len = arguments.length, Components = Array(_len), _key = 0; _key < _len; _key++) {\n\t\tComponents[_key] = arguments[_key];\n\t}\n\n\t// NOTE: Should we have the class outside of this function and just return an instance instead ? Can pass Components as a prop\n\t// Not a big issue but feels weird to create a whole new class at every call of this function (in the pixels render)\n\treturn function (_Component) {\n\t\t_inherits(PixelComponent, _Component);\n\n\t\tfunction PixelComponent(props) {\n\t\t\t_classCallCheck(this, PixelComponent);\n\n\t\t\tvar _this = _possibleConstructorReturn(this, (PixelComponent.__proto__ || Object.getPrototypeOf(PixelComponent)).call(this, props));\n\n\t\t\t_this.onCategoriesChange = _this.onCategoriesChange.bind(_this);\n\t\t\t_this.state.categories = [].concat(_toConsumableArray(categories.get()));\n\t\t\treturn _this;\n\t\t}\n\n\t\t_createClass(PixelComponent, [{\n\t\t\tkey: 'componentDidMount',\n\t\t\tvalue: function componentDidMount() {\n\t\t\t\tcategories.addChangeListener(this.onCategoriesChange);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillUnmount',\n\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\tcategories.removeChangeListener(this.onCategoriesChange);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'shouldComponentUpdate',\n\t\t\tvalue: function shouldComponentUpdate(nextProps, nextState) {\n\t\t\t\treturn nextState.categories !== this.state.categories || nextProps.children !== this.props.children;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'onCategoriesChange',\n\t\t\tvalue: function onCategoriesChange(nextCategories) {\n\t\t\t\tthis.setState({\n\t\t\t\t\tcategories: [].concat(_toConsumableArray(nextCategories))\n\t\t\t\t});\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'render',\n\t\t\tvalue: function render() {\n\t\t\t\tvar _this2 = this;\n\n\t\t\t\treturn (0, _preact.h)(\n\t\t\t\t\t'div',\n\t\t\t\t\tnull,\n\t\t\t\t\tComponents.filter(function (_ref) {\n\t\t\t\t\t\tvar _ref2 = _slicedToArray(_ref, 1),\n\t\t\t\t\t\t    category = _ref2[0];\n\n\t\t\t\t\t\treturn categories.has(_this2.state.categories, category);\n\t\t\t\t\t}).map(function (_ref3) {\n\t\t\t\t\t\tvar _ref4 = _slicedToArray(_ref3, 2),\n\t\t\t\t\t\t    C = _ref4[1];\n\n\t\t\t\t\t\treturn (0, _preact.h)(C, _this2.props);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}]);\n\n\t\treturn PixelComponent;\n\t}(_preact.Component);\n}\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.displayModal = exports.cleanCategoryName = exports.ADVERTISING = exports.TARGETING = exports.FUNCTIONAL = exports.STRICTLY_NECESSARY = exports.createPixelComponent = exports.connectToOneTrust = exports.maybeHandle = exports.Pixel = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _Pixel = __webpack_require__(21);\n\nObject.defineProperty(exports, 'Pixel', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _interopRequireDefault(_Pixel)['default'];\n\t}\n});\n\nvar _maybeHandle = __webpack_require__(57);\n\nObject.defineProperty(exports, 'maybeHandle', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _maybeHandle.maybeHandle;\n\t}\n});\n\nvar _connectToOneTrust = __webpack_require__(54);\n\nObject.defineProperty(exports, 'connectToOneTrust', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _interopRequireDefault(_connectToOneTrust)['default'];\n\t}\n});\n\nvar _createPixelComponent = __webpack_require__(55);\n\nObject.defineProperty(exports, 'createPixelComponent', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _interopRequireDefault(_createPixelComponent)['default'];\n\t}\n});\n\nvar _categories = __webpack_require__(12);\n\nObject.defineProperty(exports, 'STRICTLY_NECESSARY', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _categories.STRICTLY_NECESSARY;\n\t}\n});\nObject.defineProperty(exports, 'FUNCTIONAL', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _categories.FUNCTIONAL;\n\t}\n});\nObject.defineProperty(exports, 'TARGETING', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _categories.TARGETING;\n\t}\n});\nObject.defineProperty(exports, 'ADVERTISING', {\n\tenumerable: true,\n\tget: function get() {\n\t\treturn _categories.ADVERTISING;\n\t}\n});\n\nvar _preact = __webpack_require__(0);\n\nvar _cleanCategoryName = __webpack_require__(20);\n\nvar _cleanCategoryName2 = _interopRequireDefault(_cleanCategoryName);\n\nvar categories = _interopRequireWildcard(_categories);\n\nvar _queue = __webpack_require__(22);\n\nvar queue = _interopRequireWildcard(_queue);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar cleanCategoryName = exports.cleanCategoryName = _cleanCategoryName2['default'];\n\nvar displayModal = exports.displayModal = function displayModal() {\n\tif ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.OneTrust) {\n\t\twindow.OneTrust.ToggleInfoDisplay();\n\t}\n};\n\nvar dispatchEvent = function dispatchEvent(name) {\n\tvar data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n\t\tbubbles: false,\n\t\tcancelable: false,\n\t\tdetail: null\n\t};\n\n\tvar E = window.CustomEvent;\n\tif (typeof E !== 'function') {\n\t\t// eslint-disable-next-line\n\t\tvar FakeEvent = function FakeEvent(name, data) {\n\t\t\tvar e = document.createEvent('CustomEvent');\n\t\t\te.initCustomEvent(name, data.bubbles, data.cancelable, data.detail);\n\t\t\treturn e;\n\t\t};\n\n\t\tFakeEvent.prototype = window.Event.prototype;\n\t\tE = FakeEvent;\n\t}\n\twindow.dispatchEvent(new E(name, data));\n};\n\ncategories.addChangeListener(function (allowedCategories) {\n\twindow.powsterOneTrust = [].concat(_toConsumableArray(allowedCategories));\n\tallowedCategories.forEach(function (category) {\n\t\treturn dispatchEvent('powster.onetrust.' + category);\n\t});\n});\n\ncategories.addChangeListener(function (allowedCategories) {\n\tqueue.drain(allowedCategories);\n});\n\nif (typeof window !== 'undefined') {\n\tvar isOptatonInitialised = false;\n\twindow.OptanonWrapper = function () {\n\t\tif (!isOptatonInitialised) {\n\t\t\tvar activeGroups = window.OptanonActiveGroups;\n\t\t\tcategories.set(activeGroups);\n\t\t\tisOptatonInitialised = true;\n\t\t}\n\t};\n\n\twindow.addEventListener('consent.onetrust', function (_ref) {\n\t\tvar detail = _ref.detail;\n\n\t\treturn categories.set(detail);\n\t});\n}\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.maybeHandle = undefined;\n\nvar _Pixel = __webpack_require__(21);\n\nvar _Pixel2 = _interopRequireDefault(_Pixel);\n\nvar _cleanCategoryName = __webpack_require__(20);\n\nvar _cleanCategoryName2 = _interopRequireDefault(_cleanCategoryName);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar maybeHandle = exports.maybeHandle = function maybeHandle(oneTrustCategory, fn, shouldQueue) {\n\tvar category = (0, _cleanCategoryName2['default'])(oneTrustCategory);\n\tif (typeof category === 'undefined') {\n\t\treturn fn();\n\t}\n\n\tvar pixel = new _Pixel2['default'](category, fn, shouldQueue);\n\treturn pixel.createTrigger()();\n};\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports[\"default\"] = geoFencing;\n\nvar _clientUtils = __webpack_require__(4);\n\nvar _utils = __webpack_require__(2);\n\nvar redirectState = function redirectState(geoFencedLocation) {\n\tif (!geoFencedLocation) {\n\t\treturn;\n\t}\n\tif (location.hostname === 'localhost' || location.hostname === '127.0.0.1') {\n\t\tconsole.log('GEOFENCING GOING TO', geoFencedLocation);\n\t\treturn;\n\t}\n\tvar destinationHost = (/^((https?:)?\\/\\/)?([^/]+)/.exec(geoFencedLocation) || [])[3];\n\t// Try to prevent SOME infinite redirect loops (wouldn't catch a lot of things)\n\tif (window.location.host !== destinationHost) {\n\t\twindow.location.href = geoFencedLocation;\n\t}\n\treturn true;\n};\n\nvar getGeo = function () {\n\tvar cache = void 0;\n\treturn function () {\n\t\treturn cache || (cache = (0, _clientUtils.getGeoFromIPAsync)());\n\t};\n}();\n\nfunction geoFencing() {\n\tvar redirectionActive = typeof location !== 'undefined' && !location.search.match(/[?&]redirect=(off|false|0|no)/);\n\tif (!redirectionActive || !window.__INITIAL_STATE__) {\n\t\treturn Promise.resolve();\n\t}\n\tvar appData = window.__INITIAL_STATE__.appData || {};\n\tvar campaign = window.location.search;\n\tvar geoFence = appData.geofencing || {};\n\tvar redirectObj = appData.redirection || {};\n\tvar appRegion = (0, _utils.accessNested)(appData, 'meta.region.slug');\n\n\treturn Promise.resolve(getGeo()).then(function (result) {\n\t\tvar countryCode = result.countryCode;\n\t\t// NOTE: dynamicData is unlikely to already be available add some code if that needs to be the case\n\t\tvar store = Store.get();\n\t\tvar dynamicData = store.dynamicData;\n\t\tvar regionData = (0, _utils.accessNested)(dynamicData, ['regions', countryCode, 'url']);\n\n\t\t//allow for regions to be ignored per request\n\t\tvar regionAllow = geoFence.allowRegions || '';\n\t\tvar ignoreFor = regionAllow.split(',').map(function (region) {\n\t\t\treturn region.trim().toLowerCase();\n\t\t}).filter(function (e) {\n\t\t\treturn e;\n\t\t});\n\t\tvar ignoreGeoFence = ignoreFor.indexOf(countryCode) !== -1;\n\n\t\t// check if site is in correct country (and ignore if it is)\n\t\tif (appRegion !== countryCode && geoFence && geoFence.geofencing && !ignoreGeoFence) {\n\t\t\tvar geoFencedLocation = (0, _utils.accessNested)(geoFence, ['overrides', countryCode]) || regionData || geoFence.defaultLink;\n\t\t\tif (geoFencedLocation) {\n\t\t\t\tvar url = void 0;\n\t\t\t\tvar noActivePage = void 0;\n\t\t\t\tif ((0, _utils.isObject)(geoFencedLocation)) {\n\t\t\t\t\turl = geoFencedLocation.url;\n\t\t\t\t\tnoActivePage = geoFencedLocation.noActivePage;\n\t\t\t\t} else {\n\t\t\t\t\turl = geoFencedLocation;\n\t\t\t\t\tnoActivePage = geoFence.noActivePage;\n\t\t\t\t}\n\t\t\t\tif (!noActivePage) url = (0, _utils.joinPaths)(url, store.activePage.path);\n\t\t\t\treturn redirectState(url + campaign);\n\t\t\t}\n\t\t} else {\n\t\t\t// standard redirect behaviour\n\t\t\tvar optionsList = Object.keys(redirectObj).map(function (k) {\n\t\t\t\treturn redirectObj[k];\n\t\t\t}).concat(redirectObj).filter(function (e) {\n\t\t\t\treturn e && e.url;\n\t\t\t});\n\t\t\tvar getActiveRedirect = Promise.resolve();\n\t\t\toptionsList.forEach(function (option) {\n\t\t\t\tgetActiveRedirect = getActiveRedirect.then(function (result) {\n\t\t\t\t\tif (result) return result;\n\t\t\t\t\tvar checklist = [];\n\n\t\t\t\t\tif (option.country) {\n\t\t\t\t\t\tvar list = option.country.split(',').map(function (e) {\n\t\t\t\t\t\t\treturn e.trim();\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// .then(e => console.log('?', e) || e)\n\t\t\t\t\t\tchecklist.push(getGeo().then(function (geo) {\n\t\t\t\t\t\t\treturn list.indexOf(geo.countryCode) !== -1;\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t\tif (option.countryNot) {\n\t\t\t\t\t\tvar _list = option.countryNot.split(',').map(function (e) {\n\t\t\t\t\t\t\treturn e.trim();\n\t\t\t\t\t\t});\n\t\t\t\t\t\tchecklist.push(getGeo().then(function (geo) {\n\t\t\t\t\t\t\treturn _list.indexOf(geo.countryCode) === -1;\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.all(checklist).then(function (listResults) {\n\t\t\t\t\t\treturn listResults.every(function (e) {\n\t\t\t\t\t\t\treturn e;\n\t\t\t\t\t\t}) ? option : result;\n\t\t\t\t\t})[\"catch\"](function (e) {\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn getActiveRedirect.then(function (redirect) {\n\t\t\t\tif (!redirect) return;\n\t\t\t\treturn redirectState(redirect.url + campaign);\n\t\t\t})[\"catch\"](function (e) {\n\t\t\t\treturn console.log('Failed redirecting', e);\n\t\t\t});\n\t\t}\n\t});\n}\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\n * File needs to work in Node 6, so don't use imports!\n */\n\nfunction isError(res) {\n\treturn res.status === 0 || res.status >= 400 && res.status < 600;\n\t// ^ no-cors fetch can return status of 0\n}\n\nfunction handleApiResponse(res) {\n\treturn new Promise(function (resolve, reject) {\n\t\tif (isError(res)) {\n\t\t\treturn res.json().then(reject);\n\t\t}\n\t\treturn resolve(res.json());\n\t});\n\n\t// return res.json().then(json => isError(res) ? Promise.reject(json) : json);\n\n\t// if (isError(res)) {\n\t// \treturn res.json.then(Promise.reject);\n\t// }\n\t// return res.json();\n}\n\nfunction handleApiResponseText(res) {\n\treturn new Promise(function (resolve, reject) {\n\t\tif (isError(res)) {\n\t\t\treturn res.text().then(reject);\n\t\t}\n\t\treturn resolve(res.text());\n\t});\n}\n\nmodule.exports = {\n\thandleApiResponse: handleApiResponse,\n\thandleApiResponseText: handleApiResponseText\n};\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _utils = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// \"yyyy-MM-dd\" => timestamp\nfunction getDateTimestamp(str) {\n\tif (!str) return undefined;\n\tvar match = str.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n\tif (!match) return undefined;\n\treturn +new Date(+match[1], match[2] - 1, +match[3]);\n}\n// \"yyyy-MM-dd to yyyy-MM-dd\" => [timestampFrom, timestampTo]\nfunction getDateRange(str) {\n\tvar match = str.match(/^((?:!|not)\\s*)?(\\S+)(?:\\s*(?:to|->)\\s*(\\S+))?$/i);\n\tif (!match) return undefined;\n\tvar from = getDateTimestamp(match[2]);\n\tvar to = match[3] ? getDateTimestamp(match[3]) : from;\n\tif (!from || !to) return undefined;\n\treturn [from, to, !!match[1]];\n}\nfunction inRange(value, range) {\n\treturn range && (value >= range[0] && value <= range[1]) === !range[2];\n}\n\nfunction pad2(n) {\n\tif (!+n) n = 0;\n\treturn ('0' + n).slice(-2);\n}\nfunction cleanTime(time) {\n\tif (!time || typeof time !== 'string') return null;\n\tvar parts = time.match(/^(\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2}))?)?$/);\n\tif (!parts) return null;\n\treturn pad2(parts[1]) + ':' + pad2(parts[2]) + ':' + pad2(parts[3]);\n}\nfunction getTheaterId(identifier, included) {\n\tif (!identifier || typeof identifier !== 'string') return null;\n\tvar parts = identifier.split(':');\n\tif (parts.length < 2) {\n\t\treturn identifier;\n\t}\n\tvar pid = parts.shift();\n\tvar ptid = parts.join(':');\n\tvar match = included && included.find(function (inc) {\n\t\treturn inc.type === 'theaters' && inc.attributes.provider_id === pid && inc.attributes.provider_theater_id === ptid;\n\t});\n\treturn match && match.id;\n}\n\nvar caches = {};\nfunction getIncluded(included, type, id) {\n\tif (!included || !type || !id) return;\n\tif (!caches[type]) {\n\t\tcaches[type] = {};\n\t}\n\tif (caches[type][id]) {\n\t\treturn caches[type][id];\n\t}\n\treturn caches[type][id] = included.find(function (inc) {\n\t\treturn inc.type === type && inc.id === id;\n\t});\n}\n\nvar formatCache = {};\nvar movieCache = {};\nfunction editFormat(included, screening, format) {\n\tif (!included || !screening || !format) return;\n\tif (typeof format === 'string') {\n\t\tvar search = format.toLowerCase();\n\t\tif (formatCache[search]) {\n\t\t\tformat = formatCache[search];\n\t\t} else {\n\t\t\tvar result = included.find(function (inc) {\n\t\t\t\treturn inc.type === 'formats' && inc.attributes.name.toLowerCase() === search;\n\t\t\t});\n\t\t\tif (!result) {\n\t\t\t\tresult = {\n\t\t\t\t\ttype: 'formats',\n\t\t\t\t\tid: search,\n\t\t\t\t\tattributes: { name: format }\n\t\t\t\t};\n\t\t\t\tincluded.push(result);\n\t\t\t}\n\t\t\tformatCache[search] = format = result;\n\t\t}\n\t}\n\tif (!format || !format.id) return;\n\tvar mid = screening.attributes.movie_id;\n\tvar srcMovie = included.find(function (inc) {\n\t\treturn inc.type === 'movies' && inc.id === mid;\n\t});\n\tif (!srcMovie || srcMovie.attributes.format_id === format.id) return;\n\tvar lookup = [srcMovie.attributes.provider_id, format.id].join('|');\n\tvar movie = movieCache[lookup];\n\tif (!movie) {\n\t\tmovie = included.find(function (inc) {\n\t\t\treturn inc.type === 'movies' && inc.attributes.format_id === format.id && inc.attributes.provider_id === srcMovie.attributes.provider_id;\n\t\t});\n\t\tif (!movie) {\n\t\t\t// Urgh\n\t\t\tmovie = JSON.parse(JSON.stringify(srcMovie));\n\t\t\tmovie.attributes.format_id = format.id;\n\t\t\tmovie.id += '|' + format.id;\n\t\t\tincluded.push(movie);\n\t\t}\n\t\tmovieCache[lookup] = movie;\n\t}\n\tif (!movie || !movie.id) return;\n\tscreening.attributes.movie_id = movie.id;\n}\n\nfunction clearCaches() {\n\tcaches = {};\n\tformatCache = {};\n\tmovieCache = {};\n}\n\nfunction formatSlug(name) {\n\tif (!name) return name;\n\treturn name.toLowerCase().replace(/ /g, '');\n}\n\nmodule.exports = function (data, included, appData) {\n\tclearCaches();\n\n\tvar store = _store2['default'].get();\n\n\tif ((0, _utils.accessNested)(store, 'activePage.data.splitSpecialTheaters', true)) {\n\t\tvar thCache = {};\n\t\tvar splitTheater = function splitTheater(id, data) {\n\t\t\tvar nid = id + ':' + data.indicator;\n\t\t\tif (thCache[nid]) {\n\t\t\t\treturn thCache[nid];\n\t\t\t}\n\t\t\tvar src = included.find(function (i) {\n\t\t\t\treturn i.type === 'theaters' && i.id === id;\n\t\t\t});\n\t\t\tif (!src) return;\n\t\t\tvar nTh = JSON.parse(JSON.stringify(src));\n\t\t\tnTh.id = nid;\n\t\t\tnTh.attributes.name += ' (' + data.name + ')';\n\t\t\tnTh.attributes.theater_master_id += ':' + data.indicator;\n\t\t\tnTh.attributes.theater_master_id = data.masterId || nTh.attributes.theater_master_id + ':' + data.indicator;\n\t\t\tthCache[nid] = nTh;\n\t\t\tincluded.push(nTh);\n\t\t\treturn nTh;\n\t\t};\n\t\tvar specialTheaters = [{ indicator: 'dome', name: 'Dome' },\n\t\t// Hardcoded Curzon Bloomsbury dochouse id - ugly I know but \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:dochouse\" is not a valid guid\n\t\t// And need to match powster dochouse to the split version of webedia\n\t\t{ indicator: 'dochouse', name: 'DocHouse', masterId: '98e24e12-d9bb-11e7-9354-db0c57537af4' }];\n\t\tdata.forEach(function (s) {\n\t\t\tvar comments = (0, _utils.accessNested)(s, 'attributes.doc.comments');\n\t\t\tif (!comments) return;\n\t\t\tvar commentsList = comments.toLowerCase().split(';');\n\t\t\t// Using find to have a break behaviour (stops after the first found)\n\t\t\tspecialTheaters.find(function (special) {\n\t\t\t\tif (commentsList.indexOf(special.indicator) === -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar newTheater = splitTheater(s.attributes.theater_id, special);\n\t\t\t\tif (newTheater) {\n\t\t\t\t\ts.attributes.theater_id = newTheater.id;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tvar disabledScreenings = (0, _utils.accessNested)(store, 'activePage.data.disabledScreenings') || {};\n\tvar disabledScreeningsContexts = [disabledScreenings].concat(Object.keys(disabledScreenings).map(function (k) {\n\t\treturn disabledScreenings[k];\n\t})).filter(function (ctx) {\n\t\treturn ctx && Object.keys(ctx).length;\n\t});\n\n\tif (disabledScreeningsContexts.length) {\n\t\tdisabledScreeningsContexts = disabledScreeningsContexts.map(function (ctx) {\n\t\t\tctx = Object.assign({}, ctx);\n\t\t\tif (ctx.date) {\n\t\t\t\tctx.date = ctx.date.split(',').map(function (part) {\n\t\t\t\t\treturn getDateRange(part.trim());\n\t\t\t\t}).filter(function (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (ctx.time) {\n\t\t\t\tctx.time = ctx.time.split(',').map(function (part) {\n\t\t\t\t\treturn cleanTime(part.trim());\n\t\t\t\t}).filter(function (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (ctx.format) {\n\t\t\t\tctx.format = ctx.format.split(',').map(function (part) {\n\t\t\t\t\treturn formatSlug(part.trim());\n\t\t\t\t}).filter(function (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (ctx.theater) {\n\t\t\t\tctx.theater = ctx.theater.split(',').map(function (part) {\n\t\t\t\t\treturn getTheaterId(part.trim(), included);\n\t\t\t\t}).filter(function (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (ctx.provider) {\n\t\t\t\tctx.provider = ctx.provider.split(',').map(function (part) {\n\t\t\t\t\treturn part.trim();\n\t\t\t\t}).filter(function (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ctx;\n\t\t});\n\t\tvar localFormatCache = {};\n\t\tvar getFormat = function getFormat(screening) {\n\t\t\tvar mid = screening.attributes.movie_id;\n\t\t\tif (localFormatCache[mid]) {\n\t\t\t\treturn localFormatCache[mid];\n\t\t\t}\n\t\t\tvar format = null;\n\t\t\tvar movie = included.find(function (inc) {\n\t\t\t\treturn inc.type === 'movies' && inc.id === mid;\n\t\t\t});\n\t\t\tif (movie && movie.attributes.format_id) {\n\t\t\t\tvar fid = movie.attributes.format_id;\n\t\t\t\tvar fObj = included.find(function (inc) {\n\t\t\t\t\treturn inc.type === 'formats' && inc.id === fid;\n\t\t\t\t});\n\t\t\t\tformat = fObj && fObj.attributes.name;\n\t\t\t}\n\t\t\treturn localFormatCache[mid] = format;\n\t\t};\n\t\tdata = data.filter(function (screening) {\n\t\t\t// If one context validates, filter out the screening\n\t\t\treturn !disabledScreeningsContexts.find(function (ctx) {\n\t\t\t\treturn Object.keys(ctx).every(function (key) {\n\t\t\t\t\tvar val = ctx[key];\n\t\t\t\t\tif (val === null) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (key) {\n\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\tvar date = getDateTimestamp((screening.attributes.date || '').slice(0, 10));\n\t\t\t\t\t\t\treturn date && ctx.date.find(function (range) {\n\t\t\t\t\t\t\t\treturn inRange(date, range);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase 'time':\n\t\t\t\t\t\t\tvar time = screening.attributes.time;\n\t\t\t\t\t\t\treturn time && ctx.time.indexOf(time) !== -1;\n\t\t\t\t\t\tcase 'format':\n\t\t\t\t\t\t\tvar slug = formatSlug(getFormat(screening));\n\t\t\t\t\t\t\treturn slug && ctx.format.indexOf(slug) !== -1;\n\t\t\t\t\t\tcase 'theater':\n\t\t\t\t\t\t\tvar tid = screening.attributes.theater_id;\n\t\t\t\t\t\t\treturn tid && ctx.theater.indexOf(tid) !== -1;\n\t\t\t\t\t\tcase 'provider':\n\t\t\t\t\t\t\tvar provider = screening.attributes.provider_id;\n\t\t\t\t\t\t\treturn provider && ctx.provider.indexOf(provider) !== -1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tvar customFormats = (0, _utils.accessNested)(store, 'activePage.data.customFormats') || {};\n\tif (customFormats.format) {\n\t\tcustomFormats = {\n\t\t\tmain: customFormats\n\t\t};\n\t}\n\t// Prebuild the object to make things faster\n\tvar customFormatsList = Object.keys(customFormats).map(function (prop, index) {\n\t\tvar data = customFormats[prop];\n\t\tif (!data || (typeof data === 'undefined' ? 'undefined' : _typeof(data)) !== 'object' || !data.format) return;\n\t\tvar dataObj = {\n\t\t\tformat: data.format,\n\t\t\tappend: !!data.append\n\t\t};\n\t\tif (data.date) {\n\t\t\tdataObj.dateRanges = data.date.split(',').map(function (part) {\n\t\t\t\treturn getDateRange(part.trim());\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t}\n\t\tif (data.time) {\n\t\t\tdataObj.times = data.time.split(',').map(function (time) {\n\t\t\t\treturn cleanTime(time.trim());\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t}\n\t\t// if (data.theaterName) {\n\t\t// Issue with theaters having a comma in the name\n\t\t// \tdataObj.theaterName = data.theaterName.split(',');\n\t\t// }\n\t\tif (data.theater) {\n\t\t\tdataObj.theaters = data.theater.split(',').map(function (theater) {\n\t\t\t\treturn theater.trim();\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t} else if (data.theaterNot) {\n\t\t\tdataObj.theatersNot = data.theaterNot.split(',').map(function (theater) {\n\t\t\t\treturn theater.trim();\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t}\n\t\tif (data.domain) {\n\t\t\tdataObj.domains = data.domain.split(',').map(function (domain) {\n\t\t\t\treturn domain.trim();\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t}\n\t\tif (data.country) {\n\t\t\tdataObj.countries = data.country.split(',').map(function (country) {\n\t\t\t\treturn country.trim();\n\t\t\t}).filter(function (e) {\n\t\t\t\treturn e;\n\t\t\t});\n\t\t}\n\t\tdataObj.order = data.order || index + 100;\n\t\treturn dataObj;\n\t}).filter(function (e) {\n\t\treturn e;\n\t});\n\tcustomFormatsList.sort(function (a, b) {\n\t\treturn a.order - b.order;\n\t});\n\tif (customFormatsList.length) {\n\t\tdata.forEach(function (screening) {\n\t\t\tvar sDate = getDateTimestamp((screening.attributes.date || '').slice(0, 10));\n\t\t\tvar sTime = screening.attributes.time;\n\t\t\tvar matching = customFormatsList.find(function (formatCond) {\n\t\t\t\tif (formatCond.dateRanges) {\n\t\t\t\t\tif (!sDate || !formatCond.dateRanges.find(function (range) {\n\t\t\t\t\t\treturn inRange(sDate, range);\n\t\t\t\t\t})) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.times) {\n\t\t\t\t\tif (!sTime || formatCond.times.indexOf(sTime) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.theaters || formatCond.theatersNot) {\n\t\t\t\t\tvar thId = screening.attributes.theater_id;\n\t\t\t\t\tvar theater = getIncluded(included, 'theaters', thId);\n\t\t\t\t\tvar ptid = (0, _utils.accessNested)(theater, 'attributes.provider_id') + ':' + (0, _utils.accessNested)(theater, 'attributes.provider_theater_id');\n\t\t\t\t\tif (formatCond.theaters && !formatCond.theaters.find(function (desired) {\n\t\t\t\t\t\treturn thId === desired || ptid === desired;\n\t\t\t\t\t}) || formatCond.theatersNot && formatCond.theatersNot.find(function (desired) {\n\t\t\t\t\t\treturn thId === desired || ptid === desired;\n\t\t\t\t\t})) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.domains) {\n\t\t\t\t\tvar _thId = screening.attributes.theater_id;\n\t\t\t\t\tvar _theater = getIncluded(included, 'theaters', _thId);\n\t\t\t\t\tvar exId = (0, _utils.accessNested)(_theater, 'attributes.exhibitor_id');\n\t\t\t\t\tvar exhibitor = getIncluded(included, 'exhibitors', exId);\n\t\t\t\t\tvar domain = (0, _utils.accessNested)(exhibitor, 'attributes.domain');\n\t\t\t\t\tif (!domain || formatCond.domains.indexOf(domain) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.countries) {\n\t\t\t\t\tvar _thId2 = screening.attributes.theater_id;\n\t\t\t\t\tvar _theater2 = getIncluded(included, 'theaters', _thId2);\n\t\t\t\t\tvar country = (0, _utils.accessNested)(_theater2, 'attributes.country');\n\t\t\t\t\tif (!country || formatCond.countries.indexOf(country) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tif (matching) {\n\t\t\t\tvar format = matching.format;\n\t\t\t\tif (matching.append) {\n\t\t\t\t\tvar movie = getIncluded(included, 'movies', screening.attributes.movie_id);\n\t\t\t\t\tvar formatObject = getIncluded(included, 'formats', movie && movie.attributes.format_id);\n\t\t\t\t\tif (formatObject) {\n\t\t\t\t\t\tformat = formatObject.attributes.name + ' ' + format;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\teditFormat(included, screening, format);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tdata: data,\n\t\tincluded: included\n\t};\n};\n\nObject.assign(module.exports, {\n\tgetDateTimestamp: getDateTimestamp,\n\tgetDateRange: getDateRange,\n\tinRange: inRange,\n\teditFormat: editFormat,\n\tgetIncluded: getIncluded,\n\tclearCaches: clearCaches\n});\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.displayRegionModalIfNeeded = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _preact = __webpack_require__(0);\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _actions = __webpack_require__(3);\n\nvar actions = _interopRequireWildcard(_actions);\n\nvar _tracking = __webpack_require__(6);\n\nvar _utils = __webpack_require__(2);\n\nvar _changeRegionModal = __webpack_require__(42);\n\nvar _changeRegionModal2 = _interopRequireDefault(_changeRegionModal);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/* State Getters\n--------------------------------*/\n\nvar getGeoCountryCode = function getGeoCountryCode(state) {\n\treturn state.client.geo && state.client.geo.countryCode;\n};\nvar getAppRegionCode = function getAppRegionCode(state) {\n\treturn state.appData.meta.region.slug;\n};\nvar getAppLanguageCode = function getAppLanguageCode(state) {\n\treturn state.appData.meta.region.language;\n};\n\nvar getAppCountryCode = function getAppCountryCode(state) {\n\t// Grab the first 2 letters of the region code\n\t// (ex. BE_FR => BE)\n\tvar match = /^\\w{2}/.exec(getAppRegionCode(state));\n\treturn match && match[0];\n};\n\nvar getAppGeoRegions = function getAppGeoRegions(state) {\n\tvar alteredRegions = {};\n\tvar dynamicRegions = (0, _utils.accessNested)(state, \"dynamicData.regions\");\n\tvar staticRegions = (0, _utils.accessNested)(state, \"appData.meta.regions\", {});\n\tvar extraExternalRegions = (0, _utils.accessNested)(state, \"appData.meta.extraRegions\", null);\n\tvar regions = dynamicRegions || staticRegions;\n\n\t// Add in extra external regions\n\tObject.keys(regions).forEach(function (reg) {\n\t\t// Add in the regionCode to all of the regions\n\t\talteredRegions[reg] = _extends({}, regions[reg], {\n\t\t\tregionCode: reg\n\t\t});\n\t});\n\n\tif (extraExternalRegions) {\n\n\t\t// format the regions to the right format and add them to the regions\n\t\tObject.keys(extraExternalRegions).forEach(function (key) {\n\n\t\t\talteredRegions[key] = {\n\t\t\t\tregionCode: key,\n\t\t\t\turl: extraExternalRegions[key]\n\t\t\t};\n\t\t});\n\t}\n\n\treturn alteredRegions;\n};\n\n/* Helper Functions\n-----------------------------*/\n\nfunction getGeoRegionMatches(countryCode, regionCodes) {\n\t// Create reg ex to match all regions which match country\n\t// e.g. for ch could be: ch, ch_fr\n\t// e.g. for be could be: be_fr, be_nl\n\tvar countryCodeRE = new RegExp('^(' + countryCode + ')(_[a-z]{2})?$');\n\n\treturn regionCodes.filter(function (region) {\n\t\treturn countryCodeRE.exec(region);\n\t}).map(function (region) {\n\t\tvar regexResult = countryCodeRE.exec(region);\n\t\treturn {\n\t\t\tregionCode: region,\n\t\t\tcountryCode: regexResult[1],\n\t\t\tlanguageCode: regexResult[2]\n\t\t};\n\t});\n}\n\nfunction getCurrentAppLanguageMatch(country, language, regionMatches) {\n\treturn regionMatches.find(function (match) {\n\t\treturn match.countryCode === country && match.languageCode === language;\n\t});\n}\n\n/**\n * Detect if the Users region is not the same as the apps region\n * @return {Boolean}\n */\nfunction detectRegionMismatch(store) {\n\t// If not first visit, then shouldn't display modal\n\t// (as user has previously decided to stay here)\n\t// TODO: add in again\n\t// if (!isFirstVisit(this.props)) return false;\n\n\tvar appCode = getAppCountryCode(store);\n\tvar appLanguage = getAppLanguageCode(store);\n\tvar appRegion = getAppRegionCode(store);\n\tvar geoCode = getGeoCountryCode(store);\n\n\t// TODO: also check language in the browser presets\n\t// needed for country's with multiple languages (ex. Belgium)\n\n\n\t// If geo and app region not determined then don't display modal\n\t// (as we don't yet know if we have a mismatch)\n\tif (!(appCode !== null && geoCode !== null)) return false;\n\n\tvar geoMismatch = appCode !== geoCode;\n\n\tif (appRegion.indexOf('_') > -1 && navigator && navigator.language && appLanguage !== navigator.language) {\n\t\t// Means it's a multi language app,\n\t\t// so let's check if the user has a language set\n\t\tgeoMismatch = true;\n\t}\n\n\tif (geoMismatch) {\n\t\t// The regions aren't matching, so let the tracking know\n\t\t(0, _tracking.track)({ a: \"geo-region-mismatch\", once: true });\n\t} else {\n\t\t// regions are matching\n\t\t(0, _tracking.track)({ a: \"geo-region-match\", once: true });\n\t}\n\n\treturn geoMismatch;\n}\n\nfunction getMatchingRegionApp(state) {\n\t// Get geo countryCode, app geo regions and app langugage from state\n\tvar geoCountryCode = getGeoCountryCode(state);\n\tvar availableAppRegions = getAppGeoRegions(state);\n\tvar appRegion = getAppRegionCode(state);\n\tvar appLanguageCode = getAppLanguageCode(state);\n\n\t// Find all app regions which match the current country code\n\tvar matches = getGeoRegionMatches(geoCountryCode, Object.keys(availableAppRegions));\n\n\t// console.log('the availavle regions', availableAppRegions);\n\n\t// Get all allowable geo region / app region matches\n\tvar currentAppLanguageMatch = getCurrentAppLanguageMatch(geoCountryCode, appLanguageCode, matches);\n\n\t// console.log('get Matching region App',  currentAppLanguageMatch, state.appData.meta, appLanguageCode, availableAppRegions, geoCountryCode);\n\n\tif (currentAppLanguageMatch) {\n\t\t// First try to match against language of current region (NOTE: is this the right logic?)\n\t\treturn availableAppRegions[currentAppLanguageMatch.regionCode];\n\t}\n\n\t// Then try to match against exact region match\n\tvar exactMatch = matches.find(function (_ref) {\n\t\tvar regionCode = _ref.regionCode;\n\t\treturn regionCode === geoCountryCode;\n\t});\n\n\tif (exactMatch) {\n\t\treturn availableAppRegions[exactMatch.regionCode];\n\t} else if (availableAppRegions['other']) {\n\t\treturn availableAppRegions['other'];\n\t}\n\n\t// Then return first result found\n\tvar firstMatch = matches[0];\n\n\tif (firstMatch) {\n\t\tif (appRegion.indexOf('_') > 0) {\n\t\t\t// Multi Region App\n\t\t\tif (navigator && navigator.language && availableAppRegions[geoCountryCode + '_' + navigator.language]) {\n\t\t\t\t// Check the language the user has set in the browser\n\t\t\t\t// and see if we have an app available for that language in that region\n\t\t\t\treturn availableAppRegions[geoCountryCode + '_' + navigator.language];\n\t\t\t}\n\t\t\t// Didn't find any region app with that language,\n\t\t\t// so let's not show the popup\n\t\t} else {\n\t\t\treturn availableAppRegions[firstMatch.regionCode];\n\t\t}\n\t}\n\t// Return null if no match\n\treturn null;\n}\n\nfunction displayRegionModal() {\n\tvar store = _store2['default'].get();\n\n\tvar shouldDisplayRegionMismatchModal = store.appData.options.useRegionMismatchModal && // Is it enabled in the appData\n\tdetectRegionMismatch(store); // Are we actually in the wrong region\n\n\n\tif (!shouldDisplayRegionMismatchModal) {\n\t\treturn;\n\t}\n\n\tvar userRegionApp = getMatchingRegionApp(store);\n\n\tif (!userRegionApp) {\n\t\t// No App found with the users region,\n\t\t// so don't show the popup\n\t\treturn;\n\t}\n\n\tvar appRegionCode = getAppRegionCode(store);\n\tvar appCountryCode = getAppCountryCode(store);\n\tvar currentApp = getAppGeoRegions(store)[appRegionCode];\n\tif (!currentApp) {\n\t\tcurrentApp = {\n\t\t\tregionCode: appRegionCode,\n\t\t\turl: store.appData.meta.url\n\t\t};\n\t}\n\n\t// Display the region modal\n\t_store2['default'].emit(actions.SHOW_MODAL, (0, _preact.h)(_changeRegionModal2['default'], {\n\t\tgeo: store.client.geo,\n\t\tappRegionCode: getAppRegionCode(store),\n\t\tappCountryCode: getAppCountryCode(store),\n\t\timagePath: store.appData.urls.roots.sharedImages,\n\t\tapiRoot: store.appData.apis.stdata.root,\n\t\tcurrentApp: currentApp,\n\t\tuserRegionApp: userRegionApp,\n\t\tcopy: store.appData.copy\n\t}), null, { type: 'regionModal' });\n}\n\n/* Exported Functions\n--------------------------------*/\n\nfunction displayRegionModalIfNeeded() {\n\n\tvar store = _store2['default'].get();\n\n\tif (store.user && store.user.regionModalDismissed) {\n\t\t// The user has dismissed the modal before,\n\t\t// so let's not show again\n\t\treturn;\n\t}\n\n\t// Make sure the call to get dynamic content is finished\n\tif (!store.dynamicData || !store.dynamicData.regions) {\n\t\t// Listen to when dynamic data is updated\n\t\t_store2['default'].on(actions.UPDATE_DYNAMIC_DATA, function () {\n\t\t\tif (_store2['default'].get().dynamicData.regions) {\n\t\t\t\t// Regional data is finally available,\n\t\t\t\t// so proceed\n\t\t\t\tdisplayRegionModal();\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// All the data has already been loaded,\n\t\t// so proceed\n\t\tdisplayRegionModal();\n\t}\n}\n\nexports.displayRegionModalIfNeeded = displayRegionModalIfNeeded;\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.smoothScrollTo = smoothScrollTo;\nexports.smoothScrollBy = smoothScrollBy;\nexports.isSmoothScrolling = isSmoothScrolling;\n\nvar _clientUtils = __webpack_require__(4);\n\n/* SEE BELOW FOR HOW TO USE */\n\nvar now = Date.now || function () {\n\treturn new Date().getTime();\n};\n\nfunction getScroll(elem, hor) {\n\tif (elem === window) {\n\t\treturn (hor ? window.pageXOffset || document.documentElement.scrollLeft : window.pageYOffset || document.documentElement.scrollTop) || 0;\n\t}\n\treturn hor ? elem.scrollLeft : elem.scrollTop;\n}\n\nfunction setScroll(elem, v, hor) {\n\tif (elem === window) {\n\t\twindow.scrollTo(hor ? v : getScroll(window, true), hor ? getScroll(window, false) : v);\n\t} else {\n\t\telem[hor ? 'scrollLeft' : 'scrollTop'] = v;\n\t}\n}\n\nfunction getElemPos(e, parent, hor) {\n\tvar prop = hor ? 'offsetLeft' : 'offsetTop';\n\tvar pos = e[prop];\n\tvar last = e;\n\n\twhile ((e = e.parentElement) && e !== parent) {\n\t\tif (e === last.offsetParent) {\n\t\t\tlast = e;\n\t\t\tpos += e[prop];\n\t\t}\n\t}if (parent !== window && e !== parent) return undefined;\n\treturn pos;\n\t// Other possibility\n\t// var eBounds = e.getBoundingClientRect(), pBounds = parent.getBoundingClientRect();\n\t// return eBounds.top - pBounds.top;\n}\n\nfunction endScroll(elem) {\n\tvar t = elem._smthscrl;\n\tif (!t) return;\n\tcancelAnimationFrame(t.timer);\n\tt.timer = null;\n\tif (typeof t.callback === 'function') {\n\t\tt.callback();\n\t}\n\tt.callback = null;\n}\n\nfunction oneDir(elem, p, horizontal) {\n\tvar t = elem._smthscrl;\n\tvar currentScroll = getScroll(elem, horizontal);\n\tvar dirIndex = horizontal ? 1 : 0;\n\tif (t.previousScroll[dirIndex] == undefined) t.previousScroll[dirIndex] = currentScroll;\n\t// User tried to scroll, stop\n\t// This breaks ios and stops the scroll way too early\n\t// NOTE Anthony: use the force option or add something to only change that on iOS\n\t// Commenting that blocks the desired behaviour of not preventing the user from scrolling\n\tif (currentScroll !== t.previousScroll[dirIndex] && !t.force && !(0, _clientUtils.getIsIOS)()) {\n\t\t// As mentioned above, this breaks on Ios, so only run this on devices\n\t\t// that supports it\n\t\treturn endScroll(elem);\n\t}\n\tvar to = t.to;\n\tif (Array.isArray(to)) to = to[dirIndex];\n\tif (to instanceof Element) {\n\t\tto = getElemPos(t.to, elem, horizontal);\n\t\tvar sizeProp = horizontal ? 'clientWidth' : 'clientHeight';\n\t\tif (t.relativeTo === 'view') {\n\t\t\tvar maxPos = to - t.offsetStart;\n\t\t\tvar minPos = to - (elem[sizeProp] - t.to[sizeProp]) + t.offsetEnd;\n\t\t\tto = Math.min(Math.max(currentScroll + t.offset, minPos), maxPos);\n\t\t} else {\n\t\t\tvar rT = t.relativeTo;\n\t\t\tvar equiv = { top: 0, middle: 50, bottom: 100 };\n\t\t\trT = (equiv.hasOwnProperty(rT) ? equiv[rT] : parseFloat(rT)) || 0;\n\t\t\tto -= Math.max(elem[sizeProp] - t.to[sizeProp], 0) * rT * .01;\n\t\t}\n\t}\n\tto -= t.offset;\n\tif (t.duration <= 0) {\n\t\treturn setScroll(elem, t.to, horizontal);\n\t}\n\n\tvar newValue = t.from[dirIndex] + p * (to - t.from[dirIndex]);\n\tsetScroll(elem, newValue, horizontal);\n\tt.previousScroll[dirIndex] = getScroll(elem, horizontal);\n}\n\nfunction loop(elem) {\n\tvar t = elem._smthscrl;\n\tif (!t) return;\n\tif (t.timer) t.timer = requestAnimationFrame(loop.bind(this, elem));\n\tvar time = now() - t.start;\n\tif (time >= t.duration) time = t.duration;\n\tvar p = t.easing(t.duration ? time / t.duration : 1);\n\tvar directionsArray = [];\n\tif (t.direction === 'ver' || t.direction === 'both') directionsArray.push(false);\n\tif (t.direction === 'hor' || t.direction === 'both') directionsArray.push(true);\n\tdirectionsArray.forEach(function (hor) {\n\t\treturn oneDir(elem, p, hor);\n\t});\n\tif (time === t.duration) {\n\t\treturn endScroll(elem);\n\t}\n}\n\n// elem : element to scroll (parent container, having a scrollbar)\n//   - if elem is null or the string 'root', the script will use either body or the documentElement based on which is detected to have a scrollbar\n// v : scroll to this. Can be a number (scrollTop = v at the end) or an element ! (more on that later)\n// d : duration (in ms). Default to 300. 0 to instant scroll.\n// settings : Object containing\n//   - callback : callback to be called after the scroll is ended (either goal reached or the user scrolled during it)\n//   - direction: 'ver' (default) for vertical, 'hor' for horizontal or 'both' (in this case, v can be an array of two numbers, [verticalPos, horizontalPos])\n//   - easing: a function taking a number v between 0 and 1 as argument and returning another number\n//       easing(0) should be 0 and easing(1) should be 1 ! (can be used to handle acceleration)\n//       default to ease-out-quad (decelerating)\n//       See https://gist.github.com/gre/1650294 for a list of basic functions\n//   - offset: number to be subtracted from the current scroll (useful if v is not a number)\n//       an offset of 20 would scroll 20 pixels past the required value\n//   - relativeTo: used when `v` is an element. Indicates where the element should be on the screen (works like background-position).\n//       'top' (default): top of v is aligned with the top of elem (eq to '0%')\n//       'bottom': bottom of v is aligned with the bottom of elem (eq to '100%')\n//       'middle': middle of v is aligned with the middle of elem (eq to '50%')\n//       'x%' or 'x': aligns the xth percent of v with the xth percent of elem\n//       'view': try to make the element visible (fully if possible)\n//          will not scroll if the element is already fully in view\n//          if v is bigger than elem, makes sure the top of v is visible\n//   - offsetStart: used when `v` is an element and relativeTo is 'view'. ensure a minimum margin from the top or left, depending on the direction (can be negative)\n//   - offsetEnd: used when `v` is an element and relativeTo is 'view'. ensure a minimum margin from the bottom or right, depending on the direction (can be negative)\n//   - force: boolean (default false) to force the smoothScroll to finish (even if the user scrolled)\nfunction smoothScrollTo(elem, v, d, settings) {\n\tif (elem === null || elem === 'root') {\n\t\telem = typeof document.body.scrollTop !== 'undefined' ? document.body : document.documentElement;\n\t}\n\tif (!elem) {\n\t\treturn;\n\t}\n\tvar t = elem._smthscrl;\n\tif (t && t.timer) {\n\t\tendScroll(elem);\n\t}\n\tvar defaultEasing = function defaultEasing(t) {\n\t\treturn 1 - (t = 1 - t) * t;\n\t};\n\tsettings = settings || {};\n\tvar dir = 'ver';\n\tswitch (settings.direction) {\n\t\tcase 'horizontal':\n\t\tcase 'hor':\n\t\t\tdir = 'hor';\n\t\t\tbreak;\n\t\tcase 'both':\n\t\t\tdir = 'both';\n\t\t\tbreak;\n\t}\n\t// Legacy horizontal mode\n\tif (settings.horizontal) dir = 'hor';\n\tvar currentScroll = [undefined, undefined];\n\tif (dir === 'ver' || dir === 'both') currentScroll[0] = getScroll(elem, false);\n\tif (dir === 'hor' || dir === 'both') currentScroll[1] = getScroll(elem, true);\n\td = +d; // Cast to number\n\tvar start = now();\n\tif (settings.timeStart) {\n\t\tstart = settings.timeStart < 60000 ? start + settings.timeStart : settings.timeStart;\n\t}\n\tt = elem._smthscrl = {\n\t\ttimer: null,\n\t\teasing: typeof settings.easing === 'function' ? settings.easing : defaultEasing,\n\t\tto: v,\n\t\tdirection: dir,\n\t\toffset: settings.offset || 0,\n\t\trelativeTo: settings.relativeTo || 'top',\n\t\toffsetStart: settings.offsetStart || 0,\n\t\toffsetEnd: settings.offsetEnd || 0,\n\t\tfrom: currentScroll,\n\t\tpreviousScroll: [undefined, undefined],\n\t\tduration: !isNaN(d) ? d : 300,\n\t\tforce: !!settings.force,\n\t\tcallback: settings.callback,\n\t\tstart: start\n\t};\n\tt.timer = requestAnimationFrame(loop.bind(this, elem));\n\treturn {\n\t\tstop: endScroll.bind(this, elem)\n\t};\n}\n\n// Like smoothScrollTo but with v being an offset instead of an absolute value (v can't be an element)\nfunction smoothScrollBy(elem, v, d, settings) {\n\tsmoothScrollTo(elem, getScroll(elem, settings && settings.horizontal) + v, d, settings);\n}\n\n// Old way to scroll to an element\n// Use smoothScrollTo with v an element to achieve this now.\n// export function scrollToElem(elem, elem2, d, settings) {\n// \tlet top = getElemPos(elem2, elem, settings.horizontal);\n// \tif (top == undefined) return;\n// \tsmoothScrollTo(elem, top, d, settings);\n// }\n\nfunction isSmoothScrolling(elem) {\n\tvar t = elem._smthscrl;\n\treturn t && t.timer;\n}\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getStaticData = undefined;\n\nvar _store = __webpack_require__(1);\n\nvar _store2 = _interopRequireDefault(_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n//\n// Utils related to static data\n//\n\nvar staticData = {};\nvar isStaticDataSet = false;\n\n// Use this function if you need to grab static data from the Store\n// This way you don't have to pass it down as a prop everywhere\n// Don't use for pageData unless you are sure the data won't get\n// updated anywhere\nvar getStaticData = exports.getStaticData = function getStaticData() {\n\n\tif (!isStaticDataSet) {\n\t\t// Haven't retrieved data yet, so lets do that first\n\t\tvar store = _store2['default'].get();\n\t\tstaticData = store.appData;\n\t\tisStaticDataSet = true;\n\t}\n\n\treturn staticData;\n};\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _tracking = __webpack_require__(6);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Helper class to track loading times easily.\n */\nvar TimeTracker = function () {\n\n\t/**\n  * Create a new Time tracker.\n  *\n  * @param {string=} labelPrefix - optional prefix for the label of the event\n  * @param {string=} labelSuffix - optional suffix for the label of the event\n  */\n\tfunction TimeTracker(labelPrefix, labelSuffix) {\n\t\t_classCallCheck(this, TimeTracker);\n\n\t\tthis.labelPrefix = labelPrefix || '';\n\t\tthis.labelSuffix = labelSuffix || '';\n\t\tthis.events = {};\n\t}\n\n\t_createClass(TimeTracker, [{\n\t\tkey: 'start',\n\t\tvalue: function start(label) {\n\t\t\tthis.events[label] = Date.now();\n\t\t}\n\t}, {\n\t\tkey: 'end',\n\t\tvalue: function end(label) {\n\t\t\tthis.endAt(label, Date.now());\n\t\t}\n\t}, {\n\t\tkey: 'endAt',\n\t\tvalue: function endAt(label, date) {\n\t\t\tif (typeof this.events[label] !== 'number') return;\n\t\t\tvar time = date - this.events[label];\n\t\t\tthis.clear(label);\n\t\t\tif (time < 0) return;\n\t\t\t(0, _tracking.track)({\n\t\t\t\ta: this.labelPrefix + label + this.labelSuffix,\n\t\t\t\tl: time\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'endAll',\n\t\tvalue: function endAll() {\n\t\t\tthis.endAllAt(Date.now());\n\t\t}\n\t}, {\n\t\tkey: 'endAllAt',\n\t\tvalue: function endAllAt(date) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.events.forEach(function (label) {\n\t\t\t\treturn _this.endAt(label, date);\n\t\t\t});\n\t\t\tthis.clearAll();\n\t\t}\n\t}, {\n\t\tkey: 'clear',\n\t\tvalue: function clear(label) {\n\t\t\tthis.events[label] = undefined;\n\t\t}\n\t}, {\n\t\tkey: 'clearAll',\n\t\tvalue: function clearAll() {\n\t\t\tthis.events = {};\n\t\t}\n\t}]);\n\n\treturn TimeTracker;\n}();\n\nexports['default'] = TimeTracker;\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"embed__container__1ZBgK\",\"content\":\"embed__content__3OVUD\",\"linkContainer\":\"embed__linkContainer__nsg55\",\"button\":\"embed__button__3Q6N2\"};\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"link\":\"link__link__1xGDg\",\"top\":\"link__top__2Brbt\",\"iconLink\":\"link__iconLink__2vMSB link__link__1xGDg\",\"iconLinkSvg\":\"link__iconLinkSvg__3BJsH\",\"iconLinkUrl\":\"link__iconLinkUrl__3vuXN\"};\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"visible\":\"transition__visible__2xO2Z\",\"leaving\":\"transition__leaving__1eFUP\",\"entering\":\"transition__entering__22LLW\",\"empty\":\"transition__empty__7fZWG\"};\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"cookiesModal__container__1WKgP\",\"title\":\"cookiesModal__title__2wzdo\",\"text\":\"cookiesModal__text__1Lw73\",\"buttons\":\"cookiesModal__buttons__1Eh_o\",\"yes\":\"cookiesModal__yes__3n3Ql\",\"no\":\"cookiesModal__no__3_AJg\"};\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"dynamicTheaterSentence__container__3OCt_\",\"sentence\":\"dynamicTheaterSentence__sentence__kNp8c\",\"intro\":\"dynamicTheaterSentence__intro__13zGx\",\"theater\":\"dynamicTheaterSentence__theater__15T1W\",\"transitionContainer\":\"dynamicTheaterSentence__transitionContainer__G8T5x\",\"transition\":\"dynamicTheaterSentence__transition__1TpaS\"};\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"exitModal__container__15Go4\",\"title\":\"exitModal__title__36jsu\",\"button\":\"exitModal__button__2Zb9j\"};\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"modalBox\":\"changeRegionModal__modalBox__3MBzE\",\"locationBar\":\"changeRegionModal__locationBar__39Gqg\",\"locationBarTitle\":\"changeRegionModal__locationBarTitle__2xm9o\",\"closeModalButton\":\"changeRegionModal__closeModalButton__2u_5D\",\"contentBox\":\"changeRegionModal__contentBox__12WJK\",\"heading\":\"changeRegionModal__heading__2iLk4\",\"heading2\":\"changeRegionModal__heading2__36HkZ\",\"line\":\"changeRegionModal__line__J3Co8\",\"info\":\"changeRegionModal__info__sqMtC\",\"gotoButtonContainer\":\"changeRegionModal__gotoButtonContainer__3H6ni\",\"gotoButton\":\"changeRegionModal__gotoButton__NjGM7\",\"arrowRight\":\"changeRegionModal__arrowRight__2lRGu\",\"remainLinkBox\":\"changeRegionModal__remainLinkBox__n35ae\",\"remainLink\":\"changeRegionModal__remainLink__qAWJM\"};\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"svgBase\":\"svgIcons__svgBase__qujJH\",\"wrapper\":\"svgIcons__wrapper__xD2Gz\",\"svgIcon\":\"svgIcons__svgIcon__1IK41\",\"svgUserIcon\":\"svgIcons__svgUserIcon__YIrc7 svgIcons__svgIcon__1IK41\",\"svgShareIcon\":\"svgIcons__svgShareIcon__3NAaX svgIcons__svgIcon__1IK41\",\"compass\":\"svgIcons__compass__mWUSD\"};\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Freezer = __webpack_require__(75);\nmodule.exports = Freezer;\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n\r\nvar Utils = __webpack_require__( 13 ),\r\n\tEmitter = __webpack_require__( 23 ),\r\n\tFrozen = __webpack_require__( 76 )\r\n;\r\n\r\n//#build\r\nvar Freezer = function( initialValue, options ) {\r\n\tvar me = this,\r\n\t\tops = options || {},\r\n\t\tstore = {\r\n\t\t\tlive: ops.live || false,\r\n\t\t\tfreezeInstances: ops.freezeInstances || false\r\n\t\t}\r\n\t;\r\n\r\n\t// Immutable data\r\n\tvar frozen;\r\n\tvar pivotTriggers = [], pivotTicking = 0;\r\n\tvar triggerNow = function( node ){\r\n\t\tvar _ = node.__,\r\n\t\t\ti\r\n\t\t;\r\n\r\n\t\tif( _.listener ){\r\n\t\t\tvar prevState = _.listener.prevState || node;\r\n\t\t\t_.listener.prevState = 0;\r\n\t\t\tFrozen.emit( prevState, 'update', node, true );\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < _.parents.length; i++) {\r\n\t\t\t_.store.notify( 'now', _.parents[i] );\r\n\t\t}\r\n\t};\r\n\r\n\tvar addToPivotTriggers = function( node ){\r\n\t\tpivotTriggers.push( node );\r\n\t\tif( !pivotTicking ){\r\n\t\t\tpivotTicking = 1;\r\n\t\t\tUtils.nextTick( function(){\r\n\t\t\t\tpivotTriggers = [];\r\n\t\t\t\tpivotTicking = 0;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t// Last call to display info about orphan calls\r\n\tvar lastCall;\r\n\tstore.notify = function notify( eventName, node, options, name ){\r\n\t\tif( name ){\r\n\t\t\tif( lastCall && !lastCall.onStore ){\r\n\t\t\t\tdetachedWarn( lastCall );\r\n\t\t\t}\r\n\t\t\tlastCall = {name: name, node: node, options: options, onStore: false};\r\n\t\t}\r\n\r\n\t\tif( eventName === 'now' ){\r\n\t\t\tif( pivotTriggers.length ){\r\n\t\t\t\twhile( pivotTriggers.length ){\r\n\t\t\t\t\ttriggerNow( pivotTriggers.shift() );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttriggerNow( node );\r\n\t\t\t}\r\n\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar update = Frozen[eventName]( node, options );\r\n\r\n\t\tif( eventName !== 'pivot' ){\r\n\t\t\tvar pivot = Utils.findPivot( update );\r\n\t\t\tif( pivot ) {\r\n\t\t\t\taddToPivotTriggers( update );\r\n\t  \t\treturn pivot;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn update;\r\n\t};\r\n\r\n\tstore.freezeFn = ops.mutable === true ?\r\n\t\tfunction(){} :\r\n\t\tfunction( obj ){ Object.freeze( obj ); }\r\n\t;\r\n\r\n\t// Create the frozen object\r\n\tfrozen = Frozen.freeze( initialValue, store );\r\n\tfrozen.__.updateRoot = function( prevNode, updated ){\r\n\t\tif( prevNode === frozen ){\r\n\t\t\tfrozen = updated;\r\n\t\t\tif( lastCall ){\r\n\t\t\t\tlastCall.onStore = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if( lastCall ) {\r\n\t\t\tsetTimeout( function(){\r\n\t\t\t\tif( !lastCall.onStore ){\r\n\t\t\t\t\tdetachedWarn( lastCall );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Listen to its changes immediately\r\n\tvar listener = frozen.getListener(),\r\n\t\thub = {}\r\n\t;\r\n\r\n\tUtils.each(['on', 'off', 'once', 'emit', 'trigger'], function( method ){\r\n\t\tvar attrs = {};\r\n\t\tattrs[ method ] = listener[method].bind(listener);\r\n\t\tUtils.addNE( me, attrs );\r\n\t\tUtils.addNE( hub, attrs );\r\n\t});\r\n\r\n\tUtils.addNE( this, {\r\n\t\tget: function(){\r\n\t\t\treturn frozen;\r\n\t\t},\r\n\t\tset: function( node ){\r\n\t\t\tfrozen.reset( node );\r\n\t\t},\r\n\t\tgetEventHub: function(){\r\n\t\t\treturn hub;\r\n\t\t}\r\n\t});\r\n\r\n\tUtils.addNE( this, { getData: this.get, setData: this.set } );\r\n};\r\n\r\nfunction detachedWarn( lastCall ){\r\n\tUtils.warn( false, 'Method ' + lastCall.name + ' called on a detached node.', lastCall.node, lastCall.options );\r\n}\r\n\r\n//#build\r\n\r\nmodule.exports = Freezer;\r\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n\r\nvar Utils = __webpack_require__( 13 ),\r\n\tnodeCreator = __webpack_require__( 77),\r\n\tEmitter = __webpack_require__(23)\r\n;\r\n\r\n//#build\r\nvar Frozen = {\r\n\tfreeze: function( node, store ){\r\n\t\tif( node && node.__ ){\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = nodeCreator.clone(node)\r\n\t\t;\r\n\r\n\t\tUtils.addNE( frozen, { __: {\r\n\t\t\tlistener: false,\r\n\t\t\tparents: [],\r\n\t\t\tstore: store\r\n\t\t}});\r\n\r\n\t\t// Freeze children\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tif( !Utils.isLeaf( child, store.freezeInstances ) ){\r\n\t\t\t\tchild = me.freeze( child, store );\r\n\t\t\t}\r\n\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tstore.freezeFn( frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tmerge: function( node, attrs ){\r\n\t\tvar _ = node.__,\r\n\t\t\ttrans = _.trans,\r\n\r\n\t\t\t// Clone the attrs to not modify the argument\r\n\t\t\tattrs = Utils.extend( {}, attrs)\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\t\t\tfor( var attr in attrs )\r\n\t\t\t\ttrans[ attr ] = attrs[ attr ];\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tstore = _.store,\r\n\t\t\tval, key, isFrozen\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tisFrozen = child && child.__;\r\n\r\n\t\t\tif( isFrozen ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\r\n\t\t\tval = attrs[ key ];\r\n\t\t\tif( !val ){\r\n\t\t\t\tif( isFrozen )\r\n\t\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t\treturn frozen[ key ] = child;\r\n\t\t\t}\r\n\r\n\t\t\tif( !Utils.isLeaf( val, store.freezeInstances ) )\r\n\t\t\t\tval = me.freeze( val, store );\r\n\r\n\t\t\tif( val && val.__ )\r\n\t\t\t\tme.addParent( val, frozen );\r\n\r\n\t\t\tdelete attrs[ key ];\r\n\r\n\t\t\tfrozen[ key ] = val;\r\n\t\t});\r\n\r\n\r\n\t\tfor( key in attrs ) {\r\n\t\t\tval = attrs[ key ];\r\n\r\n\t\t\tif( !Utils.isLeaf( val, store.freezeInstances ) )\r\n\t\t\t\tval = me.freeze( val, store );\r\n\r\n\t\t\tif( val && val.__ )\r\n\t\t\t\tme.addParent( val, frozen );\r\n\r\n\t\t\tfrozen[ key ] = val;\r\n\t\t}\r\n\r\n\t\t_.store.freezeFn( frozen );\r\n\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\treplace: function( node, replacement ) {\r\n\t\tvar me = this,\r\n\t\t\t_ = node.__,\r\n\t\t\tfrozen = replacement\r\n\t\t;\r\n\r\n\t\tif( !Utils.isLeaf( replacement, _.store.freezeInstances ) ) {\r\n\r\n\t\t\tfrozen = me.freeze( replacement, _.store );\r\n\t\t\tfrozen.__.parents = _.parents;\r\n\t\t\tfrozen.__.updateRoot = _.updateRoot;\r\n\r\n\t\t\t// Add the current listener if exists, replacing a\r\n\t\t\t// previous listener in the frozen if existed\r\n\t\t\tif( _.listener )\r\n\t\t\t\tfrozen.__.listener = _.listener;\r\n\t\t}\r\n\t\tif( frozen ){\r\n\t\t\tthis.fixChildren( frozen, node );\r\n\t\t}\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tremove: function( node, attrs ){\r\n\t\tvar trans = node.__.trans;\r\n\t\tif( trans ){\r\n\t\t\tfor( var l = attrs.length - 1; l >= 0; l-- )\r\n\t\t\t\tdelete trans[ attrs[l] ];\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tisFrozen\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tisFrozen = child && child.__;\r\n\r\n\t\t\tif( isFrozen ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\r\n\t\t\tif( attrs.indexOf( key ) !== -1 ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif( isFrozen )\r\n\t\t\t\tme.addParent( child, frozen );\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.store.freezeFn( frozen );\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tsplice: function( node, args ){\r\n\t\tvar _ = node.__,\r\n\t\t\ttrans = _.trans\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\t\t\ttrans.splice.apply( trans, args );\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tindex = args[0],\r\n\t\t\tdeleteIndex = index + args[1],\r\n\t\t\tchild\r\n\t\t;\r\n\r\n\t\t// Clone the array\r\n\t\tUtils.each( node, function( child, i ){\r\n\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\r\n\t\t\t\t// Skip the nodes to delete\r\n\t\t\t\tif( i < index || i>= deleteIndex )\r\n\t\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[i] = child;\r\n\t\t});\r\n\r\n\t\t// Prepare the new nodes\r\n\t\tif( args.length > 1 ){\r\n\t\t\tfor (var i = args.length - 1; i >= 2; i--) {\r\n\t\t\t\tchild = args[i];\r\n\r\n\t\t\t\tif( !Utils.isLeaf( child, _.store.freezeInstances ) )\r\n\t\t\t\t\tchild = this.freeze( child, _.store );\r\n\r\n\t\t\t\tif( child && child.__ )\r\n\t\t\t\t\tthis.addParent( child, frozen );\r\n\r\n\t\t\t\targs[i] = child;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// splice\r\n\t\tArray.prototype.splice.apply( frozen, args );\r\n\r\n\t\t_.store.freezeFn( frozen );\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\ttransact: function( node ) {\r\n\t\tvar me = this,\r\n\t\t\ttransacting = node.__.trans,\r\n\t\t\ttrans\r\n\t\t;\r\n\r\n\t\tif( transacting )\r\n\t\t\treturn transacting;\r\n\r\n\t\ttrans = node.constructor === Array ? [] : {};\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\ttrans[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.trans = trans;\r\n\r\n\t\t// Call run automatically in case\r\n\t\t// the user forgot about it\r\n\t\tUtils.nextTick( function(){\r\n\t\t\tif( node.__.trans )\r\n\t\t\t\tme.run( node );\r\n\t\t});\r\n\r\n\t\treturn trans;\r\n\t},\r\n\r\n\trun: function( node ) {\r\n\t\tvar me = this,\r\n\t\t\ttrans = node.__.trans\r\n\t\t;\r\n\r\n\t\tif( !trans )\r\n\t\t\treturn node;\r\n\r\n\t\t// Remove the node as a parent\r\n\t\tUtils.each( trans, function( child, key ){\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdelete node.__.trans;\r\n\r\n\t\tvar result = this.replace( node, trans );\r\n\t\treturn result;\r\n\t},\r\n\r\n\tpivot: function( node ){\r\n\t\tnode.__.pivot = 1;\r\n\t\tthis.unpivot( node );\r\n\t\treturn node;\r\n\t},\r\n\r\n\tunpivot: function( node ){\r\n\t\tUtils.nextTick( function(){\r\n\t\t\tnode.__.pivot = 0;\r\n\t\t});\r\n\t},\r\n\r\n\trefresh: function( node, oldChild, newChild ){\r\n\t\tvar me = this,\r\n\t\t\ttrans = node.__.trans,\r\n\t\t\tfound = 0\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\r\n\t\t\tUtils.each( trans, function( child, key ){\r\n\t\t\t\tif( found ) return;\r\n\r\n\t\t\t\tif( child === oldChild ){\r\n\r\n\t\t\t\t\ttrans[ key ] = newChild;\r\n\t\t\t\t\tfound = 1;\r\n\r\n\t\t\t\t\tif( newChild && newChild.__ )\r\n\t\t\t\t\t\tme.addParent( newChild, node );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar frozen = this.copyMeta( node ),\r\n\t\t\treplacement, __\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tif( child === oldChild ){\r\n\t\t\t\tchild = newChild;\r\n\t\t\t}\r\n\r\n\t\t\tif( child && (__ = child.__) ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.store.freezeFn( frozen );\r\n\r\n\t\tthis.refreshParents( node, frozen );\r\n\t},\r\n\r\n\tfixChildren: function( node, oldNode ){\r\n\t\tvar me = this;\r\n\t\tUtils.each( node, function( child ){\r\n\t\t\tif( !child || !child.__ )\r\n\t\t\t\treturn;\r\n\r\n\t\t\t// Update parents in all children no matter the child\r\n\t\t\t// is linked to the node or not.\r\n\t\t\tme.fixChildren( child );\r\n\r\n\t\t\tif( child.__.parents.length === 1 )\r\n\t\t\t\treturn child.__.parents = [ node ];\r\n\r\n\t\t\tif( oldNode )\r\n\t\t\t\tme.removeParent( child, oldNode );\r\n\r\n\t\t\tme.addParent( child, node );\r\n\t\t});\r\n\t},\r\n\r\n\tcopyMeta: function( node ){\r\n\t\tvar me = this,\r\n\t\t\tfrozen = nodeCreator.clone( node ),\r\n\t\t\t_ = node.__\r\n\t\t;\r\n\r\n\t\tUtils.addNE( frozen, {__: {\r\n\t\t\tstore: _.store,\r\n\t\t\tupdateRoot: _.updateRoot,\r\n\t\t\tlistener: _.listener,\r\n\t\t\tparents: _.parents.slice( 0 ),\r\n\t\t\ttrans: _.trans,\r\n\t\t\tpivot: _.pivot,\r\n\t\t}});\r\n\r\n\t\tif( _.pivot )\r\n\t\t\tthis.unpivot( frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\trefreshParents: function( oldChild, newChild ){\r\n\t\tvar _ = oldChild.__,\r\n\t\t\tparents = _.parents.length,\r\n\t\t\ti\r\n\t\t;\r\n\r\n\t\tif( oldChild.__.updateRoot ){\r\n\t\t\toldChild.__.updateRoot( oldChild, newChild );\r\n\t\t}\r\n\t\tif( newChild ){\r\n\t\t\tthis.emit( oldChild, 'update', newChild, _.store.live );\r\n\t\t}\r\n\t\tif( parents ){\r\n\t\t\tfor (i = parents - 1; i >= 0; i--) {\r\n\t\t\t\tthis.refresh( _.parents[i], oldChild, newChild );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tremoveParent: function( node, parent ){\r\n\t\tvar parents = node.__.parents,\r\n\t\t\tindex = parents.indexOf( parent )\r\n\t\t;\r\n\r\n\t\tif( index !== -1 ){\r\n\t\t\tparents.splice( index, 1 );\r\n\t\t}\r\n\t},\r\n\r\n\taddParent: function( node, parent ){\r\n\t\tvar parents = node.__.parents,\r\n\t\t\tindex = parents.indexOf( parent )\r\n\t\t;\r\n\r\n\t\tif( index === -1 ){\r\n\t\t\tparents[ parents.length ] = parent;\r\n\t\t}\r\n\t},\r\n\r\n\temit: function( node, eventName, param, now ){\r\n\t\tvar listener = node.__.listener;\r\n\t\tif( !listener )\r\n\t\t\treturn;\r\n\r\n\t\tvar ticking = listener.ticking;\r\n\r\n\t\tif( now ){\r\n\t\t\tif( ticking || param ){\r\n\t\t\t\tlistener.ticking = 0;\r\n\t\t\t\tlistener.emit( eventName, ticking || param, node );\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlistener.ticking = param;\r\n\t\tif( !listener.prevState ){\r\n\t\t\tlistener.prevState = node;\r\n\t\t}\r\n\r\n\t\tif( !ticking ){\r\n\t\t\tUtils.nextTick( function(){\r\n\t\t\t\tif( listener.ticking ){\r\n\t\t\t\t\tvar updated = listener.ticking,\r\n\t\t\t\t\t\tprevState = listener.prevState\r\n\t\t\t\t\t;\r\n\r\n\t\t\t\t\tlistener.ticking = 0;\r\n\t\t\t\t\tlistener.prevState = 0;\r\n\r\n\t\t\t\t\tlistener.emit( eventName, updated, node );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tcreateListener: function( frozen ){\r\n\t\tvar l = frozen.__.listener;\r\n\r\n\t\tif( !l ) {\r\n\t\t\tl = Object.create(Emitter, {\r\n\t\t\t\t_events: {\r\n\t\t\t\t\tvalue: {},\r\n\t\t\t\t\twritable: true\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tfrozen.__.listener = l;\r\n\t\t}\r\n\r\n\t\treturn l;\r\n\t}\r\n};\r\n\r\nnodeCreator.init( Frozen );\r\n//#build\r\n\r\nmodule.exports = Frozen;\r\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Utils = __webpack_require__( 13 );\n\n//#build\nvar nodeCreator = {\n\tinit: function( Frozen ){\n\n\t\tvar commonMethods = {\n\t\t\tset: function( attr, value ){\n\t\t\t\tvar attrs = attr,\n\t\t\t\t\tupdate = this.__.trans,\n\t\t\t\t\tisArray = this.constructor === Array,\n\t\t\t\t\tmsg = 'Freezer arrays only accept numeric attributes, given: '\n\t\t\t\t;\n\n\t\t\t\tif( typeof attr !== 'object' ){\n\t\t\t\t\tif( isArray && parseInt(attr) != attr ){\n\t\t\t\t\t\tUtils.warn( 0, msg + attr );\n\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t\t}\n\t\t\t\t\tattrs = {};\n\t\t\t\t\tattrs[ attr ] = value;\n\t\t\t\t}\n\n\t\t\t\tif( !update ){\n\t\t\t\t\tfor( var key in attrs ){\n\t\t\t\t\t\tif( isArray && parseInt(key) != key ){\n\t\t\t\t\t\t\tUtils.warn( 0, msg + key );\n\t\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate = update || this[ key ] !== attrs[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No changes, just return the node\n\t\t\t\t\tif( !update )\n\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t}\n\n\t\t\t\tvar name = isArray ? 'array.set' : 'object.set';\n\t\t\t\treturn this.__.store.notify( 'merge', this, attrs, name );\n\t\t\t},\n\n\t\t\treset: function( attrs ) {\n\t\t\t\treturn this.__.store.notify( 'replace', this, attrs, 'object.replace' );\n\t\t\t},\n\n\t\t\tgetListener: function(){\n\t\t\t\treturn Frozen.createListener( this );\n\t\t\t},\n\n\t\t\ttoJS: function(){\n\t\t\t\tvar js;\n\t\t\t\tif( this.constructor === Array ){\n\t\t\t\t\tjs = new Array( this.length );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tjs = {};\n\t\t\t\t}\n\n\t\t\t\tUtils.each( this, function( child, i ){\n\t\t\t\t\tif( child && child.__ )\n\t\t\t\t\t\tjs[ i ] = child.toJS();\n\t\t\t\t\telse\n\t\t\t\t\t\tjs[ i ] = child;\n\t\t\t\t});\n\n\t\t\t\treturn js;\n\t\t\t},\n\n\t\t\ttransact: function(){\n\t\t\t\treturn this.__.store.notify( 'transact', this );\n\t\t\t},\n\n\t\t\trun: function(){\n\t\t\t\treturn this.__.store.notify( 'run', this );\n\t\t\t},\n\n\t\t\tnow: function(){\n\t\t\t\treturn this.__.store.notify( 'now', this );\n\t\t\t},\n\n\t\t\tpivot: function(){\n\t\t\t\treturn this.__.store.notify( 'pivot', this );\n\t\t\t}\n\t\t};\n\n\t\tvar arrayMethods = Utils.extend({\n\t\t\tpush: function( el ){\n\t\t\t\treturn this.append( [el], 'array.push' );\n\t\t\t},\n\n\t\t\tappend: function( els, name ){\n\t\t\t\tif( els && els.length )\n\t\t\t\t\treturn this.__.store.notify( 'splice', this, [this.length, 0].concat( els ), name || 'array.append' );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tpop: function(){\n\t\t\t\tif( !this.length )\n\t\t\t\t\treturn this;\n\n\t\t\t\treturn this.__.store.notify( 'splice', this, [this.length -1, 1], 'array.pop' );\n\t\t\t},\n\n\t\t\tunshift: function( el ){\n\t\t\t\treturn this.prepend( [el], 'array.unshift' );\n\t\t\t},\n\n\t\t\tprepend: function( els ){\n\t\t\t\tif( els && els.length )\n\t\t\t\t\treturn this.__.store.notify( 'splice', this, [0, 0].concat( els ), 'array.prepend' );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tshift: function(){\n\t\t\t\tif( !this.length )\n\t\t\t\t\treturn this;\n\n\t\t\t\treturn this.__.store.notify( 'splice', this, [0, 1], 'array.shift' );\n\t\t\t},\n\n\t\t\tsplice: function( index, toRemove, toAdd ){\n\t\t\t\treturn this.__.store.notify( 'splice', this, arguments, 'array.splice' );\n\t\t\t},\n\n\t\t\tsort: function(){\n\t\t\t\tvar mutable = this.slice();\n\t\t\t\tmutable.sort.apply(mutable, arguments);\n\t\t\t\treturn this.__.store.notify( 'replace', this, mutable, 'array.sort' );\n\t\t\t}\n\t\t}, commonMethods );\n\n\t\tvar FrozenArray = Object.create( Array.prototype, Utils.createNE( arrayMethods ) );\n\n\t\tvar objectMethods = Utils.createNE( Utils.extend({\n\t\t\tremove: function( keys ){\n\t\t\t\tvar filtered = [],\n\t\t\t\t\tk = keys\n\t\t\t\t;\n\n\t\t\t\tif( keys.constructor !== Array )\n\t\t\t\t\tk = [ keys ];\n\n\t\t\t\tfor( var i = 0, l = k.length; i<l; i++ ){\n\t\t\t\t\tif( this.hasOwnProperty( k[i] ) )\n\t\t\t\t\t\tfiltered.push( k[i] );\n\t\t\t\t}\n\n\t\t\t\tif( filtered.length )\n\t\t\t\t\treturn this.__.store.notify( 'remove', this, filtered, 'object.remove' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, commonMethods));\n\n\t\tvar FrozenObject = Object.create( Object.prototype, objectMethods );\n\n\t\tvar createArray = (function(){\n\t\t\t// fast version\n\t\t\tif( [].__proto__ )\n\t\t\t\treturn function( length ){\n\t\t\t\t\tvar arr = new Array( length );\n\t\t\t\t\tarr.__proto__ = FrozenArray;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\n\t\t\t// slow version for older browsers\n\t\t\treturn function( length ){\n\t\t\t\tvar arr = new Array( length );\n\n\t\t\t\tfor( var m in arrayMethods ){\n\t\t\t\t\tarr[ m ] = arrayMethods[ m ];\n\t\t\t\t}\n\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t})();\n\n\t\tthis.clone = function( node ){\n\t\t\tvar cons = node.constructor;\n\t\t\tif( cons === Array ){\n\t\t\t\treturn createArray( node.length );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( cons === Object ){\n\t\t\t\t\treturn Object.create( FrozenObject );\n\t\t\t\t}\n\t\t\t\t// Class instances\n\t\t\t\telse {\n\t\t\t\t\treturn Object.create( cons.prototype, objectMethods );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n//#build\n\nmodule.exports = nodeCreator;\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(27);\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    parameterLimit: 1000,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n\n    for (var i = 0; i < parts.length; ++i) {\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder);\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder);\n            val = options.decoder(part.slice(pos + 1), defaults.decoder);\n        }\n        if (has.call(obj, key)) {\n            obj[key] = [].concat(obj[key]).concat(val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n    var leaf = val;\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]') {\n            obj = [];\n            obj = obj.concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys\n        // that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n    options.parseArrays = options.parseArrays !== false;\n    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options);\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(27);\nvar formats = __webpack_require__(26);\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n        return prefix + '[]';\n    },\n    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n        return prefix;\n    }\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    formatter,\n    encodeValuesOnly\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    } else if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (Array.isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        if (Array.isArray(obj)) {\n            values = values.concat(stringify(\n                obj[key],\n                generateArrayPrefix(prefix, key),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        } else {\n            values = values.concat(stringify(\n                obj[key],\n                prefix + (allowDots ? '.' + key : '[' + key + ']'),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        }\n    }\n\n    return values;\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n    var sort = typeof options.sort === 'function' ? options.sort : null;\n    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n    if (typeof options.format === 'undefined') {\n        options.format = formats['default'];\n    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n        throw new TypeError('Unknown format option provided.');\n    }\n    var formatter = formats.formatters[options.format];\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (Array.isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    } else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (sort) {\n        objKeys.sort(sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        keys = keys.concat(stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encode ? encoder : null,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            formatter,\n            encodeValuesOnly\n        ));\n    }\n\n    var joined = keys.join(delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16), __webpack_require__(24)))\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(80);\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// embed.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 36);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f9e5b1775a770d70c741","var VNode = function VNode() {};\n\nvar options = {};\n\nvar stack = [];\n\nvar EMPTY_CHILDREN = [];\n\nfunction h(nodeName, attributes) {\n\tvar children = EMPTY_CHILDREN,\n\t    lastSimple,\n\t    child,\n\t    simple,\n\t    i;\n\tfor (i = arguments.length; i-- > 2;) {\n\t\tstack.push(arguments[i]);\n\t}\n\tif (attributes && attributes.children != null) {\n\t\tif (!stack.length) stack.push(attributes.children);\n\t\tdelete attributes.children;\n\t}\n\twhile (stack.length) {\n\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\tfor (i = child.length; i--;) {\n\t\t\t\tstack.push(child[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t}\n\n\t\t\tif (simple && lastSimple) {\n\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\tchildren = [child];\n\t\t\t} else {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\n\t\t\tlastSimple = simple;\n\t\t}\n\t}\n\n\tvar p = new VNode();\n\tp.nodeName = nodeName;\n\tp.children = children;\n\tp.attributes = attributes == null ? undefined : attributes;\n\tp.key = attributes == null ? undefined : attributes.key;\n\n\tif (options.vnode !== undefined) options.vnode(p);\n\n\treturn p;\n}\n\nfunction extend(obj, props) {\n  for (var i in props) {\n    obj[i] = props[i];\n  }return obj;\n}\n\nvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\nfunction cloneElement(vnode, props) {\n  return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n}\n\nvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\nvar items = [];\n\nfunction enqueueRender(component) {\n\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t(options.debounceRendering || defer)(rerender);\n\t}\n}\n\nfunction rerender() {\n\tvar p,\n\t    list = items;\n\titems = [];\n\twhile (p = list.pop()) {\n\t\tif (p._dirty) renderComponent(p);\n\t}\n}\n\nfunction isSameNodeType(node, vnode, hydrating) {\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\treturn node.splitText !== undefined;\n\t}\n\tif (typeof vnode.nodeName === 'string') {\n\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t}\n\treturn hydrating || node._componentConstructor === vnode.nodeName;\n}\n\nfunction isNamedNode(node, nodeName) {\n\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n}\n\nfunction getNodeProps(vnode) {\n\tvar props = extend({}, vnode.attributes);\n\tprops.children = vnode.children;\n\n\tvar defaultProps = vnode.nodeName.defaultProps;\n\tif (defaultProps !== undefined) {\n\t\tfor (var i in defaultProps) {\n\t\t\tif (props[i] === undefined) {\n\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\nfunction createNode(nodeName, isSvg) {\n\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\tnode.normalizedNodeName = nodeName;\n\treturn node;\n}\n\nfunction removeNode(node) {\n\tvar parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n\nfunction setAccessor(node, name, old, value, isSvg) {\n\tif (name === 'className') name = 'class';\n\n\tif (name === 'key') {} else if (name === 'ref') {\n\t\tif (old) old(null);\n\t\tif (value) value(node);\n\t} else if (name === 'class' && !isSvg) {\n\t\tnode.className = value || '';\n\t} else if (name === 'style') {\n\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\tnode.style.cssText = value || '';\n\t\t}\n\t\tif (value && typeof value === 'object') {\n\t\t\tif (typeof old !== 'string') {\n\t\t\t\tfor (var i in old) {\n\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i in value) {\n\t\t\t\tnode.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];\n\t\t\t}\n\t\t}\n\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\tif (value) node.innerHTML = value.__html || '';\n\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\tname = name.toLowerCase().substring(2);\n\t\tif (value) {\n\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t} else {\n\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t}\n\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\ttry {\n\t\t\tnode[name] = value == null ? '' : value;\n\t\t} catch (e) {}\n\t\tif ((value == null || value === false) && name != 'spellcheck') node.removeAttribute(name);\n\t} else {\n\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''));\n\n\t\tif (value == null || value === false) {\n\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t} else if (typeof value !== 'function') {\n\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t}\n\t}\n}\n\nfunction eventProxy(e) {\n\treturn this._listeners[e.type](options.event && options.event(e) || e);\n}\n\nvar mounts = [];\n\nvar diffLevel = 0;\n\nvar isSvgMode = false;\n\nvar hydrating = false;\n\nfunction flushMounts() {\n\tvar c;\n\twhile (c = mounts.pop()) {\n\t\tif (options.afterMount) options.afterMount(c);\n\t\tif (c.componentDidMount) c.componentDidMount();\n\t}\n}\n\nfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\tif (!diffLevel++) {\n\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\thydrating = dom != null && !('__preactattr_' in dom);\n\t}\n\n\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\tif (! --diffLevel) {\n\t\thydrating = false;\n\n\t\tif (!componentRoot) flushMounts();\n\t}\n\n\treturn ret;\n}\n\nfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\tvar out = dom,\n\t    prevSvgMode = isSvgMode;\n\n\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\tdom.nodeValue = vnode;\n\t\t\t}\n\t\t} else {\n\t\t\tout = document.createTextNode(vnode);\n\t\t\tif (dom) {\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tout['__preactattr_'] = true;\n\n\t\treturn out;\n\t}\n\n\tvar vnodeName = vnode.nodeName;\n\tif (typeof vnodeName === 'function') {\n\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t}\n\n\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\tvnodeName = String(vnodeName);\n\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\tif (dom) {\n\t\t\twhile (dom.firstChild) {\n\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t}\n\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\trecollectNodeTree(dom, true);\n\t\t}\n\t}\n\n\tvar fc = out.firstChild,\n\t    props = out['__preactattr_'],\n\t    vchildren = vnode.children;\n\n\tif (props == null) {\n\t\tprops = out['__preactattr_'] = {};\n\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\tprops[a[i].name] = a[i].value;\n\t\t}\n\t}\n\n\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\tfc.nodeValue = vchildren[0];\n\t\t}\n\t} else if (vchildren && vchildren.length || fc != null) {\n\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t}\n\n\tdiffAttributes(out, vnode.attributes, props);\n\n\tisSvgMode = prevSvgMode;\n\n\treturn out;\n}\n\nfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\tvar originalChildren = dom.childNodes,\n\t    children = [],\n\t    keyed = {},\n\t    keyedLen = 0,\n\t    min = 0,\n\t    len = originalChildren.length,\n\t    childrenLen = 0,\n\t    vlen = vchildren ? vchildren.length : 0,\n\t    j,\n\t    c,\n\t    f,\n\t    vchild,\n\t    child;\n\n\tif (len !== 0) {\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tvar _child = originalChildren[i],\n\t\t\t    props = _child['__preactattr_'],\n\t\t\t    key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\tif (key != null) {\n\t\t\t\tkeyedLen++;\n\t\t\t\tkeyed[key] = _child;\n\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (vlen !== 0) {\n\t\tfor (var i = 0; i < vlen; i++) {\n\t\t\tvchild = vchildren[i];\n\t\t\tchild = null;\n\n\t\t\tvar key = vchild.key;\n\t\t\tif (key != null) {\n\t\t\t\tif (keyedLen && keyed[key] !== undefined) {\n\t\t\t\t\tchild = keyed[key];\n\t\t\t\t\tkeyed[key] = undefined;\n\t\t\t\t\tkeyedLen--;\n\t\t\t\t}\n\t\t\t} else if (min < childrenLen) {\n\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\tf = originalChildren[i];\n\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\tif (f == null) {\n\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\tremoveNode(f);\n\t\t\t\t} else {\n\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (keyedLen) {\n\t\tfor (var i in keyed) {\n\t\t\tif (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);\n\t\t}\n\t}\n\n\twhile (min <= childrenLen) {\n\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t}\n}\n\nfunction recollectNodeTree(node, unmountOnly) {\n\tvar component = node._component;\n\tif (component) {\n\t\tunmountComponent(component);\n\t} else {\n\t\tif (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);\n\n\t\tif (unmountOnly === false || node['__preactattr_'] == null) {\n\t\t\tremoveNode(node);\n\t\t}\n\n\t\tremoveChildren(node);\n\t}\n}\n\nfunction removeChildren(node) {\n\tnode = node.lastChild;\n\twhile (node) {\n\t\tvar next = node.previousSibling;\n\t\trecollectNodeTree(node, true);\n\t\tnode = next;\n\t}\n}\n\nfunction diffAttributes(dom, attrs, old) {\n\tvar name;\n\n\tfor (name in old) {\n\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t}\n\t}\n\n\tfor (name in attrs) {\n\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t}\n\t}\n}\n\nvar recyclerComponents = [];\n\nfunction createComponent(Ctor, props, context) {\n\tvar inst,\n\t    i = recyclerComponents.length;\n\n\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\tinst = new Ctor(props, context);\n\t\tComponent.call(inst, props, context);\n\t} else {\n\t\tinst = new Component(props, context);\n\t\tinst.constructor = Ctor;\n\t\tinst.render = doRender;\n\t}\n\n\twhile (i--) {\n\t\tif (recyclerComponents[i].constructor === Ctor) {\n\t\t\tinst.nextBase = recyclerComponents[i].nextBase;\n\t\t\trecyclerComponents.splice(i, 1);\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\treturn inst;\n}\n\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n\nfunction setComponentProps(component, props, renderMode, context, mountAll) {\n\tif (component._disable) return;\n\tcomponent._disable = true;\n\n\tcomponent.__ref = props.ref;\n\tcomponent.__key = props.key;\n\tdelete props.ref;\n\tdelete props.key;\n\n\tif (typeof component.constructor.getDerivedStateFromProps === 'undefined') {\n\t\tif (!component.base || mountAll) {\n\t\t\tif (component.componentWillMount) component.componentWillMount();\n\t\t} else if (component.componentWillReceiveProps) {\n\t\t\tcomponent.componentWillReceiveProps(props, context);\n\t\t}\n\t}\n\n\tif (context && context !== component.context) {\n\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\tcomponent.context = context;\n\t}\n\n\tif (!component.prevProps) component.prevProps = component.props;\n\tcomponent.props = props;\n\n\tcomponent._disable = false;\n\n\tif (renderMode !== 0) {\n\t\tif (renderMode === 1 || options.syncComponentUpdates !== false || !component.base) {\n\t\t\trenderComponent(component, 1, mountAll);\n\t\t} else {\n\t\t\tenqueueRender(component);\n\t\t}\n\t}\n\n\tif (component.__ref) component.__ref(component);\n}\n\nfunction renderComponent(component, renderMode, mountAll, isChild) {\n\tif (component._disable) return;\n\n\tvar props = component.props,\n\t    state = component.state,\n\t    context = component.context,\n\t    previousProps = component.prevProps || props,\n\t    previousState = component.prevState || state,\n\t    previousContext = component.prevContext || context,\n\t    isUpdate = component.base,\n\t    nextBase = component.nextBase,\n\t    initialBase = isUpdate || nextBase,\n\t    initialChildComponent = component._component,\n\t    skip = false,\n\t    snapshot = previousContext,\n\t    rendered,\n\t    inst,\n\t    cbase;\n\n\tif (component.constructor.getDerivedStateFromProps) {\n\t\tstate = extend(extend({}, state), component.constructor.getDerivedStateFromProps(props, state));\n\t\tcomponent.state = state;\n\t}\n\n\tif (isUpdate) {\n\t\tcomponent.props = previousProps;\n\t\tcomponent.state = previousState;\n\t\tcomponent.context = previousContext;\n\t\tif (renderMode !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\tskip = true;\n\t\t} else if (component.componentWillUpdate) {\n\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t}\n\t\tcomponent.props = props;\n\t\tcomponent.state = state;\n\t\tcomponent.context = context;\n\t}\n\n\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\tcomponent._dirty = false;\n\n\tif (!skip) {\n\t\trendered = component.render(props, state, context);\n\n\t\tif (component.getChildContext) {\n\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t}\n\n\t\tif (isUpdate && component.getSnapshotBeforeUpdate) {\n\t\t\tsnapshot = component.getSnapshotBeforeUpdate(previousProps, previousState);\n\t\t}\n\n\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t    toUnmount,\n\t\t    base;\n\n\t\tif (typeof childComponent === 'function') {\n\n\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\tinst = initialChildComponent;\n\n\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\tsetComponentProps(inst, childProps, 1, context, false);\n\t\t\t} else {\n\t\t\t\ttoUnmount = inst;\n\n\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\tinst._parentComponent = component;\n\t\t\t\tsetComponentProps(inst, childProps, 0, context, false);\n\t\t\t\trenderComponent(inst, 1, mountAll, true);\n\t\t\t}\n\n\t\t\tbase = inst.base;\n\t\t} else {\n\t\t\tcbase = initialBase;\n\n\t\t\ttoUnmount = initialChildComponent;\n\t\t\tif (toUnmount) {\n\t\t\t\tcbase = component._component = null;\n\t\t\t}\n\n\t\t\tif (initialBase || renderMode === 1) {\n\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t}\n\t\t}\n\n\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\tif (!toUnmount) {\n\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (toUnmount) {\n\t\t\tunmountComponent(toUnmount);\n\t\t}\n\n\t\tcomponent.base = base;\n\t\tif (base && !isChild) {\n\t\t\tvar componentRef = component,\n\t\t\t    t = component;\n\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t(componentRef = t).base = base;\n\t\t\t}\n\t\t\tbase._component = componentRef;\n\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t}\n\t}\n\n\tif (!isUpdate || mountAll) {\n\t\tmounts.unshift(component);\n\t} else if (!skip) {\n\n\t\tif (component.componentDidUpdate) {\n\t\t\tcomponent.componentDidUpdate(previousProps, previousState, snapshot);\n\t\t}\n\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t}\n\n\twhile (component._renderCallbacks.length) {\n\t\tcomponent._renderCallbacks.pop().call(component);\n\t}if (!diffLevel && !isChild) flushMounts();\n}\n\nfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\tvar c = dom && dom._component,\n\t    originalComponent = c,\n\t    oldDom = dom,\n\t    isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t    isOwner = isDirectOwner,\n\t    props = getNodeProps(vnode);\n\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\tisOwner = c.constructor === vnode.nodeName;\n\t}\n\n\tif (c && isOwner && (!mountAll || c._component)) {\n\t\tsetComponentProps(c, props, 3, context, mountAll);\n\t\tdom = c.base;\n\t} else {\n\t\tif (originalComponent && !isDirectOwner) {\n\t\t\tunmountComponent(originalComponent);\n\t\t\tdom = oldDom = null;\n\t\t}\n\n\t\tc = createComponent(vnode.nodeName, props, context);\n\t\tif (dom && !c.nextBase) {\n\t\t\tc.nextBase = dom;\n\n\t\t\toldDom = null;\n\t\t}\n\t\tsetComponentProps(c, props, 1, context, mountAll);\n\t\tdom = c.base;\n\n\t\tif (oldDom && dom !== oldDom) {\n\t\t\toldDom._component = null;\n\t\t\trecollectNodeTree(oldDom, false);\n\t\t}\n\t}\n\n\treturn dom;\n}\n\nfunction unmountComponent(component) {\n\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\tvar base = component.base;\n\n\tcomponent._disable = true;\n\n\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\tcomponent.base = null;\n\n\tvar inner = component._component;\n\tif (inner) {\n\t\tunmountComponent(inner);\n\t} else if (base) {\n\t\tif (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);\n\n\t\tcomponent.nextBase = base;\n\n\t\tremoveNode(base);\n\t\trecyclerComponents.push(component);\n\n\t\tremoveChildren(base);\n\t}\n\n\tif (component.__ref) component.__ref(null);\n}\n\nfunction Component(props, context) {\n\tthis._dirty = true;\n\n\tthis.context = context;\n\n\tthis.props = props;\n\n\tthis.state = this.state || {};\n\n\tthis._renderCallbacks = [];\n}\n\nextend(Component.prototype, {\n\tsetState: function setState(state, callback) {\n\t\tif (!this.prevState) this.prevState = this.state;\n\t\tthis.state = extend(extend({}, this.state), typeof state === 'function' ? state(this.state, this.props) : state);\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t},\n\tforceUpdate: function forceUpdate(callback) {\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\trenderComponent(this, 2);\n\t},\n\trender: function render() {}\n});\n\nfunction render(vnode, parent, merge) {\n  return diff(merge, vnode, {}, false, parent, false);\n}\n\nvar preact = {\n\th: h,\n\tcreateElement: h,\n\tcloneElement: cloneElement,\n\tComponent: Component,\n\trender: render,\n\trerender: rerender,\n\toptions: options\n};\n\nexport default preact;\nexport { h, h as createElement, cloneElement, Component, render, rerender, options };\n//# sourceMappingURL=preact.mjs.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/preact/dist/preact.mjs\n// module id = 0\n// module chunks = 0","import Freezer from \"freezer-js\";\n\nconst Store = new Freezer(\n\t{},\n\t{\n\t\t// live: true\n\t}\n);\n\nStore.on('afterAll', function(reactionName) {\n\t// UNCOMMENT THIS TO LOG EVENTS\n\t//   PLEASE COMMENT BACK BEFORE PUSHING\n\t// console.log(...arguments);\n\n\tif (reactionName === 'update') {\n\t\treturn;\n\t}\n\tdispatch(reactionName);\n});\n\n\nStore.on(undefined, () => {\n\t// console.trace();\n\tthrow new Error('Undefined action! Please define your actions!');\n});\n\nconst getIEVersion = (function() {\n\tfunction getVersion() {\n\t\tif (typeof window === 'undefined' || !window.navigator) {\n\t\t\treturn 0;\n\t\t}\n\t\tlet ua = window.navigator.userAgent;\n\t\tlet ieIndex = ua.indexOf('MSIE');\n\n\t\t// If IE, return version number\n\t\tif (ieIndex >= 0) {\n\t\t\treturn parseInt(ua.slice(ieIndex + 5));\n\t\t}\n\t\t// Look for IE 11 updated user agent string\n\t\tif (/Trident\\/7\\./.test(ua)) {\n\t\t\treturn 11;\n\t\t}\n\t\t// Not IE\n\t\treturn 0;\n\t}\n\n\tlet cached = null;\n\treturn () => cached === null ? (cached = getVersion()) : cached;\n})();\n\nfunction dispatch(eventName) {\n\t// Only dispatch events on window for non-ie browsers (???)\n\tif (typeof window === 'undefined' || getIEVersion()) {\n\t\treturn;\n\t}\n\tconst event = new Event(eventName);\n\twindow.dispatchEvent(event);\n}\n\nif (typeof window !== 'undefined') {\n\twindow.Store = Store;\n\tdispatch('NEW_STORE');\n}\n\nexport default Store;\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/store.js","import { h } from 'preact';\n\n// Make a function only called once per frame max (useful for events triggered a lot, like resize)\n// THIS IS ACTUALLY THROTTLING AND NOT DEBOUNCING (we should rename that)\nfunction debounce(f, precall) {\n\tlet waiting = false;\n\tlet args = [];\n\tlet that = null;\n\tfunction trigger() { waiting = false; f.apply(that, args); }\n\tlet onEvent = function () {\n\t\tif (waiting) return;\n\t\twaiting = true;\n\t\targs = arguments;\n\t\tthat = this;\n\t\trequestAnimationFrame(trigger);\n\t};\n\tif (precall) f.apply(this, [].slice.call(arguments, 2));\n\treturn onEvent;\n}\n\n// Actual debouncing\nfunction dbounce(f, d) {\n\tif (d == undefined) d = 250;\n\tlet timer = null, args = [], thisArg = null;\n\tfunction trigger() { f.apply(thisArg, args); }\n\tfunction onEvent() {\n\t\tthisArg = this;\n\t\targs = [].slice.call(arguments);\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(trigger, d);\n\t}\n\treturn onEvent;\n}\n\n// Other throttling with custom timing\nfunction throttle(fn, threshhold, scope) {\n\tif (threshhold == undefined) threshhold = 250;\n\tlet last;\n\tlet deferTimer;\n\treturn function () {\n\t\tlet context = scope || this;\n\n\t\tlet now = +new Date;\n\t\tlet args = arguments;\n\t\tif (last && now < last + threshhold) {\n\t\t\t// hold on to it\n\t\t\tclearTimeout(deferTimer);\n\t\t\tdeferTimer = setTimeout(function () {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply(context, args);\n\t\t\t}, threshhold);\n\t\t} else {\n\t\t\tlast = now;\n\t\t\tfn.apply(context, args);\n\t\t}\n\t};\n}\n\n// Make a function only callable once\n// Saves the return value and returns it for subsequent calls\nfunction once(f) {\n\tlet done = false;\n\tlet result;\n\treturn function () {\n\t\tif (done) return result;\n\t\tdone = true;\n\t\treturn result = f.apply(this, arguments);\n\t};\n}\n\n// DOM classNames handling\n\n// Long versions accepting arrays\n// function hasClass(elem, className) {\n// \tif (!elem || !className) return false;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.every(cn=>hasClass(elem, cn));\n// \tclassName = arr[0];\n// \treturn (' ' + elem.className + ' ').indexOf(' ' + className + ' ') !== -1;\n// }\n// function addClass(elem, className) {\n// \tif (!elem || !className) return;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.forEach(cn=>addClass(elem, cn));\n// \tclassName = arr[0];\n// \tif(!hasClass(elem, className))\n// \t\telem.className += ' ' + className;\n// }\n// function removeClass(elem, className) {\n// \tif (!elem || !className) return;\n// \tlet arr = Array.isArray(className) ? className : className.split(' ');\n// \tif(arr.length > 1) return arr.forEach(cn=>removeClass(elem, cn));\n// \tclassName = arr[0];\n// \tif(hasClass(elem, className))\n// \t\telem.className = (' ' + elem.className + ' ').replace(className, ' ').slice(1,-1);\n// }\n// function toggleClass(e,c) { (hasClass(e,c) ? removeClass : addClass)(e,c); }\n\n// Short versions\nfunction hasClass(e, c) { return (' ' + e.className + ' ').indexOf(' ' + c + ' ') !== -1; }\nfunction addClass(e, c) { if (!hasClass(e, c)) e.className += (e.className ? ' ' : '') + c; }\n// function removeClass(e, c) { e.className = e.className.split(' ').filter(v => v != c).join(' '); }\nfunction removeClass(e, c) { e.className = (' ' + e.className + ' ').replace(' ' + c + ' ', ' ').slice(1, -1); }\nfunction triggerAnim(e, c) { removeClass(e, c); e.offsetWidth; addClass(e, c); }\nfunction toggleClass(e, c) { (hasClass(e, c) ? removeClass : addClass)(e, c); }\n\n// Easy way to add a class based on a condition (also check the class exists)\nfunction condClass(cond, className) {\n\tif (arguments.length === 1) {\n\t\tclassName = cond;\n\t\tcond = true;\n\t}\n\tif (Array.isArray(className)) return className.map(cn => condClass(cond, cn)).join('');\n\treturn cond && className && typeof className === 'string' ? ' ' + className : '';\n}\n\n/**\n * Join several classes together.\n *\n * @example\n * joinClasses('square', 'blue', false && 'active');\n * // returns 'square blue'\n * @param {...string} classNames - the class names to join\n * @return {string} the full class name\n */\nfunction joinClasses() {\n\treturn [].concat.apply([], arguments).filter(e => e).join(' ');\n}\n\n// Clamp a value between two bounds\nfunction clamp(v, min, max) { return v > min ? v < max ? v : max : min; }\n\n// Access to a property of a nested object, or return a default value if the path cannot be accessed\n// For example, if obj is { nested: { property : [ 'hello' ] } }\n// to get 'hello', path would need to be 'nested.property.0' or ['nested', 'property', 0]\n// if we use 'non.existing.path' as a path, it would return def\nfunction accessNested(obj, path, def) {\n\tif (typeof path === 'string') path = path.split('.');\n\tif (!Array.isArray(path)) return def; // Path is not an array\n\tif (!path.length) return obj;\n\tlet prop = path[0];\n\tif (obj && obj.hasOwnProperty(prop)) return accessNested(obj[prop], path.slice(1), def);\n\treturn def;\n}\n// mini version with less checks for console one-liners:\n// var n=(o,p,k)=>(o&&(p=p.split?p.split('.'):p).length)?n(o[p.shift()],p):o;\n\n// Used for example with appData.pages.showtimes.data.stuff, when you can specify either one or a lsit of values\n// if an array, returns it\n// if a string (e.g. 'hello'), returns ['hello']\n// if an object (e.g. {1: 'abc', 2: 'def'}) returns ['abc', 'def']\n// if an object of booleans (e.g. {abc: true, def: true, ghi: false}) returns ['abc', 'def']\n// Also removes falsy values (i.e. disabled items)\nfunction asList(value) {\n\tif (!value) return [];\n\tif (typeof value !== 'object') return [value];\n\tif (!Array.isArray(value)) value = Object.keys(value).map(k => typeof value[k] === 'boolean' ? value[k] && k : value[k]);\n\treturn value.filter(e => e);\n}\n\n/* ---- ARRAY STUFF ---- */\n\n// Returns an array with only unique values (remove duplicates)\nfunction arrayUnique(array) {\n\t// Move to sets when widely available : return [...new Set(array)];\n\tif (!array || !Array.isArray(array)) return array;\n\treturn array.reduce((result, elem) => {\n\t\tif (result.indexOf(elem) === -1) result.push(elem);\n\t\treturn result;\n\t}, []);\n}\n\n// Returns the union of a set of arrays ([1,2,3], [2,3,4] => [1,2,3,4])\nfunction arrayUnion(/* array1, array2, ... */) {\n\treturn arrayUnique([].concat.apply([], arguments));\n}\n\n/* ---- ----------- ---- */\n\n// Return a date based on a date set in thundr\n// If a number, consider it a timestamp\n// If a string yyyy-MM-dd, get the beginning of this day in local time (usually release dates for example are local)\n// If something else tries new Date(val)\nfunction appDataDate(val) {\n\tif (typeof val === 'number') {\n\t\treturn new Date(val);\n\t}\n\tif (typeof val === 'string') {\n\t\tif (!isNaN(val)) return new Date(+val);\n\t\telse {\n\t\t\tlet m = val.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\n\t\t\treturn m ? new Date(+m[1], +m[2], +m[3]) : new Date(val);\n\t\t}\n\t}\n\treturn new Date(NaN);\n}\n\n\n// function sortObjectByOrder(object, mapCallback, property) {\n//\n// \tif (!object) {\n// \t\treturn;\n// \t}\n// \tproperty = property || 'order';\n//\n// \tlet getProperty = typeof property === 'function' ? property : obj => obj[property];\n//\n// \tlet objectByOrder = Object.keys(object).map(k => ({ key: k, value: object[k] })).sort((obj1, obj2) => {\n// \t\tif (!obj1.value) return 1;\n// \t\tif (!obj2.value) return -1;\n//\n// \t\tlet prop1 = accessNested(obj1.value, property);\n// \t\tlet prop2 = accessNested(obj2.value, property);\n//\n//\n// \t\tif (prop1 == undefined) return 1;\n// \t\tif (prop2 == undefined) return -1;\n//\n// \t\tprop1 = parseInt(prop1) || prop1;\n// \t\tprop2 = parseInt(prop2) || prop2;\n//\n// \t\tif(prop1 < prop2)  return -1;\n// \t\telse if(prop1 > prop2) return 1;\n// \t\telse                   return 0;\n// \t});\n//\n// \tif (typeof mapCallback !== 'function') {\n// \t\tmapCallback = value => value;\n// \t}\n// \treturn objectByOrder.map(el => mapCallback(el.value, el.key));\n// }\n\nfunction sortObjectByOrder(object, mapCallback, property) {\n\tif (!object) {\n\t\treturn [];\n\t}\n\tproperty = property || 'order';\n\tlet getProperty = typeof property === 'function' ? property : obj => obj[property];\n\n\tlet objectByOrder = Object.keys(object).map(k => ({ key: k, value: object[k] })).sort((obj1, obj2) => {\n\t\tif (!obj1.value) return 1;\n\t\tif (!obj2.value) return -1;\n\n\t\tlet prop1 = getProperty(obj1.value, obj1.key);\n\t\tlet prop2 = getProperty(obj2.value, obj2.key);\n\t\tlet noProp1 = prop1 == undefined;\n\t\tlet noProp2 = prop2 == undefined;\n\t\t// If both don't have an order set, sort them by keys (so that it works with 1, 2, etc.)\n\t\tif (noProp1 && noProp2) return obj1.key.localeCompare(obj2.key, undefined, { numeric: true });\n\t\tif (noProp1) return 1;\n\t\tif (noProp2) return -1;\n\n\t\tlet stringCompare = isNaN(prop1) || isNaN(prop2);\n\t\t// sort them by order\n\t\treturn stringCompare ? prop1.toString().localeCompare(prop2.toString()) : prop1 - prop2;\n\t});\n\n\tif (typeof mapCallback !== 'function') {\n\t\tmapCallback = value => value;\n\t}\n\treturn objectByOrder.map(el => mapCallback(el.value, el.key));\n}\n\nfunction addToQuery(q, path, o) {\n\tif (o == null) {\n\t\treturn q;\n\t}\n\tif (typeof o !== 'object') {\n\t\treturn q[path] = o;\n\t}\n\tconst ks = Object.keys(o);\n\tks.forEach(k => addToQuery(q, path + '[' + k + ']', o[k]));\n\treturn q;\n}\nfunction toQueryString(obj) {\n\tif (!obj) return '';\n\tlet value = obj;\n\tif (typeof obj !== 'string') {\n\t\tlet query = {};\n\t\tObject.keys(obj).forEach(key => addToQuery(query, key, obj[key]));\n\t\tvalue = Object.keys(query).reduce((a, k) => {\n\t\t\tlet v = query[k];\n\t\t\tif (v == null) return a;\n\t\t\tlet addedVal = encodeURIComponent(k);\n\t\t\tif (typeof v !== 'boolean' && v !== '') {\n\t\t\t\taddedVal += '=' + encodeURIComponent(v);\n\t\t\t}\n\t\t\ta.push(addedVal);\n\t\t\treturn a;\n\t\t}, []).join('&');\n\t}\n\treturn value ? '?' + value : '';\n}\n\n/**\n * Make an object with all the paths that exist in the given object and\n * specifying where they are coming from\n * @param\t{Object} obj - The base object that it will compare to\n * @param\t{Array} options - array of different object which it will use to compare to, to match with the base object\n */\nfunction defaultLevelsDeep(obj, options) {\n\t// NOTE: Options Structure [{title:'TITLE|STRING|', object:DATA|OBJECT|},...];\n\tlet objPaths = {};\n\tcreateObjectPathDeep(obj, objPaths, options);\n\treturn objPaths;\n}\n\nfunction createObjectPathDeep(obj, pathsObj, optionsRef, path = '') {\n\tlet options = optionsRef.slice();\n\tObject.keys(obj).map((key) => {\n\t\tlet newPath = `${path}${key}.`;\n\t\tlet newOptions = options.filter((option) => {\n\t\t\treturn option.object && option.object.hasOwnProperty(key);\n\t\t});\n\n\t\tif (typeof obj[key] === 'object' && obj[key] !== null) {\n\t\t\tlet newOptionsTest = newOptions.map(option => {\n\t\t\t\tlet newOption = Object.create(option);\n\t\t\t\tnewOption.object = option.object[key];\n\t\t\t\tnewOption.title = option.title;\n\t\t\t\treturn newOption;\n\t\t\t});\n\n\t\t\tcreateObjectPathDeep(obj[key],pathsObj,newOptionsTest, newPath);\n\t\t}\n\t\tlet levels = [];\n\t\tif (newOptions.length > 0) {\n\t\t\tnewOptions.forEach((option) => {\n\t\t\t\tlevels.push(option.title);\n\t\t\t});\n\t\t}\n\n\t\tpathsObj[newPath] = levels;\n\n\t\treturn key;\n\t});\n}\n\n/**\n * Delete all the null properties in a specified object\n * @param  {Object} defaults - the object that needs to be filtered\n * @param  {Boolean} recurse - does it need to keep looking\n */\nfunction deleteNulls(defaults, recurse) {\n\tfor (let i in defaults) {\n\t\tif (defaults[i] === null) {\n\t\t\tdelete defaults[i];\n\t\t} else if (recurse && typeof defaults[i] === 'object') {\n\t\t\tdeleteNulls(defaults[i], recurse);\n\t\t}\n\t}\n}\n\n// Replace the content in a VNode by some other VNode\n// for example, to put 'cat' in bold\n// let result = replaceWithVNode(<div>I love my cat, he is the best</div>, 'cat', <b>cat</b>);\n// - OR (works with regexp and callback functions) -\n// let result = replaceWithVNode(<div>My cat ♥ your dog</div>, /\\b(cat|dog)\\b/g, match => <b>{match[1]}</b>);\n// /!\\ changes the src object (and returns it) !\n// Count is used to prevent infinite recursion, do not specify it for your initial call\nfunction replaceWithVNode(src, search, replace, count) {\n\tif (!src || !search) return src;\n\t// Check input\n\tcount = (+count || 0) + 1;\n\t// Prevent deep recursion ?\n\tif (count > 20) return src;\n\tsearch = _toRegexp(search);\n\tlet replaceFunc = replace;\n\tif (typeof replace !== 'function') replaceFunc = () => replace;\n\t// Array\n\tif (Array.isArray(src)) {\n\t\treturn src.reduce((arr, elem) => arr.concat(replaceWithVNode(elem, search, replace, count)), []);\n\t}\n\t// VNode\n\tif (typeof src === 'object' && src.children) {\n\t\tsrc.children = src.children.reduce((arr, child) => arr.concat(replaceWithVNode(child, search, replace, count)), []);\n\t\treturn src;\n\t}\n\t// Make sure to cast to string\n\tsrc = src + '';\n\tlet length, result = [];\n\tlet cPos = 0, found;\n\twhile (found = search.exec(src)) { // eslint-disable-line no-cond-assign\n\t\tresult.push(src.slice(cPos, found.index), replaceFunc(found));\n\t\tcPos = found.index + found[0].length;\n\t\t// The regex is not global, stop at the first match (otherwise inifnite loop - stays on the same match when doing exec multiple times)\n\t\tif (!search.global) break;\n\t}\n\t// No match at all, just return the source instead of an array containing the source\n\tif (!result.length) return src;\n\t// Don't forget the part between the end of the last match and the end of the string\n\tresult.push(src.slice(cPos));\n\treturn result;\n}\n// Utility for replaceWithVNode (changes a string to regexp, with escaped special chars : '(cat|dog)' matches that literally instead of cat OR dog)\nfunction _toRegexp(s) {\n\tif (s instanceof RegExp) return s;\n\treturn new RegExp((s + '').replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'g'); // eslint-disable-line no-useless-escape\n}\n\nlet _classCheck = (el, attr, val) => el.attributes && ~(' ' + (el.attributes.class || el.attributes.className || '') + ' ').indexOf(' ' + val + ' ');\nlet _attributeCheck = (el, attr, val) => attr ? el.attributes && (val ? el.attributes[attr] == val : el.attributes.hasOwnProperty(attr)) : (val ? val === '*' || el.nodeName === val : false);\nfunction _matchSelector(node, selector) {\n\tif (!node) return false;\n\treturn selector.every(s => {\n\t\tlet attr = undefined, val = undefined, fn = _attributeCheck;\n\t\tif (s[0] === '.') fn = _classCheck, val = s.slice(1);\n\t\telse if (s[0] === '#') attr = 'id', val = s.slice(1);\n\t\telse if (s[0] === '[') {\n\t\t\tlet match = s.match(/^\\[([^=]+)(=(['\"]?)(.+)\\3)?\\]$/);\n\t\t\tif (match) attr = match[1], val = match[4];\n\t\t} else val = s;\n\t\treturn fn(node, attr, val);\n\t});\n}\n\n// Return the subelement matching the selector\n// - node: VNode in which to perform the search (for example <div class=\"myElement\"><input id=\"val\" disabled /></div>)\n// - selector: CSS-like selector for the element you want to find\n// - asPath: if true returns the path to access the match (as an array of strings), instead of returning the matching element itself. Can be used in accessNested. (e.g. ['children', '2', 'children', '1'])\n// - direct/currentPath/childrenOffset : Internal use\n// Supported selector things :\n// - + (adjacent)\n// - ~ (sibling)\n// -   (space ; descendant)\n// - > (direct child)\n// - .class\n// - #id\n// - [attribute]\n// - [attribute=\"value\"]\nfunction findInVNode(node, selector, asPath, direct, currentPath, childrenOffset) {\n\t// if(!node) return;\n\tcurrentPath = currentPath || [];\n\tlet parts = selector;\n\tif (!Array.isArray(selector)) parts = (selector || '').split(/\\s*(\\+|>|~|\\s)\\s*/g);\n\tif (!parts[0]) return undefined;\n\n\n\tlet sel = parts[0].split(/(\\[[^\\]]+\\]|[.#]?[^.#\\[]+)/g).filter(e => e); // eslint-disable-line no-useless-escape\n\tlet srcIsArray = Array.isArray(node);\n\tif (!srcIsArray) node = [node];\n\tfor (let i = 0, l = node.length; i < l; i++) {\n\t\tlet el = node[i];\n\t\tif (!el) continue;\n\t\tlet nextNodes, nextSelector = parts, nextPath = currentPath.slice();\n\t\tlet nextOffset = 0;\n\t\tif (srcIsArray) nextPath.push(i + (childrenOffset || 0));\n\t\tif (_matchSelector(el, sel)) {\n\t\t\tif (parts.length < 2) {\n\t\t\t\tif (asPath) {\n\t\t\t\t\tif (srcIsArray) currentPath.push(i + (childrenOffset || 0));\n\t\t\t\t\t// return currentPath.join('.');\n\t\t\t\t\treturn currentPath;\n\t\t\t\t}\n\t\t\t\treturn el;\n\t\t\t}\n\t\t\tnextNodes = el.children;\n\t\t\tnextPath.push('children');\n\t\t\tdirect = false;\n\t\t\tlet inter = parts[1];\n\t\t\tif (inter === '>') {\n\t\t\t\tdirect = true;\n\t\t\t} else if (inter === '~' || inter === '+') {\n\t\t\t\tnextNodes = inter === '+' ? node.slice(i + 1, i + 2) : node.slice(i + 1);\n\t\t\t\tnextPath = currentPath.slice();\n\t\t\t\tnextOffset = (childrenOffset || 0) + i + 1;\n\t\t\t\tdirect = true;\n\t\t\t}\n\t\t\tnextSelector = parts.slice(2);\n\t\t} else if (!direct && el.children) {\n\t\t\tnextNodes = el.children;\n\t\t\tnextPath.push('children');\n\t\t}\n\t\tif (nextNodes) {\n\t\t\tlet nextResult = findInVNode(nextNodes, nextSelector, asPath, direct, nextPath, nextOffset);\n\t\t\tif (nextResult) {\n\t\t\t\treturn nextResult;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Parse dates in a few formats (e.g. dd/mm/yyyy ; yyyy-mm-dd)\nfunction parseDate(d) {\n\tif (!d || d instanceof Date) return d;\n\tif (typeof d === 'number') return new Date(d);\n\tif (typeof d !== 'string') return undefined;\n\tlet match = d.match(/^(?:(?:([0-9]{1,2})\\/)?([0-9]{1,2})\\/)?([0-9]{4})$/);\n\tif (match) return new Date(+match[3], +(match[2] || 1) - 1, +(match[1] || 1));\n\t// Handled be new Date(string) but depends on timezone so we need to handle that \"manually\" as well\n\t// Because it gives an UTC date and we want to be able to use getDate() instead of getUTCDate()\n\tmatch = d.match(/^(\\d{1,4})-(\\d{1,2})(?:-(\\d{1,2})(T\\d{1,2}:\\d{1,2}:\\d{1,2}(\\.\\d+)?Z?)?)?$/);\n\tif (match) return new Date(+match[1], +match[2] - 1, +(match[3] || 1));\n\tif (!Number.isNaN(+d)) return new Date(+d);\n\tconst date = new Date(d);\n\treturn isNaN(date) ? undefined : date;\n}\n\n/**\n * Join several parts of a path together.\n *\n * @example\n * // returns 'http://myserver.com/images/title.jpg'\n * joinPaths('http://myserver.com', 'images', '/title.jpg');\n * @param {...string} parts - the path parts to join\n * @return {string} the final path containing all the parts\n */\nfunction joinPaths() {\n\tlet path = '';\n\tlet slash = false; // whether slash is needed before\n\tfor (let i = 0, il = arguments.length; i < il; i++) {\n\t\tlet part = arguments[i];\n\t\tif (!part) continue;\n\t\t// ^ ensure empty string is not counted as a path part\n\t\tif (i > 0 && part.charAt(0) === '/') {\n\t\t\tpart = part.substring(1);\n\t\t}\n\t\tpath += slash ? '/' + part : part;\n\t\tslash = path.charAt(path.length - 1) !== '/';\n\t}\n\treturn path;\n}\n\n/**\n * Generate handlers based on a key.\n * Created handlers are cached to avoid re-creating handlers when a React\n * component is updated.\n *\n * @example\n * // in the constructor()\n * this.buttonClicks = new BindFactory(this.handleClick, this);\n * // in the render()\n * <li key={i} onClick={this.buttonClicks.get(i)}></li>\n * @constructor\n */\nclass BindFactory {\n\tconstructor(fn, context) {\n\t\tthis.fn = fn;\n\t\tthis.context = context;\n\t\tthis.cache = {};\n\t}\n\tclear() {\n\t\tthis.cache = {};\n\t}\n\tget(id) {\n\t\tif (id in this.cache) return this.cache[id];\n\t\tconst value = this.fn.bind(this.context, ...arguments);\n\t\tthis.cache[id] = value;\n\t\treturn value;\n\t}\n}\n\n/**\n * Return whether the given object has only numeric key strings.\n * Can be used to detect if an object is in reality an array.\n *\n * @example\n * hasOnlyNumericKeys({\"0\": \"foo\", \"1\": \"bar\", \"3\": \"baz\"}); // true\n * hasOnlyNumericKeys({\"0\": \"foo\", \"sam\": \"bar\"}); // false\n * hasOnlyNumericKeys({\"0\": \"foo\", \"Infinity\": \"bar\"}); // false\n * @param {Object} obj - the input object\n * @return {boolean} true if obj is an array with string keys, false otherwise\n */\nfunction hasOnlyNumericKeys(obj) {\n\tfor (const key in obj) {\n\t\tif (!isFinite(+key)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Convert an object to an array. (stricter version of asList)\n * Non-numeric/Infinite keys will be removed in the array representation of the\n * object.\n *\n * @param {Object} obj - the input object\n * @return {Array} an array equivalent to obj\n */\nfunction objToArr(obj) {\n\tconst arr = [];\n\tfor (const key in obj) {\n\t\tconst idx = +key;\n\t\tif (isFinite(idx)) {\n\t\t\tarr[idx] = obj[key];\n\t\t}\n\t}\n\treturn arr;\n}\n\n/**\n * Sanitize recursively an object created in Thundr.\n * Note that numeric value will be casted to Number unless a '@s' is explicitely\n * specified at the end of the key.\n *\n * @example\n * sanitizeObj({\"power\": \"45\", \"range\": {\"0\": \"-5.6\", \"1\": \"5.2\"}, \"id@s\": \"124\"})\n * // return {\"power\": 45, \"range\": [-5.6, 5.2], \"id\": \"124\"}\n * @param {Object} obj - the input object\n * @param {Object|Array} the sanitized object or array\n */\nfunction sanitizeObj(obj) {\n\tconst out = {};\n\tfor (let key in obj) {\n\t\tlet val = obj[key];\n\t\tif (val != null && typeof val === 'object') {\n\t\t\tval = sanitizeObj(val);\n\t\t} else if (key.endsWith('@s')) {\n\t\t\tkey = key.substring(0, key.length - 2);\n\t\t} else {\n\t\t\tval = isFinite(+val) ? +val : val;\n\t\t}\n\t\tout[key] = val;\n\t}\n\tif (hasOnlyNumericKeys(out)) {\n\t\treturn objToArr(out);\n\t}\n\treturn out;\n}\n\n/**\n * Convert a multiline text to an array of JSX elements.\n *\n * @param {string} text - string with 0 or more \\n\n * @return {Array.<string|JSX>} an array of JSX elements\n */\nconst textToJsxArray = (() => {\n\tfunction reduceTextJsx(jsxArray, line, i) {\n\t\tif (i > 0) {\n\t\t\tjsxArray.push(<br />);\n\t\t}\n\t\tjsxArray.push(line);\n\t\treturn jsxArray;\n\t}\n\n\treturn (text) => {\n\t\tconst lines = text.split('\\n');\n\t\tconst jsxArray = lines.reduce(reduceTextJsx, []);\n\t\treturn jsxArray;\n\t};\n})();\n\n/**\n * Return the body of a function as a string.\n *\n * @example\n * functionBody(() => { console.log('test'); });\n * // ^ returns \" console.log('test'); \"\n *\n * @param {Function} fn - the input function\n * @return {string} the body of the function `fn`\n */\nfunction functionBody(fn) {\n\tif (typeof fn !== 'function') return '';\n\n\tlet str = fn.toString();\n\tstr = str.slice(str.indexOf('{') + 1, str.lastIndexOf('}'));\n\n\treturn str;\n}\n\n/**\n * Return the part part of a URI.\n *\n * @example\n * pathOnly('this/is/a/folder/file.txt');\n * // ^ returns 'this/is/a/folder/'\n *\n * @param {string} path - the full URI of a resource\n * @return {string} only the path part of the resource\n */\nfunction pathOnly(path) {\n\tconst index = path.lastIndexOf('/');\n\tif (index === -1) return path;\n\treturn path.substring(0, index + 1);\n}\n\n/**\n * Return whether an object is a functional component.\n *\n * @param {*} comp - the component to test\n * @return {!boolean} true if comp is functional, false otherwise\n */\nfunction isFunctionalComp(comp) {\n\tconst nodeName = comp && comp.nodeName;\n\treturn nodeName && typeof nodeName === 'function' && !(nodeName.prototype && nodeName.prototype.render);\n}\n\n/**\n * Return whether a variable is a JS (key, value) object.\n *\n * @param {*} obj - the object to test\n * @return {!boolean} true if obj is an object, false otherwise\n */\nfunction isObject(obj) {\n\treturn obj !== null && typeof obj === 'object' && !Array.isArray(obj);\n}\n\n/**\n * Return whether a variable is a valid numberic value (string number are allowed).\n *\n * @param {*} obj - the object to test\n * @return {!boolean} true if val is numeric, false otherwise\n */\nfunction isNumeric(val) {\n\treturn !isNaN(parseFloat(val)) && isFinite(val);\n}\n\n/**\n * Access a deep member of an object and create intermediates if they are undefined.\n *\n * @param {!Object} obj - the object to look in\n * @param {Array.<string>|string} path - the path of the member in the object\n * @param {*=} def - the default value\n */\nfunction accessOrCreateNested(obj, path, def) {\n\tif (typeof path === 'string') path = path.split('.');\n\tconst levelCount = path.length;\n\tif (levelCount === 0) return obj;\n\n\tfor (let i = 0; i < levelCount; i++) {\n\t\tif (obj === null || typeof obj !== 'object') {\n\t\t\tconsole.error(`Cannot access property \"${path.slice(i).join('.')}\" in ` +\n\t\t\t\t`\"${path.slice(0, i).join('.')} (object is ${typeof obj})`);\n\t\t\treturn;\n\t\t}\n\t\tconst level = path[i];\n\t\tif (!obj.hasOwnProperty(level)) {\n\t\t\tif (i < levelCount - 1) {\n\t\t\t\tobj[level] = {};\n\t\t\t} else {\n\t\t\t\tobj[level] = def;\n\t\t\t}\n\t\t}\n\t\tobj = obj[level];\n\t}\n\treturn obj;\n}\n\n/**\n * Return the video type for <source> tag based on the extension in the video url.\n *\n * @param {string} src - the video src url.\n * @return {string} the video type corresponding to the input video url, or null if no type match.\n */\nfunction getVideoTypeFromSrc(src) {\n\tsrc = src.split('?')[0];\n\tlet type = null;\n\tif (src.endsWith('.mp4')) {\n\t\ttype = 'video/mp4';\n\t} else if (src.endsWith('.ogg') || src.endsWith('.ogv') || src.endsWith('.ogm')) {\n\t\ttype = 'video/ogg';\n\t} else if (src.endsWith('.webm')) {\n\t\ttype = 'video/webm';\n\t}\n\treturn type;\n}\n\n/**\n * Parse an string array of numeric numbers.\n *\n * @example\n * parseNumericArray('5, 2, 1.2, 7'); // returns [5, 2, 1.2, 7]\n *\n * @param {string} arrayStr - the string array\n * @return {Array.<number>|null} the array of numeric value, or null in case the parsing failed\n */\nfunction parseNumericArray(arrayStr) {\n\tif (typeof arrayStr !== 'string') return null;\n\tconst parts = arrayStr.split(/[|/,;]/);\n\t// use ES5 loop to early out in case of non-numeric value\n\tconst il = parts.length;\n\tfor (let i = 0; i < il; i++) {\n\t\tconst val = parseFloat(parts[i].trim());\n\t\tif (!isFinite(val)) return null;\n\t\tparts[i] = val;\n\t}\n\treturn parts;\n}\n\n/**\n * Quick helper to choose whether a node should be displayed.\n *\n * @example\n * <div style={displayWhen(isLoading)} />\n *\n * @param {boolean} cond - the condition to display the node\n * @return {{display: string}} the element display style\n */\nconst displayWhen = (cond) => ({ display: cond ? 'block' : 'none' });\n\n/**\n * Return whether the given number is an integer or almost.\n *\n * @example\n * isIntegerOrAlmost(9.5); // false\n * isIntegerOrAlmost(10.00000223); // true\n * isIntegerOrAlmost(-10); // true\n *\n * @param {!number} n - the integer to test\n * @return {!boolean}\n */\nconst isIntegerOrAlmost = n => Math.abs(n - Math.round(n)) < 1e-6;\n\n/**\n * Return the formatted price\n * Note that we might have to change that later for different currencies.\n *\n * @example\n * formatNumber(12.000003); // returns \"12\"\n * formatNumber(12.100003); // returns \"12.1\"\n *\n * @param {!number} price - the price amount to convert\n * @return {!string} the formatted price\n */\nconst formatPrice = price => price.toFixed(isIntegerOrAlmost(price) ? 0 : 2);\n\n/**\n * Return the uri of an image if it exists in appData -> styling -> images || returns the default image path\n *\n * @param {*} obj - appData\n * @param {!string} imgName - name of image we are trying to find\n * @param {!string} defaultImg - value returned if the imgName doesn't exist\n * @return {!string} path of the onesheet stored in appData or default value\n */\nfunction getStylingImagePath(appData, imgName, defaultImg) {\n\tconst { images } = appData.styling;\n\tif (images && images[imgName]) {\n\t\treturn images[imgName];\n\t} else {\n\t\treturn defaultImg;\n\t}\n}\n\n/**\n * Transforms HTML tags in HTML entities for safe rendering.\n *\n * @example\n * encodeHtml('<script>'); // returns \"&lt;script&gt;\"\n * encodeHtml('%3Cscript%3E'); // returns \"%3Cscript%3E\"\n *\n * @param {!string} str - the string to encode\n * @return {!string} the string with HTML tags replaced with HTML entities\n */\nconst encodeHtml = (str) => {\n\treturn (str.toString())\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/%3C/g, '&lt;')\n\t\t.replace(/%3E/g, '&gt;');\n};\n\n/**\n * Transforms HTML tags in HTML entities recursively in any object.\n *\n * @param {*} obj - the input object\n * @return {*} the same object with all string encoded with HTML entities\n */\nconst encodeHtmlRecursively = (obj) => {\n\tif (typeof obj === 'string') return encodeHtml(obj);\n\tif (Array.isArray(obj)) return obj.map(e => encodeHtmlRecursively(e));\n\tif (isObject(obj)) {\n\t\tfor (const key in obj) obj[key] = encodeHtmlRecursively(obj[key]);\n\t}\n\treturn obj;\n};\n\n/**\n * Converts HEX value to HSL value\n *\n * @param {*} Hex value\n * @return {*} HSL value\n */\n\nfunction convertHexToHsl(hex, options = {}) {\n\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n\tlet r = parseInt(result[1], 16);\n\tlet g = parseInt(result[2], 16);\n\tlet b = parseInt(result[3], 16);\n\n\tr /= 255, g /= 255, b /= 255;\n\tconst max = Math.max(r, g, b), min = Math.min(r, g, b);\n\tlet h, s, l = (max + min) / 2;\n\n\tif(max == min){\n\t\th = s = 0; // achromatic\n\t} else {\n\t\tlet d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch(max) {\n\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break;\n\t\t\tcase g: h = (b - r) / d + 2; break;\n\t\t\tcase b: h = (r - g) / d + 4; break;\n\t\t}\n\t\th /= 6;\n\t}\n\n\ts = s*100;\n\ts = Math.round(s);\n\tl = l*100;\n\tl = Math.round(l);\n\th = Math.round(360*h);\n\n\tconst {\n\t\tsaturation,\n\t\tlightness\n\t} = options;\n\n\tconst colorInHSL = 'hsl(' + h + ', ' + (saturation || s) + '%, ' + (lightness || l) + '%)';\n\n\treturn colorInHSL;\n}\n\n\nexport { debounce, throttle, dbounce };\nexport { once };\n// export { watch };\nexport { accessNested, accessOrCreateNested };\nexport { hasClass, addClass, removeClass, triggerAnim, toggleClass, condClass, joinClasses };\nexport { clamp };\nexport { asList };\nexport { arrayUnique, arrayUnion };\nexport { appDataDate };\nexport { sortObjectByOrder };\n// export { redirect };\nexport { addToQuery, toQueryString };\nexport { defaultLevelsDeep };\nexport { deleteNulls };\nexport { replaceWithVNode, findInVNode };\nexport { parseDate };\nexport { joinPaths };\nexport { hasOnlyNumericKeys, objToArr, sanitizeObj };\nexport { BindFactory };\nexport { textToJsxArray };\nexport { functionBody };\nexport { pathOnly };\nexport { isFunctionalComp };\nexport { isObject, isNumeric };\nexport { getVideoTypeFromSrc };\nexport { parseNumericArray };\nexport { displayWhen };\nexport { isIntegerOrAlmost };\nexport { formatPrice };\nexport { getStylingImagePath };\nexport { encodeHtml, encodeHtmlRecursively };\nexport { convertHexToHsl };\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/utils.js","/* Action Types\n-----------------------*/\n\nexport const UPDATE_STORE      = 'UPDATE_STORE';\nexport const BEFORE_LOAD       = 'BEFORE_LOAD';\nexport const PAGE_STATE_LOADED = 'PAGE_STATE_LOADED';\nexport const START_API         = 'START_API';\nexport const GMAPS_LOADED      = 'GMAPS_LOADED';\nexport const URL_CHANGED       = 'URL_CHANGED';\n\nexport const CLOSE_APP = 'CLOSE_APP';\n\n// Loader\nexport const UPDATE_LOADER = 'UPDATE_LOADER';\n\n// Bg Status\nexport const SET_BG_STATUS   = 'SET_BG_STATUS';\nexport const SET_ACTIVE_PAGE = 'SET_ACTIVE_PAGE';\n\n// App Dimensions/Browser Stats\nexport const SET_CLIENT_SIZE                = 'SET_CLIENT_SIZE';\nexport const START_FORCE_CLIENT_ORIENTATION = 'START_FORCE_CLIENT_ORIENTATION';\nexport const STOP_FORCE_CLIENT_ORIENTATION  = 'STOP_FORCE_CLIENT_ORIENTATION';\n\n// Background\nexport const SET_BACKGROUND_VIDEO_PLAYING = 'SET_BACKGROUND_VIDEO_PLAYING';\nexport const SET_BACKGROUND_VIDEO_ENABLED = 'SET_BACKGROUND_VIDEO_ENABLED';\nexport const SET_BACKGROUND_VIDEO_MUTED   = 'SET_BACKGROUND_VIDEO_MUTED';\nexport const SET_BACKGROUND_ELEMENT       = 'SET_BACKGROUND_ELEMENT';\nexport const UPDATE_BACKGROUND_SETTINGS   = 'UPDATE_BACKGROUND_SETTINGS';\n\n// Home page\nexport const CALENDAR_CLICKED       = 'CALENDAR_CLICKED';\nexport const MESSENGER_CLICKED      = 'MESSENGER_CLICKED';\nexport const HOMEPAGE_TRAILER_ENDED = 'HOMEPAGE_TRAILER_ENDED';\nexport const CLICKED_FOLLOW         = 'CLICKED_FOLLOW';\n\n// Menu\nexport const SET_SIDE_NAV_OPEN     = 'SET_SIDE_NAV_OPEN';\nexport const SET_SIDE_NAV_ACTIVE   = 'SET_SIDE_NAV_ACTIVE';\nexport const CLICKED_SHARE         = 'CLICKED_SHARE';\nexport const LINK_CLICKED          = 'LINK_CLICKED';\nexport const EXTERNAL_LINK_CLICKED = 'EXTERNAL_LINK_CLICKED';\nexport const HEADER_HIDDEN         = 'HEADER_HIDDEN';\n\n// Footer\n// export const FOOTER_SIZE = 'FOOTER_SIZE';\n\n// Client Geo\nexport const SET_CLIENT_GEO = 'SET_CLIENT_GEO';\nexport const GET_SCREENINGS = 'GET_SCREENINGS';\n\n// Dynamic Data\nexport const UPDATE_DYNAMIC_DATA = 'UPDATE_DYNAMIC_DATA';\n\n// Theaters\nexport const SET_THEATERS                       = 'SET_THEATERS';\nexport const ADD_THEATERS                       = 'ADD_THEATERS';\nexport const SELECT_THEATER                     = 'SELECT_THEATER';\n// export const SELECT_FIRST_THEATER               = 'SELECT_FIRST_THEATER';\nexport const SET_MAP_OPEN                       = 'SET_MAP_OPEN';\nexport const SET_CITIES                         = 'SET_CITIES';\nexport const SET_CITY_SHOW_COUNT                = 'SET_CITY_SHOW_COUNT';\nexport const SELECT_NEARBY_CITY                 = 'SELECT_NEARBY_CITY';\nexport const UPDATE_THEATER_FILTERED_SCREENINGS = 'UPDATE_THEATER_FILTERED_SCREENINGS';\nexport const AFTER_THEATERS_UPDATE              = 'AFTER_THEATERS_UPDATE';\nexport const EXTRA_THEATERS                     = 'EXTRA_THEATERS';\nexport const DO_LOCATION_SEARCH                 = 'DO_LOCATION_SEARCH';\nexport const FIRST_DATA_LOADED                  = 'FIRST_DATA_LOADED';\nexport const SCREENINGS_LOADED                  = 'SCREENINGS_LOADED';\nexport const SELECT_ST_DATE                     = 'SELECT_ST_DATE';\nexport const SELECT_PROVIDER                    = 'SELECT_PROVIDER';\nexport const SELECT_TIME                        = 'SELECT_TIME'; // DON'T USE FOR TRACKING, use SELECT_SCREENING INSTEAD\nexport const SELECT_SCREENING                   = 'SELECT_SCREENING';\nexport const TICKET_LINK_CLICKED                = 'TICKET_LINK_CLICKED';\nexport const SHOW_SCREENING_AUTH                = 'SHOW_SCREENING_AUTH';\n\n// Ticketing\nexport const OPEN_TICKETING               = 'OPEN_TICKETING';\nexport const REOPEN_TICKETING             = 'REOPEN_TICKETING';\nexport const GO_TICKETING_TYPES           = 'GO_TICKETING_TYPES';\nexport const UPDATE_TICKET_TYPE_QUANTITY  = 'UPDATE_TICKET_TYPE_QUANTITY';\nexport const CREATE_OR_UPDATE_ORDER       = 'CREATE_OR_UPDATE_ORDER';\nexport const UPDATE_ORDER_TICKETS         = 'UPDATE_ORDER_TICKETS';\nexport const GO_TICKETING_SEATING         = 'GO_TICKETING_SEATING';\nexport const PICK_OR_UNPICK_SEATS         = 'PICK_OR_UNPICK_SEATS';\nexport const UPDATE_TICKETING_SEATS       = 'UPDATE_TICKETING_SEATS';\nexport const FLUSH_SEAT_LAYOUT            = 'FLUSH_SEAT_LAYOUT';\nexport const GO_TICKETING_REVIEW          = 'GO_TICKETING_REVIEW';\nexport const GO_TICKETING_CONTACT_DETAILS = 'GO_TICKETING_CONTACT_DETAILS';\nexport const GO_TICKETING_PAYMENT         = 'GO_TICKETING_PAYMENT';\nexport const OPEN_PAYMENT                 = 'OPEN_PAYMENT';\nexport const PAYMENT_MESSAGE_RECEIVED     = 'PAYMENT_MESSAGE_RECEIVED';\nexport const CLOSE_PAYMENT                = 'CLOSE_PAYMENT';\nexport const TICKET_PURCHASE_COMPLETE     = 'TICKET_PURCHASE_COMPLETE';\nexport const SET_TICKETING_MESSAGE        = 'SET_TICKETING_MESSAGE';\nexport const CLEAR_TICKETING_MESSAGE      = 'CLEAR_TICKETING_MESSAGE';\nexport const GO_TICKETING_TIMEOUT         = 'GO_TICKETING_TIMEOUT';\nexport const CLOSE_TICKETING              = 'CLOSE_TICKETING';\n\n// Filters\nexport const CHECK_FILTERS         = 'CHECK_FILTERS';\nexport const RELOAD_FILTERS        = 'RELOAD_FILTERS';\nexport const TOGGLE_FILTER         = 'TOGGLE_FILTER';\nexport const FILTER_EXCLUDE        = 'FILTER_EXCLUDE';\nexport const FILTER_DISABLE        = 'FILTER_DISABLE';\nexport const SET_FILTER_VISIBILITY = 'SET_FILTER_VISIBILITY';\nexport const RESET_FILTER          = 'RESET_FILTER';\nexport const RESET_FILTERS         = 'RESET_FILTERS';\nexport const APPLY_FILTERS         = 'APPLY_FILTERS';\nexport const SEARCH_NEW_CITY       = 'SEARCH_NEW_CITY';\n\n// Modal\nexport const SHOW_MODAL          = 'SHOW_MODAL';\nexport const HIDE_MODAL          = 'HIDE_MODAL';\nexport const UPDATE_MODAL        = 'UPDATE_MODAL';\nexport const SHOW_COOKIES_MODAL  = 'SHOW_COOKIES_MODAL';\n// MODAL RESULTS (should probably move that somewhere else)\nexport const MODAL_RESULT_OK     = 'OK';\nexport const MODAL_RESULT_CANCEL = 'CANCEL';\n\nexport const APP_LIST_SCROLLED        = 'APP_LIST_SCROLLED';\nexport const MOVIES_LIST_SCROLLED     = 'MOVIES_LIST_SCROLLED';\nexport const SCREENINGS_LIST_SCROLLED = 'SCREENINGS_LIST_SCROLLED';\nexport const EVENT_DATA_LIST_SCROLLED = 'EVENT_DATA_LIST_SCROLLED';\n\n// QUIZ\nexport const QUIZ_STARTED = 'QUIZ_STARTED';\n\n// USER\nexport const SET_USER = 'SET_USER';\nexport const SET_USER_REGION_MODAL_DISMISSED = 'SET_USER_REGION_MODAL_DISMISSED';\n\nexport const SET_IOSFIXEDFIX = 'SET_IOSFIXEDFIX';\n\n// YOUTUBE\nexport const YOUTUBE_READY    = 'YOUTUBE_READY';\nexport const YOUTUBE_PROGRESS = 'YOUTUBE_PROGRESS';\nexport const YOUTUBE_ENDED    = 'YOUTUBE_ENDED';\nexport const YOUTUBE_PAUSE    = 'YOUTUBE_PAUSE';\nexport const YOUTUBE_PLAY     = 'YOUTUBE_PLAY';\n\n// VR\nexport const VR_SET_MODE = 'VR_SET_MODE';\n\n// SCROLL CONTROLS\nexport const SCROLL_LOCK   = 'SCROLL_LOCK';\nexport const SCROLL_UNLOCK = 'SCROLL_UNLOCK';\n\n// TRACKING\nexport const ONETRUST_SHOW = 'ONETRUST_SHOW';\n\n// AUTHENTICATION\nexport const AUTH_RESPONSE = 'AUTH_RESPONSE';\nexport const AUTH_CLEAR    = 'AUTH_CLEAR';\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/actions.js","import queryString from 'qs';\nimport formatDateTime from './formatDateTime';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport Geo from 'models/Geo';\nimport Theater from 'models/Theater';\nimport Exhibitor from 'models/Exhibitor';\nimport Screening from 'models/Screening';\nimport Format from 'models/Format';\nimport Movie from 'models/Movie';\nimport { addToQuery, toQueryString, accessNested, isObject, asList, parseDate } from 'utils/utils';\nimport { track } from 'utils/tracking';\nimport preprocessScreenings from 'utils/preprocessScreenings';\nimport { gateways } from 'store/ticketingPublic';\n\n\n\n/**\n * Add Client data to the initial state of the store\n * @return {Object} The current initial State\n */\nfunction buildClientStoreData(initialState) {\n\t// NOTE: this is a random hack to make hover work on mobile in the navigation\n\t// Should we maybe put it somewhere else ? Seems a bit weird to have it in that function\n\twindow.addEventListener('touchend', () => {});\n\n\twindow.addEventListener('unload', (ev) => {\n\t\tStore.emit(actions.CLOSE_APP, ev);\n\t});\n\n\tconst dimensions = getDims();\n\tconst device = getDevice();\n\tconst deviceSize = getSize(dimensions, device);\n\tconst orientation = dimensions.width > dimensions.height ? 'landscape' : 'portrait';\n\tconst isIOS = getIsIOS(device);\n\tconst iOSVersion = getIOSVersion();\n\tconst isIE = getIsIE();\n\tconst isEdge = getIsEdge();\n\tconst isFirefox = getIsFirefox();\n\tconst isTouch = !!('ontouchstart' in window) || window.navigator.msMaxTouchPoints > 0;\n\tconst isChrome = !!getIsChrome();\n\tconst isSafari = getIsSafari();\n\tconst hasWebGL = getHasWebGL();\n\n\tif (initialState.header) {\n\t\tconst order = ['none', 'mobile', 'tablet', 'desktop'];\n\t\tinitialState.header.sideNavActive = order.indexOf(deviceSize) <= order.indexOf(initialState.header.sideNavBelow);\n\t}\n\n\tinitialState.client = {\n\t\tdimensions,\n\t\tdeviceSize,\n\t\tdevice,\n\t\torientation,\n\t\tisIOS,\n\t\tiOSVersion,\n\t\tisEdge,\n\t\tisIE,\n\t\tisFirefox,\n\t\tisChrome,\n\t\tisTouch,\n\t\tisSafari,\n\t\thasWebGL\n\t};\n\n\treturn initialState;\n}\n\nfunction getSize(dimensions = getDims(), device = getDevice()) {\n\tconst largeDesktopStartWidth = 1280; //not using this...yet. (Be careful ! We use the result of this function in the tracking)\n\tconst breakpoints = [[768, 'mobile'], [1024, 'tablet'], [Infinity, 'desktop']];\n\n\tfor (let i = 0; i < breakpoints.length; i++) {\n\t\tif (dimensions.width < breakpoints[i][0]){\n\t\t\tif(device == \"iphone\" && i == 1) return breakpoints[0][1]; //because iPhone x\n\t\t\telse return breakpoints[i][1];\n\t\t}\n\t}\n\n\treturn 'unknown';\n}\n\nfunction getDims() {\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight\n\t};\n}\n\n\nfunction getQueryParameterByName(name, url) {\n\tif (!url) url = window.location.href;\n\tname = name.replace(/[\\[\\]]/g, '\\\\$&'); // eslint-disable-line\n\tconst regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');\n\tconst results = regex.exec(url);\n\tif (!results) return null;\n\tif (!results[2]) return '';\n\treturn decodeURIComponent(results[2].replace(/\\+/g, ' '));\n}\n\nfunction updateQueryStringItem(key, value, state, usePush) {\n\tconst parsedQS = queryString.parse(location.search.slice(1));\n\tif (typeof key !== 'object') {\n\t\tif (value !== null) {\n\t\t\tparsedQS[key] = value;\n\t\t} else {\n\t\t\tdelete parsedQS[key];\n\t\t}\n\t} else {\n\t\tusePush = state;\n\t\tstate = value;\n\t\tfor (const p in key) {\n\t\t\tif (key.hasOwnProperty(p)) {\n\t\t\t\tconst v = key[p];\n\t\t\t\tif (v !== null) {\n\t\t\t\t\tparsedQS[p] = v;\n\t\t\t\t} else {\n\t\t\t\t\tdelete parsedQS[p];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tlet qs = queryString.stringify(parsedQS);\n\tqs = qs ? '?' + qs : '';\n\tconst method = usePush ? 'pushState' : 'replaceState';\n\thistory[method](state, '', (location.pathname || '') + qs);\n}\n\n/**\n * Get the Device data.\n * @return {Object} Device data object\n */\nfunction getDevice() {\n\tif (typeof window !== 'undefined') {\n\t\tconst agent = ('' + navigator.userAgent).toLowerCase();\n\t\tif (agent.indexOf('android') !== -1) {\n\t\t\treturn 'android';\n\t\t}\n\t\tif (agent.indexOf('iphone') !== -1) {\n\t\t\treturn 'iphone';\n\t\t}\n\t\tif (agent.indexOf('ipad') !== -1) {\n\t\t\treturn 'ipad';\n\t\t}\n\t}\n\treturn 'desktop';\n}\n\nfunction findParent(el, tagName) {\n\ttagName = tagName.toUpperCase();\n\tlet parent = el.parentElement;\n\twhile (parent) {\n\t\tif (parent.tagName === tagName) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = parent.parentElement;\n\t}\n}\n\n\n/**\n * Is the browser Chrome?\n * @return {boolean|string} is the browser chrome\n */\nfunction getIsChrome() {\n\tif (getIsEdge()) return false;\n\tif (typeof window !== 'undefined') {\n\t\treturn (navigator.userAgent.match('CriOS') || !!window.chrome);\n\t}\n\treturn false;\n}\n\n\n/**\n * Is the browser IE (or Edge)?\n * @return {boolean|string} is the browser ie/which version\n */\nfunction getIsIE() {\n\tconst ua = window.navigator.userAgent;\n\n\tconst msie = ua.indexOf('MSIE ');\n\tif (msie > 0) {\n\t\t// IE 10 or older => return version number\n\t\treturn parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n\t}\n\n\tconst trident = ua.indexOf('Trident/');\n\tif (trident > 0) {\n\t\t// IE 11 => return version number\n\t\tconst rv = ua.indexOf('rv:');\n\t\treturn parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n\t}\n\n\tconst edge = ua.indexOf('Edge/');\n\tif (edge > 0) {\n\t\t// Edge (IE 12+) => return version number\n\t\treturn parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n\t}\n\n\t// other browser\n\treturn false;\n}\n\n/**\n * Is the browser Edge?\n * @return {boolean|string} is the browser edge\n */\nfunction getIsEdge() {\n\tconst ua = window.navigator.userAgent;\n\tconst edge = ua.indexOf('Edge/');\n\tif (edge > 0) {\n\t\treturn parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n\t}\n\treturn false;\n}\n\n/**\n * Is the browser Firefox?\n * @return {boolean} is the browser firefox\n */\nfunction getIsFirefox() {\n\treturn window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\n/**\n * Is the device IOS?\n * @return {boolean} is the device ios\n */\nfunction getIsIOS() {\n\tif (typeof window !== 'undefined') {\n\t\tconst agent = ('' + navigator.userAgent).toLowerCase();\n\t\treturn (agent.indexOf('ipad') !== -1 || agent.indexOf('iphone') !== -1);\n\t}\n\n\treturn false;\n}\n\n/**\n * Get version of ios (if it is ios).\n * @return {string} version of ios\n */\nfunction getIOSVersion() {\n\treturn parseFloat(\n\t\t('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1])\n\t\t\t.replace('undefined', '3_2').replace('_', '.').replace('_', '')\n\t) || false;\n}\n\n/**\n * Return whether WebGL is available.\n * @return {boolean} true if WebGL is available, false otherwise\n */\nfunction getHasWebGL() {\n\tconst canvas = document.createElement('canvas');\n\tconst gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\treturn !!gl;\n}\n\nfunction getIsSafari() {\n\treturn navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1;\n}\n\n/**\n * Calculate the status of showtimes (is it live yet or not).\n * @param {Date} activeDate - the date that showtimes is going live\n * @param {boolean} forceLive - Should we force showtimes to go live (-1 to prevent live status)\n * @param {Object} pages - All the pages that the app has\n * @return {boolean} is showtimes live or not\n */\nfunction calculateShowtimesStatus(activeDate, forceLive, pages) {\n\treturn (activeDate <= Date.now() || forceLive || (pages.showtimes && pages.showtimes.path === '/')) && forceLive !== -1;\n}\n\n\n/**\n * Get the _pk_id/ac_id\n */\nfunction getAC_ID() {\n\tconst cookie = document.cookie.split(';')\n\t\t.find(c => c.trim().slice(0, 6) === '_pk_id');\n\n\tif (cookie) return cookie.split('=')[1].split('.')[0];\n\telse return null;\n}\n\nif (typeof window !== 'undefined') window.getAC_ID = getAC_ID;\n\n/**\n * Get the client geo from ip\n */\nfunction getGeoFromIPAsync(apiRoot) {\n\tapiRoot = apiRoot || accessNested(Store.get(), 'appData.apis.stdata.root') || 'https://stdata.powster.com';\n\treturn fetch(apiRoot + '/geo').then(res => res.json()).catch(e => {\n\t\t// If error, try getting the capital city of the app region\n\t\tlet countryCode = accessNested(Store.get(), 'appData.meta.region.slug') || 'us';\n\t\tif (countryCode === 'intl' || countryCode === 'mde' || countryCode === 'lam') {\n\t\t\tthrow e;\n\t\t}\n\t\treturn fetch(apiRoot + '/capital?country=' + countryCode).then(r => r.json());\n\t}).then(data => {\n\t\tif (data && data.countryCode) {\n\t\t\tdata.countryCode = data.countryCode.toLowerCase();\n\t\t}\n\t\treturn data;\n\t});\n\t// Further error handled at usage in updateShowtimes\n}\n\nfunction rawSearchLocation(address, apiKey, srcRegion) {\n\tconst q = {\n\t\taddress,\n\t\tkey: apiKey\n\t};\n\n\tlet region = srcRegion;\n\tif (region) {\n\t\t// Special cases (ccTLD, not ISO ; see https://developers.google.com/maps/documentation/geocoding/intro#RegionCodes)\n\t\tif (region === 'gb') region = 'uk';\n\t\tq.region = region;\n\t}\n\n\treturn fetch('https://maps.googleapis.com/maps/api/geocode/json' + toQueryString(q))\n\t\t.then(res => res.json())\n\t\t.then(data => {\n\t\t\tif (data.status !== 'OK') {\n\t\t\t\tStore.emit(actions.SET_THEATERS, []);\n\t\t\t\tStore.get().showtimes.set({ loading: false, error: 'GEOCODING' });\n\t\t\t\ttrack({ a: 'location_fail', l: status });\n\t\t\t\t// probably 'ZERO_RESULTS' (we should check though)\n\t\t\t\treturn Promise.reject();\n\t\t\t}\n\t\t\tconst firstResult = findLocationInRegion(data.results, srcRegion);\n\t\t\tlet getCity = Promise.resolve();\n\t\t\tlet apiRoot = accessNested(Store.get(), 'appData.apis.stdata.root') || 'https://stdata.powster.com';\n\t\t\tif (firstResult.isCountry) {\n\t\t\t\tgetCity = fetch(apiRoot + '/capital?country=' + firstResult.countryCode).then(r => r.json());\n\t\t\t} else if (firstResult.types.indexOf('administrative_area_level_1') !== -1 && firstResult.countryCode === 'us') {\n\t\t\t\tgetCity = fetch(apiRoot + '/capital?state=' + firstResult.formatted_address.replace(/, USA$/i, '')).then(r => r.json());\n\t\t\t}\n\t\t\treturn getCity.catch(e => undefined).then(geoData => {\n\t\t\t\tif (!geoData) {\n\t\t\t\t\tconst countryCode = firstResult.countryCode;\n\t\t\t\t\tconst city = firstResult.cityName;\n\t\t\t\t\tconst location = firstResult.geometry.location;\n\t\t\t\t\tconst lat = location.lat;\n\t\t\t\t\tconst lon = location.lng;\n\t\t\t\t\tgeoData = {\n\t\t\t\t\t\tlat, lon, countryCode, city: city || address\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tgeoData.countryCode = (geoData.countryCode || srcRegion || '').toLowerCase();\n\t\t\t\tgeoData.src = address;\n\t\t\t\treturn new Geo(geoData);\n\t\t\t});\n\t\t});\n}\n\nfunction searchLocation(loc, gmapsApiKey, region, source) {\n\t// Start the loading animation when we start geocoding, not when it's done\n\tStore.get().showtimes.set({ loading: true });\n\n\ttrack({ a: 'location_search' });\n\n\treturn rawSearchLocation(loc, gmapsApiKey, region).then(result => {\n\t\t// Update the actual location\n\t\tStore.emit(actions.SET_CLIENT_GEO, result, source || 'search');\n\t\ttrack({ a: 'location', l: 'SUCCESS' });\n\t}).catch(() => {\n\t\tStore.emit(actions.SET_THEATERS, []);\n\t\tStore.get().showtimes.set({ loading: false, error: 'GEOCODING' });\n\t\ttrack({ a: 'location_fail', l: status });\n\t});\n}\n\n\n/**\n * Find the location located in the region (if it exists).\n * @param {Array} geos - array with all the possible geos\n * @param {Array} srcRegion - region in which we're doing the search\n * @return {Object} the best matching geo object to the active region\n */\nfunction findLocationInRegion(geos, srcRegion) {\n\t// Stop at the first one ?\n\tgeos.forEach((geo, index) => {\n\t\tgeo.sourceIndex = index;\n\t\tgeo.isCountry = geo.types.indexOf('country') !== -1;\n\n\t\tconst countryComp = geo.address_components.find(comp => (comp.types || []).indexOf('country') !== -1 && (comp.short_name || '').length === 2);\n\t\tif (countryComp) {\n\t\t\tgeo.countryCode = countryComp.short_name.toLowerCase();\n\t\t}\n\t\tgeo.isInCurrentCountry = geo.countryCode === srcRegion;\n\n\t\tconst cityComp = geo.address_components.find(comp => comp.types.indexOf('locality') !== -1);\n\t\tif (cityComp) {\n\t\t\tgeo.cityName = cityComp.long_name;\n\t\t}\n\t});\n\tgeos.sort((geoA, geoB) => {\n\t\t// If one of them is a country put it at the bottom\n\t\tif (geoA.isCountry !== geoB.isCountry) return geoA.isCountry ? 1 : -1;\n\t\tif (geoA.isInCurrentCountry !== geoB.isInCurrentCountry) {\n\t\t\treturn geoA.isInCurrentCountry ? -1 : 1;\n\t\t}\n\t\treturn geoA.sourceIndex - geoB.sourceIndex;\n\t});\n\treturn geos[0];\n}\n\n/**\n * Generates a fake API response with a bunch of screenings\n * TODO: Move that to the back-end. Create an endpoint stdata/screenings/fake and just call it\n */\nfunction generateFakeTimes(geo) {\n\tgeo = geo || {};\n\tconst formats = [{\n\t\ttype: 'formats',\n\t\tid: Math.random() + '',\n\t\tattributes: { name: '2d' }\n\t}];\n\tconst movies = [{\n\t\ttype: 'movies',\n\t\tid: Math.random() + '',\n\t\tattributes: {\n\t\t\tprovider_id: 'wwm',\n\t\t\tprovider_movie_id: Math.random() + '',\n\t\t\tformat_id: formats[0].id,\n\t\t\ttitle: 'Dummy movie'\n\t\t}\n\t}];\n\tconst theaters = [];\n\tfor (let i = ~~(Math.random() * 10 + 1); i--;) {\n\t\ttheaters.push(\n\t\t\t{\n\t\t\t\ttype: 'theaters',\n\t\t\t\tid: Math.random() + '',\n\t\t\t\tattributes: {\n\t\t\t\t\tname: 'Dummy Theater #' + (i + 1),\n\t\t\t\t\taddress: 'Nowhere',\n\t\t\t\t\tcity: '???',\n\t\t\t\t\tcountry: geo.countryCode || 'gb',\n\t\t\t\t\turl: 'http://google.com',\n\t\t\t\t\tlat: (geo.lat || 0) + (Math.random() - .5) * .08,\n\t\t\t\t\tlon: (geo.lon || 0) + (Math.random() - .5) * .16,\n\t\t\t\t\ttz: 'Europe/London',\n\t\t\t\t\tprovider_id: 'wwm',\n\t\t\t\t\tprovider_theater_id: Math.random() + ''\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tconst screenings = [];\n\tconst now = Date.now();\n\tfor (let i = ~~(Math.random() * 50 + 50); i--;) {\n\t\tconst sTime = new Date(now + Math.random() * 7 * 24 * 60 * 60 * 1000);\n\t\tscreenings.push(\n\t\t\t{\n\t\t\t\ttype: 'screenings',\n\t\t\t\tid: '8ac5ca20-f78f-11e6-9bb3-efc78af321f4',\n\t\t\t\tattributes: {\n\t\t\t\t\tmovie_id: movies[0].id,\n\t\t\t\t\ttheater_id: theaters[~~(Math.random() * theaters.length)].id,\n\t\t\t\t\tprovider_id: 'wwm',\n\t\t\t\t\tdate: sTime.toISOString(),\n\t\t\t\t\ttime: formatDateTime(sTime, 'hh\\\\:mm\\\\:ss'),\n\t\t\t\t\turl: 'http://google.com',\n\t\t\t\t\tis_visible: true\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\treturn {\n\t\tdata: screenings,\n\t\tincluded: formats.concat(movies).concat(theaters),\n\t\tmeta: []\n\t};\n}\n\n// Switch things like be_fr to be\nfunction getCountry2(country) {\n\treturn country && (country + '').toLowerCase().replace(/^([a-z]+)_.+$/, '$1');\n}\n\nfunction getBoundingRegions(appData) {\n\tlet br = accessNested(appData, 'pages.showtimes.data.boundingRegions', []);\n\tlet disabledBr = [];\n\tlet extraBr = [];\n\tif (!Array.isArray(br)) {\n\t\tdisabledBr = Object.keys(br).filter(k => br[k] === false);\n\t\textraBr = Object.keys(br).filter(k => br[k] === true);\n\t}\n\tif (accessNested(appData, 'options.autoBoundingRegions')) {\n\t\tconst dynamicData = Store.get().dynamicData;\n\t\tif (dynamicData && dynamicData.regions) {\n\t\t\tconst regions = dynamicData.regions;\n\t\t\tbr = Object.keys(regions).filter(k => regions[k]);\n\t\t}\n\t}\n\tif (br.toJS) br = br.toJS();\n\n\t// Convert to array\n\tbr = asList(br);\n\tif (br.indexOf('intl') !== -1) return null;\n\n\t// Turn into object for duplicate removal (avoids having to filter things out at the end)\n\tlet brObject = {};\n\tbr.concat(extraBr, appData.meta.region.slug).forEach(country => {\n\t\tif (!country) return;\n\t\t// Turn it into a regular country code\n\t\tlet country2 = getCountry2(country);\n\t\tif (disabledBr.indexOf(country2) !== -1) {\n\t\t\treturn;\n\t\t}\n\t\t// Also check country2 if different\n\t\tif (country2 !== country && disabledBr.indexOf(country) !== -1) {\n\t\t\treturn;\n\t\t}\n\t\tbrObject[country2] = true;\n\t});\n\n\treturn Object.keys(brObject);\n}\n\n// TODO: We should probably merge getGeoScreeningsAsync and getTheatersScreeningsAsync they are very similar\n// (do we even still use getTheatersScreeningsAsync ?)\n\n/**\n * Get screenings from location\n * @param {Object} geo\n * @param {Object} state current Store (used for bounding region check etc.\n * @param {Boolean} noBoundingRegionCheck Do not check the region\n */\nfunction getGeoScreeningsAsync(geo, state, noBoundingRegionCheck) {\n\tconst { appData } = state || {};\n\tif (appData && accessNested(appData, 'options.generateFakeTimes')) {\n\t\treturn Promise.resolve(generateFakeTimes(geo));\n\t}\n\n\tconst { lat, lon, countryCode } = geo;\n\tconst stdataApiRoot = appData.apis.stdata.root;\n\n\tlet be = accessNested(state, 'activePage.data.blockedExhibitors', {});\n\t// convert blockedExhibitors to object if it's an array\n\tif (Array.isArray(be)) {\n\t\tbe = be.reduce((be, exhibitor) => {\n\t\t\tbe[exhibitor] = true;\n\t\t\treturn be;\n\t\t}, {});\n\t}\n\n\tconst br = getBoundingRegions(appData);\n\tif (br && !noBoundingRegionCheck) {\n\t\tif (br.indexOf(getCountry2(countryCode)) === -1) {\n\t\t\treturn Promise.reject('BOUNDING_REGION');\n\t\t}\n\t}\n\n\tconst q = {\n\t\t'include[0]': 'theaters',\n\t\t'include[1]': 'exhibitors',\n\t\t'include[2]': 'movies',\n\t\t'include[3]': 'formats'\n\t};\n\n\taddTitleFilterToQuery(q, appData);\n\n\t// blockedExhibitors.forEach(x => addToQuery(q, 'filter[exhibitors][exclude][domain]', x));\n\taddToQuery(q, 'filter[exhibitors][exclude][domain]', Object.keys(be).filter(d => d && be[d]));\n\n\tconst removeRadiusRestriction = accessNested(state, 'activePage.data.useGlobalScreenings');\n\n\t// gets every screening in the world if useGlobalScreenings is enabld in thundr\n\tif (!removeRadiusRestriction) {\n\t\tq['filter[theaters][lat]'] = lat;\n\t\tq['filter[theaters][lon]'] = lon;\n\t\tconst radiusFactor = accessNested(state, 'activePage.data.radiusFactor', 1);\n\t\tif (radiusFactor !== 1) q['filter[theaters][rf]'] = radiusFactor;\n\t}\n\n\tif (br) {\n\t\taddToQuery(q, 'filter[theaters][country]', br.filter(r => r.match(/^[a-z]{2}$/)));\n\t}\n\n\tlet blockedProviders = asList(accessNested(state, 'activePage.data.blockedProviders', {}));\n\taddToQuery(q, 'filter[providers][id_not]', blockedProviders);\n\n\treturn fetch(stdataApiRoot + '/screenings' + toQueryString(q), {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then(res => res.json());\n}\n\n\n// SET CONTAINING TO TRUE IF ids ARE SCREENINGS IDS AND YOU WANT ALL SCREENINGS FROM THE THEATERS CONTAINING THEM\n// (otherwise ids are theaters ids)\nfunction getTheatersScreeningsAsync({ appData, client }, ids, containing) {\n\tconst stdataApiRoot = appData.apis.stdata.root;\n\n\tif (accessNested(appData, 'options.generateFakeTimes')) {\n\t\treturn Promise.resolve(generateFakeTimes(client));\n\t}\n\n\tconst q = {\n\t\t'include[0]': 'theaters',\n\t\t'include[1]': 'exhibitors',\n\t\t'include[2]': 'movies',\n\t\t'include[3]': 'formats'\n\t};\n\n\taddTitleFilterToQuery(q, appData);\n\n\tconst prop = containing ? 'theater_containing' : 'theater_id';\n\tids.forEach((id, idx) => {\n\t\tq['filter[' + prop + '][' + idx + ']'] = id;\n\t});\n\n\treturn fetch(`${stdataApiRoot}/screenings${toQueryString(q)}`, {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then((res) => (res.json()));\n}\n\nfunction processScreeningsApi({ data = [], included = [] }, clientGeo, appData, activePage, theaterMasters, firstBatch) {\n\tif (typeof preprocessScreenings === 'function') {\n\t\tconst ret = preprocessScreenings(data, included, appData);\n\t\tif (ret && ret.data) data = ret.data;\n\t\tif (ret && ret.included) included = ret.included;\n\t}\n\n\tactivePage = activePage || accessNested(appData, 'pages.showtimes') || {};\n\n\t// filter out any data from providers that we should ignore\n\tconst cc = clientGeo.countryCode;\n\tconst ignore = accessNested(activePage, 'data.ignoreProviderRegions', {});\n\tdata = data.filter(s => !ignore[s.attributes.provider_id] || !ignore[s.attributes.provider_id][cc]);\n\tincluded = included.filter(t => !t.attributes.provider_id || (!ignore[t.attributes.provider_id] || !ignore[t.attributes.provider_id][cc]));\n\n\t// const formats = included.filter(({ type }) => (type === 'formats')).map((f) => (new Format(f.id, f.attributes)));\n\tconst formatNames = accessNested(activePage, 'data.formatNames', {});\n\tconst formatsLookup = included.filter(({ type }) => (type === 'formats')).reduce((prev, f) => {\n\t\t// if (f.attributes.name === 'standard') return prev;\n\t\tconst name = f.attributes.name;\n\t\tconst newName = formatNames[name] || formatNames[name.toLowerCase().replace(/\\s/g, '')];\n\t\tif (newName) {\n\t\t\tf.attributes.name = newName;\n\t\t}\n\t\tprev[f.id] = new Format(f.id, f.attributes);\n\t\treturn prev;\n\t}, {});\n\t// let movies = included.filter(({ type }) => (type === 'movies')).map((m) => (new Movie(m.id, m.attributes, formats.find((f) => (f.id === m.attributes.format_id)))));\n\tconst movieNames = accessNested(activePage, 'data.movieNames', {});\n\tconst moviesLookup = included.filter(({ type }) => (type === 'movies')).reduce((prev, m) => {\n\t\tconst format = formatsLookup[m.attributes.format_id];\n\t\tconst newName = movieNames[m.id] || movieNames[m.attributes.provider_id + ':' + m.attributes.provider_movie_id];\n\t\tif (newName) {\n\t\t\tm.attributes.title = newName;\n\t\t}\n\t\tprev[m.id] = new Movie(m.id, m.attributes, format);\n\t\treturn prev;\n\t}, {});\n\n\tconst theaterMasterDocs = included.filter(({ type }) => (type === 'theater_masters')).reduce((prev, t) => {\n\t\tprev[t.id] = t.attributes.doc;\n\t\treturn prev;\n\t}, {});\n\n\tconst movies = Object.values(moviesLookup);\n\n\tconst atomIds = accessNested(activePage, 'data.atomIds', {});\n\tconst wwm2dMovie = movies.find((m) => {\n\t\tlet isWebedia = m.provider_id === 'wwm' || m.provider_id === 'webus';\n\t\treturn isWebedia && m.format && m.format.name.toLowerCase() === '2d';\n\t});\n\tconst wwm2dMovieId = wwm2dMovie && (wwm2dMovie.provider_movie_id.split('|')[0]);\n\tconst mainAtom = atomIds.main || wwm2dMovieId || undefined;\n\tmovies.forEach((m) => {\n\t\tif (m.atom) return;\n\t\tlet atomId = mainAtom;\n\t\tconst mid = m.provider_id + ':' + m.provider_movie_id;\n\t\tif (atomIds[mid]) {\n\t\t\tatomId = atomIds[mid];\n\t\t} else if (m.provider_id === 'wwm' && m.format && m.format.name.toLowerCase === '2d') {\n\t\t\tatomId = mainAtom;\n\t\t}\n\t\tm.atom = atomId;\n\t});\n\n\tconst screeningDates = accessNested(activePage, 'data.screeningDates', {});\n\tconst dFrom = parseDate(screeningDates.from);\n\tconst dTo = parseDate(screeningDates.to);\n\t// TODO: ability to put a list of dates instead of from / to\n\tconst checkScreening = screening => {\n\t\t// if (!screening.movie) return false;\n\t\tif (screening.isPast) return false;\n\t\tif (dFrom && screening.stDate.date < dFrom) return false;\n\t\tif (dTo && screening.stDate.date > dTo) return false;\n\t\treturn true;\n\t};\n\tconst theaterScreenings = data\n\t\t.reduce((all, s) => {\n\t\t\tlet movie = moviesLookup[s.attributes.movie_id];\n\t\t\tif (!movie) return all;\n\t\t\tconst screening = new Screening(s.id, s.attributes, movie, appData);\n\t\t\tif (checkScreening(screening)) {\n\t\t\t\tif (!all[screening.theater_id]) all[screening.theater_id] = [];\n\t\t\t\tall[screening.theater_id].push(screening);\n\t\t\t}\n\t\t\treturn all;\n\t\t}, {});\n\n\tconst exhibitorsLookup = included.filter(({ type }) => (type === 'exhibitors')).reduce((prev, e) => {\n\t\tprev[e.id] = new Exhibitor(e.id, e.attributes);\n\t\treturn prev;\n\t}, {});\n\n\tlet pinned = asList(accessNested(activePage, 'data.pinnedTheaters'));\n\tconst theaters = included.filter(({ type }) => (type === 'theaters')).map(t => {\n\t\treturn new Theater(\n\t\t\tt.id,\n\t\t\tt.attributes,\n\t\t\t{\n\t\t\t\tscreenings: theaterScreenings[t.id] || [],\n\t\t\t\texhibitor: exhibitorsLookup[t.attributes.exhibitor_id],\n\t\t\t\tclientGeo, appData, theaterMasters,\n\t\t\t\ttheaterMasterDoc: t.attributes.theater_master_id && theaterMasterDocs[t.attributes.theater_master_id],\n\t\t\t\tfirstBatch,\n\t\t\t\tpinned: pinned.indexOf(t.id) !== -1,\n\t\t\t\tactivePage\n\t\t\t}\n\t\t);\n\t}).filter(t => t.enabled);\n\n\tconst getUniques = (arr, accessor) => arr.reduce((f, v) => (v = accessor ? accessor(v) : v, f.indexOf(v) === -1 && f.push(v), f), []);\n\tconst finalScreenings = [].concat.apply([], theaters.map(t => t.screenings));\n\tconst finalMovies = getUniques(finalScreenings, s => s.movie).filter(e => e);\n\tconst finalFormats = getUniques(finalMovies, m => m.format);\n\n\treturn {\n\t\tformats:    finalFormats,\n\t\tmovies:     finalMovies,\n\t\tscreenings: finalScreenings,\n\t\texhibitors: Object.values(exhibitorsLookup),\n\t\ttheaters:   theaters\n\t};\n}\n\n\nfunction getCitiesAsync({ appData, client, overrideCountry, activePage }) {\n\tconst stdataApiRoot = appData.apis.stdata.root;\n\tconst citiesFilters = Store.get().showtimes.citiesFilters; // probably not safe, but we need to get the latest version of the filters\n\tconst targetCountry = overrideCountry || client.geo.countryCode;\n\n\tconst q = {};\n\n\tif (targetCountry !== 'intl') {\n\t\tlet countries = getBoundingRegions(appData);\n\t\tif (countries) {\n\t\t\tif (countries.indexOf(targetCountry) === -1) {\n\t\t\t\tcountries.push(targetCountry);\n\t\t\t}\n\t\t\tcountries = countries.filter(r => r.match(/^[a-z]{2}$/));\n\t\t\taddToQuery(q, 'filter[theaters][country]', countries);\n\t\t}\n\t}\n\n\tconst ignore = accessNested(activePage, 'data.ignoreProviderRegions', {});\n\taddToQuery(q, 'filter[ignoreProviderRegions]', Object.keys(ignore).map(provider => {\n\t\tlet list = ignore[provider] || {};\n\t\tlet countries = Object.keys(list).filter(k => list[k]);\n\t\tif (countries.length) {\n\t\t\treturn { provider, countries };\n\t\t}\n\t}).filter(e => e));\n\n\tif (citiesFilters && citiesFilters.pidmod) {\n\t\t// Get the cities specific to a pidmod instead of for all screenings\n\t\taddToQuery(q, 'filter[movies][pidmod]', [citiesFilters.pidmod]);\n\t} else {\n\t\taddTitleFilterToQuery(q, appData);\n\t}\n\n\tif (appData.options && appData.options.citiesUseMovieAggregate) {\n\t\t// Get the cities specific to a pidmod instead of for all screenings\n\t\taddToQuery(q, 'useMovieAggregate', 'true');\n\t}\n\n\tconst fetchPath = stdataApiRoot + '/cities' + toQueryString(q);\n\n\treturn fetch(fetchPath, {\n\t\tmethod: 'GET',\n\t\theaders: {\n\t\t\t'Accept': 'application/vnd.api+json',\n\t\t\t'Content-Type': 'application/vnd.api+json'\n\t\t}\n\t}).then(res => res.json());\n}\n\nfunction addTitleFilterToQuery(q, appData) {\n\tlet store = Store.get();\n\tlet pageData = accessNested(store, 'activePage.data') || accessNested(appData || store.appData, 'pages.showtimes.data') || {};\n\tconst overrideMovieIds = asList(pageData.overrideMovieIds);\n\tconst extraMovieIds    = asList(pageData.extraMovieIds);\n\tconst movieMasterIds   = asList(appData.meta.movieMasterIds);\n\tconst titleSlugs       = [appData.meta.title.slug].concat(asList(pageData.extraTitleSlugs));\n\n\tif (overrideMovieIds && overrideMovieIds.length) {\n\t\taddToQuery(q, 'filter[movies][pidmod]', overrideMovieIds);\n\t} else {\n\t\tif (movieMasterIds.length) {\n\t\t\taddToQuery(q, 'filter[movies][mmid]', movieMasterIds);\n\t\t} else {\n\t\t\taddToQuery(q, 'filter[titles][slug]', titleSlugs);\n\t\t}\n\t\tif (extraMovieIds && extraMovieIds.length) {\n\t\t\taddToQuery(q, 'filter[movies][pidmod]', extraMovieIds);\n\t\t}\n\t}\n\n\treturn q;\n}\n\nfunction isInViewport(element, offsets = {}) {\n\tconst rect = element.getBoundingClientRect();\n\tconst html = document.documentElement;\n\n\treturn (\n\t\trect.top >= (offsets.top || 0) &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <= (window.innerHeight || html.clientHeight) &&\n\t\trect.right <= (window.innerWidth || html.clientWidth)\n\t);\n}\n\n// Returns the path of a page\nfunction getPath(page, showtimesStatus) {\n\tlet store = null;\n\tconst getStore = () => store || (store = Store.get());\n\tif (typeof page === 'string') {\n\t\tpage = accessNested(getStore(), ['appData', 'pages', page]);\n\t}\n\tif (!page) return undefined;\n\n\t// if (showtimesStatus === undefined) {\n\t// \tshowtimesStatus = accessNested(getStore(), 'showtimes.status');\n\t// }\n\t// return page['path' + (showtimesStatus ? 'After' : 'Before') + 'Showtimes'] || page.path;\n\treturn page.path;\n}\n\nfunction getPageTitle(activePage, appData) {\n\tappData = appData || Store.get().appData;\n\tconst copy = appData.copy;\n\n\t// Hm ... This doesn't very feel like a very clean thing to do (not localized, etc.)\n\t// const activePageName = activePage.id[0].toUpperCase() + activePage.id.slice(1);\n\tconst activePageName = copy[activePage.$copy] || '';\n\tconst release = parseDate(accessNested(appData, 'meta.dates.release', 0));\n\tconst params = Object.assign({\n\t\tPAGE_NAME: activePageName,\n\t\tRELEASE_DATE: formatDateTime(release, copy.$DATE_FORMAT || 'MMMM d, yyyy', copy.$DATETIME_LOCALE)\n\t}, copy);\n\n\tconst altTitle = '$' + (activePage.id || '').toUpperCase() + '_ALT_TITLE';\n\tconst pageTitle = copy[altTitle] || copy.$DYNAMIC_TITLE;\n\treturn getCopyWithParams(params, pageTitle);\n}\n\n/**\n * Return the current Piwik identifier from the cookies.\n *\n * @return {string} the current piwik id, if found\n */\nconst getPiwikId = () => {\n\tif (!document || !document.cookie) return;\n\tconst cookies = document.cookie.split('; ');\n\tfor (const cookie of cookies) {\n\t\tconst [key, value] = cookie.split('=');\n\t\tif (key.startsWith('_pk_id')) {\n\t\t\treturn value.substr(0, 16);\n\t\t}\n\t}\n};\n\n// ↓ This should be in utils.js tbh\n\n// Gets a copy value, and replaces %$THING% by other copy data\n// Example:\n// copy = {\n// \t'$MSG': 'Hello %$NAME%',\n// \t'$NAME': '%$FIRST_NAME% %$SURNAME%',\n// \t'$FIRST_NAME': 'John',\n// \t'$SURNAME': 'Doe'\n// };\n// getCopyWithParams(copy, '$MSG'); // Hello John Doe\n// getCopyWithParams(copy, 'Bye %$NAME%'); // Bye John Doe (if attribute is not a copy element, it uses that value directly)\n// getCopyWithParams(copy, '%$FIRST_NAME% is %$MOOD%'); // John is $MOOD (if a variable is not defined, outputs its name)\n// getCopyWithParams(copy, '100% with %$SURNAME%'); // 100% with Doe (a % sign alone still works)\n// getCopyWithParams(copy, 'a \\\\%protected% part'); // a %protected% part (prepend with a \\ to prevent parsing ; warning : needs to be doubled in string literals because of default JS escaping)\nfunction _getCopyWithParams(copy, attribute, _n) {\n\t// Prevent infinite recursion (e.g. $A = %$B%, $B = %$A%)\n\tif (++_n > 10) return attribute;\n\t// let content = copy.hasOwnProperty(attribute) ? copy[attribute] : attribute;\n\tconst content = accessNested(copy, attribute, attribute) + ''; // Allow using %subObject.$VALUE%\n\treturn content.replace(/(\\\\)?%([^% ]+)%/g, (m, s, g) => s ? '%' + g + '%' : getCopyWithParams(copy, g, _n));\n}\nfunction getCopyWithParams(copy, attribute) { return _getCopyWithParams(copy, attribute, 0); }\n\n\n// Returns a tt image name based on some conditional data (used in home)\nfunction getSizeBasedTT(data, client, baseName, alternateName) {\n\tbaseName = baseName || 'tt.png';\n\talternateName = alternateName || 'tt2.png';\n\tif (!data) {\n\t\treturn baseName;\n\t}\n\n\tclient = client || Store.get().client;\n\tif (typeof data === 'string') {\n\t\tdata = { 1: data };\n\t}\n\n\tlet values = Object.keys(data).map(k => {\n\t\tlet val = data[k];\n\t\tif (val && typeof val === 'object' && !val.name) {\n\t\t\tval = Object.assign({ name: k + '.png' }, val);\n\t\t}\n\t\treturn val;\n\t}).filter(e => e);\n\n\tlet groups = [];\n\tif (values.every(val => typeof val === 'object')) {\n\t\tgroups = values.sort((a, b) => {\n\t\t\tif (a.order && b.order) return a.order - b.order;\n\t\t\tif (a.order) return -1;\n\t\t\tif (b.order) return 1;\n\t\t\treturn values.indexOf(a) - values.indexOf(b);\n\t\t});\n\t} else {\n\t\tgroups = [data];\n\t}\n\n\tlet dSize = client.deviceSize;\n\tlet device = client.device;\n\tlet orientation = client.orientation;\n\tlet result = groups.find(group => {\n\t\tlet { name, order, ...conditions } = group;\n\t\tconditions = asList(conditions);\n\t\treturn !conditions.length || conditions.some(cond => {\n\t\t\tif (!cond) return false;\n\t\t\tlet ok = true;\n\t\t\tif (cond[0] === \"!\") {\n\t\t\t\tok = false;\n\t\t\t\tcond = cond.slice(1);\n\t\t\t}\n\n\t\t\tlet [cDevice, cOrientation] = cond.split(\":\");\n\t\t\tif (cDevice && cDevice !== \"*\") {\n\t\t\t\tlet invalid = false;\n\t\t\t\tif (cDevice.startsWith(\"device=\")) {\n\t\t\t\t\tinvalid = cDevice.slice(7) !== device;\n\t\t\t\t} else if (cDevice.startsWith(\"size=\")) {\n\t\t\t\t\tinvalid = cDevice.slice(5) !== dSize;\n\t\t\t\t} else {\n\t\t\t\t\tinvalid = cDevice !== dSize && cDevice !== device;\n\t\t\t\t}\n\t\t\t\tif (invalid) return !ok;\n\t\t\t}\n\t\t\tif (cOrientation && cOrientation !== \"*\" && cOrientation !== orientation) return !ok;\n\t\t\treturn ok;\n\t\t});\n\t});\n\n\treturn result ? result.name || alternateName : baseName;\n}\n\n// Should put that in the appData\nconst staticSigningService = 'https://static-maps.s-prod.pow.io';\n// const staticSigningService = 'https://static-maps.s-test.pow.io';\n// const staticSigningService = 'http://localhost:6661';\n\n// Request a signed static maps url and puts it in the store when done (also returns a Promise with the result)\nfunction requestSignedStaticMapUrl(url) {\n\tlet store = Store.get();\n\tlet urls = store.showtimes.staticMaps;\n\tif (urls[url]) {\n\t\treturn Promise.resolve(urls[url]);\n\t}\n\turls.set(url, { loading: true });\n\n\tlet data = {\n\t\turl: url,\n\t\tstudio: accessNested(store, 'appData.meta.studio.slug')\n\t};\n\n\t// Dummy version\n\t// return new Promise(resolve => setTimeout(() => resolve({ signed: url }), 5000)).then(result => {\n\treturn fetch(staticSigningService + '/sign', {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Accept': 'application/json',\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tbody: JSON.stringify(data)\n\t}).then(res => res.json()).then(result => {\n\t\tlet urls = Store.get().showtimes.staticMaps;\n\t\turls.set(url, result);\n\t\treturn result;\n\t}).catch(err => {\n\t\tconsole.log('static signature error', err);\n\t\tStore.get().showtimes.staticMaps.set('error', true);\n\t\t// Store.emit(actions.LOAD_DYNAMIC_MAP);\n\t});\n}\n\nexport {\n\tgetGeoFromIPAsync,\n\tgetGeoScreeningsAsync,\n\trawSearchLocation,\n\tsearchLocation,\n\tgetTheatersScreeningsAsync,\n\tprocessScreeningsApi,\n\tgetCitiesAsync,\n\tbuildClientStoreData,\n\tgetSize,\n\tgetDims,\n\tgetDevice,\n\tupdateQueryStringItem,\n\tcalculateShowtimesStatus,\n\tgetAC_ID,\n\tisInViewport,\n\tgetQueryParameterByName,\n\tfindParent,\n\tgetPath,\n\tgetPageTitle,\n\tgetPiwikId,\n\tgetCopyWithParams,\n\tgetSizeBasedTT,\n\tgetIsIOS,\n\trequestSignedStaticMapUrl\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/clientUtils.js","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/qs/lib/index.js\n// module id = 5\n// module chunks = 0","import Store from 'store/store';\nimport * as actions from 'store/actions';\nimport { getSize, getDims } from 'utils/clientUtils';\nimport { isObject } from 'utils/utils';\n\nlet gaEnabled = false;\nlet piwik;\nlet powT;\nlet gaCategory = '';\nlet gaPrefixList = [];\nlet tracked = {};\n\nlet isInit = false;\nlet isGAInit = false;\nlet queue = [];\nlet gaQueue = [];\n\n/**\n * Call this function to track an action\n * @param  {Object} data\n */\nexport function track(data) {\n\tif (typeof window === \"undefined\") {\n\t\tconsole.trace(\"TRACKING SERVER-SIDE\");\n\t\treturn;\n\t}\n\n\t// Edit is enabled, so stop tracking\n\tif (__INITIAL_STATE__.editable) {\n\t\treturn;\n\t}\n\n\tif (typeof data === \"string\") data = { a: data };\n\tlet {\n\t\ta, // action name\n\t\tl, // label, used for action value like the theater id that was clicked\n\t\tni, // non-interactive, used to help determine bounce rate though currently not used with the piwik-based tracker\n\t\tonce, // should the event only be called once\n\t\tv, // event value (google analytics only)\n\t\tuseCustomPageTrack // if true, add potential activePage tracking suffix\n\t} = data;\n\n\t// (temporarily <- :/) separate static from standard\n\ta = \"static-\" + a;\n\n\tlet suffix = '';\n\tif (useCustomPageTrack) {\n\t\tlet activePage = Store.get().activePage;\n\t\tif (activePage && activePage.trackingSuffix && activePage.id !== 'showtimes') {\n\t\t\t// true: use the page id as the suffix (e.g. event-name-pageid)\n\t\t\t// string: use this value as the suffix\n\t\t\tsuffix = activePage.trackingSuffix === true ? activePage.id : activePage.trackingSuffix;\n\t\t}\n\t}\n\tif (suffix) {\n\t\ta += '-' + suffix;\n\t}\n\n\tlet currentTime = new Date().getTime();\n\t// check if time difference is less than 100ms or if it should only be called once\n\tif (tracked[a] && (currentTime - tracked[a] < 100 || once)) return;\n\t// store time of last tracking\n\ttracked[a] = currentTime;\n\n\t// Tracking debuging\n\t// console.trace();\n\tconsole.debug(`%cTRACK: %c${a} ${typeof l !== 'undefined' ? '[label:' + l + ']' : ''}`, 'color:blue; font-weight: bold;', 'font-style: italic;');\n\n\t// Send out event to store for pixels\n\ttry {\n\t\tStore.emit(\n\t\t\t\"TRACK_\" +\n\t\t\t\ta\n\t\t\t\t.replace(/^static-/, \"\")\n\t\t\t\t.replace(/[- ]/g, \"_\")\n\t\t\t\t.toUpperCase(),\n\t\t\tdata\n\t\t);\n\t} catch(e) {\n\t\tconsole.log('Error during track event', e);\n\t}\n\n\t// powT.trackEvent('cat', a, l);\n\tif (isInit && data.isBeacon) {\n\t\tbeacon(a, l);\n\t\treturn;\n\t}\n\tif (isInit) {\n\t\t// powT.trackEvent(__INITIAL_STATE__.appData.meta.title.slug, a, l);\n\t\tpowTracker.trackEvent(a, l);\n\t} else {\n\t\tqueue.push([a, l]);\n\t}\n\n\t// -- GOOGLE ANALYTICS\n\tif (a.slice(0, 7) === \"static-\") {\n\t\t// Test before slicing in case we remove \"static-\" in the future\n\t\ta = a.slice(7);\n\t}\n\tlet region = __INITIAL_STATE__.appData.meta.region.slug;\n\tlet tData = {\n\t\thitType: \"event\",\n\t\teventCategory: gaCategory,\n\t\teventAction: \"website/core/\" + region + \"/\" + a\n\t};\n\tif (l) tData.eventLabel = l.toString();\n\tif (v) tData.eventValue = parseInt(v);\n\tif (ni) tData.nonInteraction = 1;\n\tgaCustom(\"send\", tData);\n}\n\nexport function gaCustom(eventName) {\n\tif (gaEnabled) {\n\t\tlet args = [].slice.call(arguments, 1);\n\t\tgaPrefixList.forEach(name => ga.apply(ga, [name + eventName].concat(args)));\n\t} else {\n\t\t// if(!window.gaQueue) window.gaQueue = [];\n\t\t// window.gaQueue.push(arguments);\n\t\tgaQueue.push(arguments);\n\t}\n}\n\nfunction beacon(a, n) {\n\tif (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n\t\tlet preq = \"?e_a=\" + encodeURIComponent(a);\n\t\tif (n !== undefined) {\n\t\t\tpreq += \"&e_n=\" + encodeURIComponent(n);\n\t\t}\n\t\t// let data = powT.getRequest(preq);\n\t\t// let baseUrl = powT.getTrackerUrl();\n\t\tlet data = powTracker.getRequest(preq);\n\t\tlet baseUrl = powTracker.getTrackerUrl() || '//:0';\n\t\tif (baseUrl.startsWith(\"//:0\")) return;\n\t\ttry {\n\t\t\tnavigator.sendBeacon(baseUrl + data);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"failed to send beacon\", baseUrl + data);\n\t\t}\n\t}\n}\n\n/**\n * Tracking function for going to an external link\n * @param  {String} href\n * @param  {String} trackId\n * @param  {String} label\n */\nexport function trackLinkOut(href, trackId, label) {\n\tlabel = label instanceof Event ? undefined : label;\n\tStore.emit(actions.EXTERNAL_LINK_CLICKED, { href, trackId, label });\n\ttrack({ a: trackId || \"clicked-link-out\", l: label });\n}\n\nfunction setupGA(id, name, anonymize, ref, activePage, campaign) {\n\tif (!id) return;\n\tlet namePrefix = name ? name + \".\" : \"\";\n\tlet optsObj = { cookieExpires: 31536000 };\n\tif (name) optsObj.name = name;\n\tga(\"create\", id, optsObj);\n\tif (anonymize) ga(namePrefix + \"set\", \"anonymizeIp\", true);\n\tif (ref) ga(namePrefix + \"set\", \"referrer\", decodeURIComponent(ref));\n\tif (campaign) ga(namePrefix + \"set\", \"campaignName\", campaign);\n\tif (activePage) {\n\t\tga(namePrefix + \"set\", \"page\", activePage.path + location.search);\n\t}\n\tga(namePrefix + \"send\", \"pageview\");\n\n\tgaPrefixList.push(namePrefix);\n}\n\n/**\n * Init piwik tracking\n * @param  {Object} appData - appData coming from thundr\n */\nexport function initTracker(appData, options) {\n\tlet isToolkitIframe = location.search.match(/[?&]toolkit=true(&|$)/);\n\tlet disabled = !appData || (appData.options && appData.options.disableTracking) || isToolkitIframe;\n\tif (disabled || isInit || window.__IS_DEMO__ || window.__IS_LOCAL__) {\n\t\treturn;\n\t}\n\tif (typeof powTracker === 'undefined') {\n\t\tlet trackingScript = document.querySelector('script[src*=\"tracking.powster.com\"]');\n\t\tif (trackingScript) {\n\t\t\ttrackingScript.onload = initTracker.bind(this, appData, options);\n\t\t} else {\n\t\t\tlet script = document.createElement('script');\n\t\t\tscript.src = 'https://tracking.powster.com/js/tracker.js';\n\t\t\tscript.onload = initTracker.bind(this, appData, options);\n\t\t\tdocument.body.appendChild(script);\n\t\t}\n\t\treturn;\n\t}\n\tisInit = true;\n\n\tconst studio = appData.meta.studio.slug;\n\tconst title = appData.meta.title.slug;\n\tconst region = appData.meta.region.slug;\n\tconst viewMode = getSize(getDims());\n\tconst pageType = \"website\";\n\tconst ref = window.customReferrer || document.referrer;\n\n\t// powT = piwik.getTracker(appData.apis.tracking.insights.root + \"/t\", 1);\n\n\tpowTracker.initTracker(\n\t\tappData.apis.tracking.insights.root + \"/t\",\n\t\t__INITIAL_STATE__.appData.meta.title.slug,\n\t\toptions\n\t);\n\t//\n\t// Make sure the campaign url parameter is always lowercase\n\tlet search = location.search;\n\tlet campaign = search.match(/(?:\\?|&)(campaign)=([^&]+)/i);\n\tlet campaignValue = decodeURIComponent((campaign && campaign[2]) || \"\");\n\tif (campaign && campaign[1] !== \"campaign\") {\n\t\tlet newSearch = search.replace(/(\\?|&)campaign=/i, \"$1campaign=\");\n\t\tlet newUrl =\n\t\t\tlocation.protocol +\n\t\t\t\"//\" +\n\t\t\tlocation.host +\n\t\t\tlocation.pathname +\n\t\t\tnewSearch +\n\t\t\tlocation.hash;\n\t\t// console.log('fixing campaign', newUrl);\n\t\t// powT.setCustomUrl(newUrl);\n\t\tpowTracker.setCustomUrl(newUrl);\n\t}\n\tif (window.__IS_FACEBOOK__) {\n\t\t// powT.setCustomUrl(appData.meta.url + \"?campaign=fbtab\");\n\t\tpowTracker.setCustomUrl(appData.meta.url + \"?campaign=fbtab\");\n\t\tcampaignValue = \"fbtab\";\n\t}\n\n\tif (ref) {\n\t\t// powT.setReferrerUrl(decodeURIComponent(ref));\n\t\tpowTracker.setReferrerUrl(decodeURIComponent(ref));\n\t}\n\t// powT.setCampaignNameKey(\"campaign\");\n\t// powT.setCustomVariable(1, \"studio\", studio, \"visit\");\n\t// powT.setCustomVariable(2, \"movie\", title, \"visit\");\n\t// powT.setCustomVariable(3, \"region\", region, \"visit\");\n\t// powT.setCustomVariable(4, \"page_type\", pageType, \"visit\");\n\t// powT.setCustomVariable(5, \"view_mode\", viewMode, \"visit\");\n\t// powT.trackPageView();\n\n\t// Powster Tracking\n\tpowTracker.setCustomVariable(1, \"studio\", studio);\n\tpowTracker.setCustomVariable(2, \"movie\", title);\n\tpowTracker.setCustomVariable(3, \"region\", region);\n\tpowTracker.setCustomVariable(4, \"page_type\", pageType);\n\tpowTracker.setCustomVariable(5, \"view_mode\", viewMode);\n\t// Initial Page view event\n\tpowTracker.trackEvent(\"visit\");\n\n\t// powT.trackPageView();\n\tqueue.forEach(ev => {\n\t\t// powT.trackEvent(__INITIAL_STATE__.appData.meta.title.slug, ev[0], ev[1])\n\t\tpowTracker.trackEvent(ev[0], ev[1]);\n\t});\n\n\t// Google analytics ?\n\tif (\n\t\t!appData.options.coppa &&\n\t\tappData.options.useGoogleAnalytics &&\n\t\tappData.apis.tracking.googleAnalytics\n\t) {\n\t\tlet gad = appData.apis.tracking.googleAnalytics;\n\t\tlet actuallyLoadGA = function() {\n\t\t\tif (gaEnabled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgaEnabled = true;\n\t\t\t(\n\t\t\t\tfunction(p, o, w, s, t, e, r) {\n\t\t\t\t\tp[\"GoogleAnalyticsObject\"] = t;\n\t\t\t\t\t(p[t] = p[t] || function() { (p[t].q = p[t].q || []).push(arguments); }),\n\t\t\t\t\t(p[t].l = 1 * new Date());\n\t\t\t\t\t(e = o.createElement(w)), (r = o.getElementsByTagName(w)[0]);\n\t\t\t\t\te.async = 1; e.src = s;\n\t\t\t\t\tr.parentNode.insertBefore(e, r);\n\t\t\t\t}\n\t\t\t)(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n\n\t\t\t// TODO: this as a param ?\n\t\t\tlet activePage = Store.get().activePage;\n\t\t\tlet anonymize = true;\n\n\t\t\t// setupGA(gad.global);\n\t\t\t// setupGA(gad.showtimes, 'showtimes');\n\t\t\t// setupGA(gad.local, 'local');\n\t\t\tObject.keys(gad).forEach(name => {\n\t\t\t\tlet id = gad[name];\n\t\t\t\tif (typeof id === \"string\" && id.slice(0, 3) === \"UA-\") {\n\t\t\t\t\tsetupGA(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname === \"global\" ? null : name,\n\t\t\t\t\t\tanonymize,\n\t\t\t\t\t\tref,\n\t\t\t\t\t\tactivePage,\n\t\t\t\t\t\tcampaignValue\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tgaCategory = gad.category;\n\t\t\tgaQueue.forEach(gaEv => {\n\t\t\t\tgaCustom.apply(window, gaEv);\n\t\t\t});\n\t\t};\n\n\t\tif (gad.oneTrustCategory) {\n\t\t\tif (window.powsterOneTrust && window.powsterOneTrust.indexOf(gad.oneTrustCategory) !== -1) {\n\t\t\t\tactuallyLoadGA();\n\t\t\t}\n\t\t\twindow.addEventListener('powster.onetrust.' + gad.oneTrustCategory, actuallyLoadGA);\n\t\t} else {\n\t\t\tactuallyLoadGA();\n\t\t}\n\t}\n\n\ttrack({ a: \"page_is\", ni: 1 });\n}\n\nexport function updateDataLayer(obj) {\n\t// Nothing to do here if there is no dataLayer\n\tif (!window.dataLayer || typeof dataLayer.push !== \"function\" || !window.googleTagManagerActive) {\n\t\treturn;\n\t}\n\n\tdataLayer.push(obj);\n}\n\n/**\n * Update the data layer with info about the current screening\n * @param  {Object} screening\n * @param  {Object} theater\n * @param  {string} event\n * @param  {string} href\n * @param  {string} provider\n */\nexport function updateDataLayerScreening(\n\tscreening,\n\ttheater,\n\tevent,\n\thref,\n\tcta,\n\tprovider\n) {\n\tif (!screening) return;\n\tlet obj = {};\n\tif (event) {\n\t\tobj.event = event;\n\t}\n\tif (href) {\n\t\tobj.href = href;\n\t}\n\tif (screening.movie && screening.movie.title) {\n\t\tobj.filmTitle = screening.movie.title;\n\t}\n\tif (theater) {\n\t\tif (isObject(theater.location)) {\n\t\t\tif (typeof theater.location.toJS === 'function') {\n\t\t\t\tobj.location = theater.location.toJS();\n\t\t\t} else {\n\t\t\t\tobj.location = theater.location;\n\t\t\t}\n\t\t}\n\t\tobj.theater = theater.name;\n\t\tif (theater.exhibitor) {\n\t\t\tobj.exhibitor = theater.exhibitor.domain;\n\t\t}\n\t}\n\tif (screening.stDate) {\n\t\tobj.day = screening.stDate.ddmmyyyy;\n\t}\n\tif (screening.time24) {\n\t\tobj.time = screening.time24;\n\t}\n\n\tobj.cta = cta || undefined;\n\t// NOTE: ^ Clients want undefined when cta not present\n\n\tif (provider) {\n\t\tobj.provider = provider;\n\t}\n\n\tupdateDataLayer(obj);\n}\n\n/**\n * Update the data layer when the page changes\n * @param  {String} pageId\n * @param  {Boolean} firstLoad\n */\nexport function updateDataLayerPageView(pageId, firstLoad) {\n\t// Let's send a different event depending if it's the initial load\n\t// or just a page change\n\tupdateDataLayer({\n\t\tevent: firstLoad ? \"page_load\" : \"page_change\",\n\t\tpage: pageId\n\t});\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/tracking.js","import { h } from 'preact';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport qs from 'qs';\nimport { condClass, toQueryString, accessNested } from 'utils/utils';\nimport { getPath } from 'utils/clientUtils';\nimport { track, trackLinkOut } from 'utils/tracking';\nimport route from 'components/core/link/route';\nimport * as svg from 'components/shared/svgIcons/svgIcons.js';\nimport s from 'components/core/link/link.sss';\nimport ExitModal from 'components/shared/modal/exitModal';\nimport { getStaticData } from 'utils/staticData';\n\nconst isServer = typeof window === 'undefined';\n\n\n// Static data from the store\nlet staticData;\n\n/**\n * Link component to navigate through the site\n * @prop  {String} trackId - tracking id that gets called when clicked\n * @prop  {String} pageId - the id for the page it needs to navigate to\n * @prop  {String} href - href for component\n * @prop  {Object} activePage - whats the current active page, not required!\n * @prop  {String} iconStyle - styling that gets applied to icon\n * @prop  {String} iconClass - class that gets applied to icon\n * @prop  {String} linkClass - class that gets added to link\n * @prop  {Boolean} noMergeQS - should the query parameters not be merged\n * @prop  {Boolean} download - true to force download rather than link out\n * @return {Object}  link dom element\n */\nexport const Link = (fullProps) => {\n\tlet {\n\t\ttrackId,\n\t\ttrackLabel,\n\t\tchildren,\n\t\tpageId,\n\t\thref,\n\t\tactivePage,\n\t\tpages,\n\t\ticonStyle,\n\t\ticonClass,\n\t\tlinkClass,\n\t\tnoMergeQS,\n\t\tappData,\n\t\tqueryString,\n\t\tchildId,\n\t\tremoveSourceQS,\n\t\textraOnClick, // Function called on link click, in addition to the standard handlers\n\t\trenderCustomChild, // Enable when you want to ignore the span element and render your own children\n\t\texitModal,    // Use the exit modal - only useful if Features > exitModal is off in the appData\n\t\tignoreExitModal, // Ignore the exit modal for outbound links\n\t\tchildHTML,\n\t\tHTMLTag = \"a\",\n\t\tscrollSection, // ID of section to scroll to\n\t\t...props\n\t} = fullProps;\n\n\tif (!staticData) {\n\t\t// Get the static data if it hasn't been loaded in yet\n\t\t// So we can use it in the click events etc...\n\t\tstaticData = getStaticData();\n\t}\n\n\tif (pageId) {\n\t\t// page id is provided, so its an \"internal\" link\n\t\tlet store, getStore = () => store || (store = Store.get());\n\t\tif (!activePage) {\n\t\t\t// No activePage provided\n\t\t\tactivePage = getStore().activePage;\n\t\t}\n\n\t\tif (!href) {\n\t\t\tlet pagePath = getPath(pageId);\n\t\t\tif (pagePath) {\n\t\t\t\t// See if the page provided actually exists\n\t\t\t\thref = getRelativeRoot(getPath(activePage)) + pagePath.slice(1);\n\t\t\t} else {\n\t\t\t\t// No luck in finding it\n\t\t\t\thref = '.';\n\t\t\t}\n\t\t\tif (scrollSection) {\n\t\t\t\thref += '#' + scrollSection;\n\t\t\t}\n\t\t} else if (href[0] === '/') {\n\t\t\t// Already provided with an href\n\t\t\thref = getRelativeRoot(getPath(activePage)) + href.substring(1);\n\t\t}\n\t}\n\n\tif (queryString || pageId) {\n\t\t// Keep the current page query string if internal link and not specified otherwise\n\t\tlet newQS = isServer || !pageId || noMergeQS ? {} : qs.parse(location.search.substr(1));\n\t\tif (!removeSourceQS) {\n\t\t\tlet baseQS = href.match(/\\?([^#]*)(#|$)/);\n\t\t\tnewQS = Object.assign(newQS, qs.parse((baseQS && baseQS[1]) || ''));\n\t\t}\n\t\tlet removeV = true;\n\t\tif (queryString) {\n\t\t\tlet queryStringObj = typeof queryString === 'string' ? qs.parse(queryString) : queryString;\n\t\t\tif (queryStringObj.v) {\n\t\t\t\tremoveV = false;\n\t\t\t}\n\t\t\tnewQS = Object.assign(newQS, queryStringObj);\n\t\t}\n\t\t// removes youtube ID from URL when navigating away from the specific video page\n\t\tif (removeV && newQS.hasOwnProperty(\"v\")) {\n\t\t\tdelete newQS.v;\n\t\t}\n\t\tlet newQSString = toQueryString(newQS);\n\t\thref = href.replace(/(\\?([^#]*))?(#|$)/, newQSString + '$3');\n\t}\n\n\tlet onClick;\n\t// Only redirect through page if it doesn't have a target blank\n\tif (pageId && fullProps.target !== '_blank') {\n\t\tonClick = generateOnClick(handlePageLinkClick.bind(this, pageId, !noMergeQS, trackId, trackLabel), extraOnClick);\n\t} else {\n\t\tonClick = generateOnClick(trackLinkOut.bind(this, href, trackId, trackLabel), extraOnClick, clickOut.bind(this, href, exitModal, !!ignoreExitModal));\n\t}\n\n\tconst IconComponent = svg[iconClass];\n\tconst anchorLink = (iconClass || iconStyle) ? s.iconLink : s.link;\n\n\tif (props.class) {\n\t\tlinkClass = props.class;\n\t\tdelete props.class;\n\t}\n\n\tlet inside = children;\n\tif (!renderCustomChild) {\n\t\tinside = [];\n\t\tif (iconStyle) {\n\t\t\tinside.push(\n\t\t\t\t<div style={iconStyle} class={s.iconLinkUrl} />\n\t\t\t);\n\t\t}\n\t\tif (IconComponent) {\n\t\t\tinside.push(\n\t\t\t\t<IconComponent class={s.iconLinkSvg} />\n\t\t\t);\n\t\t}\n\t\tconst extraSpanProps = {};\n\t\tif (childHTML) {\n\t\t\textraSpanProps.dangerouslySetInnerHTML = { __html: childHTML };\n\t\t}\n\t\tinside.push(\n\t\t\t<span class={anchorLink} id={childId} {...extraSpanProps}>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn (\n\t\t<HTMLTag\n\t\t\tclass={s.top + condClass(linkClass)}\n\t\t\thref={href}\n\t\t\tonClick={onClick}\n\t\t\t{...props}\n\t\t>\n\t\t\t{inside}\n\t\t</HTMLTag>\n\t);\n};\n\nfunction generateOnClick() {\n\n\tlet fList = Array.prototype.concat.apply([], arguments);\n\tfList = fList.filter(f => typeof f === 'function');\n\tif (!fList.length) return;\n\t// Do not put an arrow function here so that we can use this and arguments\n\treturn function() {\n\t\tfList.forEach(f => {\n\t\t\t// try-catch to prevent pixel errors breaking everything\n\t\t\ttry {\n\t\t\t\tf.apply(this, arguments);\n\t\t\t} catch(e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n}\n\nfunction clickOut(href, useExitModal, ignoreExitModal, ev) {\n\tif ((useExitModal || staticData.options.exitModal) && !ignoreExitModal) {\n\t\t// Display the exit modal before allowing the user to leave the site\n\t\tev.preventDefault();\n\t\t// NOTE: This may be annoying if you're looking at a screening far down the list and it brings you back up\n\t\t// We should find other ways to solve the issues caused by not having that\n\t\twindow.scrollTo(0, 0);\n\t\tStore.emit(actions.SHOW_MODAL, <ExitModal href={href} vanity={staticData.meta.url} />, null, { type: 'themed' });\n\t}\n}\n\nexport function getRelativeRoot(path) {\n\treturn (path.substring(1).match(/\\//g) || []).map(() => ('../')).join('');\n}\n\n// Get the relative url for a page.\n// page can be a string (page id) or a page appData object\nexport function getRelativePageUrl(page) {\n\tif (!page) return '.';\n\n\tlet href = '.';\n\tlet pagePath = getPath(page);\n\tif (pagePath) {\n\t\tlet activePage = Store.get().activePage;\n\t\thref = getRelativeRoot(getPath(activePage)) + pagePath.slice(1);\n\t}\n\n\treturn href;\n}\n\nexport function getAbsolutePageUrl(page) {\n\tlet relative = getRelativePageUrl(page);\n\tlet a = document.createElement('a');\n\ta.href = relative;\n\treturn a.href;\n}\n\nexport function goToPage(pageId, queryString, noMergeQS, hash) {\n\tif (!pageId) return;\n\tlet page = accessNested(Store.get(), ['appData', 'pages', pageId]);\n\tif (!page) {\n\t\treturn;\n\t}\n\tlet href = getRelativePageUrl(page);\n\n\t// Keep the current page query string if internal link and not specified otherwise\n\tlet newQS = isServer || noMergeQS ? {} : qs.parse(location.search.substr(1));\n\tif (queryString) {\n\t\tnewQS = Object.assign(newQS, typeof queryString === 'string' ? qs.parse(queryString) : queryString);\n\t}\n\tlet newQSString = toQueryString(newQS);\n\thref = href + newQSString;\n\tif (hash && typeof hash === 'string') {\n\t\thref += (hash[0] === '#' ? '' : '#') + hash;\n\t}\n\n\tStore.emit(actions.SET_ACTIVE_PAGE, page);\n\troute(href, pageId);\n}\nif (typeof window !== 'undefined') {\n\twindow.goToPage = goToPage;\n}\n\nfunction handlePageLinkClick(pageId, mergeQS, trackId, trackLabel, event) {\n\tif (event.stopImmediatePropagation) event.stopImmediatePropagation();\n\tevent.stopPropagation();\n\tevent.preventDefault();\n\n\tif (typeof window.beforePageChange === 'function') {\n\t\tlet confirmation = window.beforePageChange();\n\t\tif (confirmation && typeof confirmation === 'string' && !confirm(confirmation)) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tlet page = accessNested(Store.get(), ['appData', 'pages', pageId]);\n\tif (page) {\n\t\tStore.emit(actions.SET_ACTIVE_PAGE, page);\n\t}\n\tlet href = event.currentTarget.getAttribute('href');\n\troute(href, pageId);\n\n\ttrackId = trackId || 'clicked-' + pageId;\n\tlet trackData = { a: trackId };\n\tif (trackLabel) trackData.l = trackLabel;\n\ttrack(trackData);\n\n\tStore.emit(actions.LINK_CLICKED, { trackId, pageId, link: href });\n\treturn false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/core/link/link.js","export default class Geo {\n\n\tsetGoogleLatLng() {\n\t\tif (typeof window !== 'undefined' && window.google && window.google.maps) {\n\t\t\tthis.googleLatLng = new window.google.maps.LatLng(this.lat, this.lon);\n\t\t}\n\n\t\treturn this.googleLatLng;\n\t}\n\n\ttoGoogleLatLng() {\n\t\treturn this.googleLatLng || this.setGoogleLatLng();\n\t}\n\n\tconstructor({ lat, lon, countryCode, city, src }) {\n\t\tthis.lat         = lat;\n\t\tthis.lon         = lon;\n\t\tthis.city        = city;\n\t\tthis.countryCode = countryCode;\n\t\tthis.src         = src;\n\n\t\tthis.setGoogleLatLng();\n\t}\n\n\tupdate({ lat, lon }) {\n\t\tthis.lat = lat;\n\t\tthis.lon = lon;\n\n\t\tthis.setGoogleLatLng();\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify({\n\t\t\tlat:         this.lat,\n\t\t\tlon:         this.lon,\n\t\t\tcity:        this.city,\n\t\t\tcountryCode: this.countryCode\n\t\t});\n\t}\n\n\tequals(otherGeo) {\n\t\tif (!(otherGeo instanceof Geo)) return undefined;\n\t\treturn otherGeo.lat === this.lat && otherGeo.lon === this.lon;\n\t}\n\n\tquickDistIndicator(otherGeo) {\n\t\tlet dl = otherGeo.lat - this.lat;\n\t\tlet dL = otherGeo.lon - this.lon;\n\n\t\treturn dl * dl + dL * dL;\n\t}\n\n\tdistanceFrom(otherGeo, unit, precision) {\n\t\tif (!(otherGeo instanceof Geo)) return undefined;\n\n\t\tlet R = 6371; // km\n\t\tif (unit === 'mi') R *= 0.621371192;\n\t\tlet deg2rad = Math.PI / 180;\n\t\tlet φ1 = otherGeo.lat * deg2rad;\n\t\tlet φ2 = this.lat * deg2rad;\n\t\t// let Δφ = (this.lat - otherGeo.lat) * deg2rad;\n\t\tlet Δφ = φ2 - φ1;\n\t\tlet Δλ = (this.lon - otherGeo.lon) * deg2rad;\n\n\t\tlet sinφ = Math.sin(Δφ / 2), sinλ = Math.sin(Δλ / 2);\n\t\tlet a = sinφ * sinφ + Math.cos(φ1) * Math.cos(φ2) * sinλ * sinλ;\n\t\tlet c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n\t\tlet value = R * c;\n\n\t\tif (precision != undefined) {\n\t\t\tlet roundTo = Math.pow(10, ~~precision);\n\t\t\tvalue = Math.round(value * roundTo) / roundTo;\n\t\t\t// .toFixed ?\n\t\t}\n\n\t\treturn value;\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Geo.js","/**\n * Base file for all ticketing stuff\n * Contains MX enums and structures, typedefs and helpers.\n *\n * @module ticketing/public\n */\n\nimport { h } from 'preact';\nimport { isObject, accessNested, joinPaths, pathOnly } from 'utils/utils';\nimport Store from 'store/store';\nimport { getRelativeRoot } from 'components/core/link/link';\n\nconst IS_DEMO = typeof window !== 'undefined' && accessNested(window, '__INITIAL_STATE__.' +\n\t'appData.options.isDemoTicketing', false);\n\nconst IFRAME_COMMUNICATOR_PAGE_SLUG = 'iframe-communicator';\nconst PRINT_YOUR_TICKET_PAGE_SLUG = 'print-your-ticket';\n\n/** Fallback deeplinks providers (ordered by preference) */\nconst deeplinkProviders = ['cinema', 'fandango', 'movietickets', 'atom'];\n\n/**\n * Return whether ticketing is in demo mode.\n * Demo ticketing does use test data.\n *\n * @function\n * @return {!boolean} true if demo ticketing is enabled, false otherwise\n */\nexport const isDemoTicketing = () => IS_DEMO;\n\n/**\n * Available gateway identifiers\n * If you add a gateway here, then every exhibitor using this gateway will have direct\n * ticketing enable on the platform.\n *\n * @readonly\n * @enum {string}\n */\nexport const gateways = {\n\tAUTHNET:    'authnet',\n\tVANTIV:     'vantiv',\n\tPXPAY:      'pxpay',\n\tVERIFONE2:  'verifone2',\n\tBRAINTREE:  'braintree',\n\tMASTERCARD: 'mastercard'\n\t// PAYEEZY:   'payeezy'\n};\n\n/**\n * Temporary default gateway for ticketing.\n * As the gateway is not available in the doc yet, you can use this for test purposes.\n *\n * @type {string}\n */\nexport const defaultGateway = gateways.AUTHNET;\n\n/**\n * Indicate the current status of the seat\n *\n * @readonly\n * @enum {number}\n * @see {@link https://bit.ly/2GKuww5|MX Ticketing Documentation}\n */\nexport const seatStatus = {\n\tAVAILABLE:   0,\n\tSOLD:        1,\n\tHOUSE:       2,\n\tWHEELCHAIR:  3,\n\tRESERVED:    4,\n\tBROKEN:      5,\n\tPLACEHOLDER: 6,\n\tCOMPANION:   7\n};\n\n/**\n * Enumeration of MX errors.\n * Can be used for localisation.\n *\n * @readonly\n * @enum {number}\n * @see {@link https://goo.gl/AuhR9D|MX Documentation}\n */\nexport const mxErrors = {\n\tUNEXPECTED_ERROR:                       10000, // An unexpected error/database error/component error has occurred\n\tCINEMA_CHAIN_CONFIG_ISSUE:              10001, // There's a configuration issue with the cinema chain requested\n\tAUTHORISATION_EXCEPTION:                10002, // An internal error occurred while trying to authorise the request\n\tVENDOR_CONFIGURATION_EXCEPTION:         10003, // There's a configuration issue with the authenticated vendor\n\n\tCINEMA_TICKET_SERVICE_ACCESS_ERROR:     20000, // Unable to reach the cinema's ticketing service\n\tCINEMA_TICKET_SERVICE_TIMEOUT:          20001, // Cinema’s ticketing service failed to respond in a timely manner\n\tCANT_CONNECT_TO_SITE:                   20002, // The Cinema’s ticketing service failed to connect to the specified site\n\tCANT_CONNECT_TO_LOYALTY:                20003, // The cinema’s ticketing service failed to connect to its loyalty system\n\n\tUNEXPECTED_CINEMA_TICKET_SERVICE_ERROR: 30000, // An unexpected error occurred at the cinema’s ticketing service\n\tFAILED_TO_RETRIEVE_SEATS_FOR_ORDER:     30001, // Seats were booked, but an unexpected error occurred while trying to retrieve seat information. Try to retrieve the order again\n\tFAILED_TO_PROCESS_ORDER_VALUE:          30002, // An unexpected error occurred while trying to calculate the order total. The order was cancelled\n\tREFUND_BOOKING_FAILED:                  30003, // The cinema's ticketing service was unable to refund this booking.\n\n\tCINEMA_TICKET_SERVICE_CONFIG_ERROR:     31001, // The cinema’s ticketing service has not been correctly configured with MXTransact\n\tCINEMA_TICKET_SERVICE_NOT_FOUND:        31002, // A site existing in MXTransact does not exist at cinema\n\n\tBOOKING_FEE_CONFIG_ERROR:               32001, // There’s a problem with the cinema’s ticketing service booking fee configuration\n\tPAYMENT_CONFIG_ERROR:                   32002, // There’s a problem with the cinema’s ticketing service payment configuration\n\n\tCINEMA_CHAIN_NOT_FOUND:                 40001, // The requested cinema chain cannot be found\n\tSITE_NOT_FOUND:                         40002, // The specified site cannot be found\n\tSHOWTIME_NOT_FOUND:                     40003, // The specified Showtime cannot be found\n\tTICKET_TYPES_MANDATORY:                 40004, // The client must provide the ticket types for the request.\n\tCONCESSIONS_NOT_SUPPORTED:              40005, // An attempt to purchase concessions was made, but Concessions are not supported in the API\n\tSHOWTIME_DOES_NOT_SUPPORT_SEATING:      40006, // An attempt to get screen layout was made, however, the Showtime is not configured to be seat-allocated\n\tTOTAL_PAYMENT_AMOUNT_IS_INSUFFICIENT:   40007, // The total payment amount specified doesn’t match the order total\n\tMULTI_SITE_ORDER_NOT_SUPPORTED:         40008, // A single order cannot contain sessions at more than one site\n\tORDER_DOES_NOT_EXISTS:                  40009, // Could not find an order with the specified ID\n\tNO_SEAT_MAP_FOR_SOLD_OUT_SHOWTIMES:     40010, // Seat map data was requested for a showtime that is already sold out\n\tTICKET_TYPE_NOT_FOUND:                  40011, // The requested ticket type was not found for the showtime\n\tREQUEST_TOO_LARGE:                      40012, // The request was too large.\n\tCUSTOMER_DETAILS_NOT_SET:               40013, // Customer details were not set for the order.\n\tVENDOR_ACCESS_NOT_ALLOWED:              40014, // You have no access to the Cinema Chain requested.\n\tREFUND_PAST_SCREENINGS_NOT_ALLOWED:     40015, // Cannot refund a booking when one or more tickets that are part of the booking are for screenings that have already screened.\n\tREFUND_CINEMA_CHAIN_NOT_ALLOWED:        40016, // The cinema chain does not allow refunds\n\tBOOKINS_BELONGS_TO_ANOTHER_VEND0R:      40017, // Cannot refund a booking made through a different vendor.\n\tINSUFFICIENT_CUSTOMER_DETAILS:          40018, // An email, name and/or phone number must be provided.\n\tLOYALTY_NOT_ALLOWED_FOR_CINEMA_CHAIN:   40019, // The cinema chain does not allow loyalty.\n\tINSUFFICIENT_LOYALTY_MEMBER_DETAILS:    40020, // Insufficient loyalty membership details.\n\tTICKET_TYPES_FOR_PAST_SCREENINGS:       40021, // Ticket types not available for past screenings.\n\n\tSEATS_UNAVAILABLE:                      41001, // The requested seats are not available\n\tNO_CONTIGUOUS_SEATS:                    41002, // The selected seats could not be automatically allocated in a single row\n\tBOOKING_DOES_NOT_EXIST:                 41003, // A booking with the specified ID does not exist\n\tBOOKING_ALREADY_CANCELLED:              41004, // The specified booking has already been cancelled\n\tSHOWTIME_UNAVAILABLE:                   41005, // The requested showtime is not available at the cinema’s ticketing service\n\tTICKET_NOT_FOR_SALE:                    41006, // Selected tickets are not currently for sale for this showtime\n\tSELECTED_SEATS_INVALID_FOR_THE_TICKET:  41007, // Selected seats are not valid for the tickets in the order\n\tORDER_ALREADY_BEING_COMPLETED:          41008, // A request to complete the order was already made and is currently in progress.\n\tORDER_CANNOT_BE_UNIQUELY_IDENTIFIED:    41009, // The cinema's ticketing service was not able to identify the requested order\n\tCOULD_NOT_GET_TICKET_TYPES_FOR_SESSION: 41010, // Could not get ticket types for the requested session. Please make sure the session is still available\n\tLOYALTY_MEMBER_NOT_FOUND:               41011  // Loyalty member could not be found.\n};\n\n/**\n * Enumeration of Powster ticketing server errors.\n * Can be used for localisation.\n *\n * @readonly\n * @enum {number}\n * @see {@link https://goo.gl/55yo3T|Powster Ticketing Error codes}\n */\nexport const powErrors = {\n\tINVALID_API_KEY:         101, // Invalid API developer key\n\tAUTH_FAIL:               102, // Authentication failed\n\tAUTH_EXPIRED:            103, // Authentication expired\n\n\tINVALID_EXHIBITOR:       301, // Unknown or incorrect exhibitor\n\n\tINVALID_ORDER:           501, // The order structure returned by MX is not valid\n\tNO_ORDER:                502, // The provided order does not exist in the ticketing database\n\tCOMPLETE_ORDER_FAIL:     503, // Failed to complete the order and get a proper booking reference\n\tNO_BOOKING_REF:          504, // The provided order does not have any booking reference\n\tNOT_YOUR_ORDER:          507, // You don't have access to this order\n\tPRIVATE_SCREENING:       508, // You don't have access to this screening\n\tTOO_MANY_ORDERS:         509, // Number of bookings for promotion exceeded\n\tTOO_MANY_TICKETS:        510, // Number of available tickets for promotion exceeded\n\n\tTRANSACTION_FAIL:        601, // The transaction was rejected\n\tNO_MERCHANT:             602, // The merchant does not exist\n\tTRANSACTION_VOID_FAIL:   603, // The given transaction cannot be voided\n\tNO_MERCHANT_CREDENTIALS: 604, // Could not acquire merchant credentials for the given site\n\n\tINVALID_PRICE:           901, // The price returned by MX is not a valid amount\n\tINVALID_BOOKING_FEE:     902  // Incorrect custom booking fee\n};\n\n/**\n * Return the key associated with a MX error code for localisation.\n *\n * @function\n * @param {!number} code - the MX error code\n * @return {string} the key associated with the given error id, or undefined if not found\n */\nexport const getMxErrorKey = (code) => Object.keys(mxErrors).find((key) => mxErrors[key] === code);\n\n/**\n * Return the key associated with a Powster Ticketing error code for localisation.\n *\n * @function\n * @param {!number} code - the Powster Ticketing error code\n * @return {string} the key associated with the given error id, or undefined if not found\n */\nexport const getPowErrorKey = (code) => Object.keys(powErrors).find((key) => powErrors[key] === code);\n\n/**\n * Return whether the given object is a valid error (as defined in the ticketing API)\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is an error object, false otherwise\n */\nconst isErrorObject = (obj) => {\n\tif (!isObject(obj) || !isObject(obj.data)) return false;\n\treturn isObject(obj.data.error) && typeof obj.data.from === 'string';\n};\n\n/**\n * Return whether the given object is a valid MX error (as defined in the MX API)\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is an MX error object, false otherwise\n */\nexport const isMxErrorObject = (obj) => {\n\treturn isErrorObject(obj) && obj.data.from === 'mx' &&\n\t\ttypeof obj.data.error.errorCode === 'number' &&\n\t\ttypeof obj.data.error.errorCodeDescription === 'string';\n};\n\n/**\n * Return whether the given object is a valid Powster Ticketing error.\n *\n * @param {*} obj - the variable to test\n * @return {!boolean} true if obj is a Powster Ticketing error object, false otherwise\n */\nexport const isPowErrorObject = (obj) => {\n\treturn isErrorObject(obj) && obj.data.from === 'pow' && typeof obj.data.error.code === 'number';\n};\n\n/**\n * @global\n * @typedef {Object} SeatLayout\n * @property {number} boundaryRight - the rightmost position of the map, in percentage 0-100\n * @property {number} boundaryLeft - the leftmost position of the map, in percentage 0-100\n * @property {number} boundaryTop - the topmost position of the map, in percentage 0-100\n * @property {number} screenStart - the leftmost position of the screen, in percentage 0-100\n * @property {number} screenWidth - the width of the screen, in percentage 0-100\n * @property {Array.<AreaCategory>} areaCategories - list of AreaCategories in the screen layout\n * @property {Array.<Area>} areas - list of Areas in the screen layout\n */\n\n/**\n * @global\n * @typedef {Object} AreaCategory\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {number} seatsToAllocate - number of seats that must be allocated for the area category\n * @property {number} seatsAllocatedCount - number of seats that have been automatically allcoated\n * @property {number} seatsNotAllocatedCount - number of seats that have not been allocated\n * @property {Array.<SeatPosition>} selectedSeats - list of SeatPositions for the allocated seats\n */\n\n/**\n * @global\n * @typedef {Object} SeatPosition\n * @property {number} areaNumber - identifies which area the seat belongs to (1 based)\n * @property {number} rowIndex - the row within the area the seat belongs to (0 based)\n * @property {number} columnIndex - the column within the area the seat belongs to (0 based)\n */\n\n/**\n * @global\n * @typedef {Object} Area\n * @property {number} number - uniquely identifies the area within the seat layout\n * @property {string} areaCategoryCode - the area category code this area belong to\n * @property {number} numberOfSeats - total number of seats within this area\n * @property {number} columnCount - number of columns of seats in the area\n * @property {number} rowCount - number of rows of seats in the area\n * @property {string} description - textual description of the area (e.g. \"Premium\", \"Stalls\")\n * @property {number} left - the leftmost position of the area within the screen layout (0-100)\n * @property {number} top - the topmost position of the area within the screen layout (0-100)\n * @property {number} width - the width of the area within the screen layout (0-100)\n * @property {number} height - the height of the area within the screen layout (0-100)\n * @property {Array.<Row>} rows - list of Rows in the area\n */\n\n/**\n * @global\n * @typedef {Object} Row\n * @property {string} rowLabel - the name of the row\n * @property {Array.<Seat>} seats - list of seats in the row\n */\n\n/**\n * @global\n * @typedef {Object} Seat\n * @property {SeatPosition} position - the seat position object\n * @property {Array.<SeatPosition>} seatsInGroup - list of seat positions for grouped seats (sofas)\n * @property {string} seatLabel - name of the seat (commonly rowLable + seatLabel, e.g. \"A12\")\n * @property {SeatStatus} status - the current seat status\n * @property {SeatStatus} originalStatus - the seat status before being reserved\n */\n\n/**\n * Return whether direct ticketing is enabled for a specific theater.\n *\n * @function\n * @param {Theater} theater - the theater of the active screening\n * @return {boolean} true if direct ticketing is enabled, false otherwise\n */\nexport const isDirectTicketingEnabled = (() => {\n\tlet store_;\n\n\treturn (theater) => {\n\t\tif (!store_) store_ = Store.get();\n\n\t\tif (!store_.appData.options.enableDirectTicketing) return false;\n\t\tif (store_.appData.options.forceDirectTicketing) return true;\n\n\t\tconst exhibitor = theater.exhibitor;\n\t\tif (!exhibitor) return false;\n\n\t\t// Check if ticketing is explicitly disabled in the theater master doc\n\t\tlet ticketingEnabled = accessNested(theater, 'masterDoc.ticketing.enabled', true);\n\t\tif (!ticketingEnabled) return false;\n\n\t\t// Check that ticketing is explicitly enabled in the exhibitor doc\n\t\tticketingEnabled = accessNested(exhibitor, 'doc.ticketing.enabled', false);\n\t\tconst paymentEnabled = accessNested(exhibitor, 'doc.payment.enabled', false);\n\n\t\t// TODO: Override on theater level\n\t\tif (!ticketingEnabled || !paymentEnabled) return false;\n\n\t\t// Make sure the payment gateway is known and supported\n\t\tconst gateway = accessNested(exhibitor, 'doc.payment.gateway', '');\n\t\tif (Object.values(gateways).indexOf(gateway) === -1) return false;\n\n\t\treturn true;\n\t};\n})();\n\n/**\n * Return a fallback url to be used in case of problem during the ticketing.\n *\n * @param {!Theater} theater - the theater of the screening\n * @param {!Screening} screening - the screening object\n * @return {string} a fallback URL\n */\nexport const getFallbackUrl = (theater, screening) => {\n\tlet fallbackUrl = theater.website;\n\tconst { urls } = screening;\n\n\tif (Object.keys(urls).length > 0) {\n\t\tfor (const providerName of deeplinkProviders) {\n\t\t\tconst url = urls[providerName];\n\t\t\tif (url) {\n\t\t\t\tfallbackUrl = url;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fallbackUrl;\n};\n\n/**\n * @global\n * @typedef {Object} TicketType\n * @property {string} id - the ID of the ticket type\n * @property {string} description - the name of the type of the ticket\n * @property {string} areaCategoryCode - the ID of the area category\n */\n\n/**\n * @global\n * @typedef {Object} AreaCategoryDef\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {Array.<string>} descriptions - an array of all the ticket types names in this area\n */\n\n/**\n * Return an array of all the different area categories found.\n *\n * @param {!Array.<TicketType>} ticketTypes - the array of all ticket types\n * @return {!Array.<AreaCategoryDef>} an array of area category definitions\n */\nexport const getAreaCategories = (ticketTypes) => {\n\tconst areaCategories = [];\n\n\tfor (const { areaCategoryCode, description } of ticketTypes) {\n\t\tconst areaCategory = areaCategories.find(category => {\n\t\t\treturn category.areaCategoryCode === areaCategoryCode;\n\t\t});\n\t\tif (areaCategory) {\n\t\t\tareaCategory.descriptions.push(description);\n\t\t} else {\n\t\t\tareaCategories.push({ areaCategoryCode, descriptions: [description] });\n\t\t}\n\t}\n\n\treturn areaCategories;\n};\n\n/**\n * Return the tickets reserved by the user as a formatted string.\n *\n * @param {Object} tickets - the map of tickets selected by the user\n * @param {string=} areaCategoryCode - filter the tickets in a specific area category\n * @return {string} a textual representation of the booked tickets\n */\nexport const getTicketsText = (tickets, areaCategoryCode) => {\n\tconst ticketTypeStrs = [];\n\n\tfor (const ticketTypeId in tickets) {\n\t\tconst ticketType = tickets[ticketTypeId];\n\t\tif (!areaCategoryCode || ticketType.areaCategoryCode === areaCategoryCode) {\n\t\t\tticketTypeStrs.push(`${ticketType.description} \\u00D7 ${ticketType.quantity}`);\n\t\t}\n\t}\n\n\treturn ticketTypeStrs.join(', ');\n};\n\n/**\n * Return the number of ticket selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of ticket purchased by the user\n */\nconst getTicketCount = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tlet ticketCount = 0;\n\tfor (const ticketType in tickets) {\n\t\tticketCount += tickets[ticketType].quantity;\n\t}\n\n\treturn ticketCount;\n};\n\n/**\n * @typedef {Object.<string, TicketType>} TicketsMap\n */\n\n/**\n * Return the number of seat selectable by the user.\n *\n * @param {!Object.<string, TicketType>} tickets - the ticketing state\n * @return {!number} the numbe of seat selectable by the user\n */\nconst getTicketWithSeatCount = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tlet seatCount = 0;\n\tfor (const ticketType in tickets) {\n\t\tif (tickets[ticketType].isAllocatedSeating) {\n\t\t\tseatCount += tickets[ticketType].quantity;\n\t\t}\n\t}\n\n\treturn seatCount;\n};\n\n/**\n * Return whether two seats position are equal.\n *\n * @function\n * @param {!SeatPosition} seatPos1 - the first seat position\n * @param {!SeatPosition} seatPos2 - the second seat position\n * @return {!boolean} true if the seat positions are equal, false otherwise\n */\nexport const areSeatPositionsEqual = (seatPos1, seatPos2) => {\n\treturn seatPos1.areaNumber === seatPos2.areaNumber &&\n\t\tseatPos1.rowIndex === seatPos2.rowIndex &&\n\t\tseatPos1.columnIndex === seatPos2.columnIndex;\n};\n\n/**\n * Return whether two seats objects reference the same seat.\n *\n * @function\n * @param {!Seat} seat1 - the first seat\n * @param {!Seat} seat2 - the second seat\n * @return {!boolean} true if the seats are equal, false otherwise\n */\nexport const areSeatsEqual = (seat1, seat2) => {\n\treturn areSeatPositionsEqual(seat1.position, seat2.position);\n};\n\n/**\n * Return whether a seat is a wheelchair.\n *\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a wheelchair, false otherwise\n */\nexport const isWheelchair = (seat) => (\n\tseat.status === seatStatus.WHEELCHAIR || seat.originalStatus === seatStatus.WHEELCHAIR\n);\n\n/**\n * Return whether a seat is a companion seat.\n *\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a companion seat, false otherwise\n */\nexport const isCompanionSeat = (seat) => (\n\tseat.status === seatStatus.COMPANION || seat.originalStatus === seatStatus.COMPANION\n);\n\n/**\n * Return whether the seat is reserved for a disabled person/companion.\n *\n * @function\n * @param {!Seat} seat - the seat to test\n * @return {!boolean} true if the seat is a wheelchair or a companion seat, false otherwise\n */\nexport const isSeatForDisablePeople = (seat) => isWheelchair(seat) || isCompanionSeat(seat);\n\n/**\n * Return whether all seats in a array are adjacent ot each other.\n *\n * @function\n * @param {!Array.<SeatPosition>} positions - an array of seat positions\n * @return {!boolean} true if all seat positions are contiguous\n */\nconst areSeatPositionsContiguous = (positions) => {\n\tconst count = positions.length;\n\tif (count < 2) return true;\n\n\tconst areaNumber = positions[0].areaNumber;\n\tconst rowIndex = positions[0].rowIndex;\n\n\t// check area and row\n\tfor (let i = 0; i < count; i++) {\n\t\tconst position = positions[i];\n\t\tif (position.areaNumber !== areaNumber || position.rowIndex !== rowIndex) return false;\n\t}\n\n\t// check contiguity\n\tconst columnIndices = positions.map(({ columnIndex }) => columnIndex);\n\tcolumnIndices.sort((a, b) => a - b);\n\tfor (let i = 1; i < count; i++) {\n\t\tif (columnIndices[i] !== columnIndices[i - 1] + 1) return false;\n\t}\n\n\treturn true;\n};\n\n/**\n * @typedef {Function} BinaryComparator\n * @param {!*} element - the element to compare\n * @param {*=} objective - the objective to reach\n * @return {!number} a negative if the objective is in the upper bound, a positive for the lower bound\n */\n\n/**\n * Perform a binary search on an array of element to reach the given objective\n *\n * @function\n * @param {!Array.<*>} array - an array of elements to search in\n * @param {!BinaryComparator} compare - a binary search comparator\n * @param {*=} objective - an optional parameter to the comparator\n * @return {*} the element, if found\n */\nconst binarySearch = (array, compare, objective) => {\n\tlet minIndex = 0;\n\tlet maxIndex = array.length - 1;\n\tlet currentIndex;\n\n\twhile (minIndex <= maxIndex) {\n\t\tcurrentIndex = (minIndex + maxIndex) >> 1;\n\t\tconst result = compare(array[currentIndex], objective);\n\t\tif (result < 0) {\n\t\t\tminIndex = currentIndex + 1;\n\t\t} else if (result > 0) {\n\t\t\tmaxIndex = currentIndex - 1;\n\t\t} else {\n\t\t\treturn array[currentIndex];\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Compare a seat with a column index to perform a binary comparison.\n *\n * @function\n * @type {BinaryComparator}\n * @param {!Seat} seat - the seat to test\n * @param {!number} columnIndex - the column index we're looking for\n * @return {!number} a negative if the objective is in the upper bound, a positive for the lower bound\n */\nconst compareSeatAtPosition = (seat, columnIndex) => seat.position.columnIndex - columnIndex;\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nconst getSeatAtPositionLayout = (seatLayout, seatPosition) => {\n\tconst { areaNumber, rowIndex, columnIndex } = seatPosition;\n\n\tconst area = seatLayout.areas.find(({ number }) => number === areaNumber);\n\tif (!area) return null;\n\n\tconst { rows } = area;\n\tlet row;\n\t// Attempt to guess the row in constant time\n\tif (rowIndex > 0 && rows.length > rowIndex && rows[rowIndex].seats.length > 0 &&\n\t\trows[rowIndex].seats[0].position.rowIndex === rowIndex) {\n\t\trow = rows[rowIndex];\n\t} else {\n\t\trow = rows.find(({ seats }) => seats.length > 0 && seats[0].position.rowIndex === rowIndex);\n\t}\n\tif (!row) return null;\n\n\t// We'll rarely be able to find the seat in constant time, it's not worth trying\n\treturn binarySearch(row.seats, compareSeatAtPosition, columnIndex);\n};\n\n/**\n * @global\n * @typedef {Array.<Array.<Array.<Seat>>>} SeatLookup\n */\n\n/**\n * Return a seat lookup from a seat layout, that can be used to speed us seat search.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @return {!SeatLookup} the corresponding seat lookup structure\n */\nexport const createSeatLookup = (seatLayout) => {\n\tconst lookup = [];\n\tlookup.isSeatLookup = true;\n\n\t// Create the structure\n\tconst { areas } = seatLayout;\n\tfor (const { rowCount, columnCount } of areas) {\n\t\tconst areaLookup = [];\n\t\tfor (let i = 0; i < rowCount; i++) {\n\t\t\tconst rowLookup = [];\n\t\t\tfor (let j = 0; j < columnCount; j++) {\n\t\t\t\trowLookup.push(null);\n\t\t\t}\n\t\t\tareaLookup.push(rowLookup);\n\t\t}\n\t\tlookup.push(areaLookup);\n\t}\n\t// Fill in the seats\n\tfor (const { rows } of areas) {\n\t\tfor (const { seats } of rows) {\n\t\t\tfor (const seat of seats) {\n\t\t\t\tconst { areaNumber, rowIndex, columnIndex } = seat.position;\n\t\t\t\tlookup[areaNumber - 1][rowIndex][columnIndex] = seat;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lookup;\n};\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nconst getSeatAtPositionLookup = (seatLookup, seatPosition) => {\n\tconst areaLookup = seatLookup[seatPosition.areaNumber - 1];\n\tif (!areaLookup) return null;\n\n\tconst rowLookup = areaLookup[seatPosition.rowIndex];\n\tif (!rowLookup) return null;\n\n\treturn rowLookup[seatPosition.columnIndex] || null;\n};\n\n/**\n * Return the seat at the given position from a given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!SeatPosition} seatPosition - the position of the seat to get\n * @return {Seat} the seat from the layout at the given position, if it exists\n */\nexport const getSeatAtPosition = (seatLayout, seatPosition) => {\n\tif (seatLayout.lookup && seatLayout.lookup.isSeatLookup) {\n\t\treturn getSeatAtPositionLookup(seatLayout.lookup, seatPosition);\n\t}\n\treturn getSeatAtPositionLayout(seatLayout, seatPosition);\n};\n\n/**\n * Return the first wheelchair found in an array of seat positions.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {!Array.<SeatPosition>} seatsInGroup - array of seat positions in a disabled seats group\n * @return {Seat} the wheelchair of the group, or null if not found\n */\nexport const findWheelchairInGroup = (seatLayout, seatsInGroup) => {\n\tif (!Array.isArray(seatsInGroup)) {\n\t\tconsole.error('ticketingPublic.js: findWheelchairInGroup(): seatsInGroup is not an array',\n\t\t\tseatsInGroup);\n\t\treturn null;\n\t}\n\tif (seatsInGroup.length === 0) return null;\n\n\tfor (const seatPosition of seatsInGroup) {\n\t\tconst seat = getSeatAtPosition(seatLayout, seatPosition);\n\t\tif (seat && isWheelchair(seat)) {\n\t\t\treturn seat;\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Return whether the given seat is a sofa.\n *\n * @function\n * @param {!Seat} seat - the seat to test\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @return {!boolean} true if the given seat is a sofa, false otherwise\n */\nexport const isSofa = (seat, seatLayout) => {\n\tconst { seatsInGroup } = seat;\n\tif (seatsInGroup.length < 2) return false;\n\tif (isWheelchair(seat)) return false;\n\tif (isCompanionSeat(seat) && findWheelchairInGroup(seatLayout, seatsInGroup)) return false;\n\treturn areSeatPositionsContiguous(seatsInGroup);\n};\n\n/**\n * @global\n * @typedef {Object} SelectedSeat\n * @property {string} rowName - the label of the row containing the seat\n * @property {string} seatName - the label of the seat selected\n * @property {number} ticketId - the identifier of the ticket used to reserve this seat\n */\n\n/**\n * @global\n * @typedef {Object} GroupedTicket\n * @property {string} ticketTypeId - the ID of the ticket type\n * @property {string} ticketTypeDescription - the name of the type of the ticket\n * @property {number} priceEach - the price for one ticket of this type\n * @property {number} quantity - the number of ticket of this type\n * @property {Array.<number>} ticketIds - the list of ticket identifiers in this group\n */\n\n/**\n * @global\n * @typedef {Object} TicketingSeat\n * @property {string} areaCategoryCode - the ID of the area category\n * @property {string} label - the full label of the seat\n * @property {string} rowName - the name of the seat row\n * @property {string} seatName - the name of the seat\n */\n\n/**\n * Return an array of selected seat labels per area category.\n *\n * @function\n * @param {!Array.<SelectedSeat>} selectedSeats - the array of selected seats, as returned by MX\n * @param {!Array.<GroupedTicket>} groupedTickets - the array of grouped tickets, as returned by MX\n * @param {!Array.<TicketType>} ticketTypes - the array of ticket types, as returned by MX\n * @return {!Array.<TicketingSeat>} an array of selected seat\n */\nexport const getSeats = (selectedSeats, groupedTickets, ticketTypes) => {\n\tconst seats = [];\n\n\tfor (const selectedSeat of selectedSeats) {\n\t\tconst { rowName, seatName, ticketId } = selectedSeat;\n\n\t\tconst areaCategory = groupedTickets.find(({ ticketIds }) => ticketIds.indexOf(ticketId) > -1);\n\t\tif (areaCategory) {\n\t\t\tconst { ticketTypeId } = areaCategory;\n\n\t\t\tconst ticketType = ticketTypes.find(({ id }) => id === ticketTypeId);\n\t\t\tif (ticketType) {\n\t\t\t\tseats.push({\n\t\t\t\t\tareaCategoryCode: ticketType.areaCategoryCode,\n\t\t\t\t\tlabel: rowName + seatName,\n\t\t\t\t\trowName,\n\t\t\t\t\tseatName\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsole.warn('ticketingPublic:getSeats(): Could not find ticket type for ' +\n\t\t\t\t\t'the area category:', areaCategory, 'in:', ticketTypes);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('ticketingPublic:getSeats(): Could not find the grouped ' +\n\t\t\t\t'tickets for the selected seat:', selectedSeat, 'in:', groupedTickets);\n\t\t}\n\t}\n\n\tseats.sort((seat1, seat2) => {\n\t\tconst { areaCategoryCode: area1 } = seat1;\n\t\tconst { areaCategoryCode: area2 } = seat2;\n\t\tif (area1 !== area2) {\n\t\t\treturn area1.localeCompare(area2, undefined, { numeric: true });\n\t\t}\n\t\tif (seat1.rowName !== seat2.rowName) {\n\t\t\treturn seat1.rowName.localeCompare(seat2.rowName);\n\t\t}\n\t\treturn seat1.seatName - seat2.seatName;\n\t});\n\n\treturn seats;\n};\n\n/**\n * @global\n * @typedef {Object} PickedSeat\n * @property {Seat} seat - the MX structure holding the seat\n * @property {number} lastAction - the timestamp of the last move for this seat\n */\n\n/**\n * Return whether all the seats of a sofa are picked.\n *\n * @param {!Array.<SeatPosition>} seatsInGroup - position of each seat in the sofa\n * @param {!Array.<PickedSeat>} pickedSeat - the array of picked seats\n * @return {!boolean} true if all seats are picked, false otherwise\n */\nconst areAllSeatsInSofaPicked = (seatsInGroup, pickedSeats) => {\n\tfor (const seatPosition of seatsInGroup) {\n\t\tconst pickedSeat = pickedSeats.find((pickedSeat) => {\n\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPosition);\n\t\t});\n\t\tif (!pickedSeat) return false;\n\t}\n\treturn true;\n};\n\n/**\n * Remove every seat of a sofa from the array of picked seats.\n *\n * @param {!Array.<SeatPosition>} seatsInGroup - position of each seat in the sofa\n * @param {!Array.<PickedSeat>} pickedSeats - the array of picked seats\n */\nconst removeSofaFromPickedSeats = (seatsInGroup, pickedSeats) => {\n\tfor (const seatPosition of seatsInGroup) {\n\t\tconst index = pickedSeats.findIndex((pickedSeat) => {\n\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPosition);\n\t\t});\n\t\tif (index > -1) pickedSeats.splice(index, 1);\n\t}\n};\n\n/**\n * Handler used for sorting an array of picked seats.\n *\n * @function\n * @param {PickedSeat} pickedSeat1 - the first picked seat\n * @param {PickedSeat} pickedSeat2 - the second picked seat\n * @return {number} how to sort the given picked seats.\n */\nconst pickedSeatsSorterStable = (pickedSeat1, pickedSeat2) => {\n\tconst pos1 = pickedSeat1.seat.position;\n\tconst pos2 = pickedSeat2.seat.position;\n\n\tlet diff = pos1.areaNumber - pos2.areaNumber;\n\tif (diff !== 0) return diff;\n\n\tdiff = pos1.rowIndex - pos2.rowIndex;\n\tif (diff !== 0) return diff;\n\n\t// NOTE: column indices are in reverse order\n\treturn pos2.columnIndex - pos1.columnIndex;\n};\n\n/**\n * Return the array of picked seats from the given seat layout.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {boolean=} removeIncompleteSofas - whether to discard incompletely picked sofas\n * @param {boolean=} sort - whether to sort the picked seats array\n * @return {!Array.<PickedSeat>} the array of picked seats taken from the seating map\n */\nexport const getPickedSeats = (seatLayout, removeIncompleteSofas = true, sort = true) => {\n\tconst pickedSeats = [];\n\tconst lastAction = Date.now();\n\n\tfor (const areaCategory of seatLayout.areaCategories) {\n\t\tfor (const seatPosition of areaCategory.selectedSeats) {\n\t\t\tconst seat = getSeatAtPosition(seatLayout, seatPosition);\n\t\t\tif (seat) {\n\t\t\t\tpickedSeats.push({ seat, lastAction });\n\t\t\t} else {\n\t\t\t\tconsole.warn('ticketingPublic:getPickedSeats(): Could not find seat at position:',\n\t\t\t\t\tseatPosition, 'in layout:', seatLayout);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (removeIncompleteSofas) {\n\t\t// Remove any picked sofa that doesn't have all its seats picked\n\t\tconst sofas = new Set();\n\t\t// TODO: The Set is useless in this case because all sofa arrays have independent refs\n\t\tfor (const { seat } of pickedSeats) {\n\t\t\tif (isSofa(seat, seatLayout)) sofas.add(seat.seatsInGroup);\n\t\t}\n\t\tfor (const sofa of sofas) {\n\t\t\tif (!areAllSeatsInSofaPicked(sofa, pickedSeats)) {\n\t\t\t\tremoveSofaFromPickedSeats(sofa, pickedSeats);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sort) {\n\t\tpickedSeats.sort(pickedSeatsSorterStable);\n\t}\n\n\treturn pickedSeats;\n};\n\n/**\n * @global\n * @typedef {Object} SeatBoundingBox\n * @property {number} left - the leftmost position in the seating areas\n * @property {number} right - the rightmost position in the seating areas\n * @property {number} top - the topmost position in the seating areas\n * @property {number} bottom - the bottommost position in the seating areas\n */\n\n/**\n * Return the actual bounding box of the given seat layout.\n * The bounding box returned by MX does include:\n * <ul>\n *   <li>space between the screen and the seating areas</li>\n *   <li>empty seating rows</li>\n *   <li>screen width</li>\n * </ul>\n * The bounding box returned by this function only includes the seating area.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as returned by MX\n * @return {!SeatBoundingBox} the bounding box of the seating areas\n */\nexport const getSeatLayoutBoundingBox = (seatLayout) => {\n\tconst box = {\n\t\tleft:   100.0,\n\t\tright:  0.0,\n\t\ttop:    100.0,\n\t\tbottom: 0.0\n\t};\n\n\tseatLayout.areas.forEach((area) => {\n\t\tconst { left, top, width, height, columnCount, rowCount, rows } = area;\n\t\tconst cellWidth = width / columnCount;\n\t\tconst cellHeight = height / rowCount;\n\n\t\tfor (let i = 0, il = rows.length; i < il; i++) {\n\t\t\tconst { seats } = rows[i];\n\t\t\tfor (let j = 0, jl = seats.length; j < jl; j++) {\n\t\t\t\tconst { columnIndex, rowIndex } = seats[j].position;\n\t\t\t\tbox.left = Math.min(left + columnIndex * cellWidth, box.left);\n\t\t\t\tbox.right = Math.max(left + (columnIndex + 1) * cellWidth, box.right);\n\t\t\t\tbox.top = Math.min(top + (rowIndex) * cellHeight, box.top);\n\t\t\t\tbox.bottom = Math.max(top + (rowIndex + 1) * cellHeight, box.bottom);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Clip the bounding box in case of incorrect size\n\tif (box.left > box.right) box.left = box.right;\n\tif (box.top > box.bottom) box.top = box.bottom;\n\n\treturn box;\n};\n\n/**\n * Return whether the seats of a seat layout have a unique name.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout, as returned by MX\n * @return {!boolean} true if each seat has a unique name, false otherwise\n */\nexport const hasUniqueSeatLabels = (seatLayout) => {\n\tconst set = new Set();\n\tconst { areas } = seatLayout;\n\n\tfor (let i = 0, il = areas.length; i < il; i++) {\n\t\tconst { rows } = areas[i];\n\n\t\tfor (let j = 0, jl = rows.length; j < jl; j++) {\n\t\t\tconst { seats } = rows[j];\n\n\t\t\tfor (let k = 0, kl = rows.length; k < kl; k++) {\n\t\t\t\tconst { seatLabel } = seats[k];\n\n\t\t\t\tif (set.has(seatLabel)) return false;\n\t\t\t\tset.add(seatLabel);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Return the URL of the \"Print your ticket\" page.\n *\n * @return {string} the URL of the showtime ticket.\n */\nconst getRelativeUrl = (pageSlug) => {\n\tconst store = Store.get();\n\n\tconst page = accessNested(store, ['appData', 'pages', pageSlug], '');\n\tconst activePage = accessNested(store, 'activePage');\n\tconst activePath = getRelativeRoot(activePage.path);\n\n\t// On staging https, we need to append index.html\n\tconst appendIndex = window.location.pathname.split('/').pop() === 'index.html';\n\n\tlet url = joinPaths(pathOnly(window.location.href), activePath, page.path);\n\tif (appendIndex) url = joinPaths(url, 'index.html');\n\n\treturn url;\n};\n\n/**\n* Return the URL of the payment notification page.\n*\n* @return {string} the URL to give to payment gateways as a callback.\n*/\nexport const getIframeCommunicatorUrl = () => getRelativeUrl(IFRAME_COMMUNICATOR_PAGE_SLUG);\nif (typeof window !== 'undefined') window.getIframeCommunicatorUrl = getIframeCommunicatorUrl;\n\n/**\n * Return the URL of the \"Print your ticket\" page.\n *\n * @return {string} the URL of the showtime ticket.\n */\nexport const getPrintYourTicketUrl = () => getRelativeUrl(PRINT_YOUR_TICKET_PAGE_SLUG);\n\n/**\n * Generate the card number placeholder to be used in payment forms.\n * This function is here to prevent security softwares from flagging raw card numbers as an issue.\n *\n * @return {!string} the card number placeholder\n */\nexport const generateCardNumPlaceholder = () => {\n\tconst a = [];\n\tfor (let i = 0; i < 19; i++) {\n\t\ta[i] = (i + 1) % 5 === 0 ? 0x20 : 0x31 + 3 * (i === 0);\n\t}\n\treturn String.fromCharCode.apply(null, a);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/ticketingPublic.js","import Store from 'store/store';\n\n// Utils related to copy\n\nlet copy = {};\nlet isCopySet = false;\n\n/**\n * Gets copy for the provided key + replace variables inside that copy.\n *\n * @example\n * getCopy('GALLERY_ALT_TITLE', { movieName: 'Rogue One', studioName: 'Disney' });\n * // returns 'Rogue One: Gallery | Disney'\n *\n * getCopy('CURRENCY', { value: 20 });\n * // returns £20\n *\n * getCopy('GET_TICKETS');\n * // returns Get Tickets\n *\n * getCopy('DYNAMIC_TITLE', { movieName: 'Star Trek' });\n * // returns: Star Trek: Hello There | Star Trek\n *\n * getCopy('TICKETS', {}, 'tickets');\n * // TICKETS isn't in the copy object, so it will return the fallback\n * // returns: tickets\n *\n * @note If there are two keys KEY and $KEY defined in copy, you WON'T be able to access\n *       KEY with this function. Use appData instead (or find a different name).\n *\n * @param {string} copyKey - the copy key (with or without the starting $)\n * @param {Object} [opts={}] - options\n * @param {string} [fallback=''] - the fallback value\n * @return {string} the localized string\n */\nexport const getCopy = (copyKey, opts = {}, fallback = '', fromCopy) => {\n\tif (fromCopy && typeof fromCopy !== 'object') {\n\t\tfromCopy = null;\n\t}\n\n\tif (!fromCopy && !isCopySet) {\n\t\t// Haven't retrieved copy yet, so lets do that first\n\t\tconst store = Store.get();\n\t\tcopy = (store.appData && store.appData.copy ? store.appData.copy : store.copy) || {};\n\t\tisCopySet = true;\n\t}\n\n\tif (!fromCopy) {\n\t\tfromCopy = copy;\n\t}\n\n\tlet copyItem = null;\n\tif (copyKey) {\n\t\tif (copyKey.charAt(0) !== '$') {\n\t\t\tcopyItem = fromCopy['$' + copyKey];\n\t\t\tif (copyItem === undefined) copyItem = fromCopy[copyKey];\n\t\t} else {\n\t\t\tcopyItem = fromCopy[copyKey];\n\t\t\tif (copyItem === undefined) copyItem = fromCopy[copyKey.substr(1)];\n\t\t}\n\t}\n\tif (copyItem === undefined) copyItem = fallback;\n\n\t// Loop through all the options to see replace\n\tObject.keys(opts).forEach((key) => {\n\t\t// Transform movieName to MOVIE_NAME\n\t\tlet realKey = key;\n\t\tif (key.toUpperCase() !== key) {\n\t\t\trealKey = key.replace(/([A-Z])/g, ' $1').replace(/ /g, '_').toUpperCase();\n\t\t}\n\n\t\tconst regex = new RegExp('%' + realKey + '%', 'g');\n\t\t// Replace the keys with what was provided\n\t\tcopyItem = copyItem.replace(regex, opts[key]);\n\t});\n\n\treturn copyItem;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/copy.js","// TODO: use Object.assign ?\nconst objectAssign = require('object-assign');\n\n// Live testing http://jsfiddle.net/es9qy5v0/2/\n//   (see documentation/dateFormat.md for more info)\n\n// Based on .Net DateTimeFormat.Format\n// See https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx for list of format specifiers\n// MODIFICATIONS :\n//  - unsupported: g (Era), K (time zone info)\n//  - f and F are only precise up to 3 (= milliseconds)\n//  - t/tt is lowercase and supports T/TT for uppercase alternative\n//  - added oo for ordinal version of the date (e.g. 12th)\n//  - adding more M or d changes the case:\n//     - 1 = number            1\n//     - 2 = padded number     01\n//     - 3 = standard short    Jan\n//     - 4 = standard long     January\n//     - 5 = uppercase short   JAN\n//     - 6 = uppercase long    JANUARY\n//     - 7 = lowercase short   jan\n//     - 8 = lowercase long    january\n// Be careful to use \\\\ instead of \\ when in a json/js string literal to prevent default backslash behaviour\n// (Base implementation used as reference :\n//   'FormatCustomized' @ http://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeformat.cs,429)\nmodule.exports = function formatDateTime(date, format, copy) {\n\tif (!date || !format) return '';\n\tif (!(date instanceof Date)) {\n\t\tdate = new Date(date);\n\t}\n\tif (copy) {\n\t\tcopy = objectAssign({}, localeDefaults, copy);\n\t} else {\n\t\tcopy = localeDefaults;\n\t}\n\tlet result = '';\n\tlet i, l, ch, tokenLen;\n\tfor (i = 0, l = format.length; i < l; i += tokenLen) {\n\t\ttokenLen = 1;\n\t\tch = format[i];\n\t\tif (baseFunctions.hasOwnProperty(ch)) {\n\t\t\ttokenLen = parseRepeatPattern(format, i, ch, l);\n\t\t\tresult += baseFunctions[ch](date, tokenLen, copy);\n\t\t} else {\n\t\t\tswitch(ch) {\n\t\t\t\tcase ':':\n\t\t\t\t\tresult += copy.$TIME_SEPARATOR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '/':\n\t\t\t\t\tresult += copy.$DATE_SEPARATOR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\'':\n\t\t\t\tcase '\"':\n\t\t\t\t\ttokenLen = parseQuoted(format, i); // Length including quotes\n\t\t\t\t\t// Add the string without quotes\n\t\t\t\t\tresult += format.substr(i + 1, tokenLen - 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\\\':\n\t\t\t\t\ttokenLen = 2;\n\t\t\t\t\tif (i < l - 1) {\n\t\t\t\t\t\tresult += format[i + 1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If \\ is the last character of the string, add it as a literal\n\t\t\t\t\t\tresult += '\\\\';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tresult += ch;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n};\n\n// Default that should be used if no copy is specified\nlet localeDefaults = {\n\t\"$AM\": \"am\",\n\t\"$PM\": \"pm\",\n\t\"$TIME_SEPARATOR\": \":\",\n\t\"$DATE_SEPARATOR\": \"/\",\n\t\"$DAYS_SHORT\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\"$DAYS_FULL\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\"$MONTHS_SHORT\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\"$MONTHS_FULL\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\"$ORD\": [\n\t\t//0     1     2     3     4     5     6     7     8     9\n\t\t\"th\", \"st\", \"nd\", \"rd\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t\t//10   11    12    13    14    15    16    17    18    19\n\t\t\"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t\t//20   21    22    23    24    25    26    27    28    29\n\t\t\"th\", \"st\", \"nd\", \"rd\", \"th\", \"th\", \"th\", \"th\", \"th\", \"th\",\n\t\t//30   31\n\t\t\"th\", \"st\"\n\t]\n};\n\nlet transforms = [\n\tstr => str,\n\tstr => (str || '').toUpperCase(),\n\tstr => (str || '').toLowerCase()\n];\n// Specifiers implementations\nlet baseFunctions = {\n\th: (d, l) => pad((d.getHours() % 12) || 12, l),\n\tH: (d, l) => pad(d.getHours(), l),\n\tm: (d, l) => pad(d.getMinutes(), l),\n\ts: (d, l) => pad(d.getSeconds(), l),\n\tf: (d, l, copy, noZeroes) => {\n\t\tlet v = d.getMilliseconds();\n\t\tlet vl = l;\n\t\twhile (vl++ < 3) v = ~~(v / 10);\n\t\twhile (vl-- > 4) v *= 10;\n\t\tif (noZeroes && !v) return '';\n\t\treturn pad(v, l);\n\t},\n\tF: (d, l, copy) => baseFunctions.f(d, l, copy, true),\n\tt: (d, l, copy, isUppercase) => {\n\t\tlet designator = d.getHours() < 12 ? copy.$AM : copy.$PM;\n\t\tdesignator = isUppercase ? designator.toUpperCase() : designator.toLowerCase();\n\t\tif (l == 1) designator = designator.slice(0, 1);\n\t\treturn designator;\n\t},\n\tT: (d, l, copy) => baseFunctions.t(d, l, copy, true),\n\td: (d, l, copy) => {\n\t\tif (l <= 2) return pad(d.getDate(), l);\n\t\tl -= 3;\n\t\tlet mode = l % 2, trf = transforms[(l >> 1) % transforms.length];\n\t\treturn trf(copy[mode ? '$DAYS_FULL' : '$DAYS_SHORT'][d.getDay()]);\n\t},\n\to: (d, l, copy) => {\n\t\tlet day = d.getDate();\n\t\treturn pad(day, l) + copy.$ORD[day];\n\t},\n\tM: (d, l, copy) => {\n\t\tif (l <= 2) return pad(d.getMonth() + 1, l);\n\t\tl -= 3;\n\t\tlet mode = l % 2, trf = transforms[(l >> 1) % transforms.length];\n\t\treturn trf(copy[mode ? '$MONTHS_FULL' : '$MONTHS_SHORT'][d.getMonth()]);\n\t},\n\ty: (d, l) => {\n\t\tlet v = d.getFullYear();\n\t\tif (l <= 2) v %= 100;\n\t\treturn pad(v, l);\n\t},\n\tz: (d, l, copy) => {\n\t\tlet v = d.getTimezoneOffset();\n\t\tlet ret = v < 0 ? '-' : '+';\n\t\tv = Math.abs(v);\n\t\tlet hours = ~~(v / 60);\n\t\tret += pad(hours, l <= 2 ? l : 2);\n\t\t// Add minutes\n\t\tif (l > 2) ret += copy.$TIME_SEPARATOR + pad(v - 60 * hours, 2);\n\t\treturn ret;\n\t}\n};\n\n// Detect how many of the same character are in a row\nfunction parseRepeatPattern(format, pos, ch, l) {\n\tlet i = pos + 1;\n\tif (l == undefined) l = format.length;\n\tfor (; i < l && format[i] === ch; i++);\n\treturn i - pos;\n}\n// Detect a quoted string length (starting at a specified position)\nfunction parseQuoted(format, pos) {\n\tlet quote = format[pos];\n\tlet next = pos;\n\tdo {\n\t\tnext = format.indexOf(quote, next + 1);\n\t} while(next !== -1 && format[next - 1] === '\\\\');\n\tif (next === -1) next = format.length;\n\treturn next - pos + 1;\n}\n\n// Cast a positive int to string making sure it is at least the specified length\n// If the string representation of the number is less than desired, 0s are added in front of it\nfunction pad(n, l) {\n\tlet v = n + '', vl = v.length;\n\twhile (vl++ < l) v = '0' + v;\n\treturn v;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/formatDateTime.js","const state = {\n\tcategories: [],\n\tchangeListeners: [],\n};\n\nexport const STRICTLY_NECESSARY = 'STRICTLY_NECESSARY';\nexport const FUNCTIONAL = 'FUNCTIONAL';\nexport const TARGETING = 'TARGETING';\nexport const ADVERTISING = 'ADVERTISING';\n\nconst dict = {\n\t'1': STRICTLY_NECESSARY,\n\t'3': FUNCTIONAL,\n\t'4': TARGETING,\n};\n\nexport const set = (ids) => {\n\tstate.categories = (Array.isArray(ids) ? ids : ids.split(',')).map(id => dict[id]).filter(a => !!a);\n\tstate.changeListeners.forEach(listener => listener(state.categories));\n};\n\nexport const get = () => state.categories;\n\nexport const has = (categories, category) => {\n\tif (typeof categories === 'string') {\n\t\treturn has(state.categories, categories);\n\t}\n\n\treturn categories.indexOf(category) !== -1;\n};\n\nexport const addChangeListener = (fn) => {\n\tstate.changeListeners = [...state.changeListeners, fn];\n};\n\nexport const removeChangeListener = (fn) => {\n\tstate.changeListeners = state.changeListeners.filter(a => a !== fn);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/categories.js","'use strict';\n\n//#build\nvar global = typeof global !== 'undefined' ?\n\tglobal :\n\ttypeof self !== 'undefined' ?\n\t\tself :\n\t\ttypeof window !== 'undefined' ?\n\t\t\twindow :\n\t\t\t{};\n\nvar Utils = {\n\textend: function( ob, props ){\n\t\tfor( var p in props ){\n\t\t\tob[p] = props[p];\n\t\t}\n\t\treturn ob;\n\t},\n\n\tcreateNonEnumerable: function( obj, proto ){\n\t\tvar ne = {};\n\t\tfor( var key in obj )\n\t\t\tne[key] = {value: obj[key] };\n\t\treturn Object.create( proto || {}, ne );\n\t},\n\n\terror: function( message ){\n\t\tvar err = new Error( message );\n\t\tif( console )\n\t\t\treturn console.error( err );\n\t\telse\n\t\t\tthrow err;\n\t},\n\n\teach: function( o, clbk ){\n\t\tvar i,l,keys;\n\t\tif( o && o.constructor === Array ){\n\t\t\tfor (i = 0, l = o.length; i < l; i++)\n\t\t\t\tclbk( o[i], i );\n\t\t}\n\t\telse {\n\t\t\tkeys = Object.keys( o );\n\t\t\tfor( i = 0, l = keys.length; i < l; i++ )\n\t\t\t\tclbk( o[ keys[i] ], keys[i] );\n\t\t}\n\t},\n\n\taddNE: function( node, attrs ){\n\t\tfor( var key in attrs ){\n\t\t\tObject.defineProperty( node, key, {\n\t\t\t\tenumerable: false,\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t\tvalue: attrs[ key ]\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Creates non-enumerable property descriptors, to be used by Object.create.\n\t * @param  {Object} attrs Properties to create descriptors\n\t * @return {Object}       A hash with the descriptors.\n\t */\n\tcreateNE: function( attrs ){\n\t\tvar ne = {};\n\n\t\tfor( var key in attrs ){\n\t\t\tne[ key ] = {\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: attrs[ key ]\n\t\t\t}\n\t\t}\n\n\t\treturn ne;\n\t},\n\n\t// nextTick - by stagas / public domain\n\tnextTick: (function () {\n    var queue = [],\n\t\tdirty = false,\n\t\tfn,\n\t\thasPostMessage = !!global.postMessage && (typeof Window !== 'undefined') && (global instanceof Window),\n\t\tmessageName = 'nexttick',\n\t\ttrigger = (function () {\n\t\t\treturn hasPostMessage\n\t\t\t\t? function trigger () {\n\t\t\t\tglobal.postMessage(messageName, '*');\n\t\t\t}\n\t\t\t: function trigger () {\n\t\t\t\tsetTimeout(function () { processQueue() }, 0);\n\t\t\t};\n\t\t}()),\n\t\tprocessQueue = (function () {\n\t\t\treturn hasPostMessage\n\t\t\t\t? function processQueue (event) {\n\t\t\t\t\tif (event.source === global && event.data === messageName) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tflushQueue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t: flushQueue;\n    \t})()\n    ;\n\n    function flushQueue () {\n\t\t\t\tdirty = false;\n        while (fn = queue.shift()) {\n            fn();\n        }\n    }\n\n    function nextTick (fn) {\n        queue.push(fn);\n        if (dirty) return;\n        dirty = true;\n        trigger();\n    }\n\n    if (hasPostMessage) global.addEventListener('message', processQueue, true);\n\n    nextTick.removeListener = function () {\n        global.removeEventListener('message', processQueue, true);\n    }\n\n    return nextTick;\n  })(),\n\n  findPivot: function( node ){\n  \t\tif( !node || !node.__ )\n  \t\t\treturn;\n\n  \t\tif( node.__.pivot )\n  \t\t\treturn node;\n\n  \t\tvar found = 0,\n  \t\t\tparents = node.__.parents,\n  \t\t\ti = 0,\n  \t\t\tparent\n  \t\t;\n\n  \t\t// Look up for the pivot in the parents\n  \t\twhile( !found && i < parents.length ){\n  \t\t\tparent = parents[i];\n  \t\t\tif( parent.__.pivot )\n  \t\t\t\tfound = parent;\n  \t\t\ti++;\n  \t\t}\n\n  \t\tif( found ){\n  \t\t\treturn found;\n  \t\t}\n\n  \t\t// If not found, try with the parent's parents\n  \t\ti=0;\n  \t\twhile( !found && i < parents.length ){\n\t  \t\tfound = this.findPivot( parents[i] );\n\t  \t\ti++;\n\t  \t}\n\n  \t\treturn found;\n  },\n\n\tisLeaf: function( node, freezeInstances ){\n\t\tvar cons;\n\t\treturn !node || !(cons = node.constructor) || (freezeInstances ?\n\t\t\t(cons === String || cons === Number || cons === Boolean) :\n\t\t\t(cons !== Object && cons !== Array)\n\t\t);\n\t},\n\n\twarn: function(){\n\t\tvar args;\n\t\tif( typeof process === 'undefined' || process.env.NODE_ENV !== 'production' ){\n\t\t\tif( !arguments[0] && typeof console !== 'undefined' ){\n\t\t\t\targs = Array.prototype.slice.call( arguments, 1 );\n\t\t\t\targs[0] = 'Freezer.js WARNING: ' + args[0];\n\t\t\t\tconsole.warn.apply( console, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n//#build\n\n\nmodule.exports = Utils;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/src/utils.js\n// module id = 13\n// module chunks = 0","/*** IMPORTS FROM imports-loader ***/\n(function() {\n\n(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ]\n\n    var isDataView = function(obj) {\n      return obj && DataView.prototype.isPrototypeOf(obj)\n    }\n\n    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    }\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1])\n      }, this)\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var oldValue = this.map[name]\n    this.map[name] = oldValue ? oldValue+','+value : value\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name)\n    return this.has(name) ? this.map[name] : null\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value)\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this)\n      }\n    }\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsArrayBuffer(blob)\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsText(blob)\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf)\n    var chars = new Array(view.length)\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i])\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength)\n      view.set(new Uint8Array(buf))\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (!body) {\n        this._bodyText = ''\n      } else if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer)\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer])\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body)\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      }\n    }\n\n    this.text = function() {\n      var rejected = consumed(this)\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = String(input)\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, { body: this._bodyInit })\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers()\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':')\n      var key = parts.shift().trim()\n      if (key) {\n        var value = parts.join(':').trim()\n        headers.append(key, value)\n      }\n    })\n    return headers\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = options.status === undefined ? 200 : options.status\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n    this.headers = new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init)\n      var xhr = new XMLHttpRequest()\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        }\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = global.fetch;\n}.call(global));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/imports-loader?this=>global!./~/exports-loader?global.fetch!./~/whatwg-fetch/fetch.js\n// module id = 14\n// module chunks = 0","import isShallowEqual from 'shallow-equals';\n\n/**\n * Tells if a component should update given it's next props\n * and state.\n *\n * @param object nextProps Next props.\n * @param object nextState Next state.\n */\nfunction shouldComponentUpdate(nextProps, nextState) {\n\treturn !isShallowEqual(nextProps, this.props, isSameProp) || !isShallowEqual(nextState, this.state);\n}\n\n/**\n * Makes the given component \"pure\".\n *\n * @param object component Component.\n */\nfunction pureRenderDecorator(component) {\n\tcomponent.prototype.shouldComponentUpdate = shouldComponentUpdate;\n}\n\n\n\nfunction isSameProp(a, b){\n\treturn a === b || (Array.isArray(a) && Array.isArray(b) && !a.length && !b.length);\n}\n\n\n\nmodule.exports = pureRenderDecorator;\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/pure.js","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 16\n// module chunks = 0","export default function route(url, pageId) {\n\tif (typeof history !== 'undefined') {\n\t\t// Push the new url to the pushState\n\t\t// the history listen even in the update file will take care of the rest\n\t\t// debugger;\n\t\thistory.pushState({ pageId }, '', url);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/core/link/route.js","import qs from 'qs';\nimport Geo from 'models/Geo';\nimport { isDirectTicketingEnabled } from 'store/ticketingPublic';\nimport { accessNested, asList } from 'utils/utils';\nimport formatDateTime from 'utils/formatDateTime';\nimport dataProviderToTicketProvider from 'utils/dataProviderToTicketProvider';\n\n// Finds the first non-undefined and non-null value (equivalent to v1 || v2 || v3 ... except returns the value if it's not null/undefined, even if falsy like 0, '' or false)\nfunction customDefault(...args) {\n\treturn args.find(v => v != undefined);\n}\n\n// Makes sure mainTheater has fandango and movietickets ids from alternateTheater if it doesn't have its own\nfunction checkTicketProviderIds(mainTheater, alternateTheater) {\n\tif (dataProviderToTicketProvider[alternateTheater.providerId]) {\n\t\treturn attachTicketProvider(mainTheater, alternateTheater);\n\t}\n\tif (!mainTheater.tms_id) mainTheater.tms_id = alternateTheater.tms_id;\n\tif (!mainTheater.fandango) mainTheater.fandango = alternateTheater.fandango;\n\tif (!mainTheater.movietickets) mainTheater.movietickets = alternateTheater.movietickets;\n\tmainTheater.movies.forEach(m => {\n\t\tif (m.fandango && m.movietickets) return;\n\t\tmainTheater.screenings.find(screening => {\n\t\t\tif (screening.movie.id !== m.id || !screening.datetime) return;\n\t\t\tlet matching = alternateTheater.screenings.filter(sc2 => +sc2.datetime === +screening.datetime);\n\t\t\tif (matching.length !== 1) return;\n\t\t\tif (!m.fandango) m.fandango = matching[0].movie.fandango;\n\t\t\tif (!m.movietickets) m.movietickets = matching[0].movie.movietickets;\n\t\t\treturn true;\n\t\t});\n\t});\n}\nfunction attachTicketProvider(theater, alternateTheater) {\n\talternateTheater.screenings.forEach(screening => {\n\t\tif (!screening.srcTicketProviders) {\n\t\t\treturn;\n\t\t}\n\t\tlet matching = theater.screenings.find(s2 => s2.date === screening.date && s2.time24 === screening.time24);\n\t\tif (matching) {\n\t\t\tmatching.srcTicketProviders = Object.assign({}, matching.srcTicketProviders, screening.srcTicketProviders);\n\t\t}\n\t});\n}\n\nexport default class Theater {\n\t// TODO: pass in currentPage to avoid hardcoded \"pages.showtimes.data\"\n\tconstructor(id, attr, { screenings, exhibitor, clientGeo, appData, theaterMasters, theaterMasterDoc, firstBatch, pinned, activePage }) {\n\t\tlet copy = appData.copy;\n\t\tlet providers = accessNested(activePage, 'data.providers') || accessNested(appData, 'pages.showtimes.data.providers') || {};\n\t\tlet regionProviders = accessNested(appData, 'pages.showtimes.data.providerLocation');\n\t\tthis.id = id;\n\t\tthis.pinned = attr.pinned !== undefined ? attr.pinned : !!pinned;\n\t\tthis.active = false;\n\t\tthis.name = attr.name;\n\t\tlet addr = attr.address;\n\t\tlet city = attr.city;\n\t\tif (appData.options.useEnglishCopy) {\n\t\t\tthis.name = attr.name_en || attr.name;\n\t\t\taddr =  attr.address_en || attr.address;\n\t\t\tcity =  attr.city_en || attr.city;\n\t\t}\n\t\tthis.screenings = screenings;\n\t\tlet addedMoviesCache = {};\n\t\tthis.movies = screenings.reduce((a, s) => {\n\t\t\tif (!s.movie || addedMoviesCache[s.movie.id]) return a;\n\t\t\taddedMoviesCache[s.movie.id] = true;\n\t\t\ta.push(s.movie);\n\t\t\treturn a;\n\t\t}, []);\n\n\t\tthis.activeScreenings = screenings;\n\t\t// if (filters) {\n\t\t// \tthis.activeScreenings = this.activeScreenings.filter((s) => {\n\t\t// \t\tlet passes = inactiveScreeningsFilter(filters.format, s.movie.format);\n\t\t// \t\treturn passes;\n\t\t// \t});\n\t\t// }\n\t\tthis.filteredScreenings = screenings;\n\t\tthis.filterPass = this.filteredScreenings.length ? true : false;\n\t\tthis.exhibitor = exhibitor;\n\t\tthis.logo = (exhibitor && exhibitor.logo) ? exhibitor.logo : 'default.png';\n\t\tthis.activeExhibitor = true;\n\t\tthis.activeScreening = null;\n\t\tlet addressParts = [addr, city];\n\t\t// For webedia US, also add the state to the displayed address\n\t\tif (attr.country === 'us' && (attr.provider_id === 'webus' || attr.provider_id === 'wwm' || attr.provider_id === 'mx') && attr.state) {\n\t\t\taddressParts.push(attr.state);\n\t\t}\n\t\tlet fullAddress = addressParts.filter(e => e).join(', ');\n\t\tthis.location = {\n\t\t\t'country' : attr.country,\n\t\t\t'fullAddress': fullAddress,\n\t\t\t'address': addr,\n\t\t\t'city': city,\n\t\t\t'state': attr.state\n\t\t};\n\t\tlet website = attr.url;\n\t\tif (website) {\n\t\t\t// Apparently sometimes the importers are giving us multiple websites separated by , or space\n\t\t\t// (think this should rather be fixed in the backend)\n\t\t\twebsite = website.split(',')[0].split(' ')[0];\n\t\t\tif (website.lastIndexOf('http://', 0) !== 0 && website.lastIndexOf('https://', 0) !== 0)\n\t\t\t\twebsite = 'http://' + website;\n\t\t\tthis.website = website;\n\t\t}\n\t\t// if(!this.website && exhibitor && exhibitor.domain) {\n\t\t// \tthis.website = 'http://' + exhibitor.domain;\n\t\t// }\n\t\tthis.masterId = attr.theater_master_id;\n\t\tthis.masterDoc = theaterMasterDoc || {};\n\t\tthis.providerId = attr.provider_id;\n\t\tthis.providerTheaterId = attr.provider_theater_id;\n\t\tthis.pid = this.providerId + ':' + this.providerTheaterId;\n\t\tthis.providerExhibitorId = attr.provider_exhibitor_id;\n\t\tthis.geo = new Geo({ lat: attr.lat, lon: attr.lon, countryCode: attr.country, city: city });\n\t\tthis.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT);\n\t\tthis.distanceUnit = copy.$DISTANCE_UNIT;\n\t\tthis.enabled = this.screenings.length > 0;\n\n\t\tlet disabledList = asList(accessNested(appData, 'pages.showtimes.data.disabledTheaters', []));\n\t\tif (disabledList.indexOf(this.id) !== -1 || disabledList.indexOf(this.pid) !== -1) {\n\t\t\tthis.enabled = false;\n\t\t}\n\n\t\tif (attr.wwm_ticketing) {\n\t\t\tif (attr.wwm_tickettype === 'MTC') {\n\t\t\t\tthis.movietickets = attr.movietickets_theater_id;\n\t\t\t}\n\t\t\tthis.fandango = attr.fandango_theater_id;\n\t\t\tthis.tms_id = attr.tms_id;\n\t\t}\n\t\tthis.atom = attr.atom_theater_id;\n\t\tthis.firstBatch = firstBatch;\n\n\t\tlet getRank = t => +customDefault(accessNested(regionProviders, [t.location.country, t.providerId, 'rank']), (providers[t.providerId] || {}).rank, 100);\n\n\t\tif (theaterMasters && this.masterId && this.enabled) {\n\t\t\tlet currMaster = theaterMasters[this.masterId];\n\t\t\tif (currMaster && providers) {\n\t\t\t\tlet currRank = getRank(this);\n\t\t\t\tlet masterRank = getRank(currMaster);\n\t\t\t\tif (this.hasBadDeeplinks()) {\n\t\t\t\t\tcurrRank = Infinity;\n\t\t\t\t}\n\t\t\t\tif (currMaster.hasBadDeeplinks()) {\n\t\t\t\t\tmasterRank = Infinity;\n\t\t\t\t}\n\t\t\t\tif (currRank < masterRank) {\n\t\t\t\t\tcheckTicketProviderIds(this, currMaster);\n\t\t\t\t\tcurrMaster.enabled = false;\n\t\t\t\t\ttheaterMasters[this.masterId] = this;\n\t\t\t\t} else {\n\t\t\t\t\tcheckTicketProviderIds(currMaster, this);\n\t\t\t\t\t// After potentially getting new fandango ids, recalculate the urls\n\t\t\t\t\tcurrMaster.computeUrls(appData, activePage);\n\t\t\t\t\tthis.enabled = false;\n\t\t\t\t}\n\t\t\t} else theaterMasters[this.masterId] = this;\n\t\t}\n\n\t\t// TODO: currentPage\n\t\tlet exhibitorDomain = accessNested(this, 'exhibitor.domain', '');\n\t\tlet mfixList = asList(accessNested(appData, 'pages.showtimes.data.midnightFix', {}));\n\t\tlet midnightFix = mfixList.indexOf(exhibitorDomain) !== -1;\n\t\tthis.screenings.forEach(screening => {\n\t\t\tif (midnightFix && screening.nextDayDatetime) {\n\t\t\t\tscreening.offsetDate(-1, 0, 0, appData.copy);\n\t\t\t}\n\t\t});\n\t\tthis.computeUrls(appData, activePage);\n\t}\n\n\t// Returns whether this theater has bad quality deeplinks\n\t// For instance, MX without instant ticketing may have theater homepage links only\n\t// Those theater should have the lowest priority in the ranking\n\thasBadDeeplinks() {\n\t\tif (this.providerId === 'mx' && !isDirectTicketingEnabled(this)) {\n\t\t\tlet mxLinks = accessNested(this.masterDoc, 'mxLinks');\n\t\t\tif (typeof mxLinks === 'undefined') {\n\t\t\t\tmxLinks = accessNested(this.masterDoc, 'mx_links', false);\n\t\t\t}\n\t\t\treturn mxLinks !== true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Computes the screenings urls of a theater (fandango etc.)\n\tcomputeUrls(appData, activePage) {\n\t\tlet exhibitorDomain = accessNested(this, 'exhibitor.domain', '');\n\n\t\t// TODO: currentPage\n\t\tlet deeplinksObj = accessNested(appData, 'pages.showtimes.data.overrideDeeplinks', {});\n\t\tlet overrideDeeplinks = deeplinksObj[exhibitorDomain] || deeplinksObj['*'] || deeplinksObj;\n\t\tlet isValidDLContext = ctx => (ctx.url || ctx.url === false) || ctx.movietickets;\n\n\t\tif (typeof overrideDeeplinks === 'string') {\n\t\t\toverrideDeeplinks = [{ url: overrideDeeplinks }];\n\t\t} else if (isValidDLContext(overrideDeeplinks)) {\n\t\t\toverrideDeeplinks = [overrideDeeplinks];\n\t\t} else if (!Array.isArray(overrideDeeplinks)) {\n\t\t\toverrideDeeplinks = Object.keys(overrideDeeplinks).map(k => {\n\t\t\t\t// If it's a domain obj, do not list it\n\t\t\t\tif (k.match(/^\\w{2,}\\.\\w{2,}$/)) return;\n\t\t\t\treturn overrideDeeplinks[k];\n\t\t\t});\n\t\t}\n\t\toverrideDeeplinks = overrideDeeplinks.filter(e => e).sort((a, b) => {\n\t\t\tif (a.order == b.order) return 0;\n\t\t\tif (a.order == undefined) return 1;\n\t\t\tif (b.order == undefined) return -1;\n\t\t\treturn b.order - a.order;\n\t\t});\n\n\t\t// Checks an overrideDeeplink context object\n\t\tlet checkDLContext = (ctx, s) => {\n\t\t\tif (!isValidDLContext(ctx)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Check that every recognized key in the context object is validated for this screening\n\t\t\treturn Object.keys(ctx).every(key => {\n\t\t\t\tlet val = ctx[key];\n\t\t\t\tif (!val) return true;\n\t\t\t\tswitch (key) {\n\t\t\t\t\tcase 'exhibitor':\n\t\t\t\t\tcase 'domain':\n\t\t\t\t\t\treturn val.split(',').map(e => e.trim()).indexOf(exhibitorDomain) !== -1;\n\t\t\t\t\tcase 'movie':\n\t\t\t\t\t\tlet movie = s.movie;\n\t\t\t\t\t\treturn val === movie.id || val === movie.provider_id + ':' + movie.provider_movie_id;\n\t\t\t\t\tcase 'format': return val === s.movie.format.slug;\n\t\t\t\t\tcase 'hour':\n\t\t\t\t\t\tif (val.length > 2) {\n\t\t\t\t\t\t\treturn +val.slice(0, 2) === s.hour && +val.slice(2) === s.minute;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn +val === s.hour;\n\t\t\t\t\tcase 'minute': return +val === s.minute;\n\t\t\t\t\tcase 'day':\n\t\t\t\t\tcase 'date':\n\t\t\t\t\t\tlet dateFormat = 'ddMM';\n\t\t\t\t\t\tif (val.match(/^\\d{2}-\\d{2}$/)) {\n\t\t\t\t\t\t\tdateFormat = 'MM-dd';\n\t\t\t\t\t\t} else if (val.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n\t\t\t\t\t\t\tdateFormat = 'yyyy-MM-dd';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn val === formatDateTime(s.stDate.date, dateFormat);\n\t\t\t\t\tcase 'theater':\n\t\t\t\t\t\tconst potentialMatches = [this.id, this.pid];\n\t\t\t\t\t\treturn val.split(',').find(val => potentialMatches.indexOf(val.trim()) !== -1);\n\t\t\t\t\tcase 'nameContains':\n\t\t\t\t\t\treturn this.name.toLowerCase().indexOf(val.toLowerCase()) !== -1;\n\t\t\t\t}\n\t\t\t\t// Not a valid condition, ignore\n\t\t\t\treturn true;\n\t\t\t});\n\t\t};\n\n\t\tlet affiliate = appData.meta.affiliate || 'pow';\n\t\tlet tProviders = this.providers = [];\n\t\tlet ticketProviders = accessNested(appData, 'pages.showtimes.data.ticketProviders', {});\n\n\t\tif (activePage\n\t\t\t&& activePage.data\n\t\t\t&& activePage.data.ticketProviders\n\t\t\t&& typeof activePage.data.ticketProviders === 'object'\n\t\t\t&& activePage.data.ticketProviders.override\n\t\t) {\n\t\t\tticketProviders = activePage.data.ticketProviders;\n\t\t}\n\n\n\t\t// Retro-compatibility for apps that relied on the global showtimes page value (TODO: remove that when not needed anymore)\n\t\tlet useCinemaUrls = customDefault(accessNested(activePage, 'data.useCinemaUrls'), accessNested(appData, 'pages.showtimes.data.useCinemaUrls'), true);\n\t\tif (dataProviderToTicketProvider[this.providerId]) {\n\t\t\tuseCinemaUrls = false;\n\t\t}\n\n\t\tlet affiliateCodeExhibitors = [\n\t\t\t'amccinemas.co.uk',\n\t\t\t'amctheatres.com',\n\t\t\t'amccinemas.com.hk'\n\t\t];\n\t\tlet movieSlug = accessNested(appData, 'meta.title.slug', '');\n\t\tlet addAffiliateCode = url => {\n\t\t\t// (Vue only at the moment - add the movie name to the affiliate code)\n\t\t\treturn url.replace(/([?&])SC_CMP=AFF_POW(&|$)/, '$1SC_CMP=AFF_POW_'+movieSlug+'$2');\n\t\t};\n\t\tif (affiliateCodeExhibitors.indexOf(exhibitorDomain) !== -1) {\n\t\t\taddAffiliateCode = url => {\n\t\t\t\tlet parts = url.split('#');\n\t\t\t\turl = parts.shift();\n\t\t\t\tlet hash = parts.length ? '#' + parts.join('#') : '';\n\t\t\t\tlet qsPos = url.indexOf('?');\n\n\t\t\t\tlet parsedQS = {};\n\t\t\t\tif (qsPos !== -1) {\n\t\t\t\t\tparsedQS = qs.parse(url.slice(qsPos + 1), { strictNullHandling: true });\n\t\t\t\t\turl = url.slice(0, qsPos);\n\t\t\t\t}\n\t\t\t\tparsedQS.affiliateCode = 'pow';\n\t\t\t\treturn url + '?' + qs.stringify(parsedQS, { strictNullHandling: true }) + hash;\n\t\t\t};\n\t\t}\n\n\t\tthis.screenings.forEach(screening => {\n\t\t\tlet matchingDeeplink = overrideDeeplinks.find(dl => checkDLContext(dl, screening)) || overrideDeeplinks;\n\t\t\tif (!screening.preventDeeplinkOverride && matchingDeeplink && (matchingDeeplink.url || matchingDeeplink.url === false)) {\n\t\t\t\tscreening.url = matchingDeeplink.url;\n\t\t\t}\n\n\t\t\tlet urls = screening.urls = {};\n\t\t\tlet screeningUrl = screening.url;\n\t\t\t// If we the screeningsUrl is not set to false, but we want to use cinema url.\n\t\t\tif (!screeningUrl && screeningUrl !== false && useCinemaUrls && this.website) {\n\t\t\t\tscreeningUrl = this.website;\n\t\t\t}\n\t\t\tif (screeningUrl && urlContainsBlacklistTheater(screeningUrl) === false) {\n\t\t\t\tif (tProviders.indexOf('cinema') === -1) tProviders.push('cinema');\n\t\t\t\turls.cinema = addAffiliateCode(screeningUrl);\n\t\t\t}\n\n\t\t\tif (screening.srcTicketProviders) {\n\t\t\t\tObject.keys(screening.srcTicketProviders).forEach(ticketProvider => {\n\t\t\t\t\turls[ticketProvider] = screening.srcTicketProviders[ticketProvider];\n\t\t\t\t\tif (tProviders.indexOf(ticketProvider) === -1) tProviders.push(ticketProvider);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet movie = screening.movie;\n\n\t\t\tlet movieFandango = (screening.doc && screening.doc.movie_code_id) || movie.fandango;\n\t\t\tif (screening.fandangoUrl) {\n\t\t\t\tif (tProviders.indexOf('fandango') === -1) tProviders.push('fandango');\n\t\t\t\turls.fandango = screening.fandangoUrl;\n\t\t\t} else if (this.fandango && !!ticketProviders.fandango && movieFandango && screening.datetime && this.tms_id) {\n\t\t\t\tif (tProviders.indexOf('fandango') === -1) tProviders.push('fandango');\n\t\t\t\tlet formattedDate = formatDateTime(screening.datetime, 'MM\\\\-dd\\\\-yyyy\\\\+HH\\\\:mm');\n\t\t\t\turls.fandango = 'http://www.fandango.com/redirect.aspx?&mid=' + movieFandango + '&a=&tid=' + this.tms_id +\n\t\t\t\t\t'&dte=0&date=' + formattedDate;\n\t\t\t}\n\n\t\t\tif (this.movietickets && !!ticketProviders.movietickets && movie.movietickets && screening.datetime) {\n\t\t\t\tif (tProviders.indexOf('movietickets') === -1) tProviders.push('movietickets');\n\t\t\t\tif (matchingDeeplink && matchingDeeplink.movietickets) {\n\t\t\t\t\turls.movietickets = matchingDeeplink.movietickets;\n\t\t\t\t} else {\n\t\t\t\t\tif (this.location.country === 'ca') {\n\t\t\t\t\t\t// Hacky: movietickets CA uses webedia 2d ids, like atom. Use atom id.\n\t\t\t\t\t\tlet movieId = screening.movieticketsMovieId || movie.atom || movie.movietickets;\n\t\t\t\t\t\tlet dateTime = formatDateTime(screening.datetime, 'MM\\\\-dd\\\\-yyyy+HH\\\\:mm');\n\t\t\t\t\t\t// Do not encodeURIComponent... Encoded + is not recognized\n\t\t\t\t\t\turls.movietickets = 'http://www.movietickets.ca/purchase/?theater-id=' + this.movietickets +\n\t\t\t\t\t\t'&movie-id=' + movieId + '&date-time=' + dateTime;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet movieId = screening.movieticketsMovieId || movie.movietickets;\n\t\t\t\t\t\tlet day = formatDateTime(screening.datetime, 'MMddyyyy');\n\t\t\t\t\t\tlet time = formatDateTime(screening.datetime, 'HH\\\\:mm');\n\t\t\t\t\t\turls.movietickets = 'http://www.movietickets.com/purchase.asp?house_id=' + this.movietickets +\n\t\t\t\t\t\t'&movie_id=' + movieId + '&perfd=' + day + '&perft=' + time + '&afid=' + affiliate;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.atom && !!ticketProviders.atom && movie.atom && screening.datetime && screening.tz_offset) {\n\t\t\t\tif (tProviders.indexOf('atom') === -1) tProviders.push('atom');\n\t\t\t\t// urls.atom = `atom:///ViewVenueDetails?venueId=${this.atom}`;\n\t\t\t\tlet formattedDate;\n\t\t\t\tif (screening.nextDayDatetime) {\n\t\t\t\t\tformattedDate = formatDateTime(screening.nextDayDatetime, 'yyyy\\\\-MM\\\\-dd\\\\THH\\\\:mm\\\\:ss');\n\t\t\t\t} else {\n\t\t\t\t\tformattedDate = formatDateTime(screening.datetime, 'yyyy\\\\-MM\\\\-dd\\\\THH\\\\:mm\\\\:ss');\n\t\t\t\t}\n\t\t\t\tif (movie.hasOwnProperty('customAtomURL')) {\n\t\t\t\t\turls.atom = movie.customAtomURL;\n\t\t\t\t} else {\n\t\t\t\t\turls.atom = `https://www.atomtickets.com/checkout/redirect?venueId=${this.atom}&productionId=${movie.atom}&showtime=${formattedDate}${screening.tz_offset}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t});\n\t\t// let ticketProviders = appData.pages.showtimes.data.ticketProviders;\n\t\ttProviders.sort((a, b) => ((ticketProviders[a] && ticketProviders[a].order) || 0) - ((ticketProviders[b] && ticketProviders[b].order) || 0));\n\t}\n}\n\n// Update the screenings\nfunction validateFilter(filter, obj, tester) {\n\tif (!filter) return true;\n\tif (!obj) return filter.allowNulls || !filter.current || !filter.current.length;\n\tlet mp = filter.matchProp || 'id';\n\tif (typeof tester !== 'function') {\n\t\tlet isArray = Array.isArray(obj);\n\t\ttester = v => isArray ? obj.indexOf(v[mp]) !== -1 : obj[mp] === v[mp];\n\t}\n\tif (filter.excluded && filter.excluded.find(v => tester(v, obj, filter)))\n\t\treturn false;\n\treturn !filter.current || !filter.current.length || filter.current.find(v => tester(v, obj, filter));\n}\n\nfunction inactiveScreeningsFilter(filter, obj) {\n\tif (!obj || !filter || !filter.disabled || !filter.disabled.length) return true;\n\tlet mp = filter.matchProp || 'id';\n\tlet val = obj[mp];\n\n\treturn !filter.disabled.find(v => v[mp] == val);\n}\n\nfunction validateMovie(val, obj) {\n\tif (!val) return false;\n\tif (obj.id === val.id || obj.provider_id + ':' + obj.provider_movie_id === val.id) return true;\n\treturn val.slug && val.slug === obj.slug;\n}\n\nfunction validateFormat(theater) {\n\treturn (val, obj, filter) => {\n\t\tlet mp = filter.matchProp || 'id';\n\t\tif (val.reald && !accessNested(theater, 'masterDoc.reald')) return false;\n\t\treturn obj[mp] === val[mp];\n\t};\n}\n\n// Tester function for theater filter - check id and provider id\nfunction validateTheater(val, obj) {\n\tif (!val || !val.id) return false;\n\tval = val.id;\n\tif (obj.id === val) return true;\n\tlet vals = val.split(':');\n\tlet prov = vals.shift();\n\tlet pid = vals.join(':');\n\tif (!prov || !pid) return false;\n\treturn obj.providerId === prov && (pid === '*' || obj.providerTheaterId === pid);\n}\n\nexport function filterTheater(theater, filters) {\n\n\ttheater.activeScreenings = theater.screenings.filter((s) => {\n\t\tlet passes = inactiveScreeningsFilter(filters.format, s.movie.format);\n\t\treturn passes;\n\t});\n\n\ttheater.filteredScreenings = theater.activeScreenings.filter((s) => {\n\t\tlet passes = validateFilter(filters.timeOfDay, s.timeOfDay) &&\n\t\t\tvalidateFilter(filters.movie, s.movie, validateMovie) &&\n\t\t\tvalidateFilter(filters.format, s.movie.format, validateFormat(theater)) &&\n\t\t\tvalidateFilter(filters.stDate, s.nextDaySTDate || s.stDate) &&\n\t\t\tvalidateFilter(filters.hour, { id: s.hour }) &&\n\t\t\tvalidateFilter(filters.minute, { id: s.minute }) &&\n\t\t\t// validateFilter(filters.exhibitor, theater.exhibitor) &&\n\t\t\tvalidateFilter(filters.ticketProvider, theater.providers);\n\t\treturn passes;\n\t}).sort((a, b) => a.datetime < b.datetime ? -1 : 1);\n\n\tlet filterPass = theater.filteredScreenings.length ? true : false;\n\n\t// remove active if doesn't pass filter (no filtered screenings)\n\ttheater.active = theater.active && !filterPass ? false : theater.active;\n\n\t// Is it active\n\ttheater.activeExhibitor =\n\t\tvalidateFilter(filters.exhibitor, theater.exhibitor) &&\n\t\tvalidateFilter(filters.theater, theater, validateTheater);\n\tlet pid = theater.providerId;\n\tif (pid === 'wwm' || pid === 'webuk' || pid === 'webus') {\n\t\ttheater.activeExhibitor = theater.activeExhibitor && validateFilter(filters.webedia, theater);\n\t}\n\n\t// Edit the instance but also return the properties to update the store object properly\n\n\t// in case we need to sort by date instead of distance\n\t// let firstDatetime = theater.firstDatetime = theater.filteredScreenings.length && theater.filteredScreenings[0].datetime;\n\t// let firstDate = theater.firstDate = accessNested(theater, 'filteredScreenings.0.stDate.date');\n\tlet firstDate = theater.firstDate = theater.filteredScreenings.reduce((p, s) => {\n\t\tlet date = accessNested(s, 'stDate.date');\n\t\tif (!p) return +date;\n\t\treturn date ? Math.min(p, date) : p;\n\t}, undefined);\n\n\treturn {\n\t\tfilteredScreenings: theater.filteredScreenings,\n\t\tactiveExhibitor: theater.activeExhibitor,\n\t\t// firstDatetime,\n\t\tfirstDate,\n\t\tfilterPass,\n\t\tactive: theater.active\n\t};\n}\n\n/**\n * Test if URL contains blacklisted theater.\n *\n * @param {string} url The url to test for.\n * @returns {boolean} True is the url contains the theater hostname.\n */\nfunction urlContainsBlacklistTheater(url) {\n\tlet matcher = /((\\w*\\.)?(arclightcinemas\\.com|pacifictheatres\\.com))/i;\n\treturn matcher.test(url);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Theater.js","module.exports = {\n\tcinepapaya: 'fandango',\n\tyandex: 'yandex',\n\tkinohod: 'kinohod',\n\trambler: 'rambler'\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/dataProviderToTicketProvider.js","const cleanCategoryName = s => typeof s === 'string' && s.trim().length\n\t\t? s.trim().toUpperCase()\n\t\t: undefined;\n\nmodule.exports = cleanCategoryName;\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/cleanCategoryName.common.js","import { triggerOrQueue } from './queue';\n/**\n * Class representing managed pixel\n */\nexport default class Pixel {\n\tconstructor(category, pixel, shouldQueue = false) {\n\t\tthis.category = category;\n\t\tthis.pixel = pixel;\n\t\tthis.shouldQueue = shouldQueue;\n\t}\n\n\tcreateTrigger() {\n\t\treturn (...args) => {\n\t\t\ttriggerOrQueue(this, this.shouldQueue, args);\n\t\t};\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/Pixel.js","import * as categories from './categories';\n\nlet _queue = [];\n\nexport const triggerOrQueue = (managed, shouldQueue, args) => {\n\tif (categories.has(managed.category)) {\n\t\treturn managed.pixel.apply(managed, args);\n\t}\n\n\tif (shouldQueue) {\n\t\treturn add(managed, args);\n\t}\n};\n\nexport const add = (managed, args) => {\n\t_queue = [..._queue, [managed, args]];\n};\n\nexport const drain = () => {\n\tconst prevQueue = [..._queue];\n\t_queue = [];\n\tprevQueue.forEach(([managed, args]) => triggerOrQueue(managed, managed.shouldQueue, args));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/queue.js","'use strict';\n\nvar Utils = require( './utils' );\n\n\n\n//#build\n\n\nvar BEFOREALL = 'beforeAll',\n\tAFTERALL = 'afterAll'\n;\nvar specialEvents = [BEFOREALL, AFTERALL];\n\n// The prototype methods are stored in a different object\n// and applied as non enumerable properties later\nvar emitterProto = {\n\ton: function( eventName, listener, once ){\n\t\tvar listeners = this._events[ eventName ] || [];\n\n\t\tlisteners.push({ callback: listener, once: once});\n\t\tthis._events[ eventName ] =  listeners;\n\n\t\treturn this;\n\t},\n\n\tonce: function( eventName, listener ){\n\t\treturn this.on( eventName, listener, true );\n\t},\n\n\toff: function( eventName, listener ){\n\t\tif( typeof eventName === 'undefined' ){\n\t\t\tthis._events = {};\n\t\t}\n\t\telse if( typeof listener === 'undefined' ) {\n\t\t\tthis._events[ eventName ] = [];\n\t\t}\n\t\telse {\n\t\t\tvar listeners = this._events[ eventName ] || [],\n\t\t\t\ti\n\t\t\t;\n\n\t\t\tfor (i = listeners.length - 1; i >= 0; i--) {\n\t\t\t\tif( listeners[i].callback === listener )\n\t\t\t\t\tlisteners.splice( i, 1 );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\temit: function( eventName ){\n\t\tvar args = [].slice.call( arguments, 1 ),\n\t\t\tlisteners = this._events[ eventName ] || [],\n\t\t\tonceListeners = [],\n\t\t\tspecial = specialEvents.indexOf( eventName ) !== -1,\n\t\t\ti, listener, returnValue, lastValue\n\t\t;\n\n\t\tspecial || this.emit.apply( this, [BEFOREALL, eventName].concat( args ) );\n\n\t\t// Call listeners\n\t\tfor (i = 0; i < listeners.length; i++) {\n\t\t\tlistener = listeners[i];\n\n\t\t\tif( listener.callback )\n\t\t\t\tlastValue = listener.callback.apply( this, args );\n\t\t\telse {\n\t\t\t\t// If there is not a callback, remove!\n\t\t\t\tlistener.once = true;\n\t\t\t}\n\n\t\t\tif( listener.once )\n\t\t\t\tonceListeners.push( i );\n\n\t\t\tif( lastValue !== undefined ){\n\t\t\t\treturnValue = lastValue;\n\t\t\t}\n\t\t}\n\n\t\t// Remove listeners marked as once\n\t\tfor( i = onceListeners.length - 1; i >= 0; i-- ){\n\t\t\tlisteners.splice( onceListeners[i], 1 );\n\t\t}\n\n\t\tspecial || this.emit.apply( this, [AFTERALL, eventName].concat( args ) );\n\n\t\treturn returnValue;\n\t},\n\n\ttrigger: function(){\n\t\tUtils.warn( false, 'Method `trigger` is deprecated and will be removed from freezer in upcoming releases. Please use `emit`.' );\n\t\treturn this.emit.apply( this, arguments );\n\t}\n};\n\n// Methods are not enumerable so, when the stores are\n// extended with the emitter, they can be iterated as\n// hashmaps\nvar Emitter = Utils.createNonEnumerable( emitterProto );\n//#build\n\nmodule.exports = Emitter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/src/emitter.js\n// module id = 23\n// module chunks = 0","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/node-libs-browser/~/process/browser.js\n// module id = 24\n// module chunks = 0","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/object-assign/index.js\n// module id = 25\n// module chunks = 0","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n    'default': 'RFC3986',\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return value;\n        }\n    },\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/qs/lib/formats.js\n// module id = 26\n// module chunks = 0","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    var obj;\n\n    while (queue.length) {\n        var item = queue.pop();\n        obj = item.obj[item.prop];\n\n        if (Array.isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n\n    return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        } else if (typeof target === 'object') {\n            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (Array.isArray(target) && !Array.isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                if (target[i] && typeof target[i] === 'object') {\n                    target[i] = merge(target[i], item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str) {\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\nvar encode = function encode(str) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = typeof str === 'string' ? str : String(str);\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    merge: merge\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/qs/lib/utils.js\n// module id = 27\n// module chunks = 0","module.exports = shallow\n\nfunction shallow(a, b, compare) {\n  var aIsArray = Array.isArray(a)\n  var bIsArray = Array.isArray(b)\n\n  if (aIsArray !== bIsArray) return false\n\n  var aTypeof = typeof a\n  var bTypeof = typeof b\n\n  if (aTypeof !== bTypeof) return false\n  if (flat(aTypeof)) return compare\n    ? compare(a, b)\n    : a === b\n\n  return aIsArray\n    ? shallowArray(a, b, compare)\n    : shallowObject(a, b, compare)\n}\n\nfunction shallowArray(a, b, compare) {\n  var l = a.length\n  if (l !== b.length) return false\n\n  if (compare) {\n    for (var i = 0; i < l; i++)\n      if (!compare(a[i], b[i])) return false\n  } else {\n    for (var i = 0; i < l; i++) {\n      if (a[i] !== b[i]) return false\n    }\n  }\n\n  return true\n}\n\nfunction shallowObject(a, b, compare) {\n  var ka = 0\n  var kb = 0\n\n  if (compare) {\n    for (var key in a) {\n      if (\n        a.hasOwnProperty(key) &&\n        !compare(a[key], b[key])\n      ) return false\n\n      ka++\n    }\n  } else {\n    for (var key in a) {\n      if (\n        a.hasOwnProperty(key) &&\n        a[key] !== b[key]\n      ) return false\n\n      ka++\n    }\n  }\n\n  for (var key in b) {\n    if (b.hasOwnProperty(key)) kb++\n  }\n\n  return ka === kb\n}\n\nfunction flat(type) {\n  return (\n    type !== 'function' &&\n    type !== 'object'\n  )\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/shallow-equals/index.js\n// module id = 28\n// module chunks = 0","import 'base-styles/reset.sss';\nimport s from 'base/embed/embed.sss';\nimport { h, Component } from 'preact';\nimport { Link } from 'components/core/link/link.js';\nimport qs from 'qs';\nimport DynamicTheaterSentence from 'components/shared/dynamicTheaterSentence/dynamicTheaterSentence';\nimport { getCopy } from 'utils/copy';\n\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nconst isServer = typeof window === 'undefined';\n\n\n\nexport default class EmbedApp extends Component {\n\tconstructor(props) {\n\t\tsuper();\n\t\tthis.state.appState = props.initialStore;\n\t\tStore.set(props.initialStore);\n\t\tif (!isServer) {\n\t\t\tthis.state.query = qs.parse(location.search.substr(1));\n\t\t}\n\n\t\tif(typeof window !== 'undefined') {\n\t\t\tStore.emit(actions.PAGE_STATE_LOADED);\n\t\t\twindow.Store = Store;\n\t\t}\n\n\t\tStore.on('update', () => { this.setState({appState: Store.get()}); });\n\t}\n\n\trender(props, {appState}) {\n\n\n\n\t\t// no query found in store, so means we're on the server\n\t\tif (!this.state.query) return;\n\n\t\tlet appUrl = appState.appData.meta.url || '';\n\n\t\t// Make sure the url ends with a slash\n\t\tif (appUrl[appUrl.length - 1] !== '/') {\n\t\t\tappUrl += '/';\n\t\t}\n\n\t\tlet settings = {};\n\n\t\tsettings = {\n\t\t\ttextColor: this.state.query.textColor || '000000',\n\t\t\thighlightTextColor: this.state.query.highlightTextColor|| '0B87EE',\n\t\t\tbuttonTextColor: this.state.query.buttonTextColor || 'FFFFFF',\n\t\t\tbuttonBackgroundColor: this.state.query.buttonBackgroundColor || '0B87EE',\n\t\t\tbackgroundColor: this.state.query.backgroundColor || 'FFFFFF',\n\t\t\ttextFontSize: this.state.query.textFontSize || '24',\n\t\t\tbuttonFontSize: this.state.query.buttonFontSize || '14',\n\t\t\tlocation: this.state.query.location\n\t\t};\n\n\t\tif (appState.client.deviceSize === 'mobile') {\n\t\t\t// Settings for mobile\n\t\t\tsettings = {\n\t\t\t\ttextColor: this.state.query.mobileTextColor || settings.textColor,\n\t\t\t\thighlightTextColor: this.state.query.mobileHighlightTextColor || settings.highlightTextColor,\n\t\t\t\tbuttonTextColor: this.state.query.mobileButtonTextColor || settings.buttonTextColor,\n\t\t\t\tbuttonBackgroundColor: this.state.query.mobileButtonBackgroundColor || settings.buttonBackgroundColor,\n\t\t\t\tbackgroundColor: this.state.query.mobileBackgroundColor || settings.backgroundColor,\n\t\t\t\ttextFontSize: this.state.query.mobileTextFontSize || settings.textFontSize,\n\t\t\t\tbuttonFontSize: this.state.query.mobileButtonFontSize || settings.buttonFontSize\n\t\t\t};\n\t\t}\n\n\t\t// Get the extra query Parameters\n\t\tlet extraQueryParameters = { ...this.state.query };\n\t\t// Delete all of the styling variables\n\t\tdelete extraQueryParameters.textColor;\n\t\tdelete extraQueryParameters.mobileTextColor;\n\t\tdelete extraQueryParameters.highlightTextColor;\n\t\tdelete extraQueryParameters.mobileHighlightTextColor;\n\t\tdelete extraQueryParameters.buttonTextColor;\n\t\tdelete extraQueryParameters.mobileButtonTextColor;\n\t\tdelete extraQueryParameters.buttonBackgroundColor;\n\t\tdelete extraQueryParameters.mobileButtonBackgroundColor;\n\t\tdelete extraQueryParameters.backgroundColor;\n\t\tdelete extraQueryParameters.mobileBackgroundColor;\n\t\tdelete extraQueryParameters.textFontSize;\n\t\tdelete extraQueryParameters.mobileTextFontSize;\n\t\tdelete extraQueryParameters.buttonFontSize;\n\t\tdelete extraQueryParameters.mobileButtonFontSize;\n\n\n\n\t\t// Format to right format\n\t\tsettings.textColor = `#${settings.textColor}`;\n\t\tsettings.highlightTextColor = `#${settings.highlightTextColor}`;\n\t\tsettings.buttonTextColor = `#${settings.buttonTextColor}`;\n\t\tsettings.buttonBackgroundColor = `#${settings.buttonBackgroundColor}`;\n\t\tsettings.backgroundColor = `#${settings.backgroundColor}`;\n\t\tsettings.textFontSize = `${settings.textFontSize}px`;\n\t\tsettings.buttonFontSize = `${settings.buttonFontSize}px`;\n\n\t\t// Styling embed\n\t\tconst containerStyles = {\n\t\t\tbackground: settings.backgroundColor\n\t\t};\n\n\t\t// Styling button\n\t\tconst buttonStyles = {\n\t\t\tbackground: settings.buttonBackgroundColor,\n\t\t\tcolor: settings.buttonTextColor,\n\t\t\tfontSize: settings.buttonFontSize\n\t\t};\n\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclass={s.container}\n\t\t\t\tstyle={containerStyles}\n\t\t\t>\n\t\t\t\t<div class={s.content}>\n\t\t\t\t\t<DynamicTheaterSentence\n\t\t\t\t\t\tshowtimes={appState.showtimes}\n\t\t\t\t\t\ttextColor={settings.textColor}\n\t\t\t\t\t\tlocation={settings.location}\n\t\t\t\t\t\ttextFontSize={settings.textFontSize}\n\t\t\t\t\t\thighlight={settings.highlightTextColor}\n\t\t\t\t\t\thref={appUrl}\n\t\t\t\t\t\treleaseDate={new Date(appState.appData.meta.dates.release)}\n\t\t\t\t\t\textraQueryParameters={extraQueryParameters}\n\t\t\t\t\t/>\n\t\t\t\t\t<div class={s.linkContainer}>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\thref={`${appUrl}?${qs.stringify(extraQueryParameters)}`}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\tclass={s.button}\n\t\t\t\t\t\t\tstyle={buttonStyles}\n\t\t\t\t\t\t\ttrackId=\"embed-tickets-click\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{getCopy('GET_TICKETS')}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/base/embed/embedApp.js","import { h, Component } from 'preact';\nimport { getCopyWithParams } from 'utils/clientUtils';\n\nconst Embed = ({children, path, initialState, appData, relativeRoot, reload}) => {\n\n\tlet initialData = <script dangerouslySetInnerHTML={{__html: `\nwindow.__INITIAL_STATE__ = ${JSON.stringify(initialState)};\nwindow.__BUILD_DATE__ = ${Date.now()};`\n\t}}></script>;\n\n\tlet copy = appData.copy;\n\n\tlet pageTitle = getCopyWithParams(copy, copy.$DYNAMIC_TITLE.replace(/%PAGE_NAME%/, ''));\n\treturn (\n\t\t<html>\n\t\t\t<head>\n\t\t\t\t<title>{pageTitle}</title>\n\t\t\t\t<meta charset=\"UTF-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"minimal-ui, initial-scale=1\" />\n\t\t\t\t<link rel=\"stylesheet\" type=\"text/css\"  href={`${relativeRoot}css/embed.css`} />\n\t\t\t\t<link href=\"https://fonts.googleapis.com/css?family=Noto+Sans:400,700\" rel=\"stylesheet\" />\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t<div id=\"app\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t\t{initialData}\n\t\t\t\t{ !reload && <script src=\"https://cdn.ravenjs.com/3.16.0/raven.min.js\" crossorigin=\"anonymous\"></script> }\n\t\t\t\t{reload}\n\t\t\t\t<script src={`${relativeRoot}js/embed.js`} charset=\"utf-8\" />\n\t\t\t</body>\n\t\t</html>\n\t);\n};\n\n\nexport default Embed;\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/base/embed/embedDoc.js","import { h } from 'preact';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport { oneTrust } from 'utils/gdpr';\nimport {\n\tcalculateShowtimesStatus,\n\tgetSize,\n\tsearchLocation,\n\tgetPageTitle,\n\tgetPath\n} from 'utils/clientUtils';\nimport {\n\ttrack,\n\tinitTracker,\n\tgaCustom,\n\tupdateDataLayer,\n\tupdateDataLayerPageView\n} from 'utils/tracking';\nimport { dbounce, accessNested, parseDate } from 'utils/utils';\nimport { smoothScrollTo } from 'utils/smoothScroll';\nimport queryString from 'qs';\nimport route from 'components/core/link/route';\nimport 'store/updateExtra';\nimport geoFencing from 'utils/geoFencing';\nimport CookiesModal from 'components/shared/cookiesModal/cookiesModal';\n\n// NOTE: SHOWTIMES EVENTS NOT INCLUDED IN THIS\n\n/** Listen to event triggers and update the store in reaction */\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Base events\n\n/**\n * Will be triggered every time an event is fired.\n * NOTE: This should be in store.js\n * @param {string} reactionName - the name of the event\n * @param {*} data - the first argument when the event was called\n */\nStore.on('afterAll', (reactionName, data) => {\n\tif (reactionName !== 'update') {\n\t\t// console.debug('TRIGGERED:', reactionName);\n\t}\n});\n\n/**\n * Update something in the store.\n * Should be used with care! to update anything irregular in the store.\n * NOTE: This is only used by the Warner Bros DE pixels to set movie genres.\n *       I think It should be a more explicit event like \"UPDATE_GENRES\"\n * @param {Object} storeData - the changes to apply on the store\n */\nStore.on(actions.UPDATE_STORE, (storeData) => {\n\tconst store = Store.get();\n\tstore.set(storeData);\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Loader events\n\n/**\n * Update loader data.\n * This is only used in Doctor Strange AFAIK.\n * @param {Object} loader - the loader data\n */\nStore.on(actions.UPDATE_LOADER, (loader) => {\n\tconst store = Store.get();\n\n\tif (store.hasOwnProperty('loader')) {\n\t\tstore.loader.set(loader);\n\t} else {\n\t\tstore.set({ loader: loader });\n\t}\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Page interactions\n\n/**\n * Update the active page.\n * This event is fired by the \"PAGE_STATE_LOADED\", which will automatically detect the active\n * page based on the page url.\n * @param {Object} activePage - the active page object\n */\nStore.on(actions.SET_ACTIVE_PAGE, (activePage) => {\n\tif (!activePage) return;\n\t// console.log('Navigating to', activePage.path);\n\tgaCustom('set', 'page', activePage.path);\n\tgaCustom('send', 'pageview');\n\ttrackPageView(activePage.id, null, false);\n\n\tconst state = Store.get();\n\n\tif (activePage.data && state.background && state.background.videoEnabled !== activePage.data.allowBgVideo) {\n\t\t// Update the allowBgVideo\n\t\tconst { data } = activePage;\n\t\tStore.emit(actions.SET_BACKGROUND_VIDEO_ENABLED, data && data.allowBgVideo);\n\t}\n\n\t// Close the sidenav\n\tStore.emit(actions.SET_SIDE_NAV_OPEN, false);\n\n\tconst sideNavBelow = accessNested(activePage, 'data.header.breakpoint') ||\n\t\taccessNested(state, 'appData.header.breakpoint');\n\tif (typeof window !== 'undefined' && state.activePage.id !== activePage.id && !activePage.order) {\n\t\t// Scroll to top ?\n\t\t// (will change the scroll if the new page is smaller anyway)\n\t\t// If we keep that, add delay so that some pages can save their leaving state scroll position\n\t\tsetTimeout(() => smoothScrollTo('root', 0, 200), 0);\n\t}\n\n\t// Set the document title to the active page one\n\tdocument.title = getPageTitle(activePage, state.appData);\n\tconst header = state.header;\n\tStore.get().set({ activePage });\n\n\t// Have to re-get() since the reference is changed after the first set\n\tif (state.header && state.header.sideNavBelow !== sideNavBelow) {\n\t\tStore.get().header.set({ sideNavBelow });\n\t\tStore.emit(actions.SET_SIDE_NAV_ACTIVE, state.client.deviceSize);\n\t}\n\n\tStore.emit(actions.CLOSE_TICKETING);\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Background interactions\n\n/**\n * Update any of the background settings.\n * @param {Object} values - object with new background settings\n */\nfunction updateBackground(values) {\n\tconst bg = Store.get().background;\n\tif (bg) {\n\t\tbg.set(values);\n\t}\n}\nStore.on(actions.UPDATE_BACKGROUND_SETTINGS, updateBackground);\n\n/**\n * Set whether the background video should play.\n * @param {boolean} videoPlaying - whether the background video is playing\n */\nStore.on(actions.SET_BACKGROUND_VIDEO_PLAYING, (videoPlaying) => {\n\tupdateBackground({ videoPlaying });\n});\n\n/**\n * Set whether the video background is enabled.\n * @param {boolean} videoEnabled - true to enable the video background\n */\nStore.on(actions.SET_BACKGROUND_VIDEO_ENABLED, (videoEnabled) => {\n\tupdateBackground({ videoEnabled });\n});\n\n/**\n * Mute or unmute the background video.\n * @param {boolean} muted - true to mute the video, false to unmute\n */\nStore.on(actions.SET_BACKGROUND_VIDEO_MUTED, (muted) => {\n\tupdateBackground({ muted });\n});\n\n/**\n * Set the currently displayed background DOM element\n * @param {HTMLElement} element - current DOM element being the background\n */\nStore.on(actions.SET_BACKGROUND_ELEMENT, (element) => {\n\tupdateBackground({ element });\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Header interactions\n\n/**\n * Set whether the header menu is opened.\n * @param {boolean} sideNavOpen - true to open the menu, false to close it\n */\nStore.on(actions.SET_SIDE_NAV_OPEN, (sideNavOpen) => {\n\tconst header = Store.get().header;\n\tif(!header) return;\n\tif (!!sideNavOpen === !!header.sideNavOpen) return;\n\ttrack({ a: sideNavOpen ? 'nav-open' : 'nav-closed' });\n\theader.set({ sideNavOpen });\n});\n\n/**\n * Set whether the header is hidden.\n * @param {boolean} hidden - true to hide the menu, false to show it\n */\nStore.on(actions.HEADER_HIDDEN, (hidden) => {\n\tStore.get().header.set({ hidden });\n});\n\n/**\n * Set whether the side nav is active\n * @param {string} deviceSize - the current device size\n */\nStore.on(actions.SET_SIDE_NAV_ACTIVE, (deviceSize) => {\n\tconst store = Store.get();\n\tconst headerStore = store.header;\n\n\tconst { sideNavBelow } = headerStore;\n\tlet sideNavActive = false;\n\n\tif (sideNavBelow === 'desktop' ||\n\t\t(sideNavBelow === 'tablet' && (deviceSize === 'tablet' || deviceSize === 'mobile')) ||\n\t\tsideNavBelow === deviceSize) {\n\t\tsideNavActive = true;\n\t}\n\n\tconst device = store.client.device;\n\tconst isTablet = device === 'ipad' || (device === 'android' && deviceSize === 'tablet');\n\tif (accessNested(store, 'appData.header.sideNavOnTablet') && isTablet) {\n\t\tsideNavActive = true;\n\t}\n\n\tif (headerStore.hideHeader) {\n\t\tsideNavActive = true;\n\t}\n\n\theaderStore.set({ sideNavActive });\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Footer interactions\n\n/**\n * Store the current size of the footer.\n * FIXME: Commented 3 months ago, can we remove the handler + event?\n * @param {number} size - the current size of the footer in pixels\n */\n// Store.on(actions.FOOTER_SIZE, (size) => {\n// \tStore.get().footer.set({ size });\n// });\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Quizz interactions\n\n/**\n * Set wheter a quiz is started.\n * @param {boolean} started - true to start the quizz\n * @param {string=} quizId - the page id of the quizz started, by default it's the active page\n */\nStore.on(actions.QUIZ_STARTED, (started, quizId) => {\n\tconst quiz = quizId ? Store.get().appData.pages[quizId] : Store.get().activePage;\n\tif (quiz) {\n\t\tquiz.set({ started });\n\t}\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Client interactions\n\n/**\n * Update the stored client dimensions.\n * @param {Object} dimensions - the new client dimensions\n */\nStore.on(actions.SET_CLIENT_SIZE, (dimensions) => {\n\tconst store = Store.get();\n\tconst clientStore = store.client;\n\n\tconst deviceSize = getSize(dimensions);\n\tconst orientation = dimensions.width > dimensions.height ? 'landscape' : 'portrait';\n\n\tif (deviceSize !== clientStore.deviceSize) {\n\t\tStore.emit(actions.SET_SIDE_NAV_ACTIVE, deviceSize);\n\t}\n\n\tclientStore.set({\n\t\tdimensions,\n\t\tdeviceSize,\n\t\torientation\n\t});\n});\n\n(() => {\n\tconst validOrientations = ['portrait', 'landscape'];\n\tlet refCount = 0;\n\n\t// NOTE: This system is not perfect: it is too permissive.\n\t//       Basically, you can aquire a lock for landscape while a lock on portrait is still active.\n\t//       Perhaps we could add a priority like 'portrait' > 'landscape'?\n\n\t/**\n\t * Start forcing the orientation of the device.\n\t * @param {string} orientation - the device orientation, either 'portrait' or 'landscape'\n\t */\n\tStore.on(actions.START_FORCE_CLIENT_ORIENTATION, (orientation) => {\n\t\tif (validOrientations.indexOf(orientation) === -1) {\n\t\t\tconsole.error(`FORCE_ORIENTATION: unknown device orientation \"${orientation}\"`);\n\t\t\treturn;\n\t\t}\n\t\tconst uiState = Store.get().header.uiState;\n\t\tconst { overlayOrientation } = uiState;\n\t\tconst orientationChanged = orientation !== overlayOrientation;\n\n\t\tif (refCount > 0 && orientationChanged) {\n\t\t\tconsole.error(`FORCE_ORIENTATION: received a \"${orientation}\" orienation force request but ` +\n\t\t\t\t`there are still ${refCount} ongoing requests for \"${overlayOrientation}\". The behavior ` +\n\t\t\t\t'is now undefined.');\n\t\t\trefCount = 0; // accept the request anyway\n\t\t}\n\n\t\trefCount++;\n\t\tif (orientationChanged) {\n\t\t\tuiState.set({ overlayOrientation: orientation });\n\t\t}\n\t});\n\n\t/**\n\t * Stop forcing the orientation of the device.\n\t * Note that this function has effects only when it's called the same number of times\n\t * the function to start forcing the orientation has been called.\n\t * @param {boolean=} force - ignore the previous orientation requests and stop forcing it\n\t */\n\tStore.on(actions.STOP_FORCE_CLIENT_ORIENTATION, (force) => {\n\t\tconst uiState = Store.get().header.uiState;\n\t\tconst { overlayOrientation } = uiState;\n\n\t\tif (force) refCount = 0;\n\t\tif (refCount > 0) refCount--;\n\t\tif (refCount === 0 && overlayOrientation) {\n\t\t\tuiState.set({ overlayOrientation: false });\n\t\t}\n\t});\n\n})();\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Page load\n\nfunction detectCurrentPage(state, url) {\n\tstate = state || Store.get();\n\turl = (url || location.pathname)\n\n\tif (location.hostname === 'localhost') {\n\t\t// to prevent pages with /preview/ path to automatically be selected on local builds\n\t\turl = url.replace('/preview','');\n\t}\n\n\tlet bestMatch = null;\n\tlet bestMatchCount = 0;\n\tconst pages = state.appData.pages;\n\tObject.keys(pages).forEach(pageId => {\n\t\tconst page = pages[pageId];\n\t\tlet path = page.path.slice(0, -1);\n\t\tif (path === '') {\n\t\t\tpath = '/';\n\t\t}\n\t\tif (url.indexOf(path) >= 0 && !page.baseHtml) {\n\t\t\tif (bestMatchCount < path.length) {\n\t\t\t\tbestMatch = page;\n\t\t\t\tbestMatchCount = path.length;\n\t\t\t}\n\t\t}\n\t});\n\treturn bestMatch;\n}\n\nlet originalSetItem;\nlet setItemQueue = [];\nlet originalCookieDescriptor;\nlet cookieQueue = [];\nStore.on(actions.SHOW_COOKIES_MODAL, (callback) => {\n\t// Delay all potential localStorage.setItem && document.cookie = stuff to after the user has accepted\n\t// (not foolproof, only works for same-domain cookies not for things like youtube iframes etc.)\n\ttry {\n\t\tif (!originalSetItem) {\n\t\t\toriginalSetItem = localStorage.setItem;\n\t\t}\n\t\tlocalStorage.setItem = function() { setItemQueue.push([this, ...arguments]); };\n\t} catch(e) { }\n\ttry {\n\t\tif (!originalCookieDescriptor) {\n\t\t\toriginalCookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') || Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');\n\t\t\tObject.defineProperty(document, 'cookie', {\n\t\t\t\tget: originalCookieDescriptor.get.bind(document),\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t}\n\t\tObject.defineProperty(document, 'cookie', {\n\t\t\tset: value => cookieQueue.push(value)\n\t\t});\n\t} catch(e) { }\n\tStore.emit(actions.SHOW_MODAL, CookiesModal, (accept) => {\n\t\twindow.preventCookies = !accept;\n\t\tStore.get().client.set({ cookies: accept });\n\t\tif (accept) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem = originalSetItem;\n\t\t\t\tsetItemQueue.forEach(elem => localStorage.setItem.call(...elem));\n\t\t\t\t// Empty the array without changing the ref\n\t\t\t\tsetItemQueue.length = 0;\n\t\t\t} catch(e) { }\n\t\t\ttry {\n\t\t\t\tObject.defineProperty(document, 'cookie', {\n\t\t\t\t\tset: originalCookieDescriptor.set.bind(document)\n\t\t\t\t});\n\t\t\t\tcookieQueue.forEach(elem => document.cookie = elem);\n\t\t\t\tcookieQueue.length = 0;\n\t\t\t} catch(e) { }\n\t\t}\n\t\tif (typeof callback === 'function') {\n\t\t\tcallback(accept);\n\t\t}\n\t}, {\n\t\ttype: 'cookieModal',\n\t\tblockClose: true,\n\t\tbackdropColor: 'rgba(0, 0, 0, .8)',\n\t\tfadeIn: 600,\n\t\tappData: Store.get().appData\n\t});\n});\n\n/**\n * Called when a new page is loaded.\n */\nStore.on(actions.BEFORE_LOAD, () => {\n\tconst state = Store.get().toJS();\n\tconst appData = state.appData;\n\n\tStore.emit(actions.SET_SIDE_NAV_ACTIVE, state.client.deviceSize);\n\n\tconst detectedPage = detectCurrentPage(state);\n\tif (detectedPage && detectedPage.id !== state.activePage.id) {\n\t\tStore.emit(actions.SET_ACTIVE_PAGE, detectedPage);\n\t\t// Temp update it in our object to be able to work with it\n\t\tstate.activePage = detectedPage;\n\t}\n\n\tconst parsedQS = queryString.parse(location.search.slice(1));\n\tif (parsedQS.referrer) {\n\t\twindow.customReferrer = parsedQS.referrer;\n\t}\n\n\tlet showbarebones = parsedQS.showbarebones;\n\tconst embedmode = parsedQS.embedmode;\n\t// if (embedmode) {\n\t// \t// enable showbarebones\n\t// \tshowbarebones = true;\n\t// }\n\tif (appData.options.showbarebones) {\n\t\twindow.showbarebones = true;\n\t}\n\tif (window.showbarebones !== undefined) showbarebones = window.showbarebones;\n\tif (showbarebones) {\n\t\tStore.get().header.set({\n\t\t\thideHeader: true,\n\t\t\tsideNavActive: true\n\t\t});\n\n\t\tdocument.body.classList.add('bodyBarebones');\n\t\tif (accessNested(state, 'appData.pages.showtimes.data')) {\n\t\t\tStore.get().appData.pages.showtimes.data.set({\n\t\t\t\tforceFullHeader: true\n\t\t\t});\n\t\t}\n\t}\n\n\tif (parsedQS.iframe) {\n\t\t// Apply fixes specific to iframe bugs\n\t\tStore.get().client.set({\n\t\t\tiframe: true\n\t\t});\n\n\t\t// if (state.client.isIOS) {\n\t\t// \t// Due to iframe bugs on ios, let's enable the embedMode\n\t\t// \tembedmode = true;\n\t\t// }\n\t}\n\n\tif (embedmode) {\n\t\t// Add in global class to body\n\t\tdocument.body.classList.add('embedMode');\n\t\t// Update the store\n\t\tStore.get().client.set({\n\t\t\tembedMode: true\n\t\t});\n\t}\n\n\tconst onUrlChange = (e) => {\n\t\tconst state = Store.get();\n\n\t\tlet activePage = null;\n\t\tif (e && e.state && e.state.hasOwnProperty('pageId')) {\n\t\t\tactivePage = state.appData.pages[e.state.pageId];\n\t\t} else {\n\t\t\tactivePage = detectCurrentPage(state);\n\t\t}\n\n\t\tif (activePage && activePage.id !== accessNested(state, 'activePage.id')) {\n\t\t\tStore.emit(actions.SET_ACTIVE_PAGE, activePage);\n\t\t}\n\n\t\tStore.emit(actions.URL_CHANGED, e);\n\t};\n\twindow.addEventListener('popstate', onUrlChange);\n\thistory.onpushstate = onUrlChange;\n\thistory.onreplacestate = onUrlChange;\n\n\tlet showtimesStatus = false;\n\tif (state.appData.pages && state.appData.pages.showtimes) {\n\t\tconst dates = accessNested(state, 'appData.meta.dates', {});\n\t\tconst activeDate = parseDate(dates.live || dates.release || 0);\n\t\tshowtimesStatus = calculateShowtimesStatus(activeDate, state.appData.options.forceLive, state.appData.pages);\n\t\tStore.get().showtimes.set({ status: showtimesStatus }).now();\n\t}\n\n\tlet updateSize = () => Store.emit(actions.SET_CLIENT_SIZE, {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight\n\t});\n\twindow.addEventListener('resize', updateSize, false);\n\twindow.addEventListener('orientationchange', dbounce(updateSize, 350), false);\n\n\tlet isFirstVisit = true;\n\ttry {\n\t\t// See notes below regarding weird format\n\t\t// isFirstVisit = localStorage.getItem('isFirstVisit') !== 'false';\n\t\tisFirstVisit = !localStorage.getItem('isFirstVisit');\n\t} catch(e) {}\n\n\tPromise.resolve(geoFencing()).then(redirected => {\n\t\tif (redirected) {\n\t\t\treturn;\n\t\t}\n\t\tlet checkCookies = isFirstVisit && accessNested(appData, 'options.cookiesModal');\n\t\tif (!checkCookies) {\n\t\t\twindow.preventCookies = typeof window.preventCookies == \"undefined\" ? false : window.preventCookies;\n\t\t\tStore.emit(actions.PAGE_STATE_LOADED);\n\t\t} else {\n\t\t\tStore.emit(actions.SHOW_COOKIES_MODAL, () => Store.emit(actions.PAGE_STATE_LOADED));\n\t\t}\n\t});\n});\n\n// TODO: utils\n// Using innerHTML with script doesn't execute them. This \"fixes\" it\n// Inspired by https://stackoverflow.com/a/20584396/1336843\nfunction execScripts(node) {\n\tif (!node || !node.children) return;\n\tlet children = [].slice.call(node.children);\n\tchildren.forEach(child => {\n\t\tif (child.tagName !== 'SCRIPT') {\n\t\t\t// Not a script? Recurse\n\t\t\treturn execScripts(child);\n\t\t}\n\t\t// Make it executable\n\t\ttry {\n\t\t\tlet copy = document.createElement('script');\n\t\t\tcopy.text = child.innerHTML;\n\t\t\t[].forEach.call(child.attributes, attr => {\n\t\t\t\tcopy.setAttribute(attr.name, attr.value);\n\t\t\t});\n\t\t\t// child.parentElement.replaceChild(copy, child);\n\t\t\t// GTM doesn't like being included in a div (the tag helper extension complains)\n\t\t\t// Move all scripts out, directly in the body\n\t\t\tchild.parentElement.removeChild(child);\n\t\t\tdocument.body.appendChild(copy);\n\t\t} catch(e) {\n\t\t\tconsole.log('error while loading custom script', e);\n\t\t}\n\t});\n}\n\n/**\n * Called when a new page is loaded and preliminary checks are done (e.g. cookie or not).\n */\nStore.on(actions.PAGE_STATE_LOADED, () => {\n\tif (window.STATIC_PIXELS && !window.preventCookies) {\n\t\tlet pixelsElem = document.createElement('div');\n\t\tpixelsElem.innerHTML = window.STATIC_PIXELS;\n\t\tdocument.body.appendChild(pixelsElem);\n\t\texecScripts(pixelsElem);\n\t}\n\n\tconst state = Store.get().toJS();\n\tconst appData = state.appData;\n\n\tconst parsedQS = queryString.parse(location.search.slice(1));\n\tlet preventCookies = window.preventCookies;\n\n\tif (!appData.options.preventTrackingOnLoad) {\n\t\tinitTracker(state.appData, { noCookies: preventCookies });\n\t}\n\tif (!preventCookies) {\n\t\t// check if user visits for the first time\n\t\tlet isFirstVisit = true;\n\t\tlet regionModalDismissed = false;\n\t\ttry {\n\t\t\t// A bit counter-intuitive to store firstVisit = false in the local storage\n\t\t\t// Would make more sense IMO to store visited = true, this also avoids issue with falsy values conversion (false / undefined differentiation)\n\t\t\tisFirstVisit = localStorage.getItem('isFirstVisit') !== 'false';\n\t\t\tif (isFirstVisit) {\n\t\t\t\tlocalStorage.setItem('isFirstVisit', 'false');\n\t\t\t}\n\n\t\t\tregionModalDismissed = !!localStorage.getItem('regionModalDismissed');\n\t\t} catch (err) {\n\t\t\t// No local storage available\n\t\t}\n\t\tconst user = Store.get().user;\n\n\t\tif (user) {\n\t\t\tuser.set({\n\t\t\t\tisFirstVisit: !!isFirstVisit,\n\t\t\t\tregionModalDismissed: regionModalDismissed\n\t\t\t});\n\t\t}\n\t}\n\n\ttrackPageView(state.activePage.id, null, true);\n\n\t// fix landing url error usually caused by missing trailing slash\n\tif (parsedQS.err && parsedQS.err === '404' && parsedQS.path) {\n\t\tconst appBasePath = `/${appData.meta.studio.slug}/${appData.meta.title.slug}/${appData.meta.region.slug}`;\n\t\tconst missedPath = parsedQS.path.replace(appBasePath, '');\n\t\tlet missedPageId;\n\t\tfor (const pageId in appData.pages) {\n\t\t\tconst page = appData.pages[pageId];\n\t\t\tif (missedPath === page.path) {\n\t\t\t\tmissedPageId = pageId;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (missedPageId) {\n\t\t\tlet page = state.appData.pages[missedPageId];\n\t\t\t// TODO: current base instead of hardcoded showtimes\n\t\t\tif (page.base && page.base !== 'showtimes') {\n\t\t\t\tif (!parsedQS.from404) {\n\t\t\t\t\tlocation.href = missedPath.substring(1) + '?from404=1';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\troute(missedPath.substring(1), missedPageId);\n\t\t\t\ttrack({ a: 'found_page_from_404', missedPageId });\n\t\t\t\tstate.activePage = state.appData.pages[missedPageId];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst showtimesStatus = state.showtimes && state.showtimes.status;\n\tconst redirectTo = (showtimesStatus && state.activePage.redirectOnLoadAfterShowtimes) || state.activePage.redirectOnLoad;\n\tif (redirectTo) {\n\t\tif (redirectTo.match(/^(https?:)?\\/\\//)) {\n\t\t\tlocation.href = redirectTo;\n\t\t}\n\t\tlet path = getPath(redirectTo);\n\t\tif (path && path[0] === '/') {\n\t\t\tpath = path.substring(1);\n\t\t\tpath = (getPath(state.activePage).substring(1).match(/\\//g) || []).map(() => ('../')).join('') + path;\n\t\t}\n\t\thistory.pushState({ pageId: redirectTo }, '', path);\n\t}\n\n\t// CHECK PAGE VISIBILITY - ONLY LOAD APIS ONCE VISIBLE\n\tlet loaded = false;\n\tconst beforeLoad = Date.now();\n\tconst loadAPI = () => {\n\t\tif (loaded) return;\n\t\tloaded = true;\n\t\tStore.emit(actions.START_API);\n\t\tconst time = ~~((Date.now() - beforeLoad) / 1000);\n\t\ttrack({ a: 'page_visible', l: time, ni: true });\n\t};\n\tlet hidden;\n\tlet visibilityChange;\n\tif (typeof document.hidden !== 'undefined') {\n\t\thidden = 'hidden';\n\t\tvisibilityChange = 'visibilitychange';\n\t} else if (typeof document.msHidden !== 'undefined') {\n\t\thidden = 'msHidden';\n\t\tvisibilityChange = 'msvisibilitychange';\n\t} else if (typeof document.webkitHidden !== 'undefined') {\n\t\thidden = 'webkitHidden';\n\t\tvisibilityChange = 'webkitvisibilitychange';\n\t}\n\tif (!hidden || !document[hidden]) {\n\t\tloadAPI();\n\t} else {\n\t\t// TODO: COPY !\n\t\tconst inactiveModal = (\n\t\t\t<div>\n\t\t\t\t<div style={{ fontSize: '.8rem', maxWidth: '25rem', margin: '0 auto', padding: '0 1rem', textAlign: 'center', textTransform: 'none' }}>\n\t\t\t\t\tThe content of this page has not been loaded yet because you seem to be inactive\n\t\t\t\t</div>\n\t\t\t\t<div style={{ textAlign: 'center', margin: '.5rem 0 1rem' }}>\n\t\t\t\t\t<button type=\"button\" onClick={() => Store.emit(actions.HIDE_MODAL)}\n\t\t\t\t\t\tstyle={{ background: 'none', border: '1px solid #ccc', borderRadius: '3px', fontSize: '1rem', lineHeight: '2rem', padding: '0 .5rem', cursor: 'pointer' }}>\n\t\t\t\t\t\tI am here\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\n\t\tStore.emit(actions.SHOW_MODAL, inactiveModal, loadAPI, {\n\t\t\ttitle: 'Are you here?',\n\t\t\ttype: 'inactiveModal'\n\t\t});\n\n\t\tdocument.addEventListener(visibilityChange, () => {\n\t\t\tif (loaded || document[hidden]) return;\n\t\t\tconst modal = Store.get().modal;\n\t\t\tif (modal && modal.type === 'inactiveModal') Store.emit(actions.HIDE_MODAL);\n\t\t\tloadAPI();\n\t\t}, false);\n\t}\n});\n\n// Simple helper function to make sure we\n// don't fire a pageview track event multiple times on the same page\nlet lastTrackedPage = '';\nfunction trackPageView(pageId, extraOptions, firstLoad) {\n\tif (pageId === lastTrackedPage) {\n\t\treturn;\n\t}\n\textraOptions = Object.assign({ ni: true }, extraOptions);\n\ttrack({\n\t\t...extraOptions,\n\t\ta: pageId + '-view'\n\t});\n\n\tupdateDataLayerPageView(pageId, firstLoad);\n\n\tif (pageId === 'showtimes') {\n\t\ttrack({ once: true, a: 'start_dimensions', l: document.documentElement.offsetWidth + 'x' + document.documentElement.offsetHeight, ni: 1 });\n\t} else if (pageId === 'videos') {\n\t\tupdateDataLayer({ event: 'trailer-view' });\n\t}\n\n\tlastTrackedPage = pageId;\n\n}\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Modal events\n\n/**\n * Show the modal dialog with a custom content.\n * @param {string|JSX} content - the content of the modal\n * @param {Function=} callback - function called when the modal is closed\n * @param {Object=} extra - extra modal property\n */\nStore.on(actions.SHOW_MODAL, (content, callback, extra) => {\n\tconst state = Store.get();\n\t// if (!state.modal) state = state.set({ modal: {} });\n\t// TODO: Find a way to clear previous content maybe?\n\tstate.set({\n\t\tmodal: {\n\t\t\tactive: true,\n\t\t\tcontent: content,\n\t\t\tcallback: callback,\n\t\t\t...extra\n\t\t}\n\t});\n});\n\n/**\n * Close the modal and notify the caller.\n * @param {Object} result -\n * @param {Object} data -\n */\nStore.on(actions.HIDE_MODAL, (result, data) => {\n\tconst state = Store.get();\n\t// if (!state.modal) state = state.set({modal: {}});\n\tconst cb = state.modal && state.modal.callback;\n\tstate.set({\n\t\tmodal: {\n\t\t\tactive: false,\n\t\t\tresult: result,\n\t\t\tdata: data\n\t\t}\n\t});\n\tif (typeof cb === 'function') {\n\t\tcb(result, data);\n\t}\n});\n\n/**\n * Update the content of the modal.\n * @param {string|JSX} content - the new content\n */\nStore.on(actions.UPDATE_MODAL, (content) => {\n\tconst state = Store.get();\n\tstate.modal.set('content', content);\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Dynamic data\n\nStore.on(actions.UPDATE_DYNAMIC_DATA, (dynamicData) => {\n\t// Update the dynamic data\n\tStore.get().dynamicData.set(dynamicData);\n});\n\n/**\n * Register that the region modal was dismissed by the user.\n */\nStore.on(actions.SET_USER_REGION_MODAL_DISMISSED, () => {\n\tconst user = Store.get().user;\n\t// Update localstorage\n\tlocalStorage.setItem('regionModalDismissed', true);\n\tif (user) {\n\t\t// Update the store\n\t\tuser.set({ regionModalDismissed: true });\n\t}\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Misc events\n\n/**\n * Set the current state of an iOS fix?\n * Bound to the \"blur\" and \"focus events.\n * @param {number} state - a height? in pixels\n */\nStore.on(actions.SET_IOSFIXEDFIX, (state) => {\n\tStore.get().set({ iosFixedFix: state });\n});\n\n\n// =~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=\n// Tracking events\n\n/**\n * Set the current state of an iOS fix?\n * Bound to the \"blur\" and \"focus events.\n * @param {number} state - a height? in pixels\n */\nStore.on(actions.ONETRUST_SHOW, () => oneTrust.displayModal());\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/update.js","import objectAssign from 'object-assign';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport {\n\tprocessScreeningsApi,\n\trawSearchLocation,\n\tgetGeoScreeningsAsync,\n\tgetGeoFromIPAsync,\n\tgetCitiesAsync,\n\tgetTheatersScreeningsAsync } from 'utils/clientUtils';\nimport { track, updateDataLayer } from 'utils/tracking';\nimport { accessNested, asList, parseDate, encodeHtmlRecursively } from 'utils/utils';\nimport formatDateTime from 'utils/formatDateTime';\nimport { displayRegionModalIfNeeded } from 'utils/regionModal';\nimport queryString from 'qs';\nimport { filterTheater } from 'models/Theater';\n// TODO: only when needed ?\nimport 'store/updateTicketing';\nimport City from 'models/City';\nimport Geo from 'models/Geo';\n\n\n/* Basic Setup\n--------------------------------*/\n\n\nStore.on(actions.START_API, () => {\n\tlet state = Store.get();\n\n\tlet apiRoot = accessNested(state, 'appData.apis.stdata.root');\n\n\tif (!accessNested(state, 'appData.options.disableDynamicData')) {\n\t\tfetch(apiRoot+'/app_data/dynamic/'+accessNested(state,'appData.meta.id'), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json'}\n\t\t}).then(res => res.json()).then(o => {\n\t\t\tif(!o) return;\n\t\t\tdelete o.meta;\n\t\t\tStore.emit(actions.UPDATE_DYNAMIC_DATA, o);\n\t\t\t// Store.get().dynamicData.set(o);\n\t\t}).catch(err => console.log('Error getting dynamic app data', err));\n\t}\n\n\tlet opts = accessNested(state, 'appData.options', {});\n\tlet needsRegions = opts.autoBoundingRegions || opts.useRegionSwitcher || opts.useRegionMismatchModal || opts.useAlternateLanguages;\n\t// Should merge that with dynamicData probably\n\tlet appRegionsUrl = apiRoot+'/app_data/title_regions/'+accessNested(state,'appData.meta.title.slug','');\n\tlet regionPromise;\n\tlet demoLinkedRegions = accessNested(state, 'appData.meta.demoLinkedRegions');\n\tif (needsRegions && window.__IS_DEMO__ && demoLinkedRegions) {\n\t\tconst currentRegion = accessNested(state, 'appData.meta.region.slug', '');\n\t\tconst regions       = demoLinkedRegions.split(',').map(r => r.trim().toLowerCase()).filter(r => r)\n\t\t\t.reduce((acc, region) => {\n\t\t\t\t// if (region === currentRegion) return acc;\n\t\t\t\tacc[region] = {\n\t\t\t\t\turl: window.location.href.replace(`/${currentRegion}/`, `/${region}/`)\n\t\t\t\t};\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\tregionPromise = Promise.resolve(regions);\n\t} else {\n\t\tregionPromise = !needsRegions ? Promise.resolve() : fetch(appRegionsUrl, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json'}\n\t\t})\n\t\t.then(res => res.json())\n\t\t.catch(err => console.log('Error getting app regions', err))\n\t\t.then(regions => {\n\t\t\tif (!regions) regions = {};\n\t\t\tdelete regions.meta;\n\t\t\treturn regions;\n\t\t});\n\t}\n\n\tregionPromise = regionPromise.then(regions => {\n\t\tStore.emit(actions.UPDATE_DYNAMIC_DATA, { regions });\n\t});\n\n\t//  No Showtimes Page is found, so will probably not need any of this data\n\t//  If you do then enable features -> noShowtimesPageForceGeo in Thundr\n\tif (!accessNested(state, 'appData.pages.showtimes') && !accessNested(state, 'appData.options.noShowtimesPageForceGeo')) {\n\t\treturn;\n\t}\n\n\tlet useClientGeo = (geo, source) => regionPromise.then(() => Store.emit(actions.SET_CLIENT_GEO, new Geo(geo), source));\n\n\tlet parsedQS = queryString.parse(location.search.slice(1));\n\tparsedQS = encodeHtmlRecursively(parsedQS);\n\t// NOTE: All characters <, > are replaced with HTML entities to prevent XSS\n\t//       this might be too restrictive for us in the future, but for now this is the most\n\t//       secure solutions\n\n\tlet forceStartGeo = accessNested(state.appData, 'pages.showtimes.data.forceStartGeo');\n\tlet localStorageGeo;\n\ttry {\n\t\tlocalStorageGeo = JSON.parse(window.localStorage.getItem(state.appData.meta.id + '_lastHouse'));\n\t} catch(e) {}\n\tif (forceStartGeo) {\n\t\tif (typeof forceStartGeo === 'string') {\n\t\t\trawSearchLocation(forceStartGeo, state.appData.apis.gmaps.key, state.appData.region).then(data => {\n\t\t\t\tuseClientGeo(data, 'forceStart');\n\t\t\t});\n\t\t} else {\n\t\t\tuseClientGeo(forceStartGeo, 'forceStart');\n\t\t}\n\t} else {\n\t\tlet locationResolveChain = Promise.resolve();\n\t\tlet addLocationOption = fn => {\n\t\t\tlocationResolveChain = locationResolveChain.then(value => {\n\t\t\t\tif (value) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\treturn typeof fn === 'function' ? fn() : fn;\n\t\t\t});\n\t\t};\n\t\tif (parsedQS.location) {\n\t\t\tlet loc = parsedQS.location;\n\t\t\tif (parsedQS.lat && parsedQS.lon) {\n\t\t\t\taddLocationOption({\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tlat: parsedQS.lat,\n\t\t\t\t\t\tlon: parsedQS.lon,\n\t\t\t\t\t\tcountryCode: parsedQS.cc || accessNested(state, 'appData.meta.region.slug'),\n\t\t\t\t\t\tcity: loc,\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'queryString'\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\taddLocationOption(() => {\n\t\t\t\t\treturn rawSearchLocation(loc, state.appData.apis.gmaps.key, state.appData.region).then(result => {\n\t\t\t\t\t\treturn { data: result, type: 'queryString' };\n\t\t\t\t\t}).catch(e => {});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (localStorageGeo && typeof localStorageGeo === 'object') {\n\t\t\taddLocationOption({ data: localStorageGeo, type: 'storage' });\n\t\t}\n\t\taddLocationOption(() => {\n\t\t\tlet cancel = false;\n\t\t\tlet cancelGeo = () => (cancel = true);\n\t\t\tStore.once(actions.SET_CLIENT_GEO, cancelGeo);\n\t\t\treturn getGeoFromIPAsync().then(data => {\n\t\t\t\tif (cancel) return;\n\n\t\t\t\tlet countryCode = data.countryCode.toLowerCase();\n\t\t\t\treturn { data: { lat: data.lat, lon: data.lon, countryCode: countryCode, city: data.city }, type: 'geoip' };\n\t\t\t});\n\t\t});\n\n\t\tlocationResolveChain.then(result => {\n\t\t\tif (result) {\n\t\t\t\tuseClientGeo(result.data, result.type);\n\t\t\t}\n\t\t}).catch(err => {\n\t\t\tconsole.log('Error getting geo', err);\n\t\t\tStore.get().showtimes.set({ loading: false, error: 'UNKNOWN' });\n\t\t});\n\t}\n});\n\n\n\n\n/* Theaters\n--------------------------------*/\n\n\nStore.on(actions.SET_THEATERS, (theaters, noRemainingCheck) => {\n\tlet showtimesState = Store.get().showtimes;\n\t// Not sure why we make a copy of the theaters but I'm scared to remove it\n\tlet total = (theaters || []).map(t => objectAssign({}, t));\n\t// Make sure we are using objects and not instances\n\tshowtimesState.set({ theaters: total, firstDataLoaded: true, loading: false });\n\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS, theaters && theaters.map(t => t.id));\n\tif (!showtimesState.firstDataLoaded) Store.emit(actions.FIRST_DATA_LOADED);\n});\n\n\n\nStore.on(actions.ADD_THEATERS, (newTheaters) => {\n\tlet showtimesState = Store.get().showtimes;\n\t// Breaks the thing\n\tif (showtimesState.loading || showtimesState.error) return;\n\tlet theaters = showtimesState.theaters || [];\n\tnewTheaters = newTheaters.filter(nt => !theaters.find(t => t.id === nt.id));\n\n\tif (!newTheaters.length) return;\n\tStore.emit(actions.SET_THEATERS, theaters.concat(newTheaters), true);\n});\n\n\n\nStore.on(actions.SELECT_THEATER, (theaterId) => {\n\tlet state = Store.get();\n\tlet theaters = state.showtimes.theaters;\n\tif (!theaters) return;\n\tlet currentActive = theaters.find(t => t.active);\n\tif (currentActive) currentActive.set({ active: false });\n\tlet newActive = theaterId && theaters.find(t => t.id === theaterId);\n\tif (newActive) {\n\t\tnewActive.set({ active: true });\n\t\ttry {\n\t\t\twindow.localStorage.setItem(state.appData.meta.id + '_lastHouse', newActive.geo.toString());\n\t\t} catch(e) { }\n\t}\n\ttrack({ a: 'list_click', l: theaterId, useCustomPageTrack: true });\n});\n\nStore.on(actions.SET_THEATER_STATE, (theater, state, data) => {\n\t// let theaters = Store.get().showtimes.theaters;\n\t// if(!theaters) return;\n\tif (!theater) return;\n\ttheater.set({ state: state, stateData: data });\n\t// track({a: 'theater_step', l: theaterId});\n});\n\n\n\nStore.on(actions.UPDATE_THEATER_FILTERED_SCREENINGS, (newIds) => {\n\tlet state = Store.get();\n\tlet showtimesState = state.showtimes;\n\n\tlet sortTheatersByDate = accessNested(state, 'appData.options.sortTheatersByDate');\n\t// Copy them to be able to sort them\n\t// let theaters = showtimesState.theaters.map(t => objectAssign({}, t));\n\tlet theaters = showtimesState.theaters.toJS();\n\tlet filters = showtimesState.filters;\n\n\tif (theaters) {\n\t\ttheaters.forEach((t) => {\n\t\t\tobjectAssign(t, filterTheater(t, filters));\n\t\t});\n\t\t// let pinned = asList(accessNested(state, 'activePage.data.pinnedTheaters'));\n\t\t// let isPinned = (t) => pinned.indexOf(t && t.id) !== -1;\n\t\tlet compProp = 'distance', undefinedFirst = false;\n\t\tif (sortTheatersByDate) {\n\t\t\tcompProp = 'firstDate';\n\t\t}\n\t\tif (showtimesState.sortBy) {\n\t\t\tcompProp = showtimesState.sortBy;\n\t\t}\n\t\tlet compare = (a, b, p, undefinedFirst) => {\n\t\t\tlet aPinned = a.pinned, bPinned = b.pinned;\n\t\t\tif (aPinned !== bPinned) return aPinned ? -1 : 1;\n\t\t\tlet va = a[p], vb = b[p];\n\t\t\t// == and not === to also check null\n\t\t\tif (va == vb) {\n\t\t\t\t// Always end up sorting equivalent theaters by distance\n\t\t\t\treturn p !== 'distance' ? compare(a, b, 'distance', false) : 0;\n\t\t\t}\n\t\t\tif (va == undefined) return undefinedFirst ? -1 : 1;\n\t\t\tif (vb == undefined) return undefinedFirst ? 1 : -1;\n\t\t\tlet compareAsString = typeof a === 'string' && typeof b === 'string' && (isNaN(a) || isNaN(b));\n\t\t\treturn compareAsString ? a.localeCompare(b) : va - vb; // ASC (should we make that an option ?)\n\t\t};\n\t\tlet sortFunc = (a,b) =>\n\t\t\t(!!a.filteredScreenings.length !== !!b.filteredScreenings.length)\n\t\t\t? (!!a.filteredScreenings.length ? -1 : 1) // Theaters with unfiltered screenings first\n\t\t\t: compare(a, b, compProp, undefinedFirst); // Then by distance (or date)\n\t\ttheaters.sort(sortFunc);\n\t\tlet currentActive = theaters.find(t => t.active && t.enabled);\n\t\tif (!currentActive) {\n\t\t\tlet first = theaters.find(t=>t.enabled && (!newIds || newIds.indexOf(t.id) !== -1) && t.filterPass && t.activeExhibitor);\n\t\t\tif (first) {\n\t\t\t\t// Store.emit(actions.SELECT_FIRST_THEATER, first);\n\t\t\t\t// track({a: 'list_click', l: first.id, ni: 1});\n\t\t\t\tfirst.active = true;\n\t\t\t\t// Update last house ?\n\t\t\t\t// try {\n\t\t\t\t// \twindow.localStorage.setItem(state.appData.meta.id + '_lastHouse', first.geo.toString());\n\t\t\t\t// } catch(e) { }\n\t\t\t}\n\t\t}\n\t}\n\t// showtimesState.set({theaters});\n\tStore.get().showtimes.set({ theaters }).now();\n\tStore.emit(actions.AFTER_THEATERS_UPDATE);\n});\n\n\n\n/* Map\n--------------------------------*/\n\nStore.on(actions.SET_MAP_OPEN, (open) => {\n\tlet showtimesState = Store.get().showtimes;\n\tshowtimesState.set({ mapOpen: open });\n\tdocument.body.style.overflow = open ? \"hidden\" : \"visible\";\n});\n\n\n\n/* Cities\n--------------------------------*/\n\n\n\nStore.on(actions.SET_CITIES, (cities) => {\n\tStore.get().showtimes.set({ cities, cityShowCount: 10 });\n});\n\n\n\nStore.on(actions.SET_CITY_SHOW_COUNT, (cityShowCount) => {\n\tStore.get().showtimes.set({ cityShowCount });\n});\n\n\n\n/* Filters\n--------------------------------*/\n\n// TODO: WE SHOULD HAVE DIFFERENT SUBOBJECT IN THE STORE FOR EACH PAGE\n// Instead of just a \"showtimes\" prop\n\n// Make sure filters are what they need to be on the current page\nStore.on(actions.CHECK_FILTERS, (noRefresh) => {\n\tlet state = Store.get();\n\tlet filters = state.showtimes.filters;\n\n\tlet hiddenFilters = accessNested(state, 'activePage.data.hiddenFilters', {});\n\n\tfilters.timeOfDay.set({ visible: !hiddenFilters.time });\n\t// Should we reset current ? I guess so\n\tfilters.stDate.set({ visible: !hiddenFilters.date, current: [] });\n\tif (hiddenFilters.format) filters.format.set({ visible: false });\n\tfilters.hour.set({ current: [] });\n\n\n\tlet disabledFilters = accessNested(state, 'activePage.data.disabledFilters');\n\tif (disabledFilters) {\n\t\tlet disabledFormats = asList(disabledFilters.format);\n\t\tif (disabledFormats) {\n\t\t\tlet options = disabledFormats.map(k => ({ slug: k.toLowerCase().replace(/\\s+/g, '') }));\n\t\t\tStore.emit(actions.FILTER_DISABLE, 'format', options, true);\n\t\t}\n\n\t\tlet disabledExhib = disabledFilters.exhibitor;\n\t\tif (disabledExhib) {\n\t\t\tlet options = asList(disabledExhib).map(dom => ({domain: dom}));\n\t\t\tStore.emit(actions.FILTER_EXCLUDE, 'exhibitor', options, true);\n\t\t}\n\n\t\tlet disabledWebediaTheater = disabledFilters.webediaTheater;\n\t\tif (disabledWebediaTheater) {\n\t\t\t// let allTheaters = state.showtimes.theaters || [];\n\t\t\t// let desired = asList(disabledWebediaTheater);\n\t\t\t// let providers = ['wwm', 'webus', 'webuk'];\n\t\t\t// TODO: also check providerId\n\t\t\t// let options = allTheaters.filter(t => desired.indexOf(t.providerTheaterId) !== -1);\n\t\t\t// console.log('?', options, desired, state.showtimes);\n\t\t\tlet options = asList(disabledWebediaTheater).map(id => ({providerTheaterId: id}));\n\t\t\tStore.emit(actions.FILTER_EXCLUDE, 'webedia', options, true);\n\t\t}\n\n\t\tlet disabledTheater = disabledFilters.theater;\n\t\tif (disabledTheater) {\n\t\t\tlet options = asList(disabledTheater).map(id => ({id: id}));\n\t\t\tStore.emit(actions.FILTER_EXCLUDE, 'theater', options, true);\n\t\t}\n\t}\n\n\tlet defaultFilters = accessNested(state, 'activePage.data.defaultFilters');\n\n\tif (defaultFilters) {\n\t\tlet defaultDate = defaultFilters.date;\n\t\tif (defaultDate) {\n\t\t\tlet active = true;\n\t\t\tlet datesList = filters.stDate.options;\n\t\t\tif (typeof defaultDate === 'object') {\n\t\t\t\tif (defaultDate.from) {\n\t\t\t\t\tlet from = parseDate(defaultDate.from);\n\t\t\t\t\tif (from) datesList = datesList.filter(d => d.date >= from);\n\t\t\t\t}\n\t\t\t\tif (defaultDate.to) {\n\t\t\t\t\tlet to = parseDate(defaultDate.to);\n\t\t\t\t\tif (to && to < Date.now()) active = false;\n\t\t\t\t\tif (to) datesList = datesList.filter(d => d.date <= to);\n\t\t\t\t}\n\t\t\t\tif ((defaultDate.from || defaultDate.to) && !datesList.length) {\n\t\t\t\t\tif (defaultDate.from && defaultDate.to) {\n\t\t\t\t\t\tlet date1 = parseDate(defaultDate.from);\n\t\t\t\t\t\tlet date2 = parseDate(defaultDate.to);\n\t\t\t\t\t\tlet from = Math.min(date1, date2);\n\t\t\t\t\t\tlet to = Math.max(date1, date2);\n\t\t\t\t\t\tlet currentDate = new Date(from);\n\t\t\t\t\t\tdatesList = [];\n\t\t\t\t\t\twhile (currentDate <= to) {\n\t\t\t\t\t\t\tdatesList.push({ id: +currentDate });\n\t\t\t\t\t\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet desired = parseDate(defaultDate.from || defaultDate.to);\n\t\t\t\t\t\tif (desired) datesList = [{ id: +desired }];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet desired = parseDate(defaultDate);\n\t\t\t\t// if(desired) datesList = datesList.filter(d => {\n\t\t\t\t// \treturn +d.date === +desired;\n\t\t\t\t// });\n\t\t\t\tif (desired && desired < Date.now()) active = false;\n\t\t\t\tif (desired) datesList = [{ id: +desired }];\n\t\t\t}\n\t\t\tif (active) {\n\t\t\t\tStore.emit(actions.TOGGLE_FILTER, 'stDate', datesList, true);\n\t\t\t\tStore.emit(actions.SET_FILTER_VISIBILITY, 'stDate', !!defaultDate.visible);\n\t\t\t}\n\t\t}\n\n\t\tlet defaultHour = defaultFilters.hour;\n\t\tif (defaultHour) {\n\t\t\tlet options = [];\n\t\t\tif (typeof defaultHour === 'object') {\n\t\t\t\tlet from = +defaultHour.from || 0, to = 24;\n\t\t\t\tif (defaultHour.to && !isNaN(+defaultHour.to)) to = +defaultHour.to;\n\t\t\t\tif (to < from) { let tmp = to; to = from; from = tmp; }\n\t\t\t\tfor (let i = from; i <= to; i++) {\n\t\t\t\t\toptions.push({ id: i });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toptions = [{ id: +defaultHour }];\n\t\t\t}\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'hour', options, true);\n\t\t}\n\t\tlet defaultMinute = defaultFilters.minute;\n\t\tif (defaultMinute) {\n\t\t\tlet options = [];\n\t\t\tif (typeof defaultMinute === 'object') {\n\t\t\t\tlet from = +defaultMinute.from || 0, to = 60;\n\t\t\t\tif (defaultMinute.to && !isNaN(+defaultMinute.to)) to = +defaultMinute.to;\n\t\t\t\tif (to < from) { let tmp = to; to = from; from = tmp; }\n\t\t\t\tfor (let i = from; i <= to; i++) {\n\t\t\t\t\toptions.push({ id: i });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toptions = [{ id: +defaultMinute }];\n\t\t\t}\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'minute', options, true);\n\t\t}\n\n\t\tlet defaultFormat = defaultFilters.format;\n\t\tif (defaultFormat) {\n\t\t\tlet options = asList(defaultFormat).map(format => ({ slug: format.toLowerCase().replace(/\\s/g, '') }));\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'format', options, true);\n\t\t}\n\n\t\tlet defaultExhib = defaultFilters.exhibitor;\n\t\tif (defaultExhib) {\n\t\t\tlet options = asList(defaultExhib).map(dom => ({ domain: dom }));\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'exhibitor', options, true);\n\t\t}\n\n\t\tlet defaultTheater = defaultFilters.theater;\n\t\tif (defaultTheater) {\n\t\t\tlet options = asList(defaultTheater).map(id => ({ id: id }));\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'theater', options, true);\n\t\t}\n\n\t\tif (defaultFilters.pidmod) {\n\t\t\t// Reset the cities filter to\n\t\t\t//NOTE: this should be probably be done somewhere else, but it needs to work with multiple showtimes pages\n\t\t\tstate.showtimes.citiesFilters.set({\n\t\t\t\tpidmod: defaultFilters.pidmod\n\t\t\t});\n\n\t\t\tif (state.client.geo) {\n\t\t\t\t// Only reload cities if geo has actually been set\n\t\t\t\tStore.emit(actions.SCREENINGS_LOADED);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tif (state.showtimes.citiesFilters && state.showtimes.citiesFilters.pidmod && (!defaultFilters || !defaultFilters.pidmod)) {\n\t\t// Remove the pidmod again from the state because we don't have a set\n\t\t// default filter\n\t\tstate.showtimes.citiesFilters.set({\n\t\t\tpidmod: null\n\t\t});\n\n\t\t// Reset cities with the new pidmod\n\t\tStore.emit(actions.SCREENINGS_LOADED);\n\t}\n\n\tif (typeof document !== 'undefined') {\n\t\tlet qs = queryString.parse(document.location.search.slice(1));\n\t\tif (qs.format || qs.reald) {\n\t\t\t// Formats coming fron the Query String\n\t\t\tconst desiredFormat = (qs.format || '').toLowerCase().split(',');\n\t\t\t// Formats that are available through the api\n\t\t\tlet srcOptions = filters.format.options;\n\t\t\tlet options = [];\n\t\t\t// Even when the desired format isn't available,\n\t\t\t// still filter on it\n\t\t\tif (state.appData.options.formatFilterIsStrict) {\n\t\t\t\toptions = srcOptions.filter(f => desiredFormat.indexOf(f.slug) !== -1);\n\t\t\t} else {\n\t\t\t\toptions = srcOptions.filter(f => desiredFormat.find(df => f.slug.replace(/&/g, '').indexOf(df) !== -1));\n\t\t\t}\n\t\t\tif (qs.reald) {\n\t\t\t\tlet newOptions = srcOptions\n\t\t\t\t\t.filter(f => f.slug.indexOf('imax') === -1 && f.slug.match(/(reald\\s*)?\\b3d\\b/i))\n\t\t\t\t\t.map(option => Object.assign({ reald: true }, option));\n\t\t\t\toptions = options.concat(newOptions);\n\t\t\t}\n\t\t\tif (!options.length) {\n\t\t\t\tif (qs.reald) {\n\t\t\t\t\toptions = desiredFormat.map(f => ({ slug: 'reald3d', label: 'RealD 3D', reald: true }));\n\t\t\t\t} else {\n\t\t\t\t\t// The desired format doesn't exist in the existing options\n\t\t\t\t\toptions = desiredFormat.map(f => ({ slug: f, label: f }));\n\t\t\t\t\t// Make the format filter visible,\n\t\t\t\t\t// so people can disable it again\n\t\t\t\t\tStore.emit(actions.SET_FILTER_VISIBILITY, 'format', true);\n\t\t\t\t}\n\t\t\t}\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'format', options, true);\n\t\t}\n\t\tif (qs.exhibitor) {\n\t\t\tlet desiredExhib = qs.exhibitor.toLowerCase().replace(/^https?:\\/\\/(www\\.)?/, '');\n\t\t\t// Store.emit(actions.TOGGLE_FILTER, 'exhibitor', filters.exhibitor.options.filter(e => e.domain.toLowerCase().indexOf(desiredExhib) !== -1), true);\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'exhibitor', [{ domain: desiredExhib }], true);\n\t\t\tStore.emit(actions.SET_FILTER_VISIBILITY, 'exhibitor', true);\n\t\t}\n\t\tif (qs.provider) {\n\t\t\t// let desired = qs.provider.split(',').map(e => ({id: e, name: e}));\n\t\t\tlet desired = qs.provider.split(',');\n\t\t\tlet result = filters.ticketProvider.options.filter(e => desired.indexOf(e.id) !== -1);\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'ticketProvider', result, true);\n\t\t\tStore.emit(actions.SET_FILTER_VISIBILITY, 'ticketProvider', true);\n\t\t}\n\t\tif (qs.date) {\n\t\t\tlet arr = qs.date.split(',');\n\t\t\tlet options = filters.stDate.options.filter(e => {\n\t\t\t\tlet ddmmyyyy = e.ddmmyyyy;\n\t\t\t\tlet std = formatDateTime(e.date, 'yyyy-MM-dd');\n\t\t\t\treturn arr.find(desired => desired === ddmmyyyy || desired === std);\n\t\t\t});\n\t\t\tif (!options.length) {\n\t\t\t\toptions = arr.map(elem => ({ id: +parseDate(elem) }));\n\t\t\t}\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'stDate', options, true);\n\t\t}\n\t\tif (qs.timeofday) {\n\t\t\tlet arr = qs.timeofday.toUpperCase().split(',');\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'timeOfDay', filters.timeOfDay.options.filter(e => arr.indexOf(e.id.slice(1)) !== -1), true);\n\t\t}\n\t\tif (qs.title) {\n\t\t\tlet desired = qs.title.toLowerCase().split(',');\n\t\t\t// let comp = m => desired.indexOf(m.slug) !== -1; // exact match\n\t\t\tlet comp = m => desired.find(d => m.slug.indexOf(d) !== -1); // contains\n\t\t\tlet options = filters.movie.options.filter(comp);\n\t\t\tif (!options.length) {\n\t\t\t\toptions = desired.map(e => ({ slug: e, title: e }));\n\t\t\t}\n\t\t\tStore.emit(actions.TOGGLE_FILTER, 'movie', options, true);\n\t\t}\n\t}\n\n\tif (!noRefresh) Store.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n\nStore.on(actions.RELOAD_FILTERS, (data, keepCurrent) => {\n\tif (!data) {\n\t\t// No data specified, reload the filters based on the existing showtimes data\n\t\tlet store = Store.get();\n\t\tlet theaters = store.showtimes.theaters || [];\n\t\tlet screenings = [];\n\t\tlet exhibitors = {};\n\t\tlet movies = {};\n\t\tlet formats = {};\n\t\ttheaters.forEach(theater => {\n\t\t\tscreenings.push(theater.screenings);\n\t\t\tif (theater.exhibitor) {\n\t\t\t\texhibitors[theater.exhibitor.id] = theater.exhibitor;\n\t\t\t}\n\t\t\ttheater.movies.forEach(movie => {\n\t\t\t\tmovies[movie.id] = movie;\n\t\t\t\tif (movie.format) {\n\t\t\t\t\tformats[movie.format.id] = movie.format;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\texhibitors = Object.values(exhibitors);\n\t\tmovies = Object.values(movies);\n\t\tformats = Object.values(formats);\n\t\tdata = { theaters, screenings, exhibitors, movies, formats };\n\t}\n\n\tlet { theaters, screenings, exhibitors, movies=[], formats=[] } = data;\n\tlet timeOfDayOptions = [];\n\tlet stDateOptions = [];\n\tlet ticketProviders = [];\n\t// let blockedExhibitors = accessNested(state, 'appData.pageData.showtimes.blockedExhibitors', []);\n\tlet state = Store.get();\n\tlet filters = state.showtimes.filters;\n\tlet screeningsMovieIds = [];\n\t// Use the theaters screenings rather than the list of all screenings to not get the ones removed by the provider merging\n\ttheaters.forEach(t => t.screenings.forEach(s => {\n\t\t// Only add it if it is supposed to be displayed\n\t\tif (s.timeOfDay && s.timeOfDay.label && timeOfDayOptions.indexOf(s.timeOfDay) === -1) {\n\t\t\ttimeOfDayOptions.push(s.timeOfDay);\n\t\t}\n\t\tif (s.stDate && stDateOptions.indexOf(s.stDate) === -1) {\n\t\t\tstDateOptions.push(s.stDate);\n\t\t}\n\t\tif (screeningsMovieIds.indexOf(s.movie.id) === -1) {\n\t\t\tscreeningsMovieIds.push(s.movie.id);\n\t\t}\n\t\tlet sTicketProviders = s.urls ? Object.keys(s.urls) : [];\n\t\tsTicketProviders.forEach(tp => ticketProviders.indexOf(tp) === -1 && ticketProviders.push(tp));\n\t}));\n\tmovies = movies.filter(m => screeningsMovieIds.includes(m.id)).sort((a, b) => {\n\t\t// TODO option to have custom order in thundr\n\t\treturn a.title.localeCompare(b.title);\n\t});\n\tconst timeOfDayOrder = ['$MORNING', '$AFTERNOON', '$EVENING', '$LATE'];\n\t// timeOfDayOptions.sort((a, b) => timeOfDayOrder.indexOf(a.id) - timeOfDayOrder.indexOf(b.id));\n\n\t// reverse order to easily put the unknow formats at the end of the list\n\tlet formatOrder = ['imax 3d', '3d imax', 'imax 70mm', 'imax 2d', '2d imax', 'imax', 'dolby cinema', 'dolby', '3d', '70mm', '35mm', '2d'].reverse();\n\tlet disabledFormats = asList(accessNested(state, 'activePage.data.disabledFilters.format', {})).map(e => e.toLowerCase().replace(/\\s+/g, ''));\n\tformats = formats.filter(f => f && disabledFormats.indexOf(f.slug) === -1).sort((a, b) => {\n\t\tlet nameA = a.name.toLowerCase();\n\t\tlet nameB = b.name.toLowerCase();\n\t\tlet detectedOrder = formatOrder.indexOf(nameB) - formatOrder.indexOf(nameA);\n\t\treturn detectedOrder || nameA.localeCompare(nameB);\n\t});\n\n\tfilters.timeOfDay.set({\n\t\toptions: timeOfDayOptions.sort((a, b) => timeOfDayOrder.indexOf(a.id) - timeOfDayOrder.indexOf(b.id))\n\t});\n\tfilters.stDate.set({\n\t\toptions: stDateOptions.sort((a, b) => a.date - b.date)\n\t});\n\tfilters.exhibitor.set({\n\t\toptions: exhibitors.filter(exhib => exhib.domain)\n\t});\n\tfilters.movie.set({\n\t\toptions: movies,\n\t\tvisible: state.appData.options.useTitleFilter && movies.length > 1\n\t});\n\tfilters.format.set({\n\t\toptions: formats,\n\t\tvisible: state.appData.options.useFormatFilter && formats.length > 1\n\t});\n\tlet providerNames = { // TODO copy or something ?\n\t\tfandango: 'Fandango',\n\t\tatom: 'Atom',\n\t\tmovietickets: 'Movie Tickets',\n\t\tcinema: 'Direct to cinema',\n\t};\n\tfilters.ticketProvider.set({\n\t\toptions: ticketProviders.map(tp => ({ id: tp, name: providerNames[tp] || tp }))\n\t});\n\tif (!keepCurrent) {\n\t\tfilters = Store.get().showtimes.filters;\n\t\t['timeOfDay', 'stDate', 'exhibitor', 'movie', 'format', 'ticketProvider'].forEach(filter => filters[filter].set({\n\t\t\tcurrent: [],\n\t\t\tdisabled: []\n\t\t}));\n\t}\n\t// var excludedList = [];\n\t// blockedExhibitors.forEach(ex => {\n\t// \tif(!ex) return;\n\t// \tex = ex.toLowerCase();\n\t// \tvar match = exhibitors.find(e => e.domain.toLowerCase() === ex);\n\t// \tif(match && excludedList.indexOf(match) === -1)\n\t// \t\texcludedList.push(match);\n\t// });\n\t// Store.emit(actions.FILTER_EXCLUDE, 'exhibitor', excludedList, true);\n\n\tStore.emit(actions.CHECK_FILTERS);\n\t// Store.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\nStore.on(actions.TOGGLE_FILTER, (id, options, preventReload) => {\n\tlet storeFilter = Store.get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ current: options });\n\tif (!preventReload) {\n\t\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\nStore.on(actions.FILTER_EXCLUDE, (id, options, preventReload) => {\n\tlet storeFilter = Store.get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ excluded: options });\n\tif (!preventReload) {\n\t\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\nStore.on(actions.FILTER_DISABLE, (id, options, preventReload) => {\n\tlet storeFilter = Store.get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tif (!options) options = [];\n\tif (!Array.isArray(options)) options = [options];\n\tstoreFilter.set({ disabled: options });\n\tif (!preventReload) {\n\t\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n\t}\n});\n\nStore.on(actions.SET_FILTER_VISIBILITY, (id, visible) => {\n\tlet storeFilter = Store.get().showtimes.filters[id];\n\tif (!storeFilter) return;\n\tstoreFilter.set({ visible: !!visible });\n\t// if(!preventReload)\n\t// \tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n\nStore.on(actions.SELECT_ST_DATE, (stDate) => {\n\tStore.get().showtimes.set({ selectedDate: stDate });\n\ttrack({ a: 'date_click', l: stDate.ddmmyyyy, useCustomPageTrack: true });\n});\n\n\nStore.on(actions.SELECT_PROVIDER, (provider) => {\n\tStore.get().showtimes.set({provider});\n});\n\n\nStore.on(actions.RESET_FILTER, (id) => {\n\tStore.get().showtimes.filters[id].set({current: []});\n\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n\nStore.on(actions.RESET_FILTERS, () => {\n\tlet showtimesState = Store.get().showtimes;\n\tObject.keys(showtimesState.filters).forEach(key => showtimesState.filters[key].set({current: []}));\n\tStore.emit(actions.UPDATE_THEATER_FILTERED_SCREENINGS);\n});\n\n\n/* Screenings\n--------------------------------*/\n\nlet thMasters = {};\nStore.on(actions.SET_CLIENT_GEO, (geo, source, keepCurrentFilters) => {\n\t// Save the client geo\n\tif (geo && window.dataLayer && typeof dataLayer.push === 'function') {\n\t\tupdateDataLayer({ city: geo.city, event: 'city_changed' });\n\t}\n\n\tlet state = Store.get();\n\tstate.client.set({ geo, geoSource: source }).now();\n\n\n\tdisplayRegionModalIfNeeded();\n\t// let toCapital = () => {\n\t// \tif(source !== 'geoip') return false;\n\t// \tlet capital = accessNested(state, 'appData.meta.region.capital');\n\t// \tif(!capital || !capital.lat || !capital.lon || !capital.name) return false;\n\t// \tStore.emit(actions.SET_CLIENT_GEO, new Geo({lat: capital.lat, lon: capital.lon, city: capital.name, countryCode: state.appData.meta.region.slug}));\n\t// \treturn true;\n\t// };\n\tStore.emit(actions.GET_SCREENINGS, geo, keepCurrentFilters);\n});\n\nStore.on(actions.GET_SCREENINGS, (geo, keepCurrentFilters) => {\n\tif (!geo) {\n\t\tgeo = accessNested(Store.get(), 'client.geo');\n\t}\n\tif (!geo) return;\n\n\tlet state = Store.get();\n\tlet isFirstBatch = !state.showtimes.theaters || !state.showtimes.theaters.length;\n\n\tlet version = Date.now();\n\tlet loadingPage = accessNested(state, 'activePage.id') || 'showtimes';\n\tlet activePage = accessNested(state, ['appData', 'pages', loadingPage]);\n\tstate.showtimes.set({ loading: true, error: null, cities: [], theaters: [], version, loadingPage }).now();\n\tthMasters = {};\n\treturn getGeoScreeningsAsync(geo, Store.get()).then(data => {\n\t\tlet store = Store.get();\n\t\tif (store.showtimes.version !== version) throw 'version';\n\t\tif (data.errors && data.errors.length) {\n\t\t\tthrow new Error('screenings:' + data.errors[0].detail);\n\t\t}\n\t\tif (!data.data) {\n\t\t\t// throw new Error('NO_DATA');\n\t\t\tdata.data = [];\n\t\t}\n\n\t\treturn processScreeningsApi(data, geo, store.appData, activePage, thMasters, isFirstBatch);\n\t}).then(all => {\n\t\tlet state = Store.get();\n\t\tif (state.showtimes.version !== version) throw 'version';\n\t\tlet pinned = asList(accessNested(state, 'activePage.data.pinnedTheaters')).filter(id => !all.theaters.find(t => t.id === id));\n\t\tif (pinned.length) {\n\t\t\t// Store.emit(actions.EXTRA_THEATERS, pinned);\n\t\t\treturn getTheatersScreeningsAsync(state, pinned).then(data => {\n\t\t\t\tif (data.errors && data.errors.length || !data.data) return all;\n\t\t\t\tlet processedPinned = processScreeningsApi(data, geo, Store.get().appData, activePage, thMasters, isFirstBatch);\n\t\t\t\tlet allKeys = Object.keys(all);\n\t\t\t\tallKeys.forEach(k => {\n\t\t\t\t\tif(Array.isArray(all[k]) && processedPinned[k]) {\n\t\t\t\t\t\tall[k] = all[k].concat(processedPinned[k]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tObject.keys(processedPinned).filter(k => allKeys.indexOf(k) === -1).forEach(k => all[k] = processedPinned[k]);\n\t\t\t\treturn all;\n\t\t\t});\n\t\t}\n\t\treturn all;\n\t}).then(({ formats, movies, screenings, exhibitors, theaters }) => {\n\t\tlet state = Store.get();\n\t\tif (state.showtimes.version !== version) throw 'version';\n\t\t// if(!theaters.length && toCapital()) return;\n\t\texhibitors = (exhibitors || []).filter(e => theaters.find(t => t.exhibitor === e));\n\t\tStore.emit(actions.RELOAD_FILTERS, { theaters, screenings, exhibitors, movies, formats }, keepCurrentFilters);\n\t\tStore.emit(actions.SET_THEATERS, theaters);\n\t\tStore.emit(actions.SCREENINGS_LOADED, geo);\n\t}).catch(err => {\n\t\tif (err === 'version') return;\n\t\tconsole.log('GET_SCREENINGS error', err);\n\t\t// if (toCapital()) return;\n\t\tStore.emit(actions.RESET_FILTERS);\n\t\tStore.emit(actions.SET_THEATERS, []);\n\t\tlet store = Store.get();\n\t\tif (store.client.geo !== geo) {\n\t\t\treturn;\n\t\t}\n\t\tlet errCode = 'UNKNOWN';\n\t\tswitch (err) {\n\t\t\tcase 'BOUNDING_REGION':\n\t\t\t\terrCode = 'BOUNDING_REGION';\n\t\t\t\tif (store.client.geo) {\n\t\t\t\t\t// Find cities in the current country\n\t\t\t\t\tStore.emit(actions.SCREENINGS_LOADED, geo, accessNested(store, 'appData.meta.region.slug'));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// console.log(\"showtimes_request_error\", err);\n\t\t\t\ttrack({ a: 'showtimes_request_error', l: err.message, ni: 1 });\n\t\t}\n\t\t// Store.emit(actions.SET_THEATERS, []);\n\t\tStore.get().showtimes.set({ loading: false, error: errCode });\n\t});\n});\n\nStore.on(actions.SCREENINGS_LOADED, (geo, overrideCountry) => {\n\tlet state = Store.get();\n\tlet citiesProps = { ...state };\n\tif (overrideCountry) {\n\t\tcitiesProps.overrideCountry = overrideCountry;\n\t\t// Nah let's not do that, makes client.geo wrong\n\t\t// geo.countryCode = overrideCountry;\n\t}\n\n\tif (!geo) {\n\t\t// If no geo is set, grab the current one from the store\n\t\tgeo = state.client.geo;\n\t}\n\n\tgetCitiesAsync(citiesProps)\n\t\t.then((data) => {\n\t\t\tif (data.errors && data.errors.length) {\n\t\t\t\tthrow new Error(data.errors[0].detail);\n\t\t\t}\n\t\t\tif (!data.data) {\n\t\t\t\t// throw new Error(NO_DATA);\n\t\t\t}\n\t\t\treturn data;\n\t\t})\n\t\t.catch((err) => {\n\t\t\ttrack({ a: 'cities_request_error', l: err.message, ni: 1 });\n\t\t\tconsole.log(\"cities_request_error\", err);\n\t\t})\n\t\t.then((res) => {\n\t\t\tif (!res) return; //if no response then escape\n\t\t\tlet data = res.data || [];\n\n\t\t\t// let cities = data.data.map((c)=>(new City(c.attributes, geo, state.appData.copy)));\n\t\t\tlet cities = [];\n\t\t\tlet citiesCache = {};\n\t\t\tlet copy = accessNested(state, 'appData.copy') || {};\n\t\t\tlet useEnglishCopy = accessNested(state, 'appData.options.useEnglishCopy');\n\t\t\tdata.forEach(c => {\n\t\t\t\t// let newCity = new City(c.attributes, geo, copy, useEnglishCopy);\n\t\t\t\t// // let existingCity = cities.find((exCity)=>(exCity.name === newCity.name && exCity.geo.distanceFrom(newCity.geo, copy.$DISTANCE_UNIT) < 100));\n\t\t\t\t// let existingCity = cities.find((exCity)=>(exCity.name === newCity.name && exCity.geo.quickDistIndicator(newCity.geo) <= 2));\n\t\t\t\t// // <= 2 gives indicates the distance is approx. <= 83 mi (130 km)\n\t\t\t\t// if(existingCity) {\n\t\t\t\t// \t// newCity.merge(c.attributes, geo, copy)\n\t\t\t\t// } else {\n\t\t\t\t// \tcities.push(newCity);\n\t\t\t\t// }\n\n\t\t\t\t// For the US (2000 cities) we are iterating 4 million times (complexity close to O(n²), because for every city we are using find on the others).\n\t\t\t\t// Even if we don't check the distance for all of them, it takes some time to go through\n\t\t\t\t// Using a cache makes it (basically) O(n).\n\t\t\t\t// 2000 cities = 4892.872ms (using find) -> 16.420ms (using cache)\n\t\t\t\t// Results are the same, it just uses more memory while working (but that should be garbage collected afterwards)\n\t\t\t\tif (!c.attributes.country && overrideCountry) {\n\t\t\t\t\tc.attributes.country = overrideCountry;\n\t\t\t\t}\n\t\t\t\tlet newCity = new City(c.attributes, geo, copy, useEnglishCopy);\n\t\t\t\tlet append = true, key = newCity.name;\n\t\t\t\tif (citiesCache.hasOwnProperty(key)) {\n\t\t\t\t\tlet cachedCities = citiesCache[key];\n\t\t\t\t\tfor (let i = 0, l = cachedCities.length; i < l; i++) {\n\t\t\t\t\t\tlet cachedCity = cachedCities[i];\n\t\t\t\t\t\tif (cachedCity.geo.distanceFrom(newCity.geo) < 100) {\n\t\t\t\t\t\t\t// < 100 km\n\t\t\t\t\t\t\t// cachedCity.merge(c.attributes, geo);\n\t\t\t\t\t\t\tappend = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcitiesCache[key] = [];\n\t\t\t\t}\n\t\t\t\tif (append) {\n\t\t\t\t\tcities.push(newCity);\n\t\t\t\t\tcitiesCache[key].push(newCity);\n\t\t\t\t}\n\t\t\t});\n\t\t\tcitiesCache = null; // make sure to garbage-collect this \"big\" object (~same size as data and cities)\n\t\t\tStore.emit(actions.SET_CITIES, cities);\n\t\t});\n});\n\n// SET CONTAINING TO TRUE IF ids ARE SCREENINGS IDS AND YOU WANT THE THEATERS CONTAINING THEM\n// Issue : we might request things multiple times since previous results aren't always loaded when we check again\nStore.on(actions.EXTRA_THEATERS, (ids, containing) => {\n\tlet store = Store.get();\n\tlet showtimesState = store.showtimes;\n\t// Find theaters containing the screenings with the specified id\n\tif (containing) {\n\t\tids = ids.filter(id => id && !showtimesState.theaters.find(t => t.screenings.find(sc => sc.id === id)));\n\t} else { // Or theaters themselves with the specified id\n\t\tids = ids.filter(id => id && !showtimesState.theaters.find(t => t.id === id));\n\t}\n\tif (!ids.length) {\n\t\treturn;\n\t}\n\n\t// var loadingScreenings =\n\t// showtimesState.set({loading});\n\n\tgetTheatersScreeningsAsync(store, ids, containing)\n\t\t// .then(processScreeningsApi)\n\t\t.then(data => {\n\t\t\tif (data.errors && data.errors.length) {\n\t\t\t\tthrow new Error(data.errors[0].detail);\n\t\t\t}\n\t\t\tif (!data.data) {\n\t\t\t\t// throw new Error(NO_DATA);\n\t\t\t}\n\t\t\treturn processScreeningsApi(data, store.client.geo, store.appData, store.activePage, thMasters);\n\t\t})\n\t\t.then(({ formats, movies, screenings, exhibitors, theaters })=>{\n\t\t\t// Add a property to make sure we don't use it on the main page\n\t\t\t// Store.emit(actions.ADD_THEATERS, theaters.map(t => {t.extra = true; return t;}));\n\t\t\tStore.emit(actions.ADD_THEATERS, theaters);\n\t\t})\n\t\t.catch(err => {\n\t\t\ttrack({a: 'showtimes_request_error', l: err.message, ni: 1});\n\t\t\tconsole.log(\"showtimes_request_error\", err);\n\t\t});\n});\n\nStore.on(actions.SELECT_SCREENING, ({ screening, theater }) => {\n\t// // Find the right theater\n\t// let theater = Store.get().showtimes.theaters.find((theater) => theater.id === theaterId);\n\t// set the screening for it\n\ttheater.set({ activeScreening: screening });\n});\n\n\nStore.on(actions.SHOW_SCREENING_AUTH, ({ screening, theater }) => {\n\t// TODO: Maybe we should use activeScreening and check the authToken in the render\n\tconst store = Store.get();\n\tif (screening) {\n\t\tif (store.user.authToken) {\n\t\t\tStore.emit(actions.SELECT_SCREENING, { theater, screening });\n\t\t\tStore.emit(actions.OPEN_TICKETING, { theater, screening });\n\t\t\treturn;\n\t\t} else {\n\t\t\tstore.showtimes.theaters.forEach(t => {\n\t\t\t\tif (t !== theater && t.authScreening) {\n\t\t\t\t\tt.set({ authScreening: null });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\ttheater.set({ authScreening: screening });\n});\n\n\nStore.on(actions.AUTH_RESPONSE, data => {\n\tconst token = data && data.token;\n\tStore.get().user.set({ authToken: data && data.token });\n\tif (token) {\n\t\tlet theater = Store.get().showtimes.theaters.find((theater) => theater.active && theater.authScreening);\n\t\tif (theater) {\n\t\t\tconst screening = theater.authScreening;\n\t\t\ttheater = theater.set({ authScreening: null, activeScreening: screening });\n\t\t\tStore.emit(actions.OPEN_TICKETING, { theater: theater, screening: screening });\n\t\t}\n\t}\n});\n\n\nStore.on(actions.AUTH_CLEAR, () => {\n\tStore.get().user.remove('authToken');\n});\n\n\n\n/* EXTRA INTEGRATIONS\n--------------------------------*/\n\nStore.on(actions.PAGE_STATE_LOADED, () => {\n\tlet appData = Store.get().appData.toJS();\n\tlet mailchimp = accessNested(appData, 'apis.mailchimp');\n\tif (mailchimp && mailchimp.baseUrl && mailchimp.uuid && mailchimp.lid) {\n\t\tlet finalObject = {\n\t\t\tbaseUrl: mailchimp.baseUrl,\n\t\t\tuuid: mailchimp.uuid,\n\t\t\tlid: mailchimp.lid\n\t\t};\n\t\tlet script = document.createElement('script');\n\t\tscript.onload = () => {\n\t\t\ttry {\n\t\t\t\twindow.require([\"mojo/signup-forms/Loader\"], L => L.start(finalObject));\n\t\t\t} catch(e) {\n\t\t\t\tconsole.log('MAILCHIMP ERROR', e);\n\t\t\t}\n\t\t};\n\t\tscript.setAttribute('data-dojo-config', 'usePlainJson: true, isDebug: false');\n\t\tscript.src = '//downloads.mailchimp.com/js/signup-forms/popup/embed.js';\n\t\tdocument.body.appendChild(script);\n\t}\n});\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/updateShowtimes.js","if (typeof window !== 'undefined') {\n\t((history) => {\n\t\tlet pushState = history.pushState;\n\t\t// Do not change that to arrow function ! (we use `arguments`)\n\t\thistory.pushState = function(state) {\n\t\t\tlet returnValue = pushState.apply(history, arguments);\n\t\t\tif (typeof history.onpushstate == 'function') {\n\t\t\t\thistory.onpushstate({ state: state });\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t};\n\n\t\tlet replaceState = history.replaceState;\n\t\thistory.replaceState = function(state) {\n\t\t\tlet returnValue = replaceState.apply(history, arguments);\n\t\t\tif (typeof history.onreplacestate == 'function') {\n\t\t\t\thistory.onreplacestate({ state: state });\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t};\n\t})(window.history);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/historyPushEvent.js","// Here there used to be some polyfill for things like:\n// String.prototype.startsWith\n// Object.prototype.assign\n// But these are already included in babel-polyfill\n// No need to include it twice\n\n// Fix console.debug on IE10\n/* eslint-disable no-console */\nif (console && typeof console.debug !== 'function') {\n\tconsole.debug = console.info;\n}\n/* eslint-enable no-console */\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/polyfill.js","(function (root) {\n\n  // Store setTimeout reference so promise-polyfill will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var setTimeoutFunc = setTimeout;\n\n  function noop() {}\n  \n  // Polyfill for Function.prototype.bind\n  function bind(fn, thisArg) {\n    return function () {\n      fn.apply(thisArg, arguments);\n    };\n  }\n\n  function Promise(fn) {\n    if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');\n    if (typeof fn !== 'function') throw new TypeError('not a function');\n    this._state = 0;\n    this._handled = false;\n    this._value = undefined;\n    this._deferreds = [];\n\n    doResolve(fn, this);\n  }\n\n  function handle(self, deferred) {\n    while (self._state === 3) {\n      self = self._value;\n    }\n    if (self._state === 0) {\n      self._deferreds.push(deferred);\n      return;\n    }\n    self._handled = true;\n    Promise._immediateFn(function () {\n      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n      if (cb === null) {\n        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n        return;\n      }\n      var ret;\n      try {\n        ret = cb(self._value);\n      } catch (e) {\n        reject(deferred.promise, e);\n        return;\n      }\n      resolve(deferred.promise, ret);\n    });\n  }\n\n  function resolve(self, newValue) {\n    try {\n      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n        var then = newValue.then;\n        if (newValue instanceof Promise) {\n          self._state = 3;\n          self._value = newValue;\n          finale(self);\n          return;\n        } else if (typeof then === 'function') {\n          doResolve(bind(then, newValue), self);\n          return;\n        }\n      }\n      self._state = 1;\n      self._value = newValue;\n      finale(self);\n    } catch (e) {\n      reject(self, e);\n    }\n  }\n\n  function reject(self, newValue) {\n    self._state = 2;\n    self._value = newValue;\n    finale(self);\n  }\n\n  function finale(self) {\n    if (self._state === 2 && self._deferreds.length === 0) {\n      Promise._immediateFn(function() {\n        if (!self._handled) {\n          Promise._unhandledRejectionFn(self._value);\n        }\n      });\n    }\n\n    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n      handle(self, self._deferreds[i]);\n    }\n    self._deferreds = null;\n  }\n\n  function Handler(onFulfilled, onRejected, promise) {\n    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n    this.promise = promise;\n  }\n\n  /**\n   * Take a potentially misbehaving resolver function and make sure\n   * onFulfilled and onRejected are only called once.\n   *\n   * Makes no guarantees about asynchrony.\n   */\n  function doResolve(fn, self) {\n    var done = false;\n    try {\n      fn(function (value) {\n        if (done) return;\n        done = true;\n        resolve(self, value);\n      }, function (reason) {\n        if (done) return;\n        done = true;\n        reject(self, reason);\n      });\n    } catch (ex) {\n      if (done) return;\n      done = true;\n      reject(self, ex);\n    }\n  }\n\n  Promise.prototype['catch'] = function (onRejected) {\n    return this.then(null, onRejected);\n  };\n\n  Promise.prototype.then = function (onFulfilled, onRejected) {\n    var prom = new (this.constructor)(noop);\n\n    handle(this, new Handler(onFulfilled, onRejected, prom));\n    return prom;\n  };\n\n  Promise.all = function (arr) {\n    return new Promise(function (resolve, reject) {\n      if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');\n      var args = Array.prototype.slice.call(arr);\n      if (args.length === 0) return resolve([]);\n      var remaining = args.length;\n\n      function res(i, val) {\n        try {\n          if (val && (typeof val === 'object' || typeof val === 'function')) {\n            var then = val.then;\n            if (typeof then === 'function') {\n              then.call(val, function (val) {\n                res(i, val);\n              }, reject);\n              return;\n            }\n          }\n          args[i] = val;\n          if (--remaining === 0) {\n            resolve(args);\n          }\n        } catch (ex) {\n          reject(ex);\n        }\n      }\n\n      for (var i = 0; i < args.length; i++) {\n        res(i, args[i]);\n      }\n    });\n  };\n\n  Promise.resolve = function (value) {\n    if (value && typeof value === 'object' && value.constructor === Promise) {\n      return value;\n    }\n\n    return new Promise(function (resolve) {\n      resolve(value);\n    });\n  };\n\n  Promise.reject = function (value) {\n    return new Promise(function (resolve, reject) {\n      reject(value);\n    });\n  };\n\n  Promise.race = function (values) {\n    return new Promise(function (resolve, reject) {\n      for (var i = 0, len = values.length; i < len; i++) {\n        values[i].then(resolve, reject);\n      }\n    });\n  };\n\n  // Use polyfill for setImmediate for performance gains\n  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||\n    function (fn) {\n      setTimeoutFunc(fn, 0);\n    };\n\n  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n    if (typeof console !== 'undefined' && console) {\n      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n    }\n  };\n\n  /**\n   * Set the immediate function to execute callbacks\n   * @param fn {function} Function to execute\n   * @deprecated\n   */\n  Promise._setImmediateFn = function _setImmediateFn(fn) {\n    Promise._immediateFn = fn;\n  };\n\n  /**\n   * Change the function to execute on unhandled rejection\n   * @param {function} fn Function to execute on unhandled rejection\n   * @deprecated\n   */\n  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n    Promise._unhandledRejectionFn = fn;\n  };\n  \n  if (typeof module !== 'undefined' && module.exports) {\n    module.exports = Promise;\n  } else if (!root.Promise) {\n    root.Promise = Promise;\n  }\n\n})(this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/promise-polyfill/promise.js\n// module id = 35\n// module chunks = 0","import { h, render } from 'preact';\nimport { buildClientStoreData } from 'utils/clientUtils';\nimport 'store/update';\n// TODO: we should not be using the whole showtimes store for this\nimport 'store/updateShowtimes';\nimport 'utils/historyPushEvent'; // Add events for when you do history.push\n\nimport EmbedDoc from './embedDoc.js';\nimport EmbedApp from './embedApp.js';\n\nimport Promise from 'promise-polyfill';\nimport 'utils/polyfill';\n\n// Add promises to window if it doesn't exist (polyfill)\nif (typeof window !== 'undefined' && !window.Promise) {\n\twindow.Promise = Promise;\n}\n\n\n// Client render\nif (typeof document !== 'undefined') {\n\n\t/* Setting up the store\n\t-----------------------------*/\n\n\tlet initialState = window.__INITIAL_STATE__;\n\tlet initialStore = buildClientStoreData(initialState);\n\n\t// Initialize error tracking\n\tif(typeof Raven !== 'undefined') Raven.config('https://050f2a45780848589e3ed4668bbf62dc@sentry.io/182205').install();\n\n\tif(window.__START_PAGE_ID__){\n\t\t// console.log('custom start page id', window.__START_PAGE_ID__);\n\n\t\tinitialState.activePage = initialState.appData.pages[window.__START_PAGE_ID__];\n\t\t// Also update the background state of the new page\n\t\tinitialState.background = {\n\t\t\tvideoPlaying: initialState.activePage.data ? initialState.activePage.data.allowBgVideo : true,\n\t\t\tvideoEnabled: initialState.activePage.data ? initialState.activePage.data.allowBgVideo : true\n\t\t};\n\t}\n\n\t/* Initial render of the app\n\t----------------------------------*/\n\trender((<EmbedApp initialStore={initialStore} />), document.body, document.getElementById(\"app\"));\n}\n\nmodule.exports = {\n\tApp: EmbedApp,\n\tDoc: EmbedDoc\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/base/embed/embed.js","import { h, Component } from 'preact';\nimport * as transitionStates from './transitionStates';\nimport isShallowEqual from 'shallow-equals';\nimport s from 'components/core/transition/transition.sss';\nimport { condClass } from 'utils/utils';\n\nconst isServer = typeof window === 'undefined';\n\n\n/**\n* Transition between children changing\n* All the children involved should have an id set as a property!\n* @prop {string} class - The class on the transitionWrapper\n* @prop {Number} duration[!] - The duration for the whole transitionWrapper\n* @prop {string} enteringClass - Extra class added when child is entering\n* @prop {string} leavingClass - Extra class added when child is leaving\n* @prop {string} visibleClass - Extra class added when child is visible\n* @prop {string} emptyClass - Extra class added once child has left\n*/\nexport default class Transition extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tlet childGenerator = this.getChildGenerator(props);\n\t\tlet children = childGenerator();\n\n\t\tlet initialState = {\n\t\t\tfirstChild: childGenerator,\n\t\t\tfirstChildState: transitionStates.STATE_CHILD_ENTERING,\n\t\t\tsecondChild: null,\n\t\t\tsecondChildState: transitionStates.STATE_CHILD_EMPTY,\n\t\t\tupcomingChild: childGenerator\n\t\t};\n\n\t\tlet disableInit = this.props.noInitialTransition;\n\t\tif (disableInit) {\n\t\t\tinitialState.firstChildState = transitionStates.STATE_CHILD_VISIBLE;\n\t\t}\n\t\tthis.state = initialState;\n\n\t\tif (!disableInit) {\n\t\t\tthis.setTimer(() => {\n\t\t\t\tthis.setState({\n\t\t\t\t\tfirstChildState: this.getNextStep('firstChild', this.state.firstChildState)\n\t\t\t\t});\n\t\t\t}, props.duration / 2);\n\t\t}\n\t}\n\n\tcomponentWillReceiveProps({ waitBeforeNext, ...props }) {\n\t\tlet childGenerator = this.getChildGenerator(props);\n\t\tlet child = childGenerator();\n\n\t\tconst newChildId = this.getId(child);\n\t\tconst oldChildId = this.getId(this.state.upcomingChild());\n\n\t\tif (newChildId !== oldChildId) {\n\t\t\tthis.setState({ upcomingChild: childGenerator });\n\t\t\tif (!waitBeforeNext\n\t\t\t\t|| this.state.firstChildState === transitionStates.STATE_CHILD_VISIBLE\n\t\t\t\t|| this.state.secondChildState === transitionStates.STATE_CHILD_VISIBLE) {\n\t\t\t\tthis.goToNextPage();\n\t\t\t} else {\n\t\t\t\tthis.afterTimer = this.goToNextPage;\n\t\t\t}\n\t\t} else {\n\t\t\t// Update the current child so it gets it new props\n\t\t\tif (this.state.firstChild && this.getId(this.state.firstChild()) === newChildId) {\n\t\t\t\tthis.setState({ firstChild: childGenerator });\n\t\t\t}\n\t\t\tif (this.state.secondChild && this.getId(this.state.secondChild()) === newChildId) {\n\t\t\t\tthis.setState({ secondChild: childGenerator });\n\t\t\t}\n\n\t\t}\n\t}\n\n\tgetChildGenerator(props) {\n\t\treturn typeof props.renderChildren === 'function' ? props.renderChildren : () => props.children[0];\n\t}\n\n\tgetId(vNode) {\n\t\treturn vNode && vNode.attributes && vNode.attributes.id;\n\t}\n\n\tgetStyles = () => {\n\t\treturn {\n\t\t\t'transition-duration': (this.props.duration / 2) + 'ms',\n\t\t\t'animation-duration': (this.props.duration / 2) + 'ms'\n\t\t};\n\t}\n\n\tgoToNextPage() {\n\t\tthis.endTimer();\n\n\t\tconst {\n\t\t\tfirstChild,\n\t\t\tsecondChild,\n\t\t\tupcomingChild,\n\t\t\tfirstChildState,\n\t\t\tsecondChildState\n\t\t} = this.state;\n\n\t\t// Ugly quickfix to prevent same -> same transition\n\t\tconst firstChildVisible  = firstChildState === transitionStates.STATE_CHILD_VISIBLE;\n\t\tconst secondChildVisible = secondChildState === transitionStates.STATE_CHILD_VISIBLE;\n\n\n\t\tif (firstChildVisible && this.getId(upcomingChild()) === this.getId(firstChild()) ||\n\t\t\tsecondChildVisible && this.getId(upcomingChild()) === this.getId(secondChild())) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\tfirstChildState: this.getNextStep('firstChild', firstChildState),\n\t\t\tsecondChildState: this.getNextStep('secondChild', secondChildState)\n\t\t});\n\n\t\tthis.setTimer(() => {\n\t\t\tthis.setState({\n\t\t\t\tfirstChildState: this.getNextStep('firstChild', this.state.firstChildState),\n\t\t\t\tsecondChildState: this.getNextStep('secondChild', this.state.secondChildState)\n\t\t\t});\n\t\t}, this.props.duration / 2);\n\t}\n\n\tgetNextStep(childType, currentState) {\n\t\tlet newState = {};\n\n\t\tswitch (currentState) {\n\t\t\tcase transitionStates.STATE_CHILD_ENTERING:\n\t\t\t\treturn transitionStates.STATE_CHILD_VISIBLE;\n\n\t\t\tcase transitionStates.STATE_CHILD_VISIBLE:\n\t\t\t\treturn transitionStates.STATE_CHILD_LEAVING;\n\n\t\t\tcase transitionStates.STATE_CHILD_LEAVING:\n\t\t\t\tnewState[childType] = null;\n\t\t\t\tthis.setState(newState);\n\t\t\t\treturn transitionStates.STATE_CHILD_EMPTY;\n\n\t\t\tcase transitionStates.STATE_CHILD_EMPTY:\n\t\t\t\tnewState[childType] = this.state.upcomingChild;\n\t\t\t\tthis.setState(newState);\n\t\t\t\treturn transitionStates.STATE_CHILD_ENTERING;\n\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\tgetActiveClass(currentState) {\n\t\tlet { enteringClass, visibleClass, leavingClass, emptyClass } = this.props;\n\t\tlet baseClass = condClass(this.props.baseClass);\n\n\t\tswitch (currentState) {\n\t\t\tcase transitionStates.STATE_CHILD_ENTERING:\n\t\t\t\treturn s.entering + condClass(enteringClass) + baseClass;\n\n\t\t\tcase transitionStates.STATE_CHILD_VISIBLE:\n\t\t\t\treturn s.visible + condClass(visibleClass) + baseClass;\n\n\t\t\tcase transitionStates.STATE_CHILD_LEAVING:\n\t\t\t\treturn s.leaving + condClass(leavingClass) + baseClass;\n\n\t\t\tcase transitionStates.STATE_CHILD_EMPTY:\n\t\t\t\treturn s.empty + condClass(emptyClass) + baseClass;\n\n\t\t\tdefault:\n\t\t\t\treturn baseClass;\n\t\t}\n\t}\n\n\tsetTimer = (f, d) => {\n\t\tthis.endTimer();\n\t\tthis.timerFunc = f;\n\t\tthis.timer = setTimeout(() => {\n\t\t\tf();\n\t\t\tthis.timer = null;\n\t\t\tif (this.afterTimer) {\n\t\t\t\tthis.afterTimer();\n\t\t\t\tthis.afterTimer = null;\n\t\t\t}\n\t\t}, d);\n\t}\n\n\tendTimer = (preventExecution) => {\n\t\tif (!this.timer) return;\n\t\tclearTimeout(this.timer);\n\n\t\t// Call the function early\n\t\tif (!preventExecution) {\n\t\t\tthis.timerFunc();\n\t\t}\n\n\t\tthis.timer = null;\n\t\tif (this.afterTimer) {\n\t\t\tthis.afterTimer();\n\t\t\tthis.afterTimer = null;\n\t\t}\n\t}\n\n\trender({ duration, ...props }, { firstChild, firstChildState, secondChild, secondChildState }) {\n\t\tlet child = this.getChildGenerator(props)();\n\n\t\tlet firstChildNode;\n\t\tlet secondChildNode;\n\n\t\tlet styles = this.getStyles();\n\n\t\tfirstChild = firstChild && firstChild();\n\n\t\t// Set the current state\n\t\tif (firstChild && firstChild.attributes) {\n\t\t\tfirstChild.attributes.transitionState = isServer ? transitionStates.STATE_CHILD_VISIBLE : firstChildState;\n\t\t}\n\n\t\tsecondChild = secondChild && secondChild();\n\t\tif (secondChild && secondChild.attributes) {\n\t\t\tsecondChild.attributes.transitionState = secondChildState;\n\t\t}\n\n\t\tlet firstChildClass = this.getActiveClass(isServer ? transitionStates.STATE_CHILD_VISIBLE : firstChildState);\n\t\tfirstChildNode = <div class={firstChildClass} style={styles}>{firstChild}</div>;\n\n\t\tlet secondChildClass = this.getActiveClass(secondChildState);\n\t\tsecondChildNode = <div class={secondChildClass} style={styles}>{secondChild}</div>;\n\n\t\tlet containerProps = {};\n\n\t\tif (props.class) containerProps.class = props.class;\n\t\tif (props.id) containerProps.id = props.id;\n\n\t\treturn (\n\t\t\t<div {...containerProps} >\n\t\t\t\t{firstChildNode}\n\t\t\t\t{secondChildNode}\n\t\t\t</div>\n\t\t);\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/core/transition/transition.js","export const STATE_CHILD_ENTERING = 'STATE_CHILD_ENTERING';\nexport const STATE_CHILD_VISIBLE  = 'STATE_CHILD_VISIBLE';\nexport const STATE_CHILD_LEAVING  = 'STATE_CHILD_LEAVING';\nexport const STATE_CHILD_EMPTY    = 'STATE_CHILD_EMPTY';\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/core/transition/transitionStates.js","import { h, Component } from 'preact';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport pure from 'utils/pure';\nimport s from 'components/shared/cookiesModal/cookiesModal.sss';\n\nexport default @pure class Modal extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.acceptCookies = this.sendResult.bind(this, true);\n\t\tthis.rejectCookies = this.sendResult.bind(this, false);\n\t}\n\n\tsendResult(value) {\n\t\tStore.emit(actions.HIDE_MODAL, value === true);\n\t}\n\n\trender(props) {\n\t\tlet appData = props.appData || Store.get().appData || {};\n\t\tlet copy = appData.copy || {};\n\t\treturn (\n\t\t\t<div class={s.container}>\n\t\t\t\t<h3 class={s.title}>{copy.$COOKIES_MODAL_TITLE}</h3>\n\t\t\t\t<div class={s.text}>{copy.$COOKIES_MODAL_TEXT}</div>\n\t\t\t\t<div class={s.buttons}>\n\t\t\t\t\t<button class={s.yes} type=\"button\" onClick={this.acceptCookies}>\n\t\t\t\t\t\t{copy.$COOKIES_MODAL_ACCEPT}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class={s.no} type=\"button\" onClick={this.rejectCookies}>\n\t\t\t\t\t\t{copy.$COOKIES_MODAL_DENY}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/shared/cookiesModal/cookiesModal.js","import { h, Component } from 'preact';\nimport pure from 'utils/pure';\nimport { getCopy } from 'utils/copy';\nimport { Link } from 'components/core/link/link.js';\nimport Transition from 'components/core/transition/transition.js';\nimport s from 'components/shared/dynamicTheaterSentence/dynamicTheaterSentence.sss';\nimport qs from 'qs';\n\n\nexport default @pure class DynamicTheaterSentence extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.theaterTime = 4000;\n\t\tthis.nearbyTime = 4000;\n\n\t\tthis.state = {\n\t\t\tactiveTheater: 0,\n\t\t\tshowTheater: false\n\t\t};\n\t}\n\n\tcomponentWillReceiveProps(nextProps) {\n\t\tif (!nextProps.showtimes.loading && !this.loadingFinished) {\n\t\t\t// Loading is finished,\n\t\t\t// so we'll hopefully have some theaters now\n\t\t\tthis.loadingFinished = true;\n\n\t\t\tif (nextProps.showtimes.theaters.length > 1) {\n\t\t\t\t// Start the rotation when there are theaters\n\t\t\t\tthis.timer = setTimeout(this.switchActive, 3000);\n\t\t\t}\n\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tif (this.timer) {\n\t\t\tclearInterval(this.timer);\n\t\t}\n\t}\n\n\tswitchActive = () => {\n\t\tconst newState = {\n\t\t\tshowTheater: !this.state.showTheater\n\t\t};\n\n\t\tif (!this.state.showTheater) {\n\t\t\t// let's show the new theater\n\t\t\tif (this.state.activeTheater < this.props.showtimes.theaters.length - 1) {\n\t\t\t\tnewState.activeTheater = this.state.activeTheater + 1;\n\t\t\t} else {\n\t\t\t\tnewState.activeTheater = 0;\n\t\t\t}\n\t\t}\n\t\t// Update the state\n\t\tthis.setState(newState);\n\n\t\t// prepare for the next one, make sure we show the sentence longer then the theater\n\t\tthis.timer = setTimeout(this.switchActive, newState.showTheater ? this.theaterTime : this.nearbyTime );\n\t}\n\n\trender(props) {\n\t\tconst {\n\t\t\tshowtimes, // object\n\t\t\ttextColor, // string\n\t\t\tlocation, // string\n\t\t\ttextFontSize, // string\n\t\t\thighlight, // string\n\t\t\thref, // string\n\t\t\treleaseDate, // date\n\t\t\textraQueryParameters // object\n\t\t} = props;\n\n\t\tconst linkQueryParameters = { ...extraQueryParameters };\n\n\t\tlet nrTheaters = showtimes.theaters.length;\n\t\tlet sentence = '';\n\t\tconst beforeRelease = new Date().getTime() < releaseDate.getTime();\n\n\t\tconst nowPlaying = beforeRelease ? getCopy('TICKETS_AVAILABLE') : getCopy('NOW_PLAYING_IN_THEATERS');\n\t\t// Show different copy when movie isn't out yet\n\t\t// TODO: replaceWithVNode instead of split (also we split nowPlayingTheater but never use the second half)\n\t\tconst nowPlayingTheater = (beforeRelease ? getCopy('TICKETS_AVAILABLE_AT_THEATER') : getCopy('NOW_PLAYING_IN_THEATER')).split('%THEATER%');\n\t\tconst nowPlayingTheaters = (beforeRelease ? getCopy('TICKETS_AVAILABLE_AT_THEATER_COUNT') : getCopy('NOW_PLAYING_IN_THEATER_COUNT')).split('%THEATER_COUNT%');\n\n\t\t// max 10 theaters\n\t\tif (nrTheaters > 10) {\n\t\t\tnrTheaters = 10;\n\t\t}\n\t\t// Some weird behaviour with Math.max not always working in some browsers\n\t\t// nrTheaters = Math.max(nrTheaters, 10);\n\n\n\t\tif (nrTheaters > 1) {\n\t\t\t// Basic sentence with cinemas nearby\n\t\t\tif (this.state.showTheater) {\n\t\t\t\tconst activeTheater = showtimes.theaters[this.state.activeTheater];\n\t\t\t\tlinkQueryParameters.location = `${activeTheater.geo.lat},${activeTheater.geo.lon}`;\n\n\t\t\t\t// Display the actual theater name\n\t\t\t\tsentence = (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tid={`theaters-${activeTheater.id}`}\n\t\t\t\t\t\tkey={`theaters-${activeTheater.id}`}\n\t\t\t\t\t\thref={`${href}?${qs.stringify(linkQueryParameters)}`}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tlinkClass={s.sentence}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass={s.intro}\n\t\t\t\t\t\t\tstyle={{ color: textColor }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{nowPlayingTheater}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass={s.theater}\n\t\t\t\t\t\t\tstyle={{ color: highlight }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{activeTheater.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Link>\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tsentence = (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tid={`theaters-${nrTheaters}`}\n\t\t\t\t\t\tkey={`theaters-${nrTheaters}`}\n\t\t\t\t\t\thref={`${href}?${qs.stringify(linkQueryParameters)}`}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tlinkClass={s.sentence}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class={s.intro} style={{ color: textColor }}>\n\t\t\t\t\t\t\t{nowPlayingTheaters[0]}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass={s.theater}\n\t\t\t\t\t\t\tstyle={{ color: highlight }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{nrTheaters} {nowPlayingTheaters[1]}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Link>\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (nrTheaters === 1) {\n\t\t\tconst selectedTheater = showtimes.theaters[0];\n\t\t\tlinkQueryParameters.location = `${selectedTheater.geo.lat},${selectedTheater.geo.lon}`;\n\n\t\t\t// Only one cinema available\n\t\t\tsentence = (\n\t\t\t\t<Link\n\t\t\t\t\tid={`theaters-1-${nrTheaters}`}\n\t\t\t\t\tkey={`theaters-${selectedTheater.id}`}\n\t\t\t\t\thref={`${href}?${qs.stringify(linkQueryParameters)}`}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\tlinkClass={s.sentence}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass={s.intro}\n\t\t\t\t\t\tstyle={{ color: textColor }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{nowPlayingTheater}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass={s.theater}\n\t\t\t\t\t\tstyle={{ color: highlight }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{selectedTheater.name}\n\t\t\t\t\t</span>\n\t\t\t\t</Link>\n\t\t\t);\n\t\t} else if (nrTheaters === 0) {\n\t\t\t// No cinemas available\n\t\t\tsentence = (\n\t\t\t\t<div id={`theaters-${nrTheaters}`}>\n\t\t\t\t\t<span style={{ color: textColor }}>\n\t\t\t\t\t\t{nowPlaying}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (showtimes.loading) {\n\t\t\tsentence = <span id=\"empty\" />;\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclass={s.container}\n\t\t\t\tstyle={{ fontSize: textFontSize }}\n\t\t\t>\n\t\t\t\t<Transition\n\t\t\t\t\tclass={s.transitionContainer}\n\t\t\t\t\tvisibleClass={s.transition}\n\t\t\t\t\tleavingClass={s.transition}\n\t\t\t\t\tenteringClass={s.transition}\n\t\t\t\t\tduration={1000}\n\t\t\t\t>\n\t\t\t\t\t{sentence}\n\t\t\t\t</Transition>\n\t\t\t</div>\n\t\t);\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/shared/dynamicTheaterSentence/dynamicTheaterSentence.js","import { h, Component } from 'preact';\nimport pure from 'utils/pure';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport s from 'components/shared/modal/exitModal.sss';\nimport { track } from 'utils/tracking';\nimport { getCopy } from 'utils/copy';\nimport { Link } from 'components/core/link/link';\n\n\nexport default @pure class ExitModal extends Component {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.closeModal = this.closeModal.bind(this);\n\t\tthis.openLink = this.openLink.bind(this);\n\t}\n\n\tcloseModal() {\n\t\tStore.emit(actions.HIDE_MODAL);\n\t\ttrack({ a:'exit_modal_click_cancel' });\n\t}\n\n\topenLink() {\n\t\tStore.emit(actions.HIDE_MODAL);\n\t}\n\n\tgetTitle() {\n\t\t// Should we use the current location.host instead of meta > vanity ?\n\t\t// Would be a bit weird if multiple vanities are available\n\t\tconst vanity = this.props.vanity || '';\n\t\t// get rid of the http://\n\t\tconst strippedVanity = vanity.split('://').pop();\n\t\tlet content = getCopy('EXIT_MODAL_TITLE', { vanity: strippedVanity });\n\t\treturn (\n\t\t\t<h2 class={s.title}>{content}</h2>\n\t\t);\n\t}\n\n\trender(props) {\n\t\tconst {\n\t\t\thref, // the href that it needs to direct them to\n\t\t\tvanity='' // the vanity url of the app\n\t\t} = props;\n\n\t\treturn (\n\t\t\t<div class={s.container}>\n\t\t\t\t{this.getTitle()}\n\t\t\t\t<Link\n\t\t\t\t\thref={href}\n\t\t\t\t\textraOnClick={this.openLink}\n\t\t\t\t\tignoreExitModal\n\t\t\t\t\ttrackId=\"exit_modal_click_ok\"\n\t\t\t\t\ttrackLabel={href}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\tclass={s.button}\n\t\t\t\t>\n\t\t\t\t\t{getCopy('OK')}\n\t\t\t\t</Link>\n\t\t\t\t<button onClick={this.closeModal} class={s.button}>{getCopy('CANCEL')}</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/shared/modal/exitModal.js","import { h, Component } from \"preact\";\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport { accessNested } from \"utils/utils\";\nimport { Link } from 'components/core/link/link';\nimport style from \"components/shared/regionMismatchModal/changeRegionModal.sss\";\n\nconst formatUrlWithoutProtocol = url =>\n\t/^(?:http:\\/\\/)?(?:www\\.)?(.+)$/.exec(url)[1];\n\nconst codeToCountryName = (code, countryNames) =>\n\t(countryNames && countryNames[code]) || code;\n\n// const getUrl = ({ url }) => url;\n\n\nexport default class ChangeRegionModal extends Component {\n\n\t/* LifeCycle\n\t------------------------*/\n\n\tcomponentWillMount() {\n\t\tthis.requireRegionCopy()\n\t}\n\n\n\t/* Data handlers\n\t------------------------*/\n\n\trequireRegionCopy() {\n\t\t// TODO: should this be moved to the store because the data will be thrown away on rerender?\n\t\t// if (this.dataRequest) return this.dataRequest;\n\t\tlet regionCode = this.props.userRegionApp.regionCode;\n\n\n\t\tif (regionCode === 'other') {\n\t\t\t// if we are showing a global popup, then use english\n\t\t\tthis.setState({dynamicCopy: this.props.copy});\n\t\t\treturn;\n\t\t}\n\t\tfetch(\n\t\t\tthis.props.apiRoot + \"/app_data/region_mismatch/\" + regionCode,\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/vnd.api+json\",\n\t\t\t\t\t\"Content-Type\": \"application/vnd.api+json\"\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t\t.then(r => r.json())\n\t\t.then(data => {\n\t\t\t// console.log('what is the data', data);\n\t\t\tthis.setState({ dynamicCopy: data.copy });\n\t\t})\n\t\t.catch(e => console.log(e));\n\t}\n\n\n\n\tgetFlagPath(countryCode) {\n\t\treturn `${this.props.imagePath}/flags/${countryCode}.png`;\n\t}\n\n\n\t/* Event Handlers\n\t------------------------*/\n\n\tcloseHandler = () => {\n\t\t// TODO: Save in localstorage, so we don't\n\t\t// show again next time user visits platform\n\n\t\t// Update Store to let them know user has dismissed region modal\n\t\tStore.emit(actions.SET_USER_REGION_MODAL_DISMISSED);\n\t\t// Hide the modal\n\t\tStore.emit(actions.HIDE_MODAL);\n\t}\n\n\t/* Render Methods\n\t------------------------*/\n\n\n\trender(props) {\n\n\t\tconst {\n\t\t\tgeo,\n\t\t\tappRegionCode,\n\t\t\tappCountryCode,\n\t\t\timagePath,\n\t\t\tapiRoot,\n\t\t\tcurrentApp,\n\t\t\tuserRegionApp\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tdynamicCopy\n\t\t} = this.state;\n\n\t\t// Copy\n\t\tconst titleCopy    = accessNested(dynamicCopy, \"$REGION_MISMATCH_MODAL_MAIN\", \"\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t.replace(/%LOCATION%/g, geo.city)\n\t\t\t\t\t\t\t\t\t\t\t\t\t.replace(/%REGION%/g, geo.city);\n\t\tconst subTitleCopy = accessNested(dynamicCopy, \"$REGION_MISMATCH_MODAL_SECONDARY\", \"\");\n\t\tconst stayCopy     = accessNested(dynamicCopy, \"$REGION_MISMATCH_MODAL_STAY\", \"\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t.replace(/%APP_URL%/g, formatUrlWithoutProtocol(currentApp.url));\n\n\t\tlet userRegionUrl = userRegionApp.url;\n\n\t\tif (window.location && window.location.search) {\n\t\t\tuserRegionUrl += '/' + window.location.search;\n\t\t}\n\n\t\treturn (\n\t\t\t<div class={style.modalBox}>\n\t\t\t\t{/* Modal Location Bar */}\n\t\t\t\t<div class={style.locationBar}>\n\t\t\t\t\t<div class={style.locationBarTitle}>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={this.getFlagPath(this.props.appCountryCode)}\n\t\t\t\t\t\t\talt={this.props.appCountryCode}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{/* NOTE: This line needs to be wrapped in span due to this\n\t\t\t\t\t\t\tPreact Bug: https://github.com/developit/preact/issues/430 */}\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{formatUrlWithoutProtocol(currentApp.url)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass={style.closeModalButton}\n\t\t\t\t\t\tonClick={this.closeHandler}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class={style.contentBox}>\n\t\t\t\t\t<h1 class={style.heading}>\n\t\t\t\t\t\t{titleCopy}\n\t\t\t\t\t</h1>\n\t\t\t\t\t<hr class={style.line} />\n\t\t\t\t\t<p class={style.info}>{subTitleCopy}</p>\n\t\t\t\t\t<div class={style.gotoButtonContainer}>\n\t\t\t\t\t\t<img src={this.getFlagPath(geo.countryCode)} alt=\"\" />\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclass={style.gotoButton}\n\t\t\t\t\t\t\thref={userRegionUrl}\n\t\t\t\t\t\t\ttrackId=\"geo-region-redirect\"\n\t\t\t\t\t\t\ttrackLabel={appRegionCode}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formatUrlWithoutProtocol(userRegionApp.url)}\n\t\t\t\t\t\t\t<div class={style.arrowRight} />\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class={style.remainLinkBox}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={this.closeHandler}\n\t\t\t\t\t\t\tclass={style.remainLink}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{stayCopy}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/shared/regionMismatchModal/changeRegionModal.js","import { h, Component } from 'preact';\nimport s from 'components/shared/svgIcons/svgIcons.sss';\n\n// --- try to use https://jakearchibald.github.io/svgomg/ to reduce the size of your svgs ---\n// --- Also (see more details above the exports), if a SVG is very specific to a movie, use svgRenderer instead of adding it to this file ---\n\n\n// Creates an immutable svg element\n// Avoids using innerHTML (slow)\nclass SVGContent extends Component {\n\n\trefresh(props) {\n\t\tif (typeof document === 'undefined') return;\n\t\tprops = props || this.props;\n\t\tthis.inner = this.createSVGTree(props.content);\n\t\tif (this.inner && this.base) {\n\t\t\tthis.base.appendChild(this.inner);\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.refresh();\n\t}\n\n\t// shouldComponentUpdate() {\n\t// \treturn false;\n\t// }\n\n\tcomponentDidUpdate(oldProps) {\n\t\tif (oldProps.children !== this.props.children) {\n\t\t\tthis.refresh();\n\t\t} else if (this.base && this.inner && this.base.childNodes.length !== 1) {\n\t\t\twhile (this.base.firstChild) {\n\t\t\t\tthis.base.removeChild(this.base.firstChild);\n\t\t\t}\n\t\t\tthis.base.appendChild(this.inner);\n\t\t}\n\t}\n\n\tsetAttributes(el, attrs) {\n\t\tif (!el || !attrs) return;\n\t\tconst names = Object.keys(attrs);\n\t\tfor (let i = 0, l = names.length; i < l; i++) {\n\t\t\tconst name = names[i];\n\t\t\tel.setAttribute(name, attrs[name]);\n\t\t}\n\t}\n\n\tcreateSVGTree(source) {\n\t\tif (!source) return null;\n\t\tconst el = document.createElementNS('http://www.w3.org/2000/svg', source.nodeName);\n\t\tthis.setAttributes(el, source.attributes);\n\t\tif (source.children) {\n\t\t\tfor (let i = 0, l = source.children.length; i < l; i++) {\n\t\t\t\tconst ch = this.createSVGTree(source.children[i]);\n\t\t\t\tif (ch) el.appendChild(ch);\n\t\t\t}\n\t\t}\n\t\treturn el;\n\t}\n\n\trender(props) {\n\t\tconst containerProps = Object.assign({}, props);\n\t\tdelete containerProps.content;\n\t\treturn (<div {...containerProps} />);\n\t}\n\n}\n\nfunction svgRenderer(svgContent) {\n\t// http://stackoverflow.com/a/25184858/1336843\n\t// To reduce document size, we should probably inline it (body.appendChild and display: none) the first time, and use the `use` tag !\n\n\treturn ({ ...props }) => (<SVGContent {...props} class={[s.wrapper].concat(props.class).filter(e => e).join(' ')} content={svgContent} />);\n}\n\nconst SvgVideos = svgRenderer(<svg class={s.svgIcon} viewBox='0 0 50 50'>\n\t<path d='M 20 18 L 34 25 L 20 33 L 20 18 ZM 10 12 C 7.1494 12 5 14.2457 5 17 L 5 34 C 5 36.7542 7.1494 39 10 39 L 40 39 C 42.8503 39 45 36.7542 45 34 L 45 17 C 45 14.2457 42.8503 12 40 12 L 10 12 Z' />\n</svg>);\n\nconst SvgSynopsis = svgRenderer(<svg class={s.svgIcon} viewBox='0 0 50 50'>\n\t<path d='M 30.9396 10.3793 C 30.9396 11.1035 30.4849 11.5172 30 12 C 26.6056 15.3793 23.3937 18.6205 20 22 C 21.0945 18.293 16.9395 17.2758 15 18 C 18.1516 14.3794 22.3635 10.6207 26 7 C 26.4847 7 26.8182 7 27.3027 7 C 29.9695 7 30.9396 8.931 30.9396 10.3793 ZM 37 27 C 37 28.6898 28.9092 36.8278 26 39 C 25.7578 38.7588 26 38.4828 26 38 C 26 35.8276 14 24.2414 14 24 C 13.7576 23.5172 13 22.6897 13 22.207 C 13 20.2758 14.0609 19 16 19 C 19.152 19 19 22.069 19 24 L 28 16 C 29.4549 17.4484 37 23.8621 37 27 ZM 25 39 C 25 40.6896 23.2119 42 22 42 C 19.333 42 19 39.2068 19 38 C 19 37.2758 19.8177 34 22 34 C 23.4543 34 25 38.2758 25 39 Z' />\n</svg>);\n\nconst SvgShowtimes = svgRenderer(<svg class={s.svgIcon} viewBox='0 0 50 50'>\n\t<path d='M 25.3158 11.6842 L 38.3158 24.6842 L 18 45 L 14.3438 41.3438 C 14.3438 41.3438 16.6093 39.1685 13.6316 36.3684 C 10.7015 33.6131 8.7465 35.7465 8.7465 35.7465 L 5 32 L 25.3158 11.6842 Z' />\n\t<path d='M 40.0263 22.9737 L 27.0263 9.9737 L 32 5 L 35.6563 8.6563 C 35.6563 8.6563 33.3907 10.8315 36.3684 13.6316 C 39.2985 16.3869 41.2535 14.2535 41.2535 14.2535 L 45 18 L 40.0263 22.9737 Z' />\n</svg>);\n\nconst SvgShare = svgRenderer(<svg class={s.svgShareIcon} viewBox='0 0 50 50'>\n\t<path d='M 6 25 C 6 21.9624 8.4624 19.5 11.5 19.5 C 14.5376 19.5 17 21.9624 17 25 C 17 28.0376 14.5376 30.5 11.5 30.5 C 8.4624 30.5 6 28.0376 6 25 Z' />\n\t<path d='M 30 14 C 30 10.9624 32.4624 8.5 35.5 8.5 C 38.5376 8.5 41 10.9624 41 14 C 41 17.0376 38.5376 19.5 35.5 19.5 C 32.4624 19.5 30 17.0376 30 14 Z' />\n\t<path d='M 30.5 36.5 C 30.5 33.7385 32.7385 31.5 35.5 31.5 C 38.2615 31.5 40.5 33.7385 40.5 36.5 C 40.5 39.2615 38.2615 41.5 35.5 41.5 C 32.7385 41.5 30.5 39.2615 30.5 36.5 Z' />\n\t<path d='M 35.5 13.9375 L 11.4375 25 L 35.5625 36.5625 ' />\n</svg>);\n\nconst SvgLink = svgRenderer(<svg class={s.svgIcon} viewBox='0 0 380 380' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M345.5 318.5q-20 20-47 20t-47-19l-105-105q-19-20-19-47t20-47l13-13q20-20 47.5-20t47.5 19l105 105q19 20 19 47t-20 47l-14 13zm-14-14l13-14q14-13 14.5-32.5t-13.5-32.5l-105-105q-14-13-32.5-13t-32.5 14l-14 14q-14 13-14.5 32.5t13.5 32.5l105 105q14 13 33 13t33-14zm-112-31q-20 20-47.5 20t-47.5-19l-105-105q-19-20-19-47t20-47l14-14q20-20 47-20t47 19l105 105q19 20 19 47.5t-20 47.5l-13 13zm-15-14l14-14q14-13 14.5-32.5t-13.5-32.5l-105-105q-14-13-33-13t-33 14l-13 13q-14 13-14.5 33t13.5 33l105 105q14 13 32.5 13t32.5-14z' />\n</svg>);\n\nconst SvgUser = svgRenderer(<svg class={s.svgUserIcon} viewBox='0 0 100.33333 137.33333'>\n\t<rect x='2.5' y='63.83333' width='95.33333' height='71' rx='27' ry='27'/>\n\t<circle cx='50' cy='33.33333' r='30.83333'/>\n</svg>);\n\nconst SvgHeart = svgRenderer(<svg viewBox='0 0 769 705' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M385.026 705.052C784.07 391.477 769.052 279.985 769.052 193.026S697.075 1 577.026 1s-192 128.026-192 128.026S313.076 1 193.026 1 1 106.067 1 193.026s-15.02 198.45 384.026 512.026z'/>\n</svg>);\n\nconst SvgCopy = svgRenderer(<svg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M3.2 4c-.1 0-.2.1-.2.2v18.6c0 .1.1.2.2.2h14.6c.1 0 .2-.1.2-.2V4.2c0-.1-.1-.2-.2-.2H3.2zM4 5v17h13V5H4zm2-2h1V2h13v17h-1v1h2V1H6v2z' fill-rule='evenodd'/>\n</svg>);\n\nconst SvgEdit = svgRenderer(<svg class={s.svgBase} viewBox='0 0 528.899 528.899'>\n\t<path d='M328.883,89.125l107.59,107.589l-272.34,272.34L56.604,361.465L328.883,89.125z M518.113,63.177l-47.981-47.981c-18.543-18.543-48.653-18.543-67.259,0l-45.961,45.961l107.59,107.59l53.611-53.611C532.495,100.753,532.495,77.559,518.113,63.177z M0.3,512.69c-1.958,8.812,5.998,16.708,14.811,14.565l119.891-29.069L27.473,390.597L0.3,512.69z'/>\n</svg>);\n\nconst SvgSearch = svgRenderer(<svg class={s.svgBase} viewBox='0 0 512 512'>\n\t<path d='M496.131 435.698l-121.276-103.147c-12.537-11.283-25.945-16.463-36.776-15.963 28.628-33.534 45.921-77.039 45.921-124.588 0-106.039-85.961-192-192-192s-192 85.961-192 192 85.961 192 192 192c47.549 0 91.054-17.293 124.588-45.922-0.5 10.831 4.68 24.239 15.963 36.776l103.147 121.276c17.661 19.623 46.511 21.277 64.11 3.678s15.946-46.449-3.677-64.11zM192 320c-70.692 0-128-57.308-128-128s57.308-128 128-128 128 57.308 128 128-57.307 128-128 128z' />\n</svg>);\n\nconst SvgMarker = svgRenderer(<svg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M173.57 75.26q0 18.18-19.02 49.47T116.5 178l-19.04 22q-2.96-3.38-7.6-9.3t-16.92-22.62-21.78-31.5-17.12-32.35-7.6-28.97q0-30.87 21.55-52.64T100 .84t52 21.78 21.57 52.64z'/>\n</svg>);\n\nconst SvgStar = svgRenderer(<svg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M8.28 7.92s-4.46.492-7.434.823c-.268.032-.505.21-.594.484s0 .556.197.735c2.21 2.016 5.53 5.036 5.53 5.036-.004 0-.912 4.392-1.516 7.323-.05.266.045.547.276.715.23.168.526.17.76.04 2.6-1.48 6.5-3.703 6.5-3.703l6.495 3.704c.237.13.533.127.763-.04.232-.17.328-.45.276-.713-.604-2.933-1.512-7.325-1.512-7.325s3.32-3.02 5.53-5.032c.198-.185.285-.468.198-.74s-.325-.45-.593-.48c-2.974-.334-7.435-.827-7.435-.827l-3.08-6.817C12.526.86 12.284.688 12 .688s-.53.173-.64.415C10.125 3.83 8.28 7.92 8.28 7.92z'/>\n</svg>);\n\nconst SvgFullScreenOpen = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg'  viewBox='0 0 8 8'>\n\t<path d='M0 0v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4zm5 4l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5z' />\n</svg>);\n\nconst SvgFullScreenClose = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'>\n\t<path d='M1 0l-1 1 1.5 1.5-1.5 1.5h4v-4l-1.5 1.5-1.5-1.5zm3 4v4l1.5-1.5 1.5 1.5 1-1-1.5-1.5 1.5-1.5h-4z' />\n</svg>);\n\n// Just a triangle. Is it supposed to be 'caret' ?\nconst SvgCarrotDown = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'>\n\t<path d='M0 0l4 4 4-4h-8z' transform='translate(0 2)' />\n</svg>);\n\nconst SvgCarrotUp = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'>\n\t<path d='M4 0l-4 4h8l-4-4z' transform='translate(0 2)' />\n</svg>);\n\nconst SvgTick = svgRenderer(<svg viewBox='0 0 16 13' xmlns='http://www.w3.org/2000/svg'>\n\t<path d='M5 8.993l-3-3-2 2 5.008 5.01 2.005-1.996L15.993 2l-2-2' fill-rule='evenodd'/>\n</svg>);\n\n// Flip it using CSS transforms\nconst SvgArrowRight = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'>\n\t<path d='M8.5 17.5c-.3 0-.5-.1-.7-.3s-.3-.4-.3-.7.1-.5.3-.7l5.7-5.7H1.4c-.6 0-1-.4-1-1s.4-1 1-1h12.1L7.7 2.3c-.2-.2-.3-.4-.3-.7s.1-.5.3-.7c.4-.4 1-.4 1.4 0l7.5 7.5c.4.4.4 1 0 1.4l-7.5 7.5c0 .1-.3.2-.6.2z'/>\n</svg>);\n\nconst SvgBin = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 21'>\n\t<path d='M17.5 3H14V1c0-.5-.5-1-1-1H5c-.5 0-1 .5-1 1v2H.5c-.3 0-.5.2-.5.5v2c0 .3.2.5.5.5h.6l1.8 14.5c.1.3.3.5.6.5h11c.3 0 .5-.2.6-.5L16.9 6h.6c.3 0 .5-.2.5-.5v-2c0-.3-.2-.5-.5-.5zM5 1h8v2H5V1zm9.1 19h-1.5l.9-10.4c0-.3-.2-.6-.5-.6s-.5.2-.5.5L11.6 20H9.5V9.5c0-.3-.2-.5-.5-.5s-.5.2-.5.5V20H6.4L5.5 9.5c0-.3-.2-.5-.5-.5s-.5.3-.5.6L5.4 20H3.9L2.2 6h13.6l-1.7 14zM17 5H1V4h16v1z'/>\n</svg>);\n\nconst SvgSpeaker = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 75 75'>\n\t<g stroke-width='5' style='stroke: currentColor'>\n\t\t<path style='fill: currentColor' stroke-linejoin='round' d='M39.39 13.77L22.234 28.605H6V47.7h15.99l17.4 15.05V13.77z'/>\n\t\t<path d='M48.128 49.03c1.93-3.096 3.062-6.74 3.062-10.653 0-3.978-1.164-7.674-3.147-10.8m7.04-7.04c3.694 4.986 5.883 11.157 5.883 17.84 0 6.62-2.15 12.738-5.788 17.7m6.532 6.533c5.267-6.665 8.418-15.08 8.418-24.232 0-9.217-3.192-17.682-8.52-24.368' fill='none' stroke-linecap='round'/>\n\t</g>\n</svg>);\n\nconst SvgMuted = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 75 75'>\n\t<g style='stroke: currentColor' stroke-width='5'>\n\t\t<path stroke-linejoin='round' style='fill: currentColor' d='M39.39 13.77L22.234 28.605H6V47.7h15.99l17.4 15.05V13.77z'/>\n\t\t<path d='M48.652 50.27l20.743-24.3m0 24.3l-20.743-24.3' fill='none' stroke-linecap='round'/>\n\t</g>\n</svg>);\n\nconst SvgImax = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 305.55 57.175' >\n\t<path d='M46.982 56.985l.022-40.99h2.983l20.02 40.946h12.95l20.02-40.923 3.158-.066-.11 41.035h16.02L122 .947l-27.974.088-17.545 32.97L59.865.99l-28.86.09-.043 55.905zM0 0h18.992v57.002H0zM154.25.77l-28.624 56.217 18.03.188 5.657-10.094 35.53-.186 4.94 9.906 18.75.187L179.906.77zM167 12.8l12 21.937-23.156.157zM235.938.943l-21.125.125 21.75 25.625-26.375 30.25 22.625.125 18.5-20.625 17.625 20.625 23.375-.125-26.375-30.125 21.625-25.625-21.75-.375-14.5 18.125z'/>\n\t<path d='M295.608 8.126h2.083c.747 0 1.277-.122 1.59-.365.316-.243.473-.642.473-1.2 0-.25-.05-.48-.15-.682-.1-.202-.238-.363-.417-.48-.143-.1-.316-.17-.52-.212-.202-.043-.542-.065-1.02-.065h-2.038zm-1.018 4.64v-8.56h2.904c.646 0 1.12.028 1.424.084.303.056.567.147.792.272.35.198.62.47.808.813.187.344.28.732.28 1.164 0 .533-.12.985-.365 1.356-.243.372-.57.6-.98.69.313.05.55.203.708.456.16.252.27.742.33 1.47l.11 1.25c.013.185.04.335.08.45.042.116.104.208.186.278v.277h-1.055c-.072-.14-.125-.282-.156-.427-.03-.145-.055-.323-.07-.532l-.097-1.104c-.054-.735-.178-1.196-.37-1.383-.192-.186-.594-.28-1.205-.28h-2.304v3.727z' style='line-height:125%;-inkscape-font-specification:Swis721 Lt BT Bold' font-family='Swis721 Lt BT' font-size='11.811' font-weight='bold' letter-spacing='0' word-spacing='0'/>\n\t<path d='M506.563 464.3c0 4.383-3.806 7.937-8.5 7.937-4.695 0-8.5-3.554-8.5-7.937 0-4.384 3.805-7.938 8.5-7.938 4.694 0 8.5 3.554 8.5 7.938z' transform='matrix(.88297 0 0 .94554 -142.227 -430.4)' fill='none' stroke='currentColor' stroke-width='1.094' />\n</svg>);\n\nconst SvgImax3d = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 49'>\n\t<g fill-rule='evenodd'>\n\t\t<path d='M286.878.243c-9.088.883-12.223 4.09-12.72 13.018l-.187 3.36H288v-1.54c0-4.68.62-4.9 14.06-4.84 12.654.05 13.147.23 13.134 4.86-.012 3.98-.932 4.33-11.38 4.33H296v9.52l8.7.15c11.218.19 11.68.4 11.695 5.19.003 1.24-.25 2.17-.76 2.8l-.764.95-12.47.098-12.47.094-1.16-1.165c-1.03-1.03-1.16-1.444-1.16-3.594v-2.43h-14l.01 3.7c.01 8.355 3.24 12.35 10.95 13.55 5.48.85 36.03.23 38.85-.79 5.16-1.87 6.73-4.67 6.76-12.06.02-7.542-1.573-9.81-7.75-11-1.42-.272-1.34-.433.496-.974 5.09-1.51 6.1-3.16 6.1-10.01 0-7.075-1.08-9.606-4.89-11.446-1.664-.803-1.56-.77-4.112-1.402-2.183-.542-28.28-.81-33.122-.34M181.27 1.37c13.814 16.197 17.884 21.43 17.62 21.624l-22.225 25.22h19.407l15.8-17.717 15.193 17.73 19.766-.213-22.56-24.967C240.05 3.96 241.64 2.112 242.23 1.53c1.2-1.2.468-1.315-8.402-1.315h-8.975l-2.28 2.7-10.742 12.887c-6.86-8.16-9.63-11.37-12.65-15.087-.3-.374-2.73-.5-9.62-.5h-9.22l.94 1.154M247.2.48c-3.76 1.467-2.844 7.086 1.6 6.932 1.275-.232 1.65-.455 2.2-1.2 2.198-2.98-.484-7.026-3.8-5.732M336 24.215V48.26l25.1-.15c13.805-.08 25.64-.28 26.3-.44 11.118-2.713 12.4-5.2 12.4-24.055 0-16.66-1.816-20.564-10.4-22.362-.66-.138-1.65-.373-2.2-.52-.55-.15-12.295-.336-26.1-.416L336 .17M0 24.416v23.8h15.2V.616H0v23.8m25.6 0v23.8h13.6v-34.4h2.817l4.63 9.5c2.547 5.224 5.873 12.01 7.392 15.08 3.48 7.22 4.04 8.97 4.4 9.6.51.436.08.22 5.94.22h5.48l1.06-2.176 15.65-32.16 3.01-.286v34.62h13.2V.604L90.5.71c-11.93.1-11.84.078-12.44.904-10.795 21.524-13.49 26.696-13.66 26.8-5.338-9.79-7.69-14.413-10-19.147L50.2.66 37.9.637 25.6.615m103.675.3c-22.988 45.697-23.04 46.06-23.275 46.5-.422.788-.304.8 7.565.8h7.993l4.242-8.37 30.123-.048 4.183 8.418c12.318 0 15.894-.06 15.894-.133-18.52-36.55-20.43-40.374-21.692-42.89L152.016.614h-11.408c-6.274 0-11.374.135-11.333.3m121.105.803c1.206.977 1.21 3.03.01 4.306-2.55 2.716-6.667-1.023-4.358-3.96.99-1.258 3.02-1.42 4.348-.346m-3.58 2.145c0 1.073.18 1.952.4 1.952.22 0 .4-.343.4-.763 0-.56.207-.7.8-.55.44.12.8.46.8.76 0 .31.16.56.357.56.196 0 .33-.85.3-1.89l-.057-1.9-1.5-.06-1.5-.05v1.95m2.4-.65c0 .34-.356.6-.8.6-.444 0-.8-.26-.8-.6 0-.33.356-.6.8-.6.444 0 .8.27.8.6M146.1 20.01c2.365 4.72 4.3 8.673 4.3 8.78l-19.485.425 3.2-6.4c7.227-14.448 6.267-14.223 11.985-2.806m235.732-6.9c3.074 1.49 3.458 2.84 3.3 11.59-.208 11.49.88 10.87-19.232 11.02l-15.1.12V12.19l14.63.028c14.135.027 14.687.057 16.402.89'/>\n\t\t<path fill='#fff' d='M102.988 24.6c0 13.2.05 18.542.112 11.87.06-6.67.06-17.47 0-24-.062-6.528-.112-1.07-.112 12.13M329.3 13c.005.88.087 1.193.183.695.096-.497.092-1.217-.008-1.6-.1-.382-.18.025-.174.905'/>\n\t</g>\n</svg>);\n\n// Path#1 : fill='#231f20'\nconst SvgRealD = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 603.34 69.17'>\n\t<path d='M502.58 3.05h-49.34v12.76h48.32a6.9 6.9 0 0 1 .37 13.79h-28.45v12.73h28.07a6.9 6.9 0 0 1 .37 13.79h-48.69v12.73h37.33l15.57-.55a19.6 19.6 0 0 0 9.91-32.32 19.67 19.67 0 0 0-13.46-32.92m66.16-.09h-35.53v13.12h34.78c13.05 0 20.24 7.05 20.24 19.87s-7 19.74-20.24 19.74h-20.81V29.52h-14V68.8h35.52c20.7 0 34.6-13.2 34.6-32.85s-13.9-33-34.6-33M259.09 56V3.03h-14.8v66.14h60.06V56h-45.26zM158.47 69.17h45.81l-7.1-12.8h-16.49l16.18-29.17 23.29 41.97h15.09L196.87 0l-38.4 69.17zM81.93 3.03h67.2V16.2h-67.2zm0 26.67v39.47h67.2V56H95.95V42.5h53.18V29.7h-67.2zm-13.65-6.93a19.77 19.77 0 0 0-18.71-19.7H-.01v12.78h48.54a6.93 6.93 0 0 1 .37 13.85H0v39.46h14V42.5h23.5l18.58 26.67h16l-19-27.22a19.58 19.58 0 0 0 15.14-19.17'/>\n\t<path fill='#27aae1' d='M369.59 2.97H333.9v13.18h35c13.11 0 20.33 7.09 20.33 20s-7 19.84-20.33 19.84h-20.97V29.65h-14v39.47h35.69c20.81 0 34.77-13.26 34.77-33s-14-33.14-34.77-33.14m31.54.3h4.62v.95h-1.7v4.75h-1.22V4.23h-1.7zm9.67 5.7h-1l-1.51-4.9v4.88h-1.14v-5.7h2l1.19 4.15 1.29-4.15h1.93v5.7h-1.14V4.08z'/>\n</svg>);\n\nconst SvgTrain = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>\n\t<path d='M16,18h1c0.552,0,1-0.448,1-1V3c0-0.552-0.448-1-1-1H7C6.448,2,6,2.448,6,3v14c0,0.552,0.448,1,1,1h1l-4,4h2l1-1h10l1,1h2\n\t\tL16,18z M15,15c-0.552,0-1-0.448-1-1c0-0.552,0.448-1,1-1s1,0.448,1,1C16,14.552,15.552,15,15,15z M7.5,11V4h9v7H7.5z M10,14\n\t\tc0,0.552-0.448,1-1,1s-1-0.448-1-1c0-0.552,0.448-1,1-1S10,13.448,10,14z M8,20l2-2h4l2,2H8z'/>\n</svg>);\n\nconst SvgCar = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>\n\t<path d='M19,11h-1l-1-6c0-0.552-0.448-1-1-1H8C7.448,4,7,4.448,7,5l-1,6H5c-0.552,0-1,0.448-1,1v5c0,0.552,0.448,1,1,1h1v1\n\tc0,0.552,0.448,1,1,1s1-0.448,1-1v-1h8v1c0,0.552,0.448,1,1,1s1-0.448,1-1v-1h1c0.552,0,1-0.448,1-1v-5C20,11.448,19.552,11,19,11z\n\tM7,15c-0.552,0-1-0.448-1-1s0.448-1,1-1s1,0.448,1,1S7.552,15,7,15z M7,11l1-6h8l1,6H7z M17,15c-0.552,0-1-0.448-1-1s0.448-1,1-1\n\ts1,0.448,1,1S17.552,15,17,15z'/>\n</svg>);\n\nconst SvgGuy = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>\n\t<circle cx='12.5' cy='4.5' r='1.5'/>\n\t<path d='M17.304 11.068s-2.137-.395-2.173-.404c0 0-1.52-3.172-1.66-3.332l-.01-.002c-.275-.493-.8-.83-1.402-.83-.276 0-.53.075-.758.197l-.01-.003s-2.056 1.17-2.81 1.594c-.18.1-.32.245-.414.425L6.77 11.146c-.04.092-.063.192-.063.298 0 .415.337.752.752.752.28 0 .52-.165.65-.398l1.2-2.242.74-.416c-.056.16-.738 3.482-.738 3.482l-.69 3.934-2.364 2.97c-.136.156-.227.355-.227.58 0 .494.4.894.895.894.27 0 .5-.124.665-.31 0 0 2.614-3.196 2.83-3.45.238-.284.3-.426.336-.612.034-.186.433-2.587.433-2.587l2.286 2.29v3.78c0 .497.4.897.893.897s.893-.4.893-.893l-.004-4.506c0-.27-.105-.53-.29-.728l-2.234-2.234.49-2.38.65 1.244c.148.28.41.48.72.543.857.176 2.573.51 2.607.51.416 0 .752-.338.752-.753 0-.385-.29-.688-.66-.736z'/>\n</svg>);\n\nconst SvgLinkOut = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>\n\t<path d='M20.6 2.9h-5.9c-.5 0-.9.4-.9.9s.4.9.9.9h3.9L10.2 13c-.3.3-.3.9 0 1.2.2.2.4.3.6.3.2 0 .4-.1.6-.3l8.3-8.3v3.7c0 .5.4.9.9.9s.9-.4.9-.9V3.7c0-.4-.4-.8-.9-.8z'/>\n\t<path d='M17.7 11.5c-.5 0-.9.4-.9.9v6.8c0 .3-.3.6-.6.6H5.3c-.3 0-.6-.3-.6-.6v-11c0-.3.3-.6.6-.6h6.8c.5 0 .9-.4.9-.9s-.4-.9-.9-.9H5.3C4 5.9 3 6.9 3 8.2v10.9c0 1.3 1 2.3 2.3 2.3h10.9c1.3 0 2.3-1 2.3-2.3v-6.8c0-.4-.4-.8-.8-.8z'/>\n</svg>);\n\nconst SvgCompass = svgRenderer(<svg xmlns='http://www.w3.org/2000/svg' class={s.compass} viewBox='0 0 24 24'>\n\t<path d='M16.77 7.098l-6.244 3.387c-.017.01-.03.023-.04.04L7.098 16.77c-.036.083.048.167.13.13l6.245-3.386c.017-.01.03-.023.04-.04L16.9 7.23c.037-.083-.047-.167-.13-.132zM12 13c-.552 0-1-.448-1-1s.448-1 1-1 1 .448 1 1-.448 1-1 1z'/>\n\t<path d='M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9-4.03-9-9-9zm0 15c-.276 0-.5.224-.5.5v.475C8.04 18.73 5.272 15.96 5.025 12.5H5.5c.276 0 .5-.224.5-.5s-.224-.5-.5-.5h-.475C5.272 8.04 8.04 5.272 11.5 5.025V5.5c0 .276.224.5.5.5s.5-.224.5-.5v-.475c3.46.246 6.228 3.014 6.475 6.475H18.5c-.276 0-.5.224-.5.5s.224.5.5.5h.475c-.246 3.46-3.014 6.228-6.475 6.475V18.5c0-.276-.224-.5-.5-.5z'/>\n</svg>);\n\nconst SvgCart = svgRenderer(<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 90 90\">\n\t<circle cx=\"37.673\" cy=\"78.012\" r=\"6.364\"></circle>\n\t<circle cx=\"73.627\" cy=\"78.012\" r=\"6.364\"></circle>\n\t<path d=\"M24.758,18.271L21.76,7.149h-3.333H15.74H8.486c-1.885,0-3.412,1.618-3.412,3.614c0,1.997,1.527,3.615,3.412,3.615h7.735   L31.31,70.337l0.03-0.007h48.65v-7.229H36.845l-1.702-6.312H79.99v-0.112l4.918-34.229L24.758,18.271z M76.483,37.167H63.467   l1.062-9.93l13.249,0.909L76.483,37.167z M44.926,37.167l-2.575-11.451L61.071,27l-1.089,10.167H44.926z M59.719,39.616   l-1.17,10.934H47.937l-2.458-10.934H59.719z M38.745,25.467l2.631,11.699H29.853l-3.381-12.54L38.745,25.467z M33.461,50.55   l-2.948-10.934h11.413l2.459,10.934H33.461z M62.034,50.55l1.171-10.934h12.928L74.565,50.55H62.034z\">\n\t</path>\n</svg>);\n\nconst SvgPlay = svgRenderer(<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"120 200 400 400\">\n\t<path d=\"M179.221,269.221c-70.294,70.294-70.293,184.264,0,254.558s184.265,70.294,254.559,0  c70.293-70.293,70.293-184.265,0-254.558C363.485,198.927,249.514,198.928,179.221,269.221z M408.323,498.324  c-56.235,56.229-147.411,56.231-203.646,0c-56.236-56.235-56.235-147.413,0-203.647c56.236-56.236,147.411-56.235,203.647-0.001  C464.559,350.913,464.559,442.088,408.323,498.324z\"/>\n\t<path d=\"M243.5,324.5c0-9.9,7.168-14.228,15.929-9.617l139.143,73.233c8.761,4.611,8.761,12.156,0,16.767   L259.43,478.115c-8.761,4.609-15.929,0.284-15.929-9.616L243.5,324.5z\"/>\n</svg>);\n\n// For single-use SVG specific to an app, use svgRenderer to avoid making this file too heavy\n// let MySvg = svgRenderer(<svg>your svg markup...</svg>);\n// Then use it as the others\n// <MySvg class={s.myClass} ... />\nexport {\n\tsvgRenderer,\n\tSvgVideos,\n\tSvgSynopsis,\n\tSvgShowtimes,\n\tSvgShare,\n\tSvgLink,\n\tSvgUser,\n\tSvgHeart,\n\tSvgCopy,\n\tSvgEdit,\n\tSvgSearch,\n\tSvgMarker,\n\tSvgStar,\n\tSvgFullScreenOpen,\n\tSvgFullScreenClose,\n\tSvgCarrotDown,\n\tSvgCarrotUp,\n\tSvgSpeaker,\n\tSvgMuted,\n\tSvgImax,\n\tSvgImax3d,\n\tSvgRealD,\n\tSvgTick,\n\tSvgArrowRight,\n\tSvgBin,\n\tSvgTrain,\n\tSvgCar,\n\tSvgGuy,\n\tSvgLinkOut,\n\tSvgCompass,\n\tSvgCart,\n\tSvgPlay,\n\tSVGContent\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/components/shared/svgIcons/svgIcons.js","import Geo from 'models/Geo';\n\n\nexport default class City {\n\n\tconstructor(attr, clientGeo, copy, useEnglishCopy) {\n\t\tthis.name = useEnglishCopy && attr.city_en ? attr.city_en : attr.city;\n\t\tthis.nameEn = attr.city_en || attr.city;\n\t\tthis.localName = attr.city;\n\t\tthis.state = attr.state;\n\n\t\tthis.screeningsCount = +attr.count;\n\n\t\tthis.geo = new Geo({\n\t\t\tlat:         attr.lat,\n\t\t\tlon:         attr.lon,\n\t\t\tcountryCode: attr.country || clientGeo.countryCode,\n\t\t\tcity:        attr.city\n\t\t});\n\t\tthis.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT);\n\t\tthis.distanceUnit = copy.$DISTANCE_UNIT;\n\n\t\t// add other theater attributes here\n\t}\n\n\tmerge(attr, clientGeo) {\n\t\tconst add = +attr.count;\n\t\tconst newCount = this.screeningsCount + add;\n\t\tthis.screeningsCount = newCount;\n\n\t\t// Mean position\n\t\t// const newLat = (this.geo.lat * this.screeningsCount + attr.lat * add) / newCount;\n\t\t// const newLon = (this.geo.lon * this.screeningsCount + attr.lon * add) / newCount;\n\t\t// this.geo.update({ lat: newLat, lon: newLon });\n\t\t//\n\t\t// this.distance = this.geo.distanceFrom(clientGeo, copy.$DISTANCE_UNIT, 1);\n\t\t// this.distanceUnit = copy.$DISTANCE_UNIT;\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/City.js","export default class Exhibitor {\n\n\tconstructor(id, attr) {\n\t\tthis.id = id;\n\n\t\tthis.name = attr.name; // only used for MX so far\n\t\tthis.domain = attr.domain;\n\t\tthis.logo = attr.logo_file;\n\n\t\t// Contains ticketing info, and maybe other things in the future\n\t\tthis.doc = attr.doc;\n\n\t\t// add other theater attributes here\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Exhibitor.js","export default class Format {\n\n\tconstructor(id, attributes) {\n\t\tthis.id = id;\n\t\tObject.assign(this, attributes);\n\t\tthis.name = this.name || '?';\n\t\tthis.label = this.name.toUpperCase(); // use for localised label\n\t\tthis.slug = this.name.toLowerCase().replace(/\\s/g, '');\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Format.js","// import slug from 'slugify';\n\nexport default class Movie {\n\n\tconstructor(id, attr, format) {\n\t\tthis.id = id;\n\t\tthis.title = attr.title;\n\n\t\t// this.slug = slug(attr.title, { lower: true, remove: /[^\\w\\s\\-\\.\\_~]/g });\n\t\t// this.slug = attr.title.toLowerCase().replace(/\\s+/g, '-').replace(/[^-_a-z0-9]/g, '');\n\t\tthis.slug = attr.slug || attr.title.toLowerCase().replace(/\\s+/g, '-').replace(/[^-_a-z0-9]/g, '');\n\n\t\tthis.format = format;\n\n\t\t// add other theater attributes here\n\t\tthis.movietickets = attr.movietickets_movie_id;\n\t\tthis.atom = attr.atom;\n\n\t\tthis.provider_movie_id = attr.provider_movie_id;\n\t\tthis.provider_id = attr.provider_id;\n\n\t\t// this.meta = attr.meta;\n\n\t\tthis.fandango = (attr.meta && attr.meta.movie_code_id) || attr.fandango_movie_id;\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Movie.js","import formatDateTime from 'utils/formatDateTime';\nimport dataProviderToTicketProvider from 'utils/dataProviderToTicketProvider';\n\nconst timeOfDayMapping = {};\n\nlet now = new Date();\nlet tomorrow = new Date();\ntomorrow.setDate(tomorrow.getDate() + 1);\nlet todayStr = formatDateTime(now, 'dd\\\\/MM\\\\/yyyy');\nlet tomorrowStr = formatDateTime(tomorrow, 'dd\\\\/MM\\\\/yyyy');\nlet datesCache = {};\n\nexport default class Screening {\n\tstatic clearDatesCache() {\n\t\tdatesCache = {};\n\t}\n\n\tconstructor(id, attr, movie, appData) {\n\t\tlet copy = appData.copy;\n\n\t\t// Make all attributes from attr available (e.g. time, url, theater_id, cta, ...)\n\t\tObject.assign(this, attr);\n\t\tif (attr.tz_offset) {\n\t\t\tthis.tz_offset = getTZOffsetString(attr.tz_offset);\n\t\t}\n\n\t\tlet ticketProvider = dataProviderToTicketProvider[attr.provider_id];\n\t\tif (ticketProvider) {\n\t\t\tif (!this.srcTicketProviders) {\n\t\t\t\tthis.srcTicketProviders = {};\n\t\t\t}\n\t\t\tthis.srcTicketProviders[ticketProvider] = this.url;\n\t\t\tdelete this.url;\n\t\t}\n\n\t\tthis.id = id;\n\t\tthis.movie = movie;\n\n\t\tthis.providerScreeningId = attr.provider_screening_id;\n\n\t\tthis.setDateTime(attr.date, attr.time, copy);\n\t}\n\n\tgetSTDate(iso, copy, force) {\n\t\t// Force is breaking refs, you should use Screening.clearDatesCache() instead\n\t\tforce = false;\n\t\tif (force || !datesCache.hasOwnProperty(iso)) {\n\t\t\tdatesCache[iso] = new STDate(iso, copy);\n\t\t}\n\t\treturn datesCache[iso];\n\t}\n\n\tcreateDatetime(date, hour, minute) {\n\t\tlet datetime = new Date(date);\n\t\tdatetime.setHours(hour, minute, 0, 0);\n\t\treturn datetime;\n\t}\n\n\tsetDateTime(date, time, copy, force) {\n\t\tthis.date = date;\n\t\tthis.stDate = date && this.getSTDate(date, copy, force);\n\t\tif (time) {\n\t\t\tthis.time24 = time;\n\t\t\tlet timeSplit = time.split(':');\n\t\t\tthis.hour = +timeSplit[0];\n\t\t\tthis.minute = +timeSplit[1];\n\n\t\t\tlet timeOfDay = new TimeOfDay(this.hour, copy);\n\t\t\tif (!force && timeOfDayMapping.hasOwnProperty(timeOfDay.id))\n\t\t\t\tthis.timeOfDay = timeOfDayMapping[timeOfDay.id];\n\t\t\telse {\n\t\t\t\tthis.timeOfDay = (timeOfDayMapping[timeOfDay.id] = timeOfDay);\n\t\t\t}\n\n\t\t\tthis.datetime = this.createDatetime(this.stDate ? this.stDate.date : now, this.hour, this.minute);\n\n\t\t\tif (this.hour <= 2) {\n\t\t\t\tlet nextDay = new Date(date || +now);\n\t\t\t\tnextDay.setDate(nextDay.getDate() + 1);\n\t\t\t\tthis.nextDaySTDate = this.getSTDate(nextDay.toISOString(), copy);\n\t\t\t\tthis.nextDayDatetime = this.createDatetime(this.nextDaySTDate ? this.nextDaySTDate.date : now, this.hour, this.minute);\n\t\t\t} else {\n\t\t\t\tdelete this.nextDaySTDate;\n\t\t\t\tdelete this.nextDayDatetime;\n\t\t\t}\n\n\t\t\tthis.isPast = (this.nextDayDatetime || this.datetime) < now;\n\t\t} else {\n\t\t\tdelete this.time24;\n\t\t\tdelete this.hour;\n\t\t\tdelete this.minute;\n\t\t\tdelete this.timeOfDay;\n\t\t\tdelete this.datetime;\n\t\t\tdelete this.nextDaySTDate;\n\t\t\tdelete this.nextDayDatetime;\n\t\t\tif (this.stDate) {\n\t\t\t\tthis.isPast = this.stDate.date < now;\n\t\t\t}\n\t\t}\n\t}\n\n\toffsetDate(days, months, years, copy) {\n\t\tif (!this.date) return;\n\t\tlet parts = this.date.slice(0, 10).split('-');\n\t\tlet yoff = (+years || 0);\n\t\tlet moff = (+months || 0);\n\t\tlet doff = (+days || 0);\n\t\tlet d = new Date(Date.UTC(+parts[0] + yoff, parts[1] - 1 + moff, +parts[2] + doff));\n\t\tthis.setDateTime(d.toISOString(), this.time24, copy);\n\t}\n}\n\nexport class STDate {\n\tconstructor(dateStr, copy) {\n\t\t//2016-08-04\n\t\tlet year = +dateStr.slice(0,4);\n\t\tlet month = +dateStr.slice(5,7);\n\t\tlet day = +dateStr.slice(8,10);\n\t\tlet date = new Date(year, month - 1, day);\n\n\t\t//  TESTING: REMOVE THIS\n\t\t// date.setDate(date.getDate() + ~~(Math.random() * 10));\n\t\t// !!!!!!!!!!!!!!!!!\n\t\tthis.id = date.valueOf();\n\t\tthis.date = date;\n\n\t\t// this.dayShort = copy.$DATETIME_LOCALE.$DAYS_SHORT[date.getDay()];\n\t\t// this.monthShort = copy.$DATETIME_LOCALE.$MONTHS_SHORT[date.getMonth()];\n\t\t// this.dateNum = ('00'+date.getDate()).slice(-2);\n\t\t// We could format only where needed\n\t\tthis.dayShort = formatDateTime(date, 'ddd', copy.$DATETIME_LOCALE);\n\t\tthis.monthShort = formatDateTime(date, 'MMM', copy.$DATETIME_LOCALE);\n\t\tthis.dateNum = formatDateTime(date, 'dd', copy.$DATETIME_LOCALE);\n\t\t// \\\\/ because we always want an actual '/' instead of the locale date separator (which is a / anyway because we don't pass a locale)\n\t\tthis.ddmmyyyy = formatDateTime(date, 'dd\\\\/MM\\\\/yyyy');\n\t\tthis.yyyymmdd = formatDateTime(date, 'yyyy-MM-dd');\n\n\t\tthis.label = formatDateTime(date, copy.$DATE_FILTER_FORMAT || 'ddd MMMMM dd', copy.$DATETIME_LOCALE);\n\t\t// this.label = this.dayShort + ' ' + this.monthShort.toUpperCase() + ' ' + this.dateNum;\n\n\t\tif (this.ddmmyyyy === todayStr) {\n\t\t\tthis.label = copy.$TODAY;\n\t\t} else if (this.ddmmyyyy === tomorrowStr) {\n\t\t\tthis.label = copy.$TOMORROW;\n\t\t}\n\t}\n}\n\nclass TimeOfDay {\n\tconstructor(hour24, copy) {\n\t\tthis.id = getTimeOfDayId(hour24);\n\t\tthis.label = copy[this.id];\n\t}\n}\n\nfunction getTimeOfDayId(hour24) {\n\tif (hour24 >= 22 || hour24 <= 3) {\n\t\treturn '$LATE';\n\t} else if (hour24 >= 18 && hour24 < 22) {\n\t\treturn '$EVENING';\n\t} else if (hour24 >= 12 && hour24 < 18) {\n\t\treturn '$AFTERNOON';\n\t} else if (hour24 > 3 && hour24 < 12) {\n\t\treturn '$MORNING';\n\t} else {\n\t\treturn '$UNKNOWN';\n\t}\n}\n\nfunction getTZOffsetString(offset) {\n\tlet sign = (offset.hours && offset.hours < 0) || (offset.minutes && offset.minutes < 0) ? '-' : '+';\n\tlet hours = offset.hours ? Math.abs(offset.hours) : 0;\n\thours = hours < 10 ? `0${hours}` : hours.toString();\n\tlet minutes = offset.minutes ? Math.abs(offset.hours) : 0;\n\tminutes = minutes < 10 ? `0${minutes}` : minutes.toString();\n\n\treturn `${sign}${hours}:${minutes}`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/models/Screening.js","import qs from 'qs';\nimport { defaultGateway } from 'store/ticketingPublic';\nimport { joinPaths, accessNested } from 'utils/utils';\nimport { getPiwikId } from 'utils/clientUtils';\nimport { handleApiResponse } from 'utils/handleApi';\nimport deserialise from 'utils/deserialise';\n\n\nconst IS_DEMO = typeof window !== 'undefined' && window.__INITIAL_STATE__ &&\n\twindow.__INITIAL_STATE__.appData.options.isDemoTicketing;\n\n// const API_BASE = 'http://ticketing.docker.labs:60080/mxt';\n// const API_BASE_DEV = 'https://labs.powster.com/mxt';\n// const API_BASE = 'http://ticketing.192.168.1.11.xip.io/mxt';\n// const API_BASE_DEV = 'https://live-ticketing.labs.powster.io/mxt';\nconst API_BASE_DEV = 'https://ticketing.staging.ticketing.powster.io/mxt'; // since 19-03-2018\nconst API_BASE_PROD = 'https://ticketing.powster.com/mxt';\nconst API_BASE = IS_DEMO ? API_BASE_DEV : API_BASE_PROD;\n// const API_BASE = 'http://ticketing.docker.localhost:60080/mxt'; // When working locally\n// const API_BASE = 'http://192.168.1.24:5000/mxt'; // When working locally\n\nconst API_HEADERS = {\n\t'Accept':       'application/vnd.api+json',\n\t'Content-Type': 'application/vnd.api+json'\n};\n\n\nlet dummyExhibitor = '00000000-0000-0000-0000-000000000000';\nlet dummyTheater   = '00000000-0000-0000-0000-000000000000';\nlet dummyScreening = '00000000-0000-0000-0000-000000000000';\n\n// Load in test data\nif (IS_DEMO) {\n\tconst params = qs.parse(window.location.search.substr(1));\n\tconst gateway = params.gateway !== undefined ? params.gateway : defaultGateway;\n\tconst seating = params.seating === 'false' ? false : true;\n\tgetTestData(seating, gateway);\n}\n\n/**\n * @typedef {Object} App\n * @property {!string} studio - the studio slug\n * @property {!string} movie - the movie slug\n * @property {!string} region - the region slug\n */\n\n/**\n * Return an objet representing the application.\n *\n * @return {App} the app object\n */\nconst getApp = () => {\n\tconst meta = accessNested(__INITIAL_STATE__, 'appData.meta');\n\tif (!meta) return;\n\n\tconst studio = accessNested(meta, 'studio.slug');\n\tconst movie = accessNested(meta, 'title.slug');\n\tconst region = accessNested(meta, 'region.slug');\n\tif (!studio || !movie || !region) return;\n\n\treturn { studio, movie, region };\n};\n\n/**\n * @typedef {Object} TicketingAnalytics\n * @property {!string} piwikId - the Piwik id, taken from the cookies\n * @property {!string} referrer - the page referrer (unchanged)\n * @property {!string} device - the type of device of the user\n * @property {string} campaign - the campaign tag, taken from the query string\n */\n\n/**\n * Return an object with stats for the ticketing database.\n *\n * @return {TicketingAnalytics} an object containing analytics information\n */\nconst getAnalytics = () => {\n\tconst piwikId = getPiwikId();\n\tconst referrer = document.referrer;\n\n\tconst deviceWidth = window.innerWidth;\n\tconst device = deviceWidth > 1024 ? 'desktop' : deviceWidth > 768 ? 'tablet' : 'phone';\n\n\tconst params = qs.parse(window.location.search.substr(1));\n\tconst campaign = params.campaign;\n\n\tconst analytics = { piwikId, referrer, device };\n\tif (typeof campaign === 'string') analytics.campaign = campaign;\n\n\treturn analytics;\n};\n\n\n/* Api interaction\n---------------------------*/\n\n// TODO: We need some catch() overhere!\n\nconst apiGet = (apiPath) => {\n\treturn fetch(joinPaths(API_BASE, apiPath), {\n\t\tmethod:  'GET',\n\t\theaders: API_HEADERS\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(deserialise);\n};\n\nconst apiPost = (apiPath, body) => {\n\treturn fetch(joinPaths(API_BASE, apiPath), {\n\t\tmethod:  'POST',\n\t\theaders: API_HEADERS,\n\t\tbody:    JSON.stringify(body)\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(deserialise);\n};\n\nconst apiDelete = (apiPath, body) => {\n\treturn fetch(joinPaths(API_BASE, apiPath), {\n\t\tmethod:  'DELETE',\n\t\theaders: API_HEADERS,\n\t\tbody:    JSON.stringify(body)\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(deserialise);\n};\n\nconst apiPut = (apiPath, body) => {\n\treturn fetch(joinPaths(API_BASE, apiPath), {\n\t\tmethod:  'PUT',\n\t\theaders: API_HEADERS,\n\t\tbody:    JSON.stringify(body)\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(deserialise);\n};\n\nconst apiPatch = (apiPath, body) => {\n\treturn fetch(joinPaths(API_BASE, apiPath), {\n\t\tmethod:  'PATCH',\n\t\theaders: API_HEADERS,\n\t\tbody:    JSON.stringify(body)\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(deserialise);\n};\n\nfunction getTestData(seating, gateway) {\n\tconst query = { seating, gateway };\n\n\tfetch(joinPaths(API_BASE, '/devget?' + qs.stringify(query)), {\n\t\tmethod: 'GET',\n\t\theaders: API_HEADERS\n\t})\n\t\t.then(handleApiResponse)\n\t\t.then(response => {\n\t\t\tconst dummy = response.data[0];\n\t\t\tif (dummy) {\n\t\t\t\tdummyExhibitor = dummy.provider_exhibitor_id;\n\t\t\t\tdummyTheater   = dummy.provider_theater_id;\n\t\t\t\tdummyScreening = dummy.provider_screening_id;\n\t\t\t}\n\t\t});\n}\n\n\n/* Ticket Types\n---------------------------*/\n\nexport const getTicketTypes = (exhibitorId, screeningId, authToken) => {\n\tconst query = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId\n\t};\n\n\tif (authToken) query.token = authToken;\n\n\treturn apiGet(`/ticket_types?${qs.stringify(query)}`);\n};\n\n\n/* Orders\n---------------------------*/\n\nexport const createOrder = (exhibitorId, theaterId, screeningId, seatingSupported, tickets,\n\tauthToken) => {\n\n\tif (!Array.isArray(tickets)) {\n\t\t// make it an array if it's an object\n\t\ttickets = Object.keys(tickets).map(key => tickets[key]);\n\t}\n\n\t// Let's get what we need for the push\n\tconst orderTickets = tickets.map(ticket => {\n\t\treturn {\n\t\t\ttype:     ticket.type,\n\t\t\tquantity: ticket.quantity\n\t\t};\n\t});\n\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater:   IS_DEMO ? dummyTheater : theaterId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\tapp:       getApp(),\n\t\tseating:   seatingSupported,\n\t\ttickets:   orderTickets,\n\t\tanalytics: getAnalytics()\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/order?nocache=' + Math.random(), body);\n};\n\nexport const updateTickets = (exhibitorId, screeningId, orderId, seatingSupported,\n\tticketsToAdd, ticketIdsToRemove, authToken) => {\n\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder:     orderId,\n\t\tseating:   seatingSupported\n\t};\n\n\tif (Array.isArray(ticketsToAdd) && ticketsToAdd.length > 0) {\n\t\tbody.ticketsToAdd = ticketsToAdd;\n\t}\n\tif (Array.isArray(ticketIdsToRemove) && ticketIdsToRemove.length > 0) {\n\t\tbody.ticketIdsToRemove = ticketIdsToRemove;\n\t}\n\tif (authToken) body.token = authToken;\n\n\treturn apiPatch('/tickets?nocache=' + Math.random(), body);\n};\n\nexport const cancelOrder = (exhibitorId, orderId, authToken, async = false) => {\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\torder:     orderId\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\t// We need to send it as a synchronous call because this function gets called on unload\n\t// it won't finish the call if the call is async...\n\t// TODO: make this async if needed (for the close button)\n\tif (async) {\n\t\treturn apiDelete('/order', body);\n\t} else {\n\t\tconst xhr = new XMLHttpRequest();\n\t\txhr.open('DELETE', joinPaths(API_BASE, '/order'), false);\n\t\txhr.setRequestHeader('Accept', 'application/vnd.api+json');\n\t\txhr.setRequestHeader('Content-Type', 'application/vnd.api+json');\n\t\txhr.send(JSON.stringify(body));\n\t}\n};\n\nexport const addTickets = (exhibitorId, screeningId, orderId, seatingSupported, ticketsToAdd) => {\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder:     orderId,\n\t\tseating:   seatingSupported,\n\t\ttickets:   ticketsToAdd\n\t};\n\n\treturn apiPost('/tickets?nocache=' + Math.random(), body);\n};\n\nexport const removeTickets = (exhibitorId, screeningId, orderId, seatingSupported, ticketIdsToRemove) => {\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder:     orderId,\n\t\tseating:   seatingSupported,\n\t\tids:       ticketIdsToRemove\n\t};\n\n\treturn apiDelete('/tickets?nocache=' + Math.random(), body);\n};\n\n\n/* Seats\n---------------------------*/\n\nexport const updateSeats = (exhibitorId, screeningId, orderId, seats, authToken) => {\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder:     orderId,\n\t\tseats:     seats\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPut('/seats', body);\n};\n\nexport const getSeatingMap = (exhibitorId, screeningId, orderId, authToken) => {\n\tconst body = {\n\t\texhibitor: IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\tscreening: IS_DEMO ? dummyScreening : screeningId,\n\t\torder:     orderId\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiGet(`/seat_map?${qs.stringify(body)}`);\n};\n\n\n/* Transaction\n---------------------------*/\n\nexport const startTransaction = (exhibitorId, theaterId, orderId, paymentArgs,\n\tname = '', email = '', address = '', zip = '', city = '', loyaltyNumber = '', authToken) => {\n\n\tconst body = {\n\t\texhibitor:   IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater:     IS_DEMO ? dummyTheater : theaterId,\n\t\torder:       orderId,\n\t\tpaymentArgs: paymentArgs\n\t};\n\n\tif (typeof name === 'string' && name.length > 0) {\n\t\tbody.name = name;\n\t}\n\tif (typeof email === 'string' && email.length > 0) {\n\t\tbody.email = email;\n\t}\n\tif (typeof address === 'string' && address.length > 0) {\n\t\tif (address.length > 36) {\n\t\t\tbody.address1 = address.substring(0, 36);\n\t\t\tbody.address2 = address.substring(36, 72);\n\t\t} else {\n\t\t\tbody.address1 = address;\n\t\t}\n\t}\n\tif (typeof zip === 'string' && zip.length > 0) {\n\t\tbody.zip = zip;\n\t}\n\tif (typeof city === 'string' && city.length > 0) {\n\t\tbody.city = city;\n\t}\n\tif (typeof loyaltyNumber === 'string' && loyaltyNumber.length > 0) {\n\t\tbody.loyalty = loyaltyNumber;\n\t}\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/start_transaction?nocache=' + Math.random(), body);\n};\n\nexport const completeOrder = (exhibitorId, theaterId, orderId, paymentResponse, authToken) => {\n\tconst body = {\n\t\texhibitor:       IS_DEMO ? dummyExhibitor : exhibitorId,\n\t\ttheater:         IS_DEMO ? dummyTheater : theaterId,\n\t\torder:           orderId,\n\t\tpaymentResponse: paymentResponse\n\t};\n\n\tif (authToken) body.token = authToken;\n\n\treturn apiPost('/complete_order?nocache=' + Math.random(), body);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/services/mxApi.js","/**\n * Controller for all ticketing interactions\n *\n * @module ticketing/controller\n */\n\nimport qs from 'qs';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport {\n\tisDemoTicketing,\n\tgateways,\n\tdefaultGateway,\n\tseatStatus,\n\tmxErrors,\n\tgetMxErrorKey,\n\tisMxErrorObject,\n\tpowErrors,\n\tgetPowErrorKey,\n\tisPowErrorObject,\n\tgetFallbackUrl,\n\tareSeatPositionsEqual,\n\tareSeatsEqual,\n\tisWheelchair,\n\tisCompanionSeat,\n\tisSeatForDisablePeople,\n\tgetSeats,\n\tgetPickedSeats,\n\tfindWheelchairInGroup,\n\tgetSeatLayoutBoundingBox,\n\tgetIframeCommunicatorUrl\n} from 'store/ticketingPublic';\nimport { track } from 'utils/tracking';\nimport TimeTracker from 'utils/timeTracker';\nimport { getCopy } from 'utils/copy';\nimport { isObject, accessNested, joinPaths, pathOnly } from 'utils/utils';\nimport * as mxApi from 'services/mxApi';\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Constants\n\n/** UI States */\nexport const NOT_ACTIVE      = 'NOT_ACTIVE';\nexport const SELECT_TICKETS  = 'SELECT_TICKETS';\nexport const SELECT_SEATS    = 'SELECT_SEATS';\nexport const REVIEW          = 'REVIEW';\nexport const CONTACT_DETAILS = 'CONTACT_DETAILS';\nexport const PAYMENT         = 'PAYMENT';\nexport const COMPLETE        = 'COMPLETE';\nexport const ERROR           = 'ERROR';\n\n/** Order of UI States */\nexport const ticketingOrder = [NOT_ACTIVE, SELECT_TICKETS, SELECT_SEATS, REVIEW, CONTACT_DETAILS,\n\tPAYMENT, COMPLETE];\n\n/** The number of decimals for the heatmap position vectors */\nconst HEATMAP_FLOAT_PRECISION = 7;\n\n/** The number of decimals for the theater occupancy */\nconst OCCUPANCY_FLOAT_PRECISION = 4;\n\n/** The default time allowed to book a ticket (seconds) */\nconst DEFAULT_BOOKING_TIMEOUT_S = 300;\n\n/** Tracking of loading times */\nconst timeTracker = new TimeTracker('ticketing-');\n\nconst DWELL_TIME                     = 'dwell-time';\nconst LOADING_TIME_TICKET_TYPES      = 'loading-time-ticket-types';\nconst LOADING_TIME_CREATE_ORDER      = 'loading-time-create-order';\nconst LOADING_TIME_UPDATE_ORDER      = 'loading-time-update-order';\nconst LOADING_TIME_UPDATE_SEATS      = 'loading-time-update-seats';\nconst LOADING_TIME_FLUSH_LAYOUT      = 'loading-time-flush-layout';\nconst LOADING_TIME_START_TRANSACTION = 'loading-time-start-transaction';\nconst LOADING_TIME_PAYMENTS          = 'loading-time-payments';\nconst LOADING_TIME_COMPLETE_ORDER    = 'loading-time-complete-order';\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Event list\n\nStore.on(actions.OPEN_TICKETING              , openTicketing);\nStore.on(actions.REOPEN_TICKETING            , reopenTicketing);\nStore.on(actions.GO_TICKETING_TYPES          , goToTicketingTypes);\nStore.on(actions.UPDATE_TICKET_TYPE_QUANTITY , updateTicketTypeQuantity);\nStore.on(actions.CREATE_OR_UPDATE_ORDER      , createOrUpdateOrder);\nStore.on(actions.GO_TICKETING_SEATING        , goToTicketingSeating);\nStore.on(actions.PICK_OR_UNPICK_SEATS        , pickOrUnpickSeats);\nStore.on(actions.UPDATE_TICKETING_SEATS      , updateTicketingSeats);\nStore.on(actions.FLUSH_SEAT_LAYOUT           , flushSeatLayout);\nStore.on(actions.GO_TICKETING_REVIEW         , goToTicketingReview);\nStore.on(actions.GO_TICKETING_CONTACT_DETAILS, goToTicketingContactDetails);\nStore.on(actions.GO_TICKETING_PAYMENT        , goToTicketingPayment);\nStore.on(actions.PAYMENT_MESSAGE_RECEIVED    , onPaymentMessageReceived);\nStore.on(actions.SET_TICKETING_MESSAGE       , setTicketingMessage);\nStore.on(actions.CLEAR_TICKETING_MESSAGE     , clearTicketingMessage);\nStore.on(actions.GO_TICKETING_TIMEOUT        , goToTicketingTimeout);\nStore.on(actions.CLOSE_TICKETING             , closeTicketing);\nStore.on(actions.CLOSE_APP                   , closeApp);\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Payment gateways constants\n\n// Authorize.net speicific messages while in payment\nconst AUTHNET_MSG_RESIZE_WINDOW        = 'resizeWindow';\nconst AUTHNET_MSG_CANCEL               = 'cancel';\nconst AUTHNET_MSG_TRANSACTION_RESPONSE = 'transactResponse';\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing sessions\n\n/**\n * The current ticketing session identifier.\n * This identifier will ensure that any response we're receiving from the server is about the\n * current session and not a previously created session.<br>\n * <br>\n * For example, if you send a request to create an order and then open a new ticketing session\n * before you actually receive the response, you need to ignore the response when it arrives,\n * because the response is about the outdated session.\n */\nlet _sessionId = 1;\n\n/**\n * Open a new ticketing session:\n * <ol>\n *   <li>create a new ticketing state object in `showtimes`</li>\n *   <li>display the \"SELECT_TICKETS\" pane</li>\n * </ol>\n *\n * @param {Object} data - data received by the \"OPEN_TICKETING\" event\n * @property {Theater} data.theater - the currently active theater\n * @property {Screening} data.screening - the currently active screening\n */\nfunction openTicketing({ theater, screening }) {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\n\t// TODO: We MUST check if a ticketing session is already opened, then close it.\n\t//       event if everything has been built to avoid this situation!\n\n\ttrack({ a: 'ticketing-open' });\n\ttimeTracker.start(DWELL_TIME);\n\n\tlet seatingSupported = accessNested(screening, 'doc.isAllocatedSeating');\n\tif (typeof seatingSupported === 'undefined') {\n\t\tseatingSupported = !!accessNested(screening, 'doc.is_allocated_seating', true);\n\t}\n\n\tlet paymentGateway = accessNested(theater, 'exhibitor.doc.payment.gateway', defaultGateway);\n\tlet loyaltyEnabled = !!accessNested(theater, 'exhibitor.doc.ticketing.loyalty.enabled');\n\tlet termsUrl       = accessNested(theater, 'exhibitor.doc.legals.termsUrl');\n\tlet privacyUrl     = accessNested(theater, 'exhibitor.doc.legals.privacyUrl');\n\n\t// Override exhibitor properties with theater's own properties\n\tconst theaterPaymentGateway = accessNested(theater, 'doc.payment.gateway');\n\tconst theaterLoyaltyEnabled = accessNested(theater, 'doc.ticketing.loyalty.enabled');\n\tconst theaterTermsUrl       = accessNested(theater, 'doc.legals.termsUrl');\n\tconst theaterPrivacyUrl     = accessNested(theater, 'doc.legals.privacyUrl');\n\n\tif (typeof theaterPaymentGateway !== 'undefined') paymentGateway = theaterPaymentGateway;\n\tif (typeof theaterLoyaltyEnabled !== 'undefined') loyaltyEnabled = !!theaterLoyaltyEnabled;\n\tif (typeof theaterTermsUrl       !== 'undefined') termsUrl       = theaterTermsUrl;\n\tif (typeof theaterPrivacyUrl     !== 'undefined') privacyUrl     = theaterPrivacyUrl;\n\n\tif (!termsUrl) console.warn('There is no terms and conditions link setup for this exhibitor');\n\tif (!privacyUrl) console.warn('There is no privacy policy link setup for this exhibitor');\n\n\t// Override payment gateway and seating in demo mode\n\tif (isDemoTicketing()) {\n\t\tconst params = qs.parse(window.location.search.substr(1));\n\t\tif (params.seating !== undefined) seatingSupported = params.seating !== 'false';\n\t\tif (params.gateway !== undefined) paymentGateway = params.gateway;\n\t}\n\n\tticketing.set({\n\t\tsessionId:        _sessionId,\n\t\ttheaterId:        theater.id,\n\t\ttheaterMxId:      theater.providerTheaterId,\n\t\texhibitorId:      accessNested(theater, 'exhibitor.id'),\n\t\tscreeningId:      screening.id,\n\t\tscreeningMxId:    screening.provider_screening_id,\n\t\t// ^ NOTE: screening.id and screening.provider_screening_id used to be the same.\n\t\t//         For all MX related stuff, use the screeningMxId\n\t\tmeta: {\n\t\t\tmovieTitle:     accessNested(screening, 'movie.title'),\n\t\t\tmovieFormat:    accessNested(screening, 'movie.format.label'),\n\t\t\tmovieDate:      screening.nextDayDatetime || screening.datetime,\n\t\t\ttheaterName:    theater.name,\n\t\t\ttheaterAddress: accessNested(theater, 'location.fullAddress'),\n\t\t\texhibitorName:  accessNested(theater, 'exhibitor.name'),\n\t\t\ttermsUrl:       termsUrl,\n\t\t\tprivacyUrl:     privacyUrl\n\t\t},\n\t\tstate:            SELECT_TICKETS,\n\t\tseatingSupported: seatingSupported,\n\t\tpaymentGateway:   paymentGateway,\n\t\tloyaltyEnabled:   loyaltyEnabled,\n\t\tstartDate:        Date.now(),\n\t\tsavedTickets:     null,\n\t\tfallbackUrl:      getFallbackUrl(theater, screening),\n\t\tisDemo:           isDemoTicketing()\n\t});\n\n\tStore.emit(actions.GO_TICKETING_TYPES);\n}\n\n/**\n * Reopen a previously opened ticketing session\n * The session will only be reopened if the session was opened before (= has all the necessary\n * infos available).\n *\n * This function will redirect the user to the ticket booking or the seating section based on the\n * previous state.\n */\nfunction reopenTicketing() {\n\tlet ticketing = Store.get().showtimes.ticketing;\n\n\t// If session is up to date, no need to reopen\n\tif (ticketing.sessionId === _sessionId) return;\n\n\t// Check that basic info are there\n\tif (!ticketing.theaterId || !ticketing.exhibitorId) return;\n\tif (!ticketing.screeningMxId && !isDemoTicketing()) return;\n\n\tif (!ticketing.hasOwnProperty('seatingSupported')) return;\n\tif (!ticketing.hasOwnProperty('paymentGateway')) return;\n\n\t// Reopen accepted: update the sessionId\n\tticketing = ticketing.set({\n\t\tsessionId: _sessionId,\n\t\tstartDate: Date.now()\n\t});\n\n\t// Recover saved tickets\n\tif (ticketing.hasOwnProperty('savedTickets') && isObject(ticketing.savedTickets)) {\n\t\tticketing = ticketing.set('tickets', ticketing.savedTickets.toJS());\n\t}\n\n\t// Redirect the user:\n\t// if there are some selected seats, we can directly go to the seating pane.\n\tconst hasAlreadyBookedTickets = ticketing.hasOwnProperty('pickedSeats');\n\tStore.emit(hasAlreadyBookedTickets ? actions.GO_TICKETING_SEATING : actions.GO_TICKETING_TYPES);\n}\n\n/**\n * Clear the ticketing session:\n * (1) cancel the order, if any\n * (2) reset the ticketing state\n *\n * This function does not make any change to the UI, you need to redirect the user afterward.\n *\n * @param {boolean=} async - whether the cancel order request should be asynchronous or not\n * @return {boolean} true if an order was cancelled, false otherwise\n */\nfunction clearTicketingSession(async = true) {\n\tlet orderCancelled = false;\n\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\n\tconst { exhibitorId, order } = ticketing;\n\n\t// User just left ticketing\n\ttimeTracker.end(DWELL_TIME);\n\n\t// Make sure the loading is closed\n\tticketing = ticketing.set({\n\t\tapiLoading:         false,\n\t\tapiMessage:         '',\n\t\tapiMessageCallback: undefined\n\t});\n\n\t// Cancel the order in case it was created but not complete\n\tconst orderComplete = !!accessNested(ticketing, 'payment.bookingId');\n\tif (ticketing.order && !orderComplete) {\n\t\tmxApi.cancelOrder(exhibitorId, order.orderId, authToken, async);\n\t\torderCancelled = true;\n\n\t\t// Save tickets for eventual future recovering\n\t\tif (ticketing.hasOwnProperty('tickets') && isObject(ticketing.tickets)) {\n\t\t\tticketing = ticketing.set('savedTickets', ticketing.tickets.toJS());\n\t\t}\n\n\t\tticketing = ticketing.remove(['order', 'timeout', 'allowedTime', 'startDate']);\n\t}\n\n\tif (ticketing.tickets) ticketing = ticketing.remove('tickets');\n\n\t// Clear all pending loading times\n\ttimeTracker.clearAll();\n\n\t_sessionId++;\n\t// ^ now this session is now outdated until we call openTicketing() OR reopenTicketing()\n\n\treturn orderCancelled;\n}\n\n/**\n * Set the ticketing message to display to the user.\n *\n * @param {!Object} data - the event data\n * @property {!string} data.message - the message to show to the user\n * @property {Function=} data.callback - optional function to call when the message box is closed\n */\nfunction setTicketingMessage({ message, callback }) {\n\tif (callback && typeof callback !== 'function') {\n\t\tcallback = undefined;\n\t}\n\tStore.get().showtimes.ticketing.set({\n\t\tapiMessage: message,\n\t\tapiMessageCallback: callback\n\t});\n}\n\n/**\n * Hide the ticketing message.\n * This function will clear both the `apiMessage` and the `apiMessageCallback`.\n */\nfunction clearTicketingMessage() {\n\tStore.get().showtimes.ticketing.set({\n\t\tapiMessage: '',\n\t\tapiMessageCallback: undefined\n\t});\n}\n\n/**\n * Close the ticketing pane.\n * This function clears the ticketing session and prepare the ticketing state for the next session.\n *\n * Note that, after calling this function, the ticketing state will still exist to keep the\n * previously ordered tickets (if any), so you don't have to re-enter your tickets again.\n */\nfunction closeTicketing() {\n\tlet ticketing = Store.get().showtimes.ticketing;\n\tconst wasLoading = ticketing.apiLoading;\n\tconst lastStep = ticketing.state;\n\n\tif (!lastStep || lastStep === NOT_ACTIVE) return;\n\n\ttrack({ a: 'ticketing-close' });\n\n\tif (wasLoading) {\n\t\ttrack({ a: 'ticketing-close-while-loading' });\n\t}\n\n\tclearTicketingSession();\n\n\tlet showtimes = Store.get().showtimes;\n\tticketing = showtimes.ticketing;\n\n\tconst newTicketing = {\n\t\tsessionId: ticketing.sessionId,\n\t\tstate:     NOT_ACTIVE,\n\t\tauthToken: ticketing.authToken\n\t};\n\n\t// Add in the previously ordered tickets, if any\n\tif (ticketing.tickets) {\n\t\tnewTicketing.tickets = ticketing.tickets;\n\t}\n\n\tif (lastStep === SELECT_SEATS && ticketing.seatingSupported && ticketing.seating) {\n\t\t// Here, the user might give up because there's not enough free seats\n\t\t// So let's track the theater's occupancy\n\t\ttrack({\n\t\t\ta: 'ticketing-close-occupancy',\n\t\t\tl: getTheaterOccupancy(ticketing.seating).toFixed(OCCUPANCY_FLOAT_PRECISION)\n\t\t});\n\t}\n\n\tshowtimes = showtimes.remove('ticketing');\n\tshowtimes.set('ticketing', newTicketing);\n}\n\n/**\n * Called when the page is closed.\n * This function cancel a previously created order synchronously to make sure the request is sent\n * before the page is closed.\n */\nfunction closeApp() {\n\tconst ticketing = accessNested(Store.get(), 'showtimes.ticketing');\n\tif (!ticketing) return;\n\n\tif (!ticketing.state || ticketing.state === NOT_ACTIVE) return;\n\n\ttrack({ a: 'ticketing-close' });\n\ttrack({ a: 'ticketing-close-app' });\n\n\tif (ticketing.order) {\n\t\tclearTicketingSession(false);\n\t\t// ^ synchronous, but intentional\n\t}\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticket types\n\n/**\n * Loads ticket types for the screening stored in the ticketing state then\n * display the \"SELECT_TICKETS\" pane, with the tickets available for that screening.\n */\nfunction goToTicketingTypes() {\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tconst { ticketing } = store.showtimes;\n\n\tif (ticketing.ticketTypes) {\n\t\t// We already have ticket types, no need to ask for them again\n\t\tticketing.set({ state: SELECT_TICKETS });\n\t\treturn;\n\t}\n\n\tconst { exhibitorId, screeningMxId } = ticketing;\n\n\tticketing.set({\n\t\tstate:      SELECT_TICKETS,\n\t\tapiLoading: true\n\t});\n\n\ttimeTracker.start(LOADING_TIME_TICKET_TYPES);\n\n\tmxApi.getTicketTypes(exhibitorId, screeningMxId, authToken).then((data) => {\n\t\ttimeTracker.end(LOADING_TIME_TICKET_TYPES);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tlet ticketTypes;\n\t\tlet maxTickets;\n\t\tif (isObject(data) && data.ticketTypes) {\n\t\t\t({ ticketTypes, maxTickets } = data);\n\t\t} else {\n\t\t\tticketTypes = data;\n\t\t}\n\n\t\tif (ticketTypes.length === 0) {\n\t\t\tgoToError(getCopy('NO_TICKET_AVAIL_AT_THE_MOMENT'));\n\t\t\treturn;\n\t\t}\n\n\t\tlet updatedTicketing = Store.get().showtimes.ticketing;\n\n\t\tupdatedTicketing = updatedTicketing.set({\n\t\t\tticketTypes,\n\t\t\tapiLoading:  false\n\t\t});\n\n\t\tif (maxTickets) {\n\t\t\tupdatedTicketing.set('maxTickets', maxTickets);\n\t\t}\n\n\t\ttrack({ a: 'ticketing-go-types' });\n\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_TICKET_TYPES);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Helper to generate a 41001 MX error.\n */\n/* eslint-disable no-unused-vars */\nconst requestLotOfTicketsToKillMx = () => {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst { ticketTypes } = ticketing;\n\tif (!ticketTypes) return;\n\tconst tickets = isObject(ticketing.tickets) ? ticketing.tickets.toJS() : {};\n\n\tticketTypes.forEach((ticketType) => {\n\t\ttickets[ticketType.id] = {\n\t\t\ttype:     ticketType.id,\n\t\t\tquantity: Math.round(573 + Math.random() * 1142)\n\t\t};\n\t});\n\n\tticketing.set({ tickets });\n};\n/* eslint-enable no-unused-vars */\n\n// if (typeof window !== 'undefined') {\n// \twindow.requestLotOfTicketsToKillMx = requestLotOfTicketsToKillMx;\n// }\n\n/**\n * Update the quantity for a certain ticket type inside the ticketing state.\n *\n * @param {Object} data - data received by the \"UPDATE_TICKET_TYPE_QUANTITY\" event\n * @param {string} data.ticketTypeId - id of the ticket type\n * @param {string} data.quantity - the new quantity of the ticket type\n */\nfunction updateTicketTypeQuantity({ ticketTypeId, quantity }) {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst { ticketTypes } = ticketing;\n\tlet { tickets } = ticketing;\n\n\tif (!ticketTypes) return;\n\n\tconst ticketType = ticketing.ticketTypes.find((ticketType) => ticketType.id === ticketTypeId);\n\n\tif (!tickets) {\n\t\ttickets = ticketing.set('tickets', {}).tickets;\n\t}\n\n\ttrack({\n\t\ta: 'ticketing-change-type-quantity',\n\t\tl: ticketType.description\n\t});\n\n\t// Do we already have a ticket saved for that type\n\tif (tickets[ticketTypeId]) {\n\t\tif (quantity === 0) {\n\t\t\ttickets.remove(ticketTypeId);\n\t\t} else {\n\t\t\ttickets[ticketTypeId].set({ quantity });\n\t\t}\n\n\t} else {\n\t\tif (quantity === 0) return;\n\n\t\ttickets.set(ticketTypeId, {\n\t\t\ttype:               ticketTypeId,\n\t\t\tquantity:           quantity,\n\t\t\tdescription:        ticketType.description,\n\t\t\tprice:              ticketType.price,\n\t\t\tareaCategoryCode:   ticketType.areaCategoryCode,\n\t\t\tisAllocatedSeating: ticketType.isAllocatedSeating\n\t\t});\n\t}\n}\n\n/**\n * Return the total price of the order.\n *\n * @function\n * @param {Object=} ticketing - the ticketing state\n * @return {!string} the total price of the order, including the booking fee.\n */\nexport const getOrderTotalPrice = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst tickets = ticketing.tickets;\n\tlet totalPrice = 0;\n\n\tfor (const type in tickets) {\n\t\tconst ticket = tickets[type];\n\t\ttotalPrice += ticket.price * ticket.quantity;\n\t}\n\n\ttotalPrice += ticketing.order.bookingFee;\n\n\treturn totalPrice.toFixed(2);\n};\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ordering tickets\n\n/**\n * Return whether 2 ticket sets are equals.\n *\n * @param {Object} tickets1 - the first ticket set\n * @param {Object} tickets2 - the second ticket set\n * @return {boolean} true if ticket sets are equals, false otherwise\n */\nfunction areTicketsEqual(tickets1, tickets2) {\n\tconst ticketIds = new Set();\n\n\tfor (const ticketId in tickets1) {\n\t\tticketIds.add(ticketId);\n\t\tif (!tickets2[ticketId]) return false;\n\t}\n\n\tfor (const ticketId in tickets2) {\n\t\tticketIds.add(ticketId);\n\t\tif (!tickets1[ticketId]) return false;\n\t}\n\n\tfor (const ticketId of ticketIds) {\n\t\tconst ticketType1 = tickets1[ticketId];\n\t\tconst ticketType2 = tickets2[ticketId];\n\n\t\tif (ticketType1.areaCategoryCode !== ticketType2.areaCategoryCode) return false;\n\t\tif (ticketType1.quantity !== ticketType2.quantity) return false;\n\t\tif (ticketType1.price !== ticketType2.price) return false;\n\t\tif (ticketType1.description !== ticketType2.description) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Update the ticketing timeout if a new expiration time is received.\n *\n * @function\n * @param {number=} expiration - the number of minutes before a timeout\n * @param {Object=} ticketing - the ticketing state\n * @return {!Object} the new ticketing state\n */\nconst refreshTimeout = (expiration, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst expirationSet = typeof expiration === 'number';\n\tconst timeoutSet = ticketing.timeout && ticketing.allowedTime;\n\n\tif (expirationSet || !timeoutSet) {\n\t\tconst allowedTime = expirationSet ? expiration * 1e-3 : DEFAULT_BOOKING_TIMEOUT_S;\n\t\tticketing = ticketing.set({\n\t\t\ttimeout: Date.now() + allowedTime * 1e3,\n\t\t\tallowedTime: Math.round(allowedTime)\n\t\t});\n\t}\n\n\treturn ticketing;\n};\n\n/**\n * Create a new order from the tickets stored in the ticketing state\n * or update the tickets of a previously created order with the new tickets.\n */\nfunction createOrUpdateOrder() {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\n\tconst tickets = ticketing.tickets.toJS(); // the ordered tickets\n\tconst prevOrder = ticketing.order; // the previously created order, if any\n\n\t// You can't create an order without any ticket\n\tif (!tickets) {\n\t\tif (ticketing.state !== SELECT_TICKETS && ticketing.state !== NOT_ACTIVE) {\n\t\t\tStore.emit(actions.GO_TICKETING_TYPES);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (prevOrder) {\n\t\tconst prevTickets = prevOrder.tickets.toJS();\n\n\t\tif (areTicketsEqual(tickets, prevTickets)) {\n\t\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t\t} else {\n\t\t\tupdateOrder(tickets, prevTickets);\n\t\t}\n\t} else {\n\t\tcreateOrder();\n\t}\n}\n\n/**\n * Function called before the seating map gets added to the store.\n * You can add any preprocessing here. The seat layout is modified in-place.\n *\n * @function\n * @param {!SeatLayout} seatLayout - the seat layout to process\n */\nfunction prepareSeatingMap(seatLayout) {\n\tseatLayout.areas.forEach((area) => area.rows.forEach((row) => row.seats.forEach((seat) => {\n\t\tseat.areaCategoryCode = area.areaCategoryCode;\n\t\tseat.rowLabel = row.rowLabel;\n\t})));\n}\n\n/**\n * Create a new ticket order then go to the next step.\n * All required info are taken from the ticketing state.\n */\nfunction createOrder() {\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\n\tticketing.set({ apiLoading: true });\n\n\ttimeTracker.start(LOADING_TIME_CREATE_ORDER);\n\n\tconst { exhibitorId, theaterMxId, screeningMxId, seatingSupported } = ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tmxApi.createOrder(exhibitorId, theaterMxId, screeningMxId, seatingSupported,\n\t\ttickets, authToken).then((order) => {\n\n\t\ttimeTracker.end(LOADING_TIME_CREATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tconst { seatingMap, selectedSeats, groupedTickets, expiration } = order;\n\n\t\t// Lets store which tickets we have now, so we can easily compare when they get updated\n\t\torder.tickets = ticketing.tickets.toJS();\n\n\t\t// Delete the seating map from the order, so we don't add it inside the store twice\n\t\tdelete order.seatingMap;\n\n\t\tticketing = Store.get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\torder:      order,\n\t\t\tapiLoading: false\n\t\t});\n\n\t\tticketing = refreshTimeout(expiration, ticketing);\n\n\t\tif (seatingSupported) {\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tconst pickedSeats = getPickedSeats(seatingMap);\n\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating:     seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats:       getSeats(selectedSeats, groupedTickets, ticketing.ticketTypes)\n\t\t\t});\n\t\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t\t}\n\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_CREATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Update a previously created order.\n *\n * @param {Object} nextTickets - the newly ordered tickets\n * @param {Object} prevTickets - the previously ordered tickets\n */\nfunction updateOrder(nextTickets, prevTickets) {\n\t// (1) let's find which ticket was added and which ticket was removed\n\tconst addedTickets = {};\n\tconst removedTickets = {};\n\n\tfor (const ticketTypeId in nextTickets) {\n\t\tif (!prevTickets[ticketTypeId]) {\n\t\t\taddedTickets[ticketTypeId] = nextTickets[ticketTypeId].quantity;\n\t\t} else {\n\t\t\tconst diff = nextTickets[ticketTypeId].quantity - prevTickets[ticketTypeId].quantity;\n\t\t\tif (diff > 0) {\n\t\t\t\taddedTickets[ticketTypeId] = diff;\n\t\t\t} else if (diff < 0) {\n\t\t\t\tremovedTickets[ticketTypeId] = -diff;\n\t\t\t}\n\t\t}\n\t}\n\tfor (const ticketTypeId in prevTickets) {\n\t\tif (!nextTickets[ticketTypeId]) {\n\t\t\tremovedTickets[ticketTypeId] = prevTickets[ticketTypeId].quantity;\n\t\t}\n\t}\n\n\t// (2) prepare the request parameters\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\tconst groupedTickets = ticketing.order.groupedTickets;\n\n\tconst ticketsToAdd = [];\n\tfor (const ticketTypeId in addedTickets) {\n\t\tticketsToAdd.push({\n\t\t\ttype:     ticketTypeId,\n\t\t\tquantity: addedTickets[ticketTypeId]\n\t\t});\n\t}\n\n\tconst ticketIdsToRemove = [];\n\tfor (const ticketTypeId in removedTickets) {\n\t\tconst quantity = removedTickets[ticketTypeId];\n\n\t\tconst previouslyOrderedTickets = groupedTickets.find(groupedTicket => {\n\t\t\treturn groupedTicket.ticketTypeId === ticketTypeId;\n\t\t});\n\n\t\tif (!previouslyOrderedTickets) {\n\t\t\tconsole.error(`${quantity} tickets of type ${ticketTypeId} were removed, but could not be ` +\n\t\t\t\t'found among the previously ordered tickets:', previouslyOrderedTickets);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst previousQuantity = previouslyOrderedTickets.ticketIds.length;\n\n\t\tfor (let i = previousQuantity - quantity; i < previousQuantity; i++) {\n\t\t\tticketIdsToRemove.push(previouslyOrderedTickets.ticketIds[i]);\n\t\t}\n\t}\n\n\tif (ticketsToAdd.length === 0 && ticketIdsToRemove.length === 0) {\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t\treturn;\n\t}\n\n\t// (3) send the needed requests\n\tconst { exhibitorId, screeningMxId, seatingSupported } = ticketing;\n\tconst orderId = ticketing.order.orderId;\n\n\tticketing = ticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_UPDATE_ORDER);\n\n\tconst needSeating = seatingSupported && getTicketWithSeatCount(ticketing) > 0;\n\n\tmxApi.updateTickets(exhibitorId, screeningMxId, orderId, seatingSupported, ticketsToAdd,\n\t\tticketIdsToRemove, authToken).then((updatedOrder) => {\n\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tconst { seatingMap, selectedSeats, groupedTickets, expiration } = updatedOrder;\n\n\t\t// (4) update the order with the selectedSeats and the new tickets\n\t\tticketing = Store.get().showtimes.ticketing;\n\t\tticketing = ticketing.set('apiLoading', false);\n\n\t\tticketing = refreshTimeout(expiration, ticketing);\n\n\t\tticketing.order.set({\n\t\t\tprice:          updatedOrder.price,\n\t\t\tbookingFee:     updatedOrder.bookingFee,\n\t\t\tgroupedTickets: updatedOrder.groupedTickets,\n\t\t\tselectedSeats:  updatedOrder.selectedSeats,\n\t\t\ttickets:        nextTickets,\n\t\t});\n\t\tticketing = Store.get().showtimes.ticketing;\n\n\t\tif (ticketing.seatingSupported) {\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tconst pickedSeats = getPickedSeats(seatingMap);\n\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating:     seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats:       getSeats(selectedSeats, groupedTickets, ticketing.ticketTypes)\n\t\t\t});\n\t\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t\t}\n\n\t\t// (5) display the next section\n\t\tgoToNextSectionAfterOrderCreated(ticketing);\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_ORDER);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Return the number of ticket selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of ticket purchased by the user\n */\nconst getTicketCount = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tlet ticketCount = 0;\n\tfor (const ticketType in tickets) {\n\t\tticketCount += tickets[ticketType].quantity;\n\t}\n\n\treturn ticketCount;\n};\n\n/**\n * Return the number of seat selectable by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the numbe of seat selectable by the user\n */\nconst getTicketWithSeatCount = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tlet seatCount = 0;\n\tfor (const ticketType in tickets) {\n\t\tif (tickets[ticketType].isAllocatedSeating) {\n\t\t\tseatCount += tickets[ticketType].quantity;\n\t\t}\n\t}\n\n\treturn seatCount;\n};\n\n/**\n * Go to the next step once the order is ready.\n * If the \"SELECT_TICKETS\" pane is displayed, this function will redirect:\n * <ul>\n *   <li>to the \"SEATING\" pane if the screening supports seating</li>\n *   <li>to the \"REVIEW\" pane otherwise</li>\n * </ul>\n *\n * @param {Object=} ticketing - the ticketing state\n */\nfunction goToNextSectionAfterOrderCreated(ticketing) {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tif (ticketing.state === SELECT_TICKETS) {\n\t\tStore.emit(ticketing.seatingSupported && getTicketWithSeatCount(ticketing) > 0 ?\n\t\t\tactions.GO_TICKETING_SEATING : actions.GO_TICKETING_REVIEW);\n\t}\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Seating\n\n/**\n * Return the normalized position of the given seat for building heatmaps.\n * The point (0.0, 0.0) is the top-left corner.\n *\n * @param {!Seat} seat - the input seat\n * @param {!SeatLayout} seatLayout - the seat layout including the seat\n * @param {SeatBoundingBox=} boundingBox - optional bounding box to use to get the normalized position\n * @return {{x: number, y: number}} the seat position, normalized between 0.0 and 1.0, or null in case of error\n */\nexport const getSeatPositionNormalized = (seat, seatLayout, boundingBox) => {\n\tconst { position } = seat;\n\tconst { areas } = seatLayout;\n\tif (!position || !areas) return null;\n\n\tconst { areaNumber, columnIndex, rowIndex } = position;\n\n\tconst area = areas.find(({ number }) => number === areaNumber);\n\tif (!area) return null;\n\n\tlet x = area.left + (columnIndex + 0.5) / area.columnCount * area.width;\n\tlet y = area.top + (rowIndex + 0.5) / area.rowCount * area.height;\n\n\t// Get bounding box parameters\n\tconst left   = boundingBox ? boundingBox.left : seatLayout.boundaryLeft;\n\tconst right  = boundingBox ? boundingBox.right : seatLayout.boundaryRight;\n\tconst top    = boundingBox ? boundingBox.top : seatLayout.boundaryTop;\n\tconst bottom = boundingBox ? boundingBox.bottom : 100.0;\n\tconst width  = right - left;\n\tconst height = bottom - top;\n\n\t// Normalize the position using the bounding box\n\tx = (x - left) / width;\n\ty = (y - top) / height;\n\n\t// MX seating map is rotated 180 deg, let's put the screen on the top\n\tx = 1.0 - x;\n\ty = 1.0 - y;\n\n\treturn { x, y };\n};\n\n/**\n * Return the theater's occupancy based on the given seat layout.\n * The occupancy does not include the user's seats.\n *\n * @param {!SeatLayout} seatLayout - the seating layout, as sent by MX\n * @return {!number} the theater's occupancy, in [0.0, 1.0[, at the time of the booking\n */\nexport const getTheaterOccupancy = (seatLayout) => {\n\tlet seatCount = 0;\n\tlet soldSeatCount = 0;\n\n\tseatLayout.areas.forEach((area) => area.rows.forEach((row) => row.seats.forEach((seat) => {\n\t\tif (seat.status === seatStatus.SOLD) {\n\t\t\tsoldSeatCount++;\n\t\t}\n\t\tseatCount++;\n\t})));\n\n\tif (seatCount === 0) return 1.0;\n\treturn soldSeatCount / seatCount;\n};\n\n/**\n * Display the \"SEATING\" pane.\n * This function will call \"CREATE_OR_UPDATE_ORDER\" if there's currently no order.\n */\nfunction goToTicketingSeating() {\n\tlet ticketing = Store.get().showtimes.ticketing;\n\n\ttrack({ a: 'ticketing-go-seating' });\n\n\tticketing = ticketing.set({ state: SELECT_SEATS });\n\n\tif (!ticketing.order) {\n\t\tStore.emit(actions.CREATE_OR_UPDATE_ORDER);\n\t}\n}\n\n/**\n * Make a request to reload the seat layout.\n * Calling this function will erase the currently picked seats.\n */\nfunction flushSeatLayout() {\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\tif (!ticketing.order) return;\n\n\tconst { exhibitorId, screeningMxId, order } = ticketing;\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_FLUSH_LAYOUT);\n\n\tmxApi.getSeatingMap(exhibitorId, screeningMxId, order.orderId, authToken).then((result) => {\n\t\ttimeTracker.end(LOADING_TIME_FLUSH_LAYOUT);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tconst { seatingMap } = result;\n\n\t\tprepareSeatingMap(seatingMap);\n\n\t\tconst pickedSeats = getPickedSeats(seatingMap);\n\n\t\tticketing = Store.get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\tseating:     seatingMap,\n\t\t\tpickedSeats: pickedSeats,\n\t\t\tapiLoading:  false\n\t\t});\n\t\tticketing.order.set('pickedSeats', pickedSeats);\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_FLUSH_LAYOUT);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Pick seats from the seating map or unpick them if one of them is already picked.\n *\n * @param {Object} data - data received by the \"PICK_OR_UNPICK_SEATS\" event\n * @property {Array.<Seat>|Seat} data.seats - array of seats to pick or unpick from the seating map\n * @return {boolean} true if the action succeed, false otherwise\n */\nfunction pickOrUnpickSeats(data) {\n\tlet { seats } = data;\n\tif (!seats) return;\n\tif (!Array.isArray(seats)) {\n\t\tseats = [seats];\n\t}\n\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst pickedSeats = ticketing.pickedSeats;\n\n\tconst alreadyPickedSeat = seats.find((seat) => {\n\t\treturn pickedSeats.find((pickedSeat) => areSeatsEqual(pickedSeat.seat, seat));\n\t});\n\n\tif (alreadyPickedSeat) {\n\t\treturn unpickSeats(seats);\n\t}\n\treturn pickSeats(seats);\n}\n\n/**\n * Pick seats from the seating map.\n * This function automatically chooses which seat to move when the user does not have any more\n * ticket available.\n * If the number of seats to pick exceed the number of ticket available for the specific area,\n * an error is displayed to the user.\n *\n * @param {Array.<Seat>} seats - an array of seats to pick from the seating map\n * @return {boolean} true if the action succeed, false otherwise\n */\nfunction pickSeats(seats) {\n\tlet ticketing = Store.get().showtimes.ticketing;\n\n\t// First, check that the action is valid, then pick the seat\n\t// so we don't have to reverse the operation in case of failure\n\tconst { areas, areaCategories } = ticketing.seating;\n\n\tconst availablePerArea = {};\n\tareaCategories.forEach((areaCategory) => {\n\t\tavailablePerArea[areaCategory.areaCategoryCode] = areaCategory.seatsToAllocate;\n\t});\n\n\tconst pickedPerArea = {};\n\tseats.forEach((seat) => {\n\t\tconst { areaCategoryCode } = seat;\n\n\t\tif (pickedPerArea[areaCategoryCode]) {\n\t\t\tpickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\tpickedPerArea[areaCategoryCode] = 1;\n\t\t}\n\t});\n\n\tfor (const areaCategoryCode in pickedPerArea) {\n\t\tconst areaCategory = areaCategories.find((area) => area.areaCategoryCode === areaCategoryCode);\n\n\t\tconst availCount = areaCategory ? areaCategory.seatsToAllocate : 0;\n\t\tconst pickedCount = pickedPerArea[areaCategoryCode];\n\n\t\tif (pickedCount > availCount) {\n\t\t\tlet errorMessage;\n\n\t\t\tif (areas.length > 1) {\n\t\t\t\tconst area = areas.find((area) => area.areaCategoryCode === areaCategoryCode);\n\t\t\t\tconst areaName = area && area.description || areaCategoryCode;\n\n\t\t\t\tif (availCount > 0) {\n\t\t\t\t\terrorMessage = getCopy('ONLY_N_TICKETS_AVAIL_AREA', {\n\t\t\t\t\t\tNUM_AVAIL: availCount,\n\t\t\t\t\t\tAREA_NAME: areaName\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = getCopy('NO_TICKET_AVAIL_AREA', { AREA_NAME: areaName });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (availCount > 0) {\n\t\t\t\t\terrorMessage = getCopy('ONLY_N_TICKETS_AVAIL', { NUM_AVAIL: availCount });\n\t\t\t\t} else {\n\t\t\t\t\t// This message should never appear in theory\n\t\t\t\t\terrorMessage = getCopy('NO_TICKET_AVAIL');\n\t\t\t\t}\n\t\t\t}\n\t\t\tticketing.set('apiMessage', errorMessage);\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Now we can safely pick the seats\n\tconst pickedSeats = ticketing.pickedSeats.toJS(); // we are gonna modify this one\n\n\tconst alreadyPickedPerArea = {};\n\tpickedSeats.forEach((pickedSeat) => {\n\t\tconst areaCategoryCode = pickedSeat.seat.areaCategoryCode;\n\t\tif (alreadyPickedPerArea[areaCategoryCode]) {\n\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\talreadyPickedPerArea[areaCategoryCode] = 1;\n\t\t}\n\t});\n\n\t// Sometimes companion seats are not paired with wheelchair space\n\t// If such a seat is picked, we need to send a disclaimer to the user.\n\t// Since this disclaimer doesn't prevent the user action, the message is sent at the very end.\n\tconst loneCompanionSeats = [];\n\n\tfor (let i = 0; i < seats.length; i++) {\n\t\tconst seat = seats[i];\n\n\t\tconst isCompanion = isCompanionSeat(seat);\n\t\tlet wheelchairSeat = null;\n\n\t\t// If the user picks a companion seat, the corresponding wheelchair should be picked as well\n\t\tif (isCompanion) {\n\t\t\twheelchairSeat = findWheelchairInGroup(ticketing.seating, seat.seatsInGroup);\n\t\t\tif (wheelchairSeat) {\n\t\t\t\t// Seek the wheelchair among the already picked seats and the newly picked seats\n\t\t\t\tlet pickedWheelchair = pickedSeats.find((pickedSeat) => {\n\t\t\t\t\treturn areSeatsEqual(pickedSeat.seat, wheelchairSeat);\n\t\t\t\t});\n\n\t\t\t\tif (!pickedWheelchair) {\n\t\t\t\t\tpickedWheelchair = seats.find((seat) => {\n\t\t\t\t\t\tareSeatsEqual(seat, wheelchairSeat);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!pickedWheelchair) {\n\t\t\t\t\t\tconst companionLabel = seat.rowLabel + seat.seatLabel;\n\t\t\t\t\t\tconst wheelchairLabel = wheelchairSeat.rowLabel + wheelchairSeat.seatLabel;\n\n\t\t\t\t\t\tticketing.set('apiMessage', getCopy('PICK_THE_WHEELCHAIR', {\n\t\t\t\t\t\t\tCOMP_LABEL: companionLabel,\n\t\t\t\t\t\t\tWLCHR_LABEL: wheelchairLabel\n\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst companionLabel = seat.rowLabel + seat.seatLabel;\n\t\t\t\tloneCompanionSeats.push(companionLabel);\n\t\t\t\tconsole.warn('updateTicketing.js: pickSeats(): No wheelchair found in the group of the ' +\n\t\t\t\t\t`companion seat ${companionLabel}:`, seat.seatsInGroup);\n\t\t\t}\n\t\t}\n\n\t\tconst { areaCategoryCode } = seat;\n\n\t\t// We need to know whether there are unpicked seats\n\t\t// otherwise we will start moving seats that were picked already\n\t\tconst availableCount     = availablePerArea[areaCategoryCode] || 0;\n\t\tconst alreadyPickedCount = alreadyPickedPerArea[areaCategoryCode] || 0;\n\t\tconst unpickedCount      = availableCount - alreadyPickedCount;\n\n\t\tif (unpickedCount > 0) {\n\t\t\tpickedSeats.push({\n\t\t\t\tseat:       seat,\n\t\t\t\tlastAction: Date.now()\n\t\t\t});\n\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t} else {\n\t\t\t// Pick the oldest seat among the picked one:\n\t\t\tlet seatToMove = null;\n\t\t\tlet oldestAction = Number.MAX_SAFE_INTEGER;\n\n\t\t\tpickedSeats.forEach((pickedSeat) => {\n\t\t\t\tif (pickedSeat.seat.areaCategoryCode === areaCategoryCode &&\n\t\t\t\t\tpickedSeat.lastAction < oldestAction) {\n\t\t\t\t\tseatToMove = pickedSeat;\n\t\t\t\t\toldestAction = pickedSeat.lastAction;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (isCompanion && wheelchairSeat) {\n\t\t\t\tif (areSeatsEqual(seatToMove.seat, wheelchairSeat)) {\n\t\t\t\t\t// Trying to move a wheelchair to one of the companion seats in its group\n\t\t\t\t\tticketing.set('apiMessage', getCopy('NOT_ENOUGH_TICKET_FOR_COMPANION'));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seatToMove.seat.seatsInGroup.length > 0) {\n\t\t\t\tseatToMove.seat.seatsInGroup.forEach((seatPosition) => {\n\t\t\t\t\tconst indexToRemove = pickedSeats.findIndex((pickedSeat) => {\n\t\t\t\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPosition);\n\t\t\t\t\t});\n\t\t\t\t\tif (indexToRemove > -1) {\n\t\t\t\t\t\tpickedSeats.splice(indexToRemove, 1);\n\t\t\t\t\t}\n\t\t\t\t\talreadyPickedPerArea[areaCategoryCode] -= 1;\n\t\t\t\t});\n\n\t\t\t\tpickedSeats.push({\n\t\t\t\t\tseat: seat,\n\t\t\t\t\tlastAction: Date.now()\n\t\t\t\t});\n\t\t\t\talreadyPickedPerArea[areaCategoryCode] += 1;\n\t\t\t} else {\n\t\t\t\tseatToMove.seat = seat;\n\t\t\t\tseatToMove.lastAction = Date.now();\n\t\t\t}\n\t\t}\n\t}\n\n\t// If some lone companion seats are picked, show a disclaimer\n\tif (loneCompanionSeats.length > 0) {\n\t\tconst copy = loneCompanionSeats.length > 1 ? 'SEATS_ARE_COMPANION' : 'SEAT_IS_COMPANION';\n\t\tticketing = ticketing.set('apiMessage', getCopy(copy, {\n\t\t\tLABEL: loneCompanionSeats.join(', ')\n\t\t}));\n\t}\n\n\tticketing.set('pickedSeats', pickedSeats);\n\n\treturn true;\n}\n\n/**\n * Unpick seats from the seating map.\n *\n * @param {Array.<Seat>} seats - an array of seats to unpick\n * @return {boolean} true if at least one seat was unpicked, false otherwise\n */\nfunction unpickSeats(seats) {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst pickedSeats = ticketing.pickedSeats.toJS();\n\n\tlet modified = false;\n\tseats.forEach((seat) => {\n\t\t// If a wheelchair is unpicked, unpick all its companion seats too\n\t\tif (isWheelchair(seat) && seat.seatsInGroup.length > 0) {\n\t\t\tseat.seatsInGroup.forEach((seatPos) => {\n\t\t\t\tconst index = pickedSeats.findIndex((pickedSeat) => {\n\t\t\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, seatPos);\n\t\t\t\t});\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tpickedSeats.splice(index, 1);\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst index = pickedSeats.findIndex((pickedSeat) => areSeatsEqual(pickedSeat.seat, seat));\n\t\t\tif (index > -1) {\n\t\t\t\tpickedSeats.splice(index, 1);\n\t\t\t\tmodified = true;\n\t\t\t}\n\t\t}\n\t});\n\n\tif (modified) {\n\t\tticketing.set('pickedSeats', pickedSeats);\n\t}\n\n\treturn modified;\n}\n\n/**\n * Return whether seats should be updated on the server.\n *\n * @return {boolean} true if seats should be update, false otherwise\n */\nfunction shouldUpdateSeats() {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\n\tif (!ticketing.hasOwnProperty('order')) return false;\n\tif (!ticketing.hasOwnProperty('pickedSeats')) return false;\n\tif (!ticketing.order.hasOwnProperty('pickedSeats')) return true;\n\n\tconst pickedSeats = ticketing.pickedSeats;\n\tconst cachedPickedSeats = ticketing.order.pickedSeats;\n\n\tif (pickedSeats.length !== getTicketWithSeatCount(ticketing)) return true;\n\tif (pickedSeats.length === 0) return true;\n\n\t// return true when no matching seat is found\n\treturn !!pickedSeats.find((pickedSeat) => {\n\t\treturn !cachedPickedSeats.find((cachedSeat) => {\n\t\t\treturn areSeatPositionsEqual(pickedSeat.seat.position, cachedSeat.seat.position);\n\t\t});\n\t});\n}\n\n/**\n * Return the number of seats to pick before updating the order.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {!number} the number of seats not picked yet, or null if no order is created\n */\nconst getNumberOfSeatToPick = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst availableSeats = getTicketWithSeatCount(ticketing);\n\tconst alreadyPickedSeat = ticketing.pickedSeats.length;\n\n\treturn availableSeats - alreadyPickedSeat;\n};\n\n/**\n * Return an array of seat slots.\n * Each slot contains a seats picked on the map or null if the slot is empty.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {Array.<Seat>} - an array of seat slots\n */\nexport const getSeatSlots = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst seatSlots = [];\n\n\tif (!ticketing.hasOwnProperty('pickedSeats')) return seatSlots;\n\tif (!ticketing.hasOwnProperty('tickets')) return seatSlots;\n\n\tconst pickedSeats = ticketing.pickedSeats;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tlet availableSeats = 0;\n\tfor (const ticketId in tickets) {\n\t\tif (tickets[ticketId].isAllocatedSeating) {\n\t\t\tavailableSeats += tickets[ticketId].quantity;\n\t\t}\n\t}\n\n\tseatSlots.length = availableSeats;\n\tseatSlots.fill(null);\n\n\tfor (let i = 0; i < pickedSeats.length; i++) {\n\t\tseatSlots[i] = pickedSeats[i].seat;\n\t}\n\n\treturn seatSlots;\n};\n\n/**\n * Return whether a seat is available.\n *\n * @param {Seat} seat - the seat to test\n * @param {Array.<PickedSeat>} pickedSeats - the array of currently picked seats\n * @return {boolean} true if the seat is avaiable, false otherwise\n */\nconst isSeatAvailable = (seat, pickedSeats) => {\n\tif (seat.status === seatStatus.SOLD) return false;\n\tfor (let i = 0; i < pickedSeats.length; i++) {\n\t\tif (areSeatsEqual(pickedSeats[i].seat, seat)) return false;\n\t}\n\treturn true;\n};\n\n/**\n * Return the row of a specific seat in the seating map.\n *\n * @function\n * @param {SeatLayout} seatingLayout - the seating layout containing the row to get\n * @param {Seat} seat - the seat in the row to get\n * @return {Row} the row having the given seat, null if not found\n */\nconst getRowForSeat = (seatLayout, seat) => {\n\tconst { position } = seat;\n\n\tconst area = seatLayout.areas.find(({ number }) => number === position.areaNumber);\n\tif (!area) return null;\n\n\tconst { rows } = area;\n\tconst row = rows[position.rowIndex];\n\tif (row && row.rowLabel === seat.rowLabel) return row;\n\n\treturn rows.find(({ rowLabel }) => rowLabel === seat.rowLabel) || null;\n};\n\n/**\n * Return whether the orphan seat policy is respected.\n * Display a message if it's not.\n *\n * @param {SeatLayout} seatLayout - the seat layout, as defined in the MX API\n * @param {Array.<PickedSeat>} pickedSeats - an array of seats picked from the map\n * @return {boolean} true if the orphan seat policy is respected, false otherwise\n */\nconst checkOrphanSeatPolicy = (seatLayout, pickedSeats) => {\n\tconst orphanSeats = [];\n\n\tfor (const { seat } of pickedSeats) {\n\t\tif (seat.seatsInGroup.length > 1 || isSeatForDisablePeople(seat)) continue;\n\t\t// NOTE: ^^^ No need to check orphan seats with sofas or wheelchairs\n\t\t//           We're explicitly checking for wheelchair and companion seats because we found\n\t\t//           some cases where those seats are not wrapped in groups (19-04-18, Envision)\n\n\t\tconst { position } = seat;\n\n\t\tconst row = getRowForSeat(seatLayout, seat);\n\t\tif (!row) {\n\t\t\tconsole.error(`Orphan seats: Row ${seat.rowLabel} not found in map:`, seatLayout);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { seats } = row;\n\t\tconst { columnIndex } = position;\n\n\t\t// Check the left-hand side\n\t\tconst leftSeat = seats.find((seat) => seat.position.columnIndex === columnIndex - 1);\n\t\tif (leftSeat && isSeatAvailable(leftSeat, pickedSeats)) {\n\t\t\tconst leftLeftSeat = seats.find((seat) => seat.position.columnIndex === columnIndex - 2);\n\t\t\tif (!leftLeftSeat || !isSeatAvailable(leftLeftSeat, pickedSeats)) {\n\t\t\t\tconst orphanSeatLabel = leftSeat.rowLabel + leftSeat.seatLabel;\n\t\t\t\tif (orphanSeats.indexOf(orphanSeatLabel) === -1) orphanSeats.push(orphanSeatLabel);\n\t\t\t}\n\t\t}\n\n\t\t// Check the right-hand side\n\t\tconst rightSeat = seats.find((seat) => seat.position.columnIndex === columnIndex + 1);\n\t\tif (rightSeat && isSeatAvailable(rightSeat, pickedSeats)) {\n\t\t\tconst rightRightSeat = seats.find((seat) => seat.position.columnIndex === columnIndex + 2);\n\t\t\tif (!rightRightSeat || !isSeatAvailable(rightRightSeat, pickedSeats)) {\n\t\t\t\tconst orphanSeatLabel = rightSeat.rowLabel + rightSeat.seatLabel;\n\t\t\t\tif (orphanSeats.indexOf(orphanSeatLabel) === -1) orphanSeats.push(orphanSeatLabel);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (orphanSeats.length > 0) {\n\t\tconst ticketing = Store.get().showtimes.ticketing;\n\t\tticketing.set('apiMessage', getCopy('CANNOT_LEAVE_ORPHAN_SEATS', {\n\t\t\tORPHAN_SEATS: orphanSeats.join(', ')\n\t\t}));\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n\n/**\n * Send the currently picked seats to the server.\n * This function will bring the user to the review pane, if no error occured.\n */\nfunction updateTicketingSeats() {\n\t// Check that order has changed\n\tif (!shouldUpdateSeats()) {\n\t\tgoToTicketingReview();\n\t\treturn;\n\t}\n\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\tconst pickedSeats = ticketing.pickedSeats.toJS();\n\n\t// Check that they are no remaining seat\n\tconst numberOfSeatsToPick = getNumberOfSeatToPick(ticketing);\n\tif (numberOfSeatsToPick > 0) {\n\t\tticketing.set('apiMessage', getCopy('STILL_N_SEATS_TO_PICK', {\n\t\t\tNUM_SEAT: numberOfSeatsToPick\n\t\t}));\n\t\treturn;\n\t}\n\n\t// Check the orphan seat policy if needed\n\tconst orphanSeatPolicyEnabled = true;\n\t// TODO: ^^^ Starlight-specific policy, please move this somewhere\n\tif (orphanSeatPolicyEnabled && pickedSeats.length === getTicketWithSeatCount(ticketing)) {\n\t\t//                           ^^^ Not sure about the purpose of this condition?\n\t\tif (!checkOrphanSeatPolicy(ticketing.seating, pickedSeats)) return;\n\t}\n\n\t// Tracking of seat movements\n\tconst seatsBefore = ticketing.order.pickedSeats.map(({ seat }) => seat.rowLabel + seat.seatLabel);\n\tconst seatsAfter = ticketing.pickedSeats.map(({ seat }) => seat.rowLabel + seat.seatLabel);\n\tconst seatMovement = seatsBefore + '=>' + seatsAfter;\n\n\ttrack({\n\t\ta: 'ticketing-seat-move',\n\t\tl: seatMovement\n\t});\n\n\tconst { exhibitorId, screeningMxId, order } = ticketing;\n\n\t// Create the new array of seats\n\tconst seats = pickedSeats.map(({ seat }) => ({\n\t\tareaCategoryCode: seat.areaCategoryCode,\n\t\tareaNumber:       seat.position.areaNumber,\n\t\tcolumnId:         seat.position.columnIndex,\n\t\trowId:            seat.position.rowIndex\n\t}));\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_UPDATE_SEATS);\n\n\tmxApi.updateSeats(exhibitorId, screeningMxId, order.orderId, seats, authToken).then((order) => {\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tmxApi.getSeatingMap(exhibitorId, screeningMxId, order.orderId, authToken).then((result) => {\n\t\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tconst { seatingMap } = result;\n\t\t\tconst { selectedSeats, groupedTickets, price, bookingFee } = order;\n\n\t\t\tprepareSeatingMap(seatingMap);\n\n\t\t\tconst pickedSeats = getPickedSeats(seatingMap);\n\n\t\t\tticketing = Store.get().showtimes.ticketing;\n\t\t\tticketing = ticketing.set({\n\t\t\t\tseating:     seatingMap,\n\t\t\t\tpickedSeats: pickedSeats,\n\t\t\t\tseats:       getSeats(selectedSeats, groupedTickets, ticketing.ticketTypes),\n\t\t\t\tapiLoading:  false\n\t\t\t});\n\t\t\tticketing.order.set({\n\t\t\t\tprice:          price,\n\t\t\t\tbookingFee:     bookingFee,\n\t\t\t\tgroupedTickets: groupedTickets,\n\t\t\t\tselectedSeats:  selectedSeats,\n\t\t\t\tpickedSeats:    pickedSeats\n\t\t\t});\n\n\t\t\tgoToTicketingReview();\n\t\t}, (response) => {\n\t\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tonHttpError(response);\n\t\t});\n\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_UPDATE_SEATS);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t// Handle MX Error 41001: Somebody has taken some of those seats before the user\n\t\tif (isMxErrorObject(response)) {\n\t\t\tconst { errorCode } = response.data.error;\n\t\t\tif (errorCode === mxErrors.SEATS_UNAVAILABLE) {\n\t\t\t\ttrack({ a: 'ticketing-seats-race' });\n\t\t\t\tticketing = Store.get().showtimes.ticketing;\n\t\t\t\tticketing.set({\n\t\t\t\t\tapiLoading: false,\n\t\t\t\t\tapiMessage: getCopy('THOSE_SEATS_WERE_RESERVED_RECENTLY'),\n\t\t\t\t\tapiMessageCallback: () => Store.emit(actions.FLUSH_SEAT_LAYOUT)\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tonHttpError(response);\n\t});\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing review\n\n/**\n * Display the review pane.\n */\nfunction goToTicketingReview() {\n\ttrack({ a: 'ticketing-go-review' });\n\tStore.get().showtimes.ticketing.set('state', REVIEW);\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Contact details\n\n/**\n * Display the contact details pane.\n * Required details may be different from one payment gateway to another.\n */\nfunction goToTicketingContactDetails() {\n\ttrack({ a: 'ticketing-go-contact-details' });\n\tStore.get().showtimes.ticketing.set('state', CONTACT_DETAILS);\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Payments\n\n/**\n * Display the payment pane.\n * Note that contact details should be valid for the user to be redirected to the payment section.\n *\n * @param {Object} contactDetails - the details provided by the user to prepare the transaction\n */\nfunction goToTicketingPayment(contactDetails) {\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\n\t// Get contact details\n\tconst { exhibitorId, theaterMxId } = ticketing;\n\tconst { orderId } = ticketing.order;\n\tconst paymentArgs = {};\n\tconst { name, email, address, zip, city } = contactDetails;\n\tconst iframeCommunicatorUrl = getIframeCommunicatorUrl();\n\n\tlet { loyaltyNumber } = contactDetails;\n\tif (!ticketing.loyaltyEnabled) loyaltyNumber = undefined;\n\n\tswitch (ticketing.paymentGateway) {\n\t\tcase gateways.AUTHNET:\n\t\t\tpaymentArgs.iFramecommunicationsChannel = iframeCommunicatorUrl;\n\t\t\tpaymentArgs.returnUrl = 'https://httpbin.org/get';\n\t\t\t// NOTE: 'about:blank' is giving errors here ^^^\n\t\t\tpaymentArgs.cancelUrl = window.location.href.replace(/&/g, '%26');\n\t\t\t// NOTE: could there be issues with double tracking because we load in  the same page twice\n\t\t\t// Maybe it should redirect to the iframeCommunicator instead\n\t\t\tbreak;\n\n\t\tcase gateways.VANTIV:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl;\n\t\t\tbreak;\n\n\t\tcase gateways.PXPAY:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?succeed';\n\t\t\tpaymentArgs.cancelUrl = iframeCommunicatorUrl + '?cancelled';\n\t\t\tbreak;\n\n\t\tcase gateways.VERIFONE2:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?readytocheck';\n\t\t\tbreak;\n\n\t\tcase gateways.BRAINTREE:\n\t\t\tpaymentArgs.returnUrl = iframeCommunicatorUrl + '?braintree';\n\t\t\tbreak;\n\t}\n\n\tticketing.set('apiLoading', true);\n\n\ttimeTracker.start(LOADING_TIME_START_TRANSACTION);\n\n\tmxApi.startTransaction(exhibitorId, theaterMxId, orderId, paymentArgs, name, email, address, zip,\n\t\tcity, loyaltyNumber, authToken).then((paymentData) => {\n\t\ttimeTracker.end(LOADING_TIME_START_TRANSACTION);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\ttrack({ a: 'ticketing-go-payment' });\n\n\t\tticketing = Store.get().showtimes.ticketing;\n\t\tticketing = ticketing.set({\n\t\t\tapiLoading:  false,\n\t\t\tstate:       PAYMENT,\n\t\t\tpaymentData: paymentData,\n\t\t\tusedLoyalty: ticketing.loyaltyEnabled && loyaltyNumber !== undefined\n\t\t});\n\t\tticketing = ticketing.remove('iframeSize');\n\n\t\t// NOTE: This is a trick to track Authorize.net response time\n\t\ttimeTracker.start(LOADING_TIME_PAYMENTS);\n\n\t}, (response) => {\n\t\ttimeTracker.end(LOADING_TIME_START_TRANSACTION);\n\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\tif (isMxErrorObject(response)) {\n\t\t\tconst { errorCode } = response.data.error;\n\n\t\t\tif (errorCode === mxErrors.CANT_CONNECT_TO_LOYALTY ||\n\t\t\t\terrorCode === mxErrors.LOYALTY_NOT_ALLOWED_FOR_CINEMA_CHAIN ||\n\t\t\t\terrorCode === mxErrors.INSUFFICIENT_LOYALTY_MEMBER_DETAILS ||\n\t\t\t\terrorCode === mxErrors.LOYALTY_MEMBER_NOT_FOUND) {\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-error-from-mx',\n\t\t\t\t\tl: errorCode\n\t\t\t\t});\n\t\t\t\tticketing = Store.get().showtimes.ticketing;\n\t\t\t\tticketing.set({\n\t\t\t\t\tapiLoading: false,\n\t\t\t\t\tapiMessage: getCopy('MX_' + getMxErrorKey(errorCode))\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tonHttpError(response);\n\t});\n}\n\n/**\n * Return the list of seats selected by the user.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {string} a list of tickets by area category, separated by a comma\n */\nfunction getTicketList(ticketing) {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\tconst tickets = ticketing.tickets.toJS();\n\n\tconst ticketList = [];\n\n\tfor (const ticketType in tickets) {\n\t\tticketList.push(`${ticketType}:${tickets[ticketType].quantity}`);\n\t}\n\n\treturn ticketList.join(';');\n}\n\n/**\n * Return the elapsed time since the ticketing session started.\n *\n * @param {Object=} ticketing - the ticketing state\n * @return {number} the elapsed time (in seconds), or null if no session is active\n */\nfunction getElapsedTime(ticketing) {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tlet elapsedTime = null;\n\n\tif (typeof ticketing.startDate === 'number') {\n\t\telapsedTime = Math.ceil((Date.now() - ticketing.startDate) * 1e-3);\n\t}\n\n\treturn elapsedTime;\n}\n\n/**\n * Track the positions of user's picked seats.\n *\n * @param {Object} ticketing - the ticketing state\n */\nconst trackSeatingHeatmap = (ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst seatLayout = ticketing.seating;\n\tconst { pickedSeats } = ticketing;\n\tif (!seatLayout || !pickedSeats) return;\n\n\tconst boundingBox = getSeatLayoutBoundingBox(seatLayout);\n\n\tpickedSeats.forEach((pickedSeat) => {\n\t\tconst position = getSeatPositionNormalized(pickedSeat.seat, ticketing.seating, boundingBox);\n\t\tif (!position) return;\n\t\tconst { x, y } = position;\n\t\ttrack({\n\t\t\ta: 'ticketing-purchase-heatmap',\n\t\t\tl: x.toFixed(HEATMAP_FLOAT_PRECISION) + ' ' + y.toFixed(HEATMAP_FLOAT_PRECISION)\n\t\t});\n\t});\n};\n\n/**\n * Complete an order after the payment is done.\n *\n * @param {Object} paymentResponse - the response received from the payment gateway\n */\nconst completeOrderAfterPaymentSucceed = (paymentResponse) => {\n\tif (!isObject(paymentResponse)) goToError();\n\n\ttrack({ a: 'ticketing-payment-succeed-start-complete-order' });\n\n\tconst store = Store.get();\n\tconst { authToken } = store.user;\n\tlet { ticketing } = store.showtimes;\n\tticketing = ticketing.set({\n\t\tapiLoading:      true,\n\t\ttransactionDone: true\n\t});\n\n\ttimeTracker.start(LOADING_TIME_COMPLETE_ORDER);\n\n\tconst { exhibitorId, theaterMxId } = ticketing;\n\tconst { orderId } = ticketing.order;\n\n\tmxApi.completeOrder(exhibitorId, theaterMxId, orderId, paymentResponse, authToken)\n\t\t.then(({ code, bookingId }) => {\n\t\t\ttimeTracker.end(LOADING_TIME_COMPLETE_ORDER);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tticketing = Store.get().showtimes.ticketing;\n\n\t\t\tconst paymentSucceed = code === 'approved';\n\n\t\t\tticketing = ticketing.set({\n\t\t\t\tstate:      COMPLETE,\n\t\t\t\tapiLoading: false,\n\t\t\t\tpayment:    { code, bookingId }\n\t\t\t});\n\t\t\t// TODO: ^ the payment object needs to be cleaned as well\n\t\t\t//         when the session is cleared\n\n\t\t\ttrack({ a: 'ticketing-go-complete' });\n\n\t\t\tif (paymentSucceed) {\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-purchase-complete',\n\t\t\t\t\tl: ticketing.sessionId\n\t\t\t\t});\n\t\t\t\tif (ticketing.loyaltyEnabled && ticketing.usedLoyalty) {\n\t\t\t\t\ttrack({ a: 'ticketing-purchase-with-loyalty' });\n\t\t\t\t}\n\t\t\t\tconst elapsedTime = getElapsedTime(ticketing);\n\t\t\t\tif (elapsedTime) {\n\t\t\t\t\ttrack({\n\t\t\t\t\t\ta: 'ticketing-time-to-purchase',\n\t\t\t\t\t\tl: elapsedTime\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-purchase-theater',\n\t\t\t\t\tl: ticketing.theaterId\n\t\t\t\t});\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-purchase-gateway',\n\t\t\t\t\tl: ticketing.paymentGateway\n\t\t\t\t});\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-purchase-ticket-count',\n\t\t\t\t\tl: getTicketCount(ticketing)\n\t\t\t\t});\n\t\t\t\ttrack({\n\t\t\t\t\ta: 'ticketing-purchase-tickets',\n\t\t\t\t\tl: getTicketList(ticketing)\n\t\t\t\t});\n\t\t\t\tif (ticketing.seatingSupported) {\n\t\t\t\t\ttrack({\n\t\t\t\t\t\ta: 'ticketing-purchase-occupancy',\n\t\t\t\t\t\tl: getTheaterOccupancy(ticketing.seating)\n\t\t\t\t\t});\n\t\t\t\t\ttrackSeatingHeatmap(ticketing);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tStore.emit(actions.TICKET_PURCHASE_COMPLETE);\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// This was specific to Peter Rabbit and should be changed to something more\n\t\t\t\t\t// generic in the future\n\t\t\t\t\twindow.didAbodeTrackerFailed = true;\n\t\t\t\t\tconsole.error('Adobe tracking for ticket purchase failed');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.log('bookingId:', bookingId);\n\t\t\tconsole.log('orderId:', orderId);\n\t\t\t/* eslint-enable no-console */\n\n\t\t\tticketing = ticketing.remove('timeout');\n\t\t}, (response) => {\n\t\t\ttimeTracker.end(LOADING_TIME_COMPLETE_ORDER);\n\t\t\tif (ticketing.sessionId !== _sessionId) return;\n\n\t\t\tonHttpError(response);\n\t\t});\n};\n\n/**\n * Handle messages received from the Authorize.net iframe.\n *\n * @param {Object} data - the message data\n * @property {string} data.payload - the message sent from the iframe\n * @property {string} data.referrer - the referrer of the message\n * @param {Object=} ticketing - the ticketing state\n */\nconst handleAuthnetPaymentMessage = (data, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst msgData = qs.parse(data.payload);\n\tif (!isObject(msgData)) return;\n\n\tconst action = msgData.action;\n\tif (typeof action !== 'string') return;\n\n\tswitch (action) {\n\t\tcase AUTHNET_MSG_RESIZE_WINDOW:\n\t\t\t// Receiving ideal iframe dimensions\n\t\t\tconst width = parseInt(msgData.width);\n\t\t\tconst height = parseInt(msgData.height);\n\t\t\t// Note that this will be called every time the content\n\t\t\t// of the iframe is changing.\n\t\t\tticketing = ticketing.set('iframeSize', { width, height });\n\t\t\ttimeTracker.end(LOADING_TIME_PAYMENTS); // Authorize.Net specific?\n\t\t\tbreak;\n\t\tcase AUTHNET_MSG_CANCEL:\n\t\t\t// If the user is waiting for the transaction to be confirmed,\n\t\t\t// the user shouldn't be able to cancel the payment.\n\t\t\tif (ticketing.transactionDone) return;\n\t\t\t// TODO: Go back one step\n\t\t\t// FIXME: MX Bug? this one is never called...\n\t\t\tgoToTicketingContactDetails();\n\t\t\tbreak;\n\t\tcase AUTHNET_MSG_TRANSACTION_RESPONSE:\n\t\t\t// --- IMPORTANT ---\n\t\t\t// At this point we know the payment succeed.\n\t\t\t// BUT we MUST NOT tell the user now because the user won't get the tickets\n\t\t\t// until MX confirmed the payment. So just show the loader.\n\t\t\t// -----------------\n\t\t\ttry {\n\t\t\t\tconst response = JSON.parse(msgData.response);\n\t\t\t\tcompleteOrderAfterPaymentSucceed(response);\n\t\t\t} catch (e) {\n\t\t\t\tgoToError();\n\t\t\t\t// TODO: ^^^ Add a message?\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbreak;\n\t}\n};\n\n/**\n * Handle messages received from the Vantiv iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nconst handleVantivPaymentMessage = (data, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst msgData = qs.parse(data.payload);\n\tif (!isObject(msgData)) return;\n\n\t// The user cancelled the transaction\n\tif (msgData.HostedPaymentStatus === 'Cancelled') {\n\t\tgoToTicketingContactDetails();\n\t\treturn;\n\t}\n\n\tif (msgData.ExpressResponseMessage === 'Approved') {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t} else {\n\t\tgoToError();\n\t\t// TODO: ^^ Improve that section\n\t}\n};\n\n/**\n * Handle messages received from the Payment Express iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nconst handlePxPayPaymentMessage = (data, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst msgData = qs.parse(data.payload);\n\tif (!isObject(msgData)) return;\n\n\t// The user cancelled the transaction\n\tif (msgData.hasOwnProperty('succeed')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t} else if (msgData.hasOwnProperty('cancelled')) {\n\t\tgoToTicketingContactDetails();\n\t} else {\n\t\tgoToError();\n\t\t// TODO: ^^ Improve that section\n\t}\n};\n\n/**\n * Handle messages received from the Verifone PP2 iframe.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nconst handleVerifone2PaymentMessage = (data, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst msgData = qs.parse(data.payload);\n\tif (!isObject(msgData)) return;\n\n\tif (msgData.hasOwnProperty('readytocheck')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t}\n};\n\n/**\n * Handle messages received from the Braintree API.\n *\n * @param {Object} data - the message data\n * @param {Object=} ticketing - the ticketing state\n */\nconst handleBraintreePaymentMessage = (data, ticketing) => {\n\tif (!ticketing) ticketing = Store.get().showtimes.ticketing;\n\n\tconst msgData = data.payload; // already an object\n\tif (!isObject(msgData)) return;\n\n\tif (msgData.hasOwnProperty('nonce')) {\n\t\tcompleteOrderAfterPaymentSucceed(msgData);\n\t}\n};\n\n/**\n * Called when a message is received from an iframe.\n *\n * NOTE: This function is probably specific to Authorize.net\n *       Some refactoring might be needed in the future.\n *\n * @param {Object} data - the message data\n * @property {*} data.payload - the message, sent from the iframe\n * @property {string} data.referrer - the referrer of the message\n */\nfunction onPaymentMessageReceived(data) {\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst { paymentGateway } = ticketing;\n\n\tswitch (paymentGateway) {\n\t\tcase gateways.AUTHNET:   handleAuthnetPaymentMessage(data, ticketing);   break;\n\t\tcase gateways.VANTIV:    handleVantivPaymentMessage(data, ticketing);    break;\n\t\tcase gateways.PXPAY:     handlePxPayPaymentMessage(data, ticketing);     break;\n\t\tcase gateways.VERIFONE2: handleVerifone2PaymentMessage(data, ticketing); break;\n\t\tcase gateways.BRAINTREE: handleBraintreePaymentMessage(data, ticketing); break;\n\t\tdefault: console.error(`updateTicketing: unkown payment gateway \"${paymentGateway}\", ` +\n\t\t\t'discarding payment message');\n\t}\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Ticketing timeout\n\n/**\n * Display an error with the timeout message, and cancel the order.\n * This function clears the ticketing session.\n */\nfunction goToTicketingTimeout() {\n\ttrack({ a: 'ticketing-go-timeout' });\n\n\tconst ticketing = Store.get().showtimes.ticketing;\n\tconst message = getCopy('TICKETING_TIMEOUT_MESSAGE', {\n\t\tMIN: Math.round(ticketing.allowedTime / 60)\n\t});\n\n\tgoToError(message);\n}\n\n\n// =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n// Error in ticketing\n\n/**\n * Function called when an HTTP error occurs\n *\n * @param {Object} error - the error object returned by fetch\n */\nfunction onHttpError(error) {\n\tlet copy = '$UNKNOW_ERROR';\n\n\t// TODO: Track error numbers\n\t// TODO: Branch based on error gravity (display message or error panel)\n\n\tif (isMxErrorObject(error)) {\n\t\tconst { errorCode } = error.data.error;\n\t\tcopy = '$MX_' + getMxErrorKey(errorCode);\n\t\ttrack({\n\t\t\ta: 'ticketing-error-from-mx',\n\t\t\tl: errorCode\n\t\t});\n\t} else if (isPowErrorObject(error)) {\n\t\tconst { code } = error.data.error;\n\n\t\tif (code === powErrors.AUTH_FAIL || code === powErrors.AUTH_EXPIRED) {\n\t\t\tStore.emit(actions.AUTH_CLEAR);\n\t\t}\n\n\t\tcopy = '$POW_' + getPowErrorKey(code);\n\t\ttrack({\n\t\t\ta: 'ticketing-error-from-pow',\n\t\t\tl: code\n\t\t});\n\t}\n\n\tgoToError(copy);\n}\n\n/**\n * Display the \"ERROR\" pane.\n * This function clears the ticketing session.\n *\n * Should only be used in extreme cases, where you know won't be able to handle the error.\n *\n * @param {string=} message - the error message to show to the user\n */\nfunction goToError(message) {\n\ttrack({ a: 'ticketing-error' });\n\n\tclearTicketingSession();\n\n\tconst ticketing = Store.get().showtimes.ticketing;\n\n\tticketing.set({\n\t\tstate:     ERROR,\n\t\tmessage:   message,\n\t\tprevState: ticketing.state\n\t});\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/store/updateTicketing.js","module.exports = response => response.data;\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/deserialise.js","export * as oneTrust from './oneTrust';\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/index.js","import { h, Component } from 'preact';\nimport * as categories from './categories';\n\nexport default function connectToOneTrust(category, C) {\n\treturn class OneTrustComponent extends Component {\n\t\tconstructor(props) {\n\t\t\tsuper(props);\n\t\t\tthis.onCategoriesChange = this.onCategoriesChange.bind(this);\n\t\t\tthis.state.categories = [...categories.get()];\n\t\t}\n\n\t\tcomponentDidMount() {\n\t\t\tcategories.addChangeListener(this.onCategoriesChange);\n\t\t}\n\n\t\tcomponentWillUnmount() {\n\t\t\tcategories.removeChangeListener(this.onCategoriesChange);\n\t\t}\n\n\t\tonCategoriesChange(nextCategories) {\n\t\t\tthis.setState({\n\t\t\t\tcategories: [...nextCategories],\n\t\t\t});\n\t\t}\n\n\t\trender() {\n\t\t\treturn (\n\t\t\t\t<C\n\t\t\t\t\t{...this.props}\n\t\t\t\t\toneTrustAllowed={categories.has(this.state.categories, category)}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t};\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/connectToOneTrust.js","import { h, Component } from 'preact';\nimport * as categories from './categories';\n\nexport default function createPixelComponent (...Components) {\n\t// NOTE: Should we have the class outside of this function and just return an instance instead ? Can pass Components as a prop\n\t// Not a big issue but feels weird to create a whole new class at every call of this function (in the pixels render)\n\treturn class PixelComponent extends Component {\n\t\tconstructor(props) {\n\t\t\tsuper(props);\n\t\t\tthis.onCategoriesChange = this.onCategoriesChange.bind(this);\n\t\t\tthis.state.categories = [...categories.get()];\n\t\t}\n\n\t\tcomponentDidMount() {\n\t\t\tcategories.addChangeListener(this.onCategoriesChange);\n\t\t}\n\n\t\tcomponentWillUnmount() {\n\t\t\tcategories.removeChangeListener(this.onCategoriesChange);\n\t\t}\n\n\t\tshouldComponentUpdate(nextProps, nextState) {\n\t\t\treturn nextState.categories !== this.state.categories\n\t\t\t\t|| nextProps.children !== this.props.children;\n\t\t}\n\n\t\tonCategoriesChange(nextCategories) {\n\t\t\tthis.setState({\n\t\t\t\tcategories: [...nextCategories],\n\t\t\t});\n\t\t}\n\n\t\trender() {\n\t\t\treturn (\n\t\t\t\t<div>\n\t\t\t\t\t{Components\n\t\t\t\t\t\t.filter(([category]) => categories.has(\n\t\t\t\t\t\t\tthis.state.categories,\n\t\t\t\t\t\t\tcategory\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.map(([, C]) => (<C {...this.props} />))\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t};\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/createPixelComponent.js","import { h } from 'preact';\nimport cleanCategory from '../cleanCategoryName.common';\nimport * as categories from './categories';\nimport * as queue from './queue';\n\nexport { default as Pixel } from './Pixel';\nexport { maybeHandle } from './maybeHandle';\nexport { default as connectToOneTrust } from './connectToOneTrust';\nexport { default as createPixelComponent } from './createPixelComponent';\n\nexport { STRICTLY_NECESSARY, FUNCTIONAL, TARGETING, ADVERTISING } from './categories';\n\nexport const cleanCategoryName = cleanCategory;\n\nexport const displayModal = () => {\n\tif (typeof window === 'object' && window.OneTrust) {\n\t\twindow.OneTrust.ToggleInfoDisplay();\n\t}\n};\n\nconst dispatchEvent = (name, data = {\n\tbubbles: false,\n\tcancelable: false,\n\tdetail: null,\n}) => {\n\tlet E = window.CustomEvent;\n\tif (typeof E !== 'function') {\n\t\t// eslint-disable-next-line\n\t\tfunction FakeEvent(name, data) {\n\t\t\tconst e = document.createEvent('CustomEvent');\n\t\t\te.initCustomEvent(name, data.bubbles, data.cancelable, data.detail);\n\t\t\treturn e;\n\t\t}\n\t\tFakeEvent.prototype = window.Event.prototype;\n\t\tE = FakeEvent;\n\t}\n\twindow.dispatchEvent(new E(name, data));\n};\n\ncategories.addChangeListener((allowedCategories) => {\n\twindow.powsterOneTrust = [...allowedCategories];\n\tallowedCategories.forEach((category) => dispatchEvent(`powster.onetrust.${category}`));\n});\n\ncategories.addChangeListener((allowedCategories) => {\n\tqueue.drain(allowedCategories);\n});\n\nif (typeof window !== 'undefined') {\n\tlet isOptatonInitialised = false;\n\twindow.OptanonWrapper = function() {\n\t\tif (!isOptatonInitialised) {\n\t\t\tconst activeGroups = window.OptanonActiveGroups;\n\t\t\tcategories.set(activeGroups);\n\t\t\tisOptatonInitialised = true;\n\t\t}\n\t};\n\n\twindow.addEventListener('consent.onetrust', ({ detail }) => {\n\t\treturn categories.set(detail);\n\t});\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/index.js","import Pixel from './Pixel';\nimport cleanCategory from '../cleanCategoryName.common';\n\nexport const maybeHandle = (oneTrustCategory, fn, shouldQueue) => {\n\tconst category = cleanCategory(oneTrustCategory);\n\tif (typeof category === 'undefined') {\n\t\treturn fn();\n\t}\n\n\tconst pixel = new Pixel(category, fn, shouldQueue);\n\treturn pixel.createTrigger()();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/gdpr/oneTrust/maybeHandle.js","import { getGeoFromIPAsync } from \"utils/clientUtils\";\nimport { accessNested, isObject, joinPaths } from \"utils/utils\";\n\n\nlet redirectState = (geoFencedLocation) => {\n\tif (!geoFencedLocation) {\n\t\treturn;\n\t}\n\tif (location.hostname === 'localhost' || location.hostname === '127.0.0.1') {\n\t\tconsole.log('GEOFENCING GOING TO', geoFencedLocation);\n\t\treturn;\n\t}\n\tlet destinationHost = (/^((https?:)?\\/\\/)?([^/]+)/.exec(geoFencedLocation) || [])[3];\n\t// Try to prevent SOME infinite redirect loops (wouldn't catch a lot of things)\n\tif (window.location.host !== destinationHost) {\n\t\twindow.location.href = geoFencedLocation;\n\t}\n\treturn true;\n}\n\nlet getGeo = (function() {\n\tlet cache;\n\treturn () => cache || (cache = getGeoFromIPAsync());\n})();\n\nexport default function geoFencing() {\n\tlet redirectionActive = typeof location !== 'undefined' && !location.search.match(/[?&]redirect=(off|false|0|no)/);\n\tif (!redirectionActive || !window.__INITIAL_STATE__) {\n\t\treturn Promise.resolve();\n\t}\n\tlet appData = window.__INITIAL_STATE__.appData || {};\n\tlet campaign = window.location.search;\n\tlet geoFence = appData.geofencing || {};\n\tlet redirectObj = appData.redirection || {};\n\tlet appRegion = accessNested(appData, 'meta.region.slug');\n\n\treturn Promise.resolve(getGeo()).then(result => {\n\t\tlet countryCode = result.countryCode;\n\t\t// NOTE: dynamicData is unlikely to already be available add some code if that needs to be the case\n\t\tconst store = Store.get();\n\t\tconst dynamicData = store.dynamicData;\n\t\tlet regionData = accessNested(dynamicData, ['regions', countryCode, 'url']);\n\n\t\t//allow for regions to be ignored per request\n\t\tconst regionAllow = geoFence.allowRegions || '';\n\t\tconst ignoreFor = regionAllow.split(',').map(region => region.trim().toLowerCase()).filter(e => e);\n\t\tconst ignoreGeoFence = ignoreFor.indexOf(countryCode) !== -1;\n\n\t\t// check if site is in correct country (and ignore if it is)\n\t\tif (appRegion !== countryCode && geoFence && geoFence.geofencing && !ignoreGeoFence) {\n\t\t\tlet geoFencedLocation = accessNested(geoFence, ['overrides', countryCode]) || regionData || geoFence.defaultLink;\n\t\t\tif (geoFencedLocation) {\n\t\t\t\tlet url;\n\t\t\t\tlet noActivePage;\n\t\t\t\tif (isObject(geoFencedLocation)) {\n\t\t\t\t\turl = geoFencedLocation.url;\n\t\t\t\t\tnoActivePage = geoFencedLocation.noActivePage;\n\t\t\t\t} else {\n\t\t\t\t\turl = geoFencedLocation;\n\t\t\t\t\tnoActivePage = geoFence.noActivePage;\n\t\t\t\t}\n\t\t\t\tif (!noActivePage) url = joinPaths(url, store.activePage.path);\n\t\t\t\treturn redirectState(url + campaign);\n\t\t\t}\n\t\t} else {\n\t\t\t// standard redirect behaviour\n\t\t\tlet optionsList = Object.keys(redirectObj).map(k => redirectObj[k]).concat(redirectObj).filter(e => e && e.url);\n\t\t\tlet getActiveRedirect = Promise.resolve();\n\t\t\toptionsList.forEach(option => {\n\t\t\t\tgetActiveRedirect = getActiveRedirect.then(result => {\n\t\t\t\t\tif (result) return result;\n\t\t\t\t\tlet checklist = [];\n\n\t\t\t\t\tif (option.country) {\n\t\t\t\t\t\tlet list = option.country.split(',').map(e => e.trim());\n\t\t\t\t\t\t// .then(e => console.log('?', e) || e)\n\t\t\t\t\t\tchecklist.push(getGeo().then(geo => list.indexOf(geo.countryCode) !== -1));\n\t\t\t\t\t}\n\t\t\t\t\tif (option.countryNot) {\n\t\t\t\t\t\tlet list = option.countryNot.split(',').map(e => e.trim());\n\t\t\t\t\t\tchecklist.push(getGeo().then(geo => list.indexOf(geo.countryCode) === -1));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.all(checklist).then(listResults => listResults.every(e => e) ? option : result).catch(e => result);\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn getActiveRedirect.then(redirect => {\n\t\t\t\tif (!redirect) return;\n\t\t\t\treturn redirectState(redirect.url + campaign);\n\t\t\t}).catch(e => console.log('Failed redirecting', e));\n\t\t}\n\t});\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/geoFencing.js","/*\n * File needs to work in Node 6, so don't use imports!\n */\n\nfunction isError(res) {\n\treturn res.status === 0 || res.status >= 400 && res.status < 600;\n\t// ^ no-cors fetch can return status of 0\n}\n\nfunction handleApiResponse(res) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (isError(res)) {\n\t\t\treturn res.json().then(reject);\n\t\t}\n\t\treturn resolve(res.json());\n\t});\n\n\t// return res.json().then(json => isError(res) ? Promise.reject(json) : json);\n\n\t// if (isError(res)) {\n\t// \treturn res.json.then(Promise.reject);\n\t// }\n\t// return res.json();\n}\n\nfunction handleApiResponseText(res) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (isError(res)) {\n\t\t\treturn res.text().then(reject);\n\t\t}\n\t\treturn resolve(res.text());\n\t});\n}\n\nmodule.exports = {\n\thandleApiResponse,\n\thandleApiResponseText\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/handleApi.js","import Store from 'store/store';\nimport { accessNested } from 'utils/utils';\n\n// \"yyyy-MM-dd\" => timestamp\nfunction getDateTimestamp(str) {\n\tif (!str) return undefined;\n\tlet match = str.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n\tif (!match) return undefined;\n\treturn +new Date(+match[1], match[2] - 1, +match[3]);\n}\n// \"yyyy-MM-dd to yyyy-MM-dd\" => [timestampFrom, timestampTo]\nfunction getDateRange(str) {\n\tlet match = str.match(/^((?:!|not)\\s*)?(\\S+)(?:\\s*(?:to|->)\\s*(\\S+))?$/i);\n\tif (!match) return undefined;\n\tlet from = getDateTimestamp(match[2]);\n\tlet to = match[3] ? getDateTimestamp(match[3]) : from;\n\tif (!from || !to) return undefined;\n\treturn [from, to, !!match[1]];\n}\nfunction inRange(value, range) {\n\treturn range && (value >= range[0] && value <= range[1]) === !range[2];\n}\n\nfunction pad2(n) {\n\tif (!+n) n = 0;\n\treturn ('0' + n).slice(-2);\n}\nfunction cleanTime(time) {\n\tif (!time || typeof time !== 'string') return null;\n\tlet parts = time.match(/^(\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2}))?)?$/);\n\tif (!parts) return null;\n\treturn pad2(parts[1]) + ':' + pad2(parts[2]) + ':' + pad2(parts[3]);\n}\nfunction getTheaterId(identifier, included) {\n\tif (!identifier || typeof identifier !== 'string') return null;\n\tlet parts = identifier.split(':');\n\tif (parts.length < 2) {\n\t\treturn identifier;\n\t}\n\tlet pid = parts.shift();\n\tlet ptid = parts.join(':');\n\tlet match = included && included.find(inc => inc.type === 'theaters' && inc.attributes.provider_id === pid && inc.attributes.provider_theater_id === ptid);\n\treturn match && match.id;\n}\n\nlet caches = {};\nfunction getIncluded(included, type, id) {\n\tif (!included || !type || !id) return;\n\tif (!caches[type]) {\n\t\tcaches[type] = {};\n\t}\n\tif (caches[type][id]) {\n\t\treturn caches[type][id];\n\t}\n\treturn caches[type][id] = included.find(inc => inc.type === type && inc.id === id);\n}\n\nlet formatCache = {};\nlet movieCache = {};\nfunction editFormat(included, screening, format) {\n\tif (!included || !screening || !format) return;\n\tif (typeof format === 'string') {\n\t\tlet search = format.toLowerCase();\n\t\tif (formatCache[search]) {\n\t\t\tformat = formatCache[search];\n\t\t} else {\n\t\t\tlet result = included.find(inc => (\n\t\t\t\tinc.type === 'formats' && inc.attributes.name.toLowerCase() === search\n\t\t\t));\n\t\t\tif (!result) {\n\t\t\t\tresult = {\n\t\t\t\t\ttype: 'formats',\n\t\t\t\t\tid: search,\n\t\t\t\t\tattributes: { name: format }\n\t\t\t\t};\n\t\t\t\tincluded.push(result);\n\t\t\t}\n\t\t\tformatCache[search] = format = result;\n\t\t}\n\t}\n\tif (!format || !format.id) return;\n\tlet mid = screening.attributes.movie_id;\n\tlet srcMovie = included.find(inc => (\n\t\tinc.type === 'movies' && inc.id === mid\n\t));\n\tif (!srcMovie || srcMovie.attributes.format_id === format.id) return;\n\tlet lookup = [srcMovie.attributes.provider_id, format.id].join('|');\n\tlet movie = movieCache[lookup];\n\tif (!movie) {\n\t\tmovie = included.find(inc => (\n\t\t\tinc.type === 'movies' && inc.attributes.format_id === format.id && inc.attributes.provider_id === srcMovie.attributes.provider_id\n\t\t));\n\t\tif (!movie) {\n\t\t\t// Urgh\n\t\t\tmovie = JSON.parse(JSON.stringify(srcMovie));\n\t\t\tmovie.attributes.format_id = format.id;\n\t\t\tmovie.id += '|' + format.id;\n\t\t\tincluded.push(movie);\n\t\t}\n\t\tmovieCache[lookup] = movie;\n\t}\n\tif (!movie || !movie.id) return;\n\tscreening.attributes.movie_id = movie.id;\n}\n\nfunction clearCaches() {\n\tcaches = {};\n\tformatCache = {};\n\tmovieCache = {};\n}\n\nfunction formatSlug(name) {\n\tif (!name) return name;\n\treturn name.toLowerCase().replace(/ /g, '');\n}\n\nmodule.exports = function(data, included, appData) {\n\tclearCaches();\n\n\tlet store = Store.get();\n\n\tif (accessNested(store, 'activePage.data.splitSpecialTheaters', true)) {\n\t\tlet thCache = {};\n\t\tlet splitTheater = (id, data) => {\n\t\t\tlet nid = id + ':' + data.indicator;\n\t\t\tif (thCache[nid]) {\n\t\t\t\treturn thCache[nid];\n\t\t\t}\n\t\t\tlet src = included.find(i => i.type === 'theaters' && i.id === id);\n\t\t\tif (!src) return;\n\t\t\tlet nTh = JSON.parse(JSON.stringify(src));\n\t\t\tnTh.id = nid;\n\t\t\tnTh.attributes.name += ' (' + data.name + ')';\n\t\t\tnTh.attributes.theater_master_id += ':' + data.indicator;\n\t\t\tnTh.attributes.theater_master_id = data.masterId || (nTh.attributes.theater_master_id + ':' + data.indicator);\n\t\t\tthCache[nid] = nTh;\n\t\t\tincluded.push(nTh);\n\t\t\treturn nTh;\n\t\t};\n\t\tlet specialTheaters = [\n\t\t\t{ indicator: 'dome', name: 'Dome' },\n\t\t\t// Hardcoded Curzon Bloomsbury dochouse id - ugly I know but \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:dochouse\" is not a valid guid\n\t\t\t// And need to match powster dochouse to the split version of webedia\n\t\t\t{ indicator: 'dochouse', name: 'DocHouse', masterId: '98e24e12-d9bb-11e7-9354-db0c57537af4' }\n\t\t];\n\t\tdata.forEach(s => {\n\t\t\tlet comments = accessNested(s, 'attributes.doc.comments');\n\t\t\tif (!comments) return;\n\t\t\tlet commentsList = comments.toLowerCase().split(';');\n\t\t\t// Using find to have a break behaviour (stops after the first found)\n\t\t\tspecialTheaters.find(special => {\n\t\t\t\tif (commentsList.indexOf(special.indicator) === -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet newTheater = splitTheater(s.attributes.theater_id, special);\n\t\t\t\tif (newTheater) {\n\t\t\t\t\ts.attributes.theater_id = newTheater.id;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tlet disabledScreenings = accessNested(store, 'activePage.data.disabledScreenings') || {};\n\tlet disabledScreeningsContexts = [disabledScreenings].concat(\n\t\tObject.keys(disabledScreenings).map(k => disabledScreenings[k])\n\t).filter(ctx => ctx && Object.keys(ctx).length);\n\n\tif (disabledScreeningsContexts.length) {\n\t\tdisabledScreeningsContexts = disabledScreeningsContexts.map(ctx => {\n\t\t\tctx = Object.assign({}, ctx);\n\t\t\tif (ctx.date) {\n\t\t\t\tctx.date = ctx.date.split(',').map(part => getDateRange(part.trim())).filter(e => e);\n\t\t\t}\n\t\t\tif (ctx.time) {\n\t\t\t\tctx.time = ctx.time.split(',').map(part => cleanTime(part.trim())).filter(e => e);\n\t\t\t}\n\t\t\tif (ctx.format) {\n\t\t\t\tctx.format = ctx.format.split(',').map(part => formatSlug(part.trim())).filter(e => e);\n\t\t\t}\n\t\t\tif (ctx.theater) {\n\t\t\t\tctx.theater = ctx.theater.split(',').map(part => getTheaterId(part.trim(), included)).filter(e => e);\n\t\t\t}\n\t\t\tif (ctx.provider) {\n\t\t\t\tctx.provider = ctx.provider.split(',').map(part => part.trim()).filter(e => e);\n\t\t\t}\n\t\t\treturn ctx;\n\t\t});\n\t\tlet localFormatCache = {};\n\t\tlet getFormat = screening => {\n\t\t\tlet mid = screening.attributes.movie_id;\n\t\t\tif (localFormatCache[mid]) {\n\t\t\t\treturn localFormatCache[mid];\n\t\t\t}\n\t\t\tlet format = null;\n\t\t\tlet movie = included.find(inc => inc.type === 'movies' && inc.id === mid);\n\t\t\tif (movie && movie.attributes.format_id) {\n\t\t\t\tlet fid = movie.attributes.format_id;\n\t\t\t\tlet fObj = included.find(inc => inc.type === 'formats' && inc.id === fid);\n\t\t\t\tformat = fObj && fObj.attributes.name;\n\t\t\t}\n\t\t\treturn localFormatCache[mid] = format;\n\t\t};\n\t\tdata = data.filter(screening => {\n\t\t\t// If one context validates, filter out the screening\n\t\t\treturn !disabledScreeningsContexts.find(ctx => {\n\t\t\t\treturn Object.keys(ctx).every(key => {\n\t\t\t\t\tlet val = ctx[key];\n\t\t\t\t\tif (val === null) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (key) {\n\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\tlet date = getDateTimestamp((screening.attributes.date || '').slice(0, 10));\n\t\t\t\t\t\t\treturn date && ctx.date.find(range => inRange(date, range));\n\t\t\t\t\t\tcase 'time':\n\t\t\t\t\t\t\tlet time = screening.attributes.time;\n\t\t\t\t\t\t\treturn time && ctx.time.indexOf(time) !== -1;\n\t\t\t\t\t\tcase 'format':\n\t\t\t\t\t\t\tlet slug = formatSlug(getFormat(screening));\n\t\t\t\t\t\t\treturn slug && ctx.format.indexOf(slug) !== -1;\n\t\t\t\t\t\tcase 'theater':\n\t\t\t\t\t\t\tlet tid = screening.attributes.theater_id;\n\t\t\t\t\t\t\treturn tid && ctx.theater.indexOf(tid) !== -1;\n\t\t\t\t\t\tcase 'provider':\n\t\t\t\t\t\t\tlet provider = screening.attributes.provider_id;\n\t\t\t\t\t\t\treturn provider && ctx.provider.indexOf(provider) !== -1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tlet customFormats = accessNested(store, 'activePage.data.customFormats') || {};\n\tif (customFormats.format) {\n\t\tcustomFormats = {\n\t\t\tmain: customFormats\n\t\t};\n\t}\n\t// Prebuild the object to make things faster\n\tlet customFormatsList = Object.keys(customFormats).map((prop, index) => {\n\t\tlet data = customFormats[prop];\n\t\tif (!data || typeof data !== 'object' || !data.format) return;\n\t\tlet dataObj = {\n\t\t\tformat: data.format,\n\t\t\tappend: !!data.append\n\t\t};\n\t\tif (data.date) {\n\t\t\tdataObj.dateRanges = data.date.split(',').map(part => getDateRange(part.trim())).filter(e => e);\n\t\t}\n\t\tif (data.time) {\n\t\t\tdataObj.times = data.time.split(',').map(time => cleanTime(time.trim())).filter(e => e);\n\t\t}\n\t\t// if (data.theaterName) {\n\t\t// Issue with theaters having a comma in the name\n\t\t// \tdataObj.theaterName = data.theaterName.split(',');\n\t\t// }\n\t\tif (data.theater) {\n\t\t\tdataObj.theaters = data.theater.split(',').map(theater => theater.trim()).filter(e => e);\n\t\t} else  if (data.theaterNot) {\n\t\t\tdataObj.theatersNot = data.theaterNot.split(',').map(theater => theater.trim()).filter(e => e);\n\t\t}\n\t\tif (data.domain) {\n\t\t\tdataObj.domains = data.domain.split(',').map(domain => domain.trim()).filter(e => e);\n\t\t}\n\t\tif (data.country) {\n\t\t\tdataObj.countries = data.country.split(',').map(country => country.trim()).filter(e => e);\n\t\t}\n\t\tdataObj.order = data.order || (index + 100);\n\t\treturn dataObj;\n\t}).filter(e => e);\n\tcustomFormatsList.sort((a, b) => a.order - b.order);\n\tif (customFormatsList.length) {\n\t\tdata.forEach(screening => {\n\t\t\tlet sDate = getDateTimestamp((screening.attributes.date || '').slice(0, 10));\n\t\t\tlet sTime = screening.attributes.time;\n\t\t\tlet matching = customFormatsList.find(formatCond => {\n\t\t\t\tif (formatCond.dateRanges) {\n\t\t\t\t\tif (!sDate || !formatCond.dateRanges.find(range => inRange(sDate, range))) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.times) {\n\t\t\t\t\tif (!sTime || formatCond.times.indexOf(sTime) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.theaters || formatCond.theatersNot) {\n\t\t\t\t\tlet thId = screening.attributes.theater_id;\n\t\t\t\t\tlet theater = getIncluded(included, 'theaters', thId);\n\t\t\t\t\tlet ptid = accessNested(theater, 'attributes.provider_id') + ':' + accessNested(theater, 'attributes.provider_theater_id');\n\t\t\t\t\tif (\n\t\t\t\t\t\t(formatCond.theaters && !formatCond.theaters.find(desired => thId === desired || ptid === desired))\n\t\t\t\t\t\t|| (formatCond.theatersNot && formatCond.theatersNot.find(desired => thId === desired || ptid === desired))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.domains) {\n\t\t\t\t\tlet thId = screening.attributes.theater_id;\n\t\t\t\t\tlet theater = getIncluded(included, 'theaters', thId);\n\t\t\t\t\tlet exId = accessNested(theater, 'attributes.exhibitor_id');\n\t\t\t\t\tlet exhibitor = getIncluded(included, 'exhibitors', exId);\n\t\t\t\t\tlet domain = accessNested(exhibitor, 'attributes.domain');\n\t\t\t\t\tif (!domain || formatCond.domains.indexOf(domain) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (formatCond.countries) {\n\t\t\t\t\tlet thId = screening.attributes.theater_id;\n\t\t\t\t\tlet theater = getIncluded(included, 'theaters', thId);\n\t\t\t\t\tlet country = accessNested(theater, 'attributes.country');\n\t\t\t\t\tif (!country || formatCond.countries.indexOf(country) === -1) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tif (matching) {\n\t\t\t\tlet format = matching.format;\n\t\t\t\tif (matching.append) {\n\t\t\t\t\tlet movie = getIncluded(included, 'movies', screening.attributes.movie_id);\n\t\t\t\t\tlet formatObject = getIncluded(included, 'formats', movie && movie.attributes.format_id);\n\t\t\t\t\tif (formatObject) {\n\t\t\t\t\t\tformat = formatObject.attributes.name + ' ' + format;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\teditFormat(included, screening, format);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tdata: data,\n\t\tincluded: included\n\t};\n};\n\nObject.assign(module.exports, {\n\tgetDateTimestamp,\n\tgetDateRange,\n\tinRange,\n\teditFormat,\n\tgetIncluded,\n\tclearCaches\n});\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/preprocessScreenings.js","import { h } from 'preact';\nimport Store from 'store/store';\nimport * as actions from 'store/actions';\nimport { track } from \"utils/tracking\";\nimport { accessNested } from \"utils/utils\";\n\nimport ChangeRegionModal from 'components/shared/regionMismatchModal/changeRegionModal';\n\n\n/* State Getters\n--------------------------------*/\n\nconst getGeoCountryCode = state => state.client.geo && state.client.geo.countryCode;\nconst getAppRegionCode = state => state.appData.meta.region.slug;\nconst getAppLanguageCode = state => state.appData.meta.region.language;\n\nconst getAppCountryCode = state => {\n\t// Grab the first 2 letters of the region code\n\t// (ex. BE_FR => BE)\n\tconst match = /^\\w{2}/.exec(getAppRegionCode(state));\n\treturn match && match[0];\n};\n\nconst getAppGeoRegions = state => {\n\tconst alteredRegions = {};\n\tconst dynamicRegions = accessNested(state, \"dynamicData.regions\");\n\tconst staticRegions = accessNested(state, \"appData.meta.regions\", {});\n\tconst extraExternalRegions = accessNested(state, \"appData.meta.extraRegions\", null);\n\tconst regions = dynamicRegions || staticRegions;\n\n\n\n\n\n\t// Add in extra external regions\n\tObject.keys(regions).forEach((reg)=>{\n\t\t// Add in the regionCode to all of the regions\n\t\talteredRegions[reg] = {\n\t\t\t...regions[reg],\n\t\t\tregionCode: reg\n\t\t};\n\t});\n\n\tif (extraExternalRegions) {\n\n\t\t// format the regions to the right format and add them to the regions\n\t\tObject.keys(extraExternalRegions).forEach((key)=>{\n\n\t\t\talteredRegions[key] = {\n\t\t\t\tregionCode: key,\n\t\t\t\turl: extraExternalRegions[key]\n\t\t\t};\n\t\t});\n\t}\n\n\n\n\n\treturn alteredRegions;\n};\n\n\n\n/* Helper Functions\n-----------------------------*/\n\nfunction getGeoRegionMatches(countryCode, regionCodes) {\n\t// Create reg ex to match all regions which match country\n\t// e.g. for ch could be: ch, ch_fr\n\t// e.g. for be could be: be_fr, be_nl\n\tconst countryCodeRE = new RegExp(`^(${countryCode})(_[a-z]{2})?$`);\n\n\treturn regionCodes\n\t\t.filter(region => countryCodeRE.exec(region))\n\t\t.map(region => {\n\t\t\tconst regexResult = countryCodeRE.exec(region);\n\t\t\treturn {\n\t\t\t\tregionCode: region,\n\t\t\t\tcountryCode: regexResult[1],\n\t\t\t\tlanguageCode: regexResult[2]\n\t\t\t};\n\t\t});\n\n}\n\nfunction getCurrentAppLanguageMatch(country, language, regionMatches) {\n\treturn regionMatches.find(match => {\n\t\treturn match.countryCode === country && match.languageCode === language\n\t});\n}\n\n\n/**\n * Detect if the Users region is not the same as the apps region\n * @return {Boolean}\n */\nfunction detectRegionMismatch(store) {\n\t// If not first visit, then shouldn't display modal\n\t// (as user has previously decided to stay here)\n\t// TODO: add in again\n\t// if (!isFirstVisit(this.props)) return false;\n\n\tconst appCode = getAppCountryCode(store);\n\tconst appLanguage = getAppLanguageCode(store);\n\tconst appRegion = getAppRegionCode(store);\n\tconst geoCode = getGeoCountryCode(store);\n\n\t// TODO: also check language in the browser presets\n\t// needed for country's with multiple languages (ex. Belgium)\n\n\n\t// If geo and app region not determined then don't display modal\n\t// (as we don't yet know if we have a mismatch)\n\tif (!(appCode !== null && geoCode !== null)) return false;\n\n\tlet geoMismatch = appCode !== geoCode;\n\n\tif (appRegion.indexOf('_') > -1 && navigator && navigator.language && appLanguage !== navigator.language) {\n\t\t// Means it's a multi language app,\n\t\t// so let's check if the user has a language set\n\t\tgeoMismatch = true;\n\t}\n\n\tif (geoMismatch) {\n\t\t// The regions aren't matching, so let the tracking know\n\t\ttrack({ a: \"geo-region-mismatch\", once: true });\n\t} else {\n\t\t// regions are matching\n\t\ttrack({ a: \"geo-region-match\", once: true });\n\t}\n\n\treturn geoMismatch;\n}\n\n\nfunction getMatchingRegionApp(state) {\n\t// Get geo countryCode, app geo regions and app langugage from state\n\tconst geoCountryCode = getGeoCountryCode(state);\n\tconst availableAppRegions = getAppGeoRegions(state);\n\tconst appRegion = getAppRegionCode(state);\n\tconst appLanguageCode = getAppLanguageCode(state);\n\n\t// Find all app regions which match the current country code\n\tconst matches = getGeoRegionMatches(geoCountryCode, Object.keys(availableAppRegions));\n\n\t// console.log('the availavle regions', availableAppRegions);\n\n\t// Get all allowable geo region / app region matches\n\tconst currentAppLanguageMatch = getCurrentAppLanguageMatch(\n\t\tgeoCountryCode,\n\t\tappLanguageCode,\n\t\tmatches\n\t);\n\n\t// console.log('get Matching region App',  currentAppLanguageMatch, state.appData.meta, appLanguageCode, availableAppRegions, geoCountryCode);\n\n\tif (currentAppLanguageMatch) {\n\t\t// First try to match against language of current region (NOTE: is this the right logic?)\n\t\treturn availableAppRegions[currentAppLanguageMatch.regionCode];\n\t}\n\n\n\t// Then try to match against exact region match\n\tconst exactMatch = \tmatches.find(({regionCode}) => regionCode === geoCountryCode);\n\n\tif (exactMatch) {\n\t\treturn availableAppRegions[exactMatch.regionCode];\n\t} else if (availableAppRegions['other']) {\n\t\treturn availableAppRegions['other'];\n\t}\n\n\n\t// Then return first result found\n\tconst firstMatch = matches[0];\n\n\tif (firstMatch) {\n\t\tif (appRegion.indexOf('_') > 0) {\n\t\t\t// Multi Region App\n\t\t\tif (navigator && navigator.language && availableAppRegions[geoCountryCode+'_'+navigator.language]) {\n\t\t\t\t// Check the language the user has set in the browser\n\t\t\t\t// and see if we have an app available for that language in that region\n\t\t\t\treturn availableAppRegions[geoCountryCode+'_'+navigator.language];\n\t\t\t}\n\t\t\t// Didn't find any region app with that language,\n\t\t\t// so let's not show the popup\n\t\t} else {\n\t\t\treturn availableAppRegions[firstMatch.regionCode];\n\t\t}\n\t}\n\t// Return null if no match\n\treturn null;\n}\n\nfunction displayRegionModal() {\n\tconst store = Store.get();\n\n\tconst shouldDisplayRegionMismatchModal =\n\t\tstore.appData.options.useRegionMismatchModal && // Is it enabled in the appData\n\t\tdetectRegionMismatch(store); // Are we actually in the wrong region\n\n\n\tif (!shouldDisplayRegionMismatchModal) {\n\t\treturn;\n\t}\n\n\n\tconst userRegionApp = getMatchingRegionApp(store);\n\n\n\tif (!userRegionApp) {\n\t\t// No App found with the users region,\n\t\t// so don't show the popup\n\t\treturn;\n\t}\n\n\tconst appRegionCode  = getAppRegionCode(store);\n\tconst appCountryCode = getAppCountryCode(store);\n\tlet currentApp     = getAppGeoRegions(store)[appRegionCode];\n\tif (!currentApp) {\n\t\tcurrentApp = {\n\t\t\tregionCode: appRegionCode,\n\t\t\turl: store.appData.meta.url\n\t\t};\n\t}\n\n\t// Display the region modal\n\tStore.emit(actions.SHOW_MODAL, (\n\t\t<ChangeRegionModal\n\t\t\tgeo={store.client.geo}\n\t\t\tappRegionCode={getAppRegionCode(store)}\n\t\t\tappCountryCode={getAppCountryCode(store)}\n\t\t\timagePath={store.appData.urls.roots.sharedImages}\n\t\t\tapiRoot={store.appData.apis.stdata.root}\n\t\t\tcurrentApp={currentApp}\n\t\t\tuserRegionApp={userRegionApp}\n\t\t\tcopy={store.appData.copy}\n\t\t/>\n\t), null, { type: 'regionModal' });\n}\n\n\n/* Exported Functions\n--------------------------------*/\n\nfunction displayRegionModalIfNeeded() {\n\n\tlet store = Store.get();\n\n\n\tif (store.user && store.user.regionModalDismissed) {\n\t\t// The user has dismissed the modal before,\n\t\t// so let's not show again\n\t\treturn;\n\t}\n\n\n\t// Make sure the call to get dynamic content is finished\n\tif (!store.dynamicData || !store.dynamicData.regions) {\n\t\t// Listen to when dynamic data is updated\n\t\tStore.on(actions.UPDATE_DYNAMIC_DATA, () => {\n\t\t\tif (Store.get().dynamicData.regions) {\n\t\t\t\t// Regional data is finally available,\n\t\t\t\t// so proceed\n\t\t\t\tdisplayRegionModal();\n\t\t\t}\n\t\t})\n\t} else {\n\t\t// All the data has already been loaded,\n\t\t// so proceed\n\t\tdisplayRegionModal();\n\t}\n}\n\n\nexport {\n\tdisplayRegionModalIfNeeded\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/regionModal.js","import { getIsIOS } from 'utils/clientUtils';\n/* SEE BELOW FOR HOW TO USE */\n\nlet now = Date.now || (() => new Date().getTime());\n\nfunction getScroll(elem, hor) {\n\tif (elem === window) {\n\t\treturn (hor ? window.pageXOffset || document.documentElement.scrollLeft : window.pageYOffset || document.documentElement.scrollTop) || 0;\n\t}\n\treturn hor ? elem.scrollLeft : elem.scrollTop;\n}\n\nfunction setScroll(elem, v, hor) {\n\tif (elem === window) {\n\t\twindow.scrollTo(hor ? v : getScroll(window, true), hor ? getScroll(window, false) : v);\n\t} else {\n\t\telem[hor ? 'scrollLeft' : 'scrollTop'] = v;\n\t}\n}\n\nfunction getElemPos(e, parent, hor) {\n\tlet prop = hor ? 'offsetLeft' : 'offsetTop';\n\tlet pos = e[prop];\n\tlet last = e;\n\n\twhile ((e = e.parentElement) && e !== parent)\n\t\tif (e === last.offsetParent) {\n\t\t\tlast = e;\n\t\t\tpos += e[prop];\n\t\t}\n\tif (parent !== window && e !== parent) return undefined;\n\treturn pos;\n\t// Other possibility\n\t// var eBounds = e.getBoundingClientRect(), pBounds = parent.getBoundingClientRect();\n\t// return eBounds.top - pBounds.top;\n}\n\nfunction endScroll(elem) {\n\tlet t = elem._smthscrl;\n\tif (!t) return;\n\tcancelAnimationFrame(t.timer);\n\tt.timer = null;\n\tif (typeof t.callback === 'function') {\n\t\tt.callback();\n\t}\n\tt.callback = null;\n}\n\nfunction oneDir(elem, p, horizontal) {\n\tlet t = elem._smthscrl;\n\tlet currentScroll = getScroll(elem, horizontal);\n\tlet dirIndex = horizontal ? 1 : 0;\n\tif (t.previousScroll[dirIndex] == undefined) t.previousScroll[dirIndex] = currentScroll;\n\t// User tried to scroll, stop\n\t// This breaks ios and stops the scroll way too early\n\t// NOTE Anthony: use the force option or add something to only change that on iOS\n\t// Commenting that blocks the desired behaviour of not preventing the user from scrolling\n\tif (currentScroll !== t.previousScroll[dirIndex] && !t.force && !getIsIOS()) {\n\t\t// As mentioned above, this breaks on Ios, so only run this on devices\n\t\t// that supports it\n\t\treturn endScroll(elem);\n\t}\n\tlet to = t.to;\n\tif (Array.isArray(to)) to = to[dirIndex];\n\tif (to instanceof Element) {\n\t\tto = getElemPos(t.to, elem, horizontal);\n\t\tlet sizeProp = horizontal ? 'clientWidth' : 'clientHeight';\n\t\tif (t.relativeTo === 'view') {\n\t\t\tlet maxPos = to - t.offsetStart;\n\t\t\tlet minPos = to - (elem[sizeProp] - t.to[sizeProp]) + t.offsetEnd;\n\t\t\tto = Math.min(Math.max(currentScroll + t.offset, minPos), maxPos);\n\t\t} else {\n\t\t\tlet rT = t.relativeTo;\n\t\t\tlet equiv = { top: 0, middle: 50, bottom: 100 };\n\t\t\trT = (equiv.hasOwnProperty(rT) ? equiv[rT] : parseFloat(rT)) || 0;\n\t\t\tto -= Math.max(elem[sizeProp] - t.to[sizeProp], 0) * rT * .01;\n\t\t}\n\t}\n\tto -= t.offset;\n\tif (t.duration <= 0) {\n\t\treturn setScroll(elem, t.to, horizontal);\n\t}\n\n\tlet newValue = t.from[dirIndex] + p * (to - t.from[dirIndex]);\n\tsetScroll(elem, newValue, horizontal);\n\tt.previousScroll[dirIndex] = getScroll(elem, horizontal);\n}\n\nfunction loop(elem) {\n\tlet t = elem._smthscrl;\n\tif (!t) return;\n\tif (t.timer) t.timer = requestAnimationFrame(loop.bind(this, elem));\n\tlet time = now() - t.start;\n\tif (time >= t.duration) time = t.duration;\n\tlet p = t.easing(t.duration ? time / t.duration : 1);\n\tlet directionsArray = [];\n\tif (t.direction === 'ver' || t.direction === 'both') directionsArray.push(false);\n\tif (t.direction === 'hor' || t.direction === 'both') directionsArray.push(true);\n\tdirectionsArray.forEach(hor => oneDir(elem, p, hor));\n\tif (time === t.duration) {\n\t\treturn endScroll(elem);\n\t}\n}\n\n// elem : element to scroll (parent container, having a scrollbar)\n//   - if elem is null or the string 'root', the script will use either body or the documentElement based on which is detected to have a scrollbar\n// v : scroll to this. Can be a number (scrollTop = v at the end) or an element ! (more on that later)\n// d : duration (in ms). Default to 300. 0 to instant scroll.\n// settings : Object containing\n//   - callback : callback to be called after the scroll is ended (either goal reached or the user scrolled during it)\n//   - direction: 'ver' (default) for vertical, 'hor' for horizontal or 'both' (in this case, v can be an array of two numbers, [verticalPos, horizontalPos])\n//   - easing: a function taking a number v between 0 and 1 as argument and returning another number\n//       easing(0) should be 0 and easing(1) should be 1 ! (can be used to handle acceleration)\n//       default to ease-out-quad (decelerating)\n//       See https://gist.github.com/gre/1650294 for a list of basic functions\n//   - offset: number to be subtracted from the current scroll (useful if v is not a number)\n//       an offset of 20 would scroll 20 pixels past the required value\n//   - relativeTo: used when `v` is an element. Indicates where the element should be on the screen (works like background-position).\n//       'top' (default): top of v is aligned with the top of elem (eq to '0%')\n//       'bottom': bottom of v is aligned with the bottom of elem (eq to '100%')\n//       'middle': middle of v is aligned with the middle of elem (eq to '50%')\n//       'x%' or 'x': aligns the xth percent of v with the xth percent of elem\n//       'view': try to make the element visible (fully if possible)\n//          will not scroll if the element is already fully in view\n//          if v is bigger than elem, makes sure the top of v is visible\n//   - offsetStart: used when `v` is an element and relativeTo is 'view'. ensure a minimum margin from the top or left, depending on the direction (can be negative)\n//   - offsetEnd: used when `v` is an element and relativeTo is 'view'. ensure a minimum margin from the bottom or right, depending on the direction (can be negative)\n//   - force: boolean (default false) to force the smoothScroll to finish (even if the user scrolled)\nexport function smoothScrollTo(elem, v, d, settings) {\n\tif (elem === null || elem === 'root') {\n\t\telem = (typeof document.body.scrollTop !== 'undefined') ? document.body : document.documentElement;\n\t}\n\tif (!elem) {\n\t\treturn;\n\t}\n\tlet t = elem._smthscrl;\n\tif (t && t.timer) {\n\t\tendScroll(elem);\n\t}\n\tlet defaultEasing = (t => 1 - (t = 1 - t) * t);\n\tsettings = settings || {};\n\tlet dir = 'ver';\n\tswitch (settings.direction) {\n\t\tcase 'horizontal':\n\t\tcase 'hor':\n\t\t\tdir = 'hor';\n\t\t\tbreak;\n\t\tcase 'both':\n\t\t\tdir = 'both';\n\t\t\tbreak;\n\t}\n\t// Legacy horizontal mode\n\tif (settings.horizontal) dir = 'hor';\n\tlet currentScroll = [undefined, undefined];\n\tif (dir === 'ver' || dir === 'both') currentScroll[0] = getScroll(elem, false);\n\tif (dir === 'hor' || dir === 'both') currentScroll[1] = getScroll(elem, true);\n\td = +d; // Cast to number\n\tlet start = now();\n\tif (settings.timeStart) {\n\t\tstart = settings.timeStart < 60000 ? start + settings.timeStart : settings.timeStart;\n\t}\n\tt = elem._smthscrl = {\n\t\ttimer: null,\n\t\teasing: typeof settings.easing === 'function' ? settings.easing : defaultEasing,\n\t\tto: v,\n\t\tdirection: dir,\n\t\toffset: settings.offset || 0,\n\t\trelativeTo: settings.relativeTo || 'top',\n\t\toffsetStart: settings.offsetStart || 0,\n\t\toffsetEnd: settings.offsetEnd || 0,\n\t\tfrom: currentScroll,\n\t\tpreviousScroll: [undefined, undefined],\n\t\tduration: !isNaN(d) ? d : 300,\n\t\tforce: !!settings.force,\n\t\tcallback: settings.callback,\n\t\tstart: start\n\t};\n\tt.timer = requestAnimationFrame(loop.bind(this, elem));\n\treturn {\n\t\tstop: endScroll.bind(this, elem)\n\t};\n}\n\n// Like smoothScrollTo but with v being an offset instead of an absolute value (v can't be an element)\nexport function smoothScrollBy(elem, v, d, settings) {\n\tsmoothScrollTo(elem, getScroll(elem, settings && settings.horizontal) + v, d, settings);\n}\n\n// Old way to scroll to an element\n// Use smoothScrollTo with v an element to achieve this now.\n// export function scrollToElem(elem, elem2, d, settings) {\n// \tlet top = getElemPos(elem2, elem, settings.horizontal);\n// \tif (top == undefined) return;\n// \tsmoothScrollTo(elem, top, d, settings);\n// }\n\nexport function isSmoothScrolling(elem) {\n\tlet t = elem._smthscrl;\n\treturn t && t.timer;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/smoothScroll.js","import Store from 'store/store';\n\n//\n// Utils related to static data\n//\n\nlet staticData = {};\nlet isStaticDataSet = false;\n\n\n// Use this function if you need to grab static data from the Store\n// This way you don't have to pass it down as a prop everywhere\n// Don't use for pageData unless you are sure the data won't get\n// updated anywhere\nexport const getStaticData = () => {\n\n\n\tif (!isStaticDataSet) {\n\t\t// Haven't retrieved data yet, so lets do that first\n\t\tlet store = Store.get();\n\t\tstaticData = store.appData;\n\t\tisStaticDataSet = true;\n\t}\n\n\n\treturn staticData;\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/staticData.js","import { track } from 'utils/tracking';\n\n/**\n * Helper class to track loading times easily.\n */\nexport default class TimeTracker {\n\n\t/**\n\t * Create a new Time tracker.\n\t *\n\t * @param {string=} labelPrefix - optional prefix for the label of the event\n\t * @param {string=} labelSuffix - optional suffix for the label of the event\n\t */\n\tconstructor(labelPrefix, labelSuffix) {\n\t\tthis.labelPrefix = labelPrefix || '';\n\t\tthis.labelSuffix = labelSuffix || '';\n\t\tthis.events = {};\n\t}\n\n\tstart(label) {\n\t\tthis.events[label] = Date.now();\n\t}\n\n\tend(label) {\n\t\tthis.endAt(label, Date.now());\n\t}\n\n\tendAt(label, date) {\n\t\tif (typeof this.events[label] !== 'number') return;\n\t\tconst time = date - this.events[label];\n\t\tthis.clear(label);\n\t\tif (time < 0) return;\n\t\ttrack({\n\t\t\ta: this.labelPrefix + label + this.labelSuffix,\n\t\t\tl: time\n\t\t});\n\t}\n\n\tendAll() {\n\t\tthis.endAllAt(Date.now());\n\t}\n\n\tendAllAt(date) {\n\t\tthis.events.forEach((label) => this.endAt(label, date));\n\t\tthis.clearAll();\n\t}\n\n\tclear(label) {\n\t\tthis.events[label] = undefined;\n\t}\n\n\tclearAll() {\n\t\tthis.events = {};\n\t}\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./static/src/utils/timeTracker.js","// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"embed__container__1ZBgK\",\"content\":\"embed__content__3OVUD\",\"linkContainer\":\"embed__linkContainer__nsg55\",\"button\":\"embed__button__3Q6N2\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/base/embed/embed.sss\n// module id = 66\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"link\":\"link__link__1xGDg\",\"top\":\"link__top__2Brbt\",\"iconLink\":\"link__iconLink__2vMSB link__link__1xGDg\",\"iconLinkSvg\":\"link__iconLinkSvg__3BJsH\",\"iconLinkUrl\":\"link__iconLinkUrl__3vuXN\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/core/link/link.sss\n// module id = 67\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"visible\":\"transition__visible__2xO2Z\",\"leaving\":\"transition__leaving__1eFUP\",\"entering\":\"transition__entering__22LLW\",\"empty\":\"transition__empty__7fZWG\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/core/transition/transition.sss\n// module id = 68\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"cookiesModal__container__1WKgP\",\"title\":\"cookiesModal__title__2wzdo\",\"text\":\"cookiesModal__text__1Lw73\",\"buttons\":\"cookiesModal__buttons__1Eh_o\",\"yes\":\"cookiesModal__yes__3n3Ql\",\"no\":\"cookiesModal__no__3_AJg\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/shared/cookiesModal/cookiesModal.sss\n// module id = 69\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"dynamicTheaterSentence__container__3OCt_\",\"sentence\":\"dynamicTheaterSentence__sentence__kNp8c\",\"intro\":\"dynamicTheaterSentence__intro__13zGx\",\"theater\":\"dynamicTheaterSentence__theater__15T1W\",\"transitionContainer\":\"dynamicTheaterSentence__transitionContainer__G8T5x\",\"transition\":\"dynamicTheaterSentence__transition__1TpaS\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/shared/dynamicTheaterSentence/dynamicTheaterSentence.sss\n// module id = 70\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"container\":\"exitModal__container__15Go4\",\"title\":\"exitModal__title__36jsu\",\"button\":\"exitModal__button__2Zb9j\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/shared/modal/exitModal.sss\n// module id = 71\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"modalBox\":\"changeRegionModal__modalBox__3MBzE\",\"locationBar\":\"changeRegionModal__locationBar__39Gqg\",\"locationBarTitle\":\"changeRegionModal__locationBarTitle__2xm9o\",\"closeModalButton\":\"changeRegionModal__closeModalButton__2u_5D\",\"contentBox\":\"changeRegionModal__contentBox__12WJK\",\"heading\":\"changeRegionModal__heading__2iLk4\",\"heading2\":\"changeRegionModal__heading2__36HkZ\",\"line\":\"changeRegionModal__line__J3Co8\",\"info\":\"changeRegionModal__info__sqMtC\",\"gotoButtonContainer\":\"changeRegionModal__gotoButtonContainer__3H6ni\",\"gotoButton\":\"changeRegionModal__gotoButton__NjGM7\",\"arrowRight\":\"changeRegionModal__arrowRight__2lRGu\",\"remainLinkBox\":\"changeRegionModal__remainLinkBox__n35ae\",\"remainLink\":\"changeRegionModal__remainLink__qAWJM\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/shared/regionMismatchModal/changeRegionModal.sss\n// module id = 72\n// module chunks = 0","// removed by extract-text-webpack-plugin\nmodule.exports = {\"svgBase\":\"svgIcons__svgBase__qujJH\",\"wrapper\":\"svgIcons__wrapper__xD2Gz\",\"svgIcon\":\"svgIcons__svgIcon__1IK41\",\"svgUserIcon\":\"svgIcons__svgUserIcon__YIrc7 svgIcons__svgIcon__1IK41\",\"svgShareIcon\":\"svgIcons__svgShareIcon__3NAaX svgIcons__svgIcon__1IK41\",\"compass\":\"svgIcons__compass__mWUSD\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/src/components/shared/svgIcons/svgIcons.sss\n// module id = 73\n// module chunks = 0","var Freezer = require('./src/freezer');\nmodule.exports = Freezer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/freezer.js\n// module id = 74\n// module chunks = 0","'use strict';\r\n\r\nvar Utils = require( './utils.js' ),\r\n\tEmitter = require( './emitter' ),\r\n\tFrozen = require( './frozen' )\r\n;\r\n\r\n//#build\r\nvar Freezer = function( initialValue, options ) {\r\n\tvar me = this,\r\n\t\tops = options || {},\r\n\t\tstore = {\r\n\t\t\tlive: ops.live || false,\r\n\t\t\tfreezeInstances: ops.freezeInstances || false\r\n\t\t}\r\n\t;\r\n\r\n\t// Immutable data\r\n\tvar frozen;\r\n\tvar pivotTriggers = [], pivotTicking = 0;\r\n\tvar triggerNow = function( node ){\r\n\t\tvar _ = node.__,\r\n\t\t\ti\r\n\t\t;\r\n\r\n\t\tif( _.listener ){\r\n\t\t\tvar prevState = _.listener.prevState || node;\r\n\t\t\t_.listener.prevState = 0;\r\n\t\t\tFrozen.emit( prevState, 'update', node, true );\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < _.parents.length; i++) {\r\n\t\t\t_.store.notify( 'now', _.parents[i] );\r\n\t\t}\r\n\t};\r\n\r\n\tvar addToPivotTriggers = function( node ){\r\n\t\tpivotTriggers.push( node );\r\n\t\tif( !pivotTicking ){\r\n\t\t\tpivotTicking = 1;\r\n\t\t\tUtils.nextTick( function(){\r\n\t\t\t\tpivotTriggers = [];\r\n\t\t\t\tpivotTicking = 0;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t// Last call to display info about orphan calls\r\n\tvar lastCall;\r\n\tstore.notify = function notify( eventName, node, options, name ){\r\n\t\tif( name ){\r\n\t\t\tif( lastCall && !lastCall.onStore ){\r\n\t\t\t\tdetachedWarn( lastCall );\r\n\t\t\t}\r\n\t\t\tlastCall = {name: name, node: node, options: options, onStore: false};\r\n\t\t}\r\n\r\n\t\tif( eventName === 'now' ){\r\n\t\t\tif( pivotTriggers.length ){\r\n\t\t\t\twhile( pivotTriggers.length ){\r\n\t\t\t\t\ttriggerNow( pivotTriggers.shift() );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttriggerNow( node );\r\n\t\t\t}\r\n\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar update = Frozen[eventName]( node, options );\r\n\r\n\t\tif( eventName !== 'pivot' ){\r\n\t\t\tvar pivot = Utils.findPivot( update );\r\n\t\t\tif( pivot ) {\r\n\t\t\t\taddToPivotTriggers( update );\r\n\t  \t\treturn pivot;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn update;\r\n\t};\r\n\r\n\tstore.freezeFn = ops.mutable === true ?\r\n\t\tfunction(){} :\r\n\t\tfunction( obj ){ Object.freeze( obj ); }\r\n\t;\r\n\r\n\t// Create the frozen object\r\n\tfrozen = Frozen.freeze( initialValue, store );\r\n\tfrozen.__.updateRoot = function( prevNode, updated ){\r\n\t\tif( prevNode === frozen ){\r\n\t\t\tfrozen = updated;\r\n\t\t\tif( lastCall ){\r\n\t\t\t\tlastCall.onStore = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if( lastCall ) {\r\n\t\t\tsetTimeout( function(){\r\n\t\t\t\tif( !lastCall.onStore ){\r\n\t\t\t\t\tdetachedWarn( lastCall );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Listen to its changes immediately\r\n\tvar listener = frozen.getListener(),\r\n\t\thub = {}\r\n\t;\r\n\r\n\tUtils.each(['on', 'off', 'once', 'emit', 'trigger'], function( method ){\r\n\t\tvar attrs = {};\r\n\t\tattrs[ method ] = listener[method].bind(listener);\r\n\t\tUtils.addNE( me, attrs );\r\n\t\tUtils.addNE( hub, attrs );\r\n\t});\r\n\r\n\tUtils.addNE( this, {\r\n\t\tget: function(){\r\n\t\t\treturn frozen;\r\n\t\t},\r\n\t\tset: function( node ){\r\n\t\t\tfrozen.reset( node );\r\n\t\t},\r\n\t\tgetEventHub: function(){\r\n\t\t\treturn hub;\r\n\t\t}\r\n\t});\r\n\r\n\tUtils.addNE( this, { getData: this.get, setData: this.set } );\r\n};\r\n\r\nfunction detachedWarn( lastCall ){\r\n\tUtils.warn( false, 'Method ' + lastCall.name + ' called on a detached node.', lastCall.node, lastCall.options );\r\n}\r\n\r\n//#build\r\n\r\nmodule.exports = Freezer;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/src/freezer.js\n// module id = 75\n// module chunks = 0","'use strict';\r\n\r\nvar Utils = require( './utils' ),\r\n\tnodeCreator = require( './nodeCreator'),\r\n\tEmitter = require('./emitter')\r\n;\r\n\r\n//#build\r\nvar Frozen = {\r\n\tfreeze: function( node, store ){\r\n\t\tif( node && node.__ ){\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = nodeCreator.clone(node)\r\n\t\t;\r\n\r\n\t\tUtils.addNE( frozen, { __: {\r\n\t\t\tlistener: false,\r\n\t\t\tparents: [],\r\n\t\t\tstore: store\r\n\t\t}});\r\n\r\n\t\t// Freeze children\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tif( !Utils.isLeaf( child, store.freezeInstances ) ){\r\n\t\t\t\tchild = me.freeze( child, store );\r\n\t\t\t}\r\n\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tstore.freezeFn( frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tmerge: function( node, attrs ){\r\n\t\tvar _ = node.__,\r\n\t\t\ttrans = _.trans,\r\n\r\n\t\t\t// Clone the attrs to not modify the argument\r\n\t\t\tattrs = Utils.extend( {}, attrs)\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\t\t\tfor( var attr in attrs )\r\n\t\t\t\ttrans[ attr ] = attrs[ attr ];\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tstore = _.store,\r\n\t\t\tval, key, isFrozen\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tisFrozen = child && child.__;\r\n\r\n\t\t\tif( isFrozen ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\r\n\t\t\tval = attrs[ key ];\r\n\t\t\tif( !val ){\r\n\t\t\t\tif( isFrozen )\r\n\t\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t\treturn frozen[ key ] = child;\r\n\t\t\t}\r\n\r\n\t\t\tif( !Utils.isLeaf( val, store.freezeInstances ) )\r\n\t\t\t\tval = me.freeze( val, store );\r\n\r\n\t\t\tif( val && val.__ )\r\n\t\t\t\tme.addParent( val, frozen );\r\n\r\n\t\t\tdelete attrs[ key ];\r\n\r\n\t\t\tfrozen[ key ] = val;\r\n\t\t});\r\n\r\n\r\n\t\tfor( key in attrs ) {\r\n\t\t\tval = attrs[ key ];\r\n\r\n\t\t\tif( !Utils.isLeaf( val, store.freezeInstances ) )\r\n\t\t\t\tval = me.freeze( val, store );\r\n\r\n\t\t\tif( val && val.__ )\r\n\t\t\t\tme.addParent( val, frozen );\r\n\r\n\t\t\tfrozen[ key ] = val;\r\n\t\t}\r\n\r\n\t\t_.store.freezeFn( frozen );\r\n\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\treplace: function( node, replacement ) {\r\n\t\tvar me = this,\r\n\t\t\t_ = node.__,\r\n\t\t\tfrozen = replacement\r\n\t\t;\r\n\r\n\t\tif( !Utils.isLeaf( replacement, _.store.freezeInstances ) ) {\r\n\r\n\t\t\tfrozen = me.freeze( replacement, _.store );\r\n\t\t\tfrozen.__.parents = _.parents;\r\n\t\t\tfrozen.__.updateRoot = _.updateRoot;\r\n\r\n\t\t\t// Add the current listener if exists, replacing a\r\n\t\t\t// previous listener in the frozen if existed\r\n\t\t\tif( _.listener )\r\n\t\t\t\tfrozen.__.listener = _.listener;\r\n\t\t}\r\n\t\tif( frozen ){\r\n\t\t\tthis.fixChildren( frozen, node );\r\n\t\t}\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tremove: function( node, attrs ){\r\n\t\tvar trans = node.__.trans;\r\n\t\tif( trans ){\r\n\t\t\tfor( var l = attrs.length - 1; l >= 0; l-- )\r\n\t\t\t\tdelete trans[ attrs[l] ];\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tisFrozen\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tisFrozen = child && child.__;\r\n\r\n\t\t\tif( isFrozen ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\r\n\t\t\tif( attrs.indexOf( key ) !== -1 ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif( isFrozen )\r\n\t\t\t\tme.addParent( child, frozen );\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.store.freezeFn( frozen );\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\tsplice: function( node, args ){\r\n\t\tvar _ = node.__,\r\n\t\t\ttrans = _.trans\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\t\t\ttrans.splice.apply( trans, args );\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar me = this,\r\n\t\t\tfrozen = this.copyMeta( node ),\r\n\t\t\tindex = args[0],\r\n\t\t\tdeleteIndex = index + args[1],\r\n\t\t\tchild\r\n\t\t;\r\n\r\n\t\t// Clone the array\r\n\t\tUtils.each( node, function( child, i ){\r\n\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\r\n\t\t\t\t// Skip the nodes to delete\r\n\t\t\t\tif( i < index || i>= deleteIndex )\r\n\t\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[i] = child;\r\n\t\t});\r\n\r\n\t\t// Prepare the new nodes\r\n\t\tif( args.length > 1 ){\r\n\t\t\tfor (var i = args.length - 1; i >= 2; i--) {\r\n\t\t\t\tchild = args[i];\r\n\r\n\t\t\t\tif( !Utils.isLeaf( child, _.store.freezeInstances ) )\r\n\t\t\t\t\tchild = this.freeze( child, _.store );\r\n\r\n\t\t\t\tif( child && child.__ )\r\n\t\t\t\t\tthis.addParent( child, frozen );\r\n\r\n\t\t\t\targs[i] = child;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// splice\r\n\t\tArray.prototype.splice.apply( frozen, args );\r\n\r\n\t\t_.store.freezeFn( frozen );\r\n\t\tthis.refreshParents( node, frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\ttransact: function( node ) {\r\n\t\tvar me = this,\r\n\t\t\ttransacting = node.__.trans,\r\n\t\t\ttrans\r\n\t\t;\r\n\r\n\t\tif( transacting )\r\n\t\t\treturn transacting;\r\n\r\n\t\ttrans = node.constructor === Array ? [] : {};\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\ttrans[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.trans = trans;\r\n\r\n\t\t// Call run automatically in case\r\n\t\t// the user forgot about it\r\n\t\tUtils.nextTick( function(){\r\n\t\t\tif( node.__.trans )\r\n\t\t\t\tme.run( node );\r\n\t\t});\r\n\r\n\t\treturn trans;\r\n\t},\r\n\r\n\trun: function( node ) {\r\n\t\tvar me = this,\r\n\t\t\ttrans = node.__.trans\r\n\t\t;\r\n\r\n\t\tif( !trans )\r\n\t\t\treturn node;\r\n\r\n\t\t// Remove the node as a parent\r\n\t\tUtils.each( trans, function( child, key ){\r\n\t\t\tif( child && child.__ ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdelete node.__.trans;\r\n\r\n\t\tvar result = this.replace( node, trans );\r\n\t\treturn result;\r\n\t},\r\n\r\n\tpivot: function( node ){\r\n\t\tnode.__.pivot = 1;\r\n\t\tthis.unpivot( node );\r\n\t\treturn node;\r\n\t},\r\n\r\n\tunpivot: function( node ){\r\n\t\tUtils.nextTick( function(){\r\n\t\t\tnode.__.pivot = 0;\r\n\t\t});\r\n\t},\r\n\r\n\trefresh: function( node, oldChild, newChild ){\r\n\t\tvar me = this,\r\n\t\t\ttrans = node.__.trans,\r\n\t\t\tfound = 0\r\n\t\t;\r\n\r\n\t\tif( trans ){\r\n\r\n\t\t\tUtils.each( trans, function( child, key ){\r\n\t\t\t\tif( found ) return;\r\n\r\n\t\t\t\tif( child === oldChild ){\r\n\r\n\t\t\t\t\ttrans[ key ] = newChild;\r\n\t\t\t\t\tfound = 1;\r\n\r\n\t\t\t\t\tif( newChild && newChild.__ )\r\n\t\t\t\t\t\tme.addParent( newChild, node );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn node;\r\n\t\t}\r\n\r\n\t\tvar frozen = this.copyMeta( node ),\r\n\t\t\treplacement, __\r\n\t\t;\r\n\r\n\t\tUtils.each( node, function( child, key ){\r\n\t\t\tif( child === oldChild ){\r\n\t\t\t\tchild = newChild;\r\n\t\t\t}\r\n\r\n\t\t\tif( child && (__ = child.__) ){\r\n\t\t\t\tme.removeParent( child, node );\r\n\t\t\t\tme.addParent( child, frozen );\r\n\t\t\t}\r\n\r\n\t\t\tfrozen[ key ] = child;\r\n\t\t});\r\n\r\n\t\tnode.__.store.freezeFn( frozen );\r\n\r\n\t\tthis.refreshParents( node, frozen );\r\n\t},\r\n\r\n\tfixChildren: function( node, oldNode ){\r\n\t\tvar me = this;\r\n\t\tUtils.each( node, function( child ){\r\n\t\t\tif( !child || !child.__ )\r\n\t\t\t\treturn;\r\n\r\n\t\t\t// Update parents in all children no matter the child\r\n\t\t\t// is linked to the node or not.\r\n\t\t\tme.fixChildren( child );\r\n\r\n\t\t\tif( child.__.parents.length === 1 )\r\n\t\t\t\treturn child.__.parents = [ node ];\r\n\r\n\t\t\tif( oldNode )\r\n\t\t\t\tme.removeParent( child, oldNode );\r\n\r\n\t\t\tme.addParent( child, node );\r\n\t\t});\r\n\t},\r\n\r\n\tcopyMeta: function( node ){\r\n\t\tvar me = this,\r\n\t\t\tfrozen = nodeCreator.clone( node ),\r\n\t\t\t_ = node.__\r\n\t\t;\r\n\r\n\t\tUtils.addNE( frozen, {__: {\r\n\t\t\tstore: _.store,\r\n\t\t\tupdateRoot: _.updateRoot,\r\n\t\t\tlistener: _.listener,\r\n\t\t\tparents: _.parents.slice( 0 ),\r\n\t\t\ttrans: _.trans,\r\n\t\t\tpivot: _.pivot,\r\n\t\t}});\r\n\r\n\t\tif( _.pivot )\r\n\t\t\tthis.unpivot( frozen );\r\n\r\n\t\treturn frozen;\r\n\t},\r\n\r\n\trefreshParents: function( oldChild, newChild ){\r\n\t\tvar _ = oldChild.__,\r\n\t\t\tparents = _.parents.length,\r\n\t\t\ti\r\n\t\t;\r\n\r\n\t\tif( oldChild.__.updateRoot ){\r\n\t\t\toldChild.__.updateRoot( oldChild, newChild );\r\n\t\t}\r\n\t\tif( newChild ){\r\n\t\t\tthis.emit( oldChild, 'update', newChild, _.store.live );\r\n\t\t}\r\n\t\tif( parents ){\r\n\t\t\tfor (i = parents - 1; i >= 0; i--) {\r\n\t\t\t\tthis.refresh( _.parents[i], oldChild, newChild );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tremoveParent: function( node, parent ){\r\n\t\tvar parents = node.__.parents,\r\n\t\t\tindex = parents.indexOf( parent )\r\n\t\t;\r\n\r\n\t\tif( index !== -1 ){\r\n\t\t\tparents.splice( index, 1 );\r\n\t\t}\r\n\t},\r\n\r\n\taddParent: function( node, parent ){\r\n\t\tvar parents = node.__.parents,\r\n\t\t\tindex = parents.indexOf( parent )\r\n\t\t;\r\n\r\n\t\tif( index === -1 ){\r\n\t\t\tparents[ parents.length ] = parent;\r\n\t\t}\r\n\t},\r\n\r\n\temit: function( node, eventName, param, now ){\r\n\t\tvar listener = node.__.listener;\r\n\t\tif( !listener )\r\n\t\t\treturn;\r\n\r\n\t\tvar ticking = listener.ticking;\r\n\r\n\t\tif( now ){\r\n\t\t\tif( ticking || param ){\r\n\t\t\t\tlistener.ticking = 0;\r\n\t\t\t\tlistener.emit( eventName, ticking || param, node );\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlistener.ticking = param;\r\n\t\tif( !listener.prevState ){\r\n\t\t\tlistener.prevState = node;\r\n\t\t}\r\n\r\n\t\tif( !ticking ){\r\n\t\t\tUtils.nextTick( function(){\r\n\t\t\t\tif( listener.ticking ){\r\n\t\t\t\t\tvar updated = listener.ticking,\r\n\t\t\t\t\t\tprevState = listener.prevState\r\n\t\t\t\t\t;\r\n\r\n\t\t\t\t\tlistener.ticking = 0;\r\n\t\t\t\t\tlistener.prevState = 0;\r\n\r\n\t\t\t\t\tlistener.emit( eventName, updated, node );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tcreateListener: function( frozen ){\r\n\t\tvar l = frozen.__.listener;\r\n\r\n\t\tif( !l ) {\r\n\t\t\tl = Object.create(Emitter, {\r\n\t\t\t\t_events: {\r\n\t\t\t\t\tvalue: {},\r\n\t\t\t\t\twritable: true\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tfrozen.__.listener = l;\r\n\t\t}\r\n\r\n\t\treturn l;\r\n\t}\r\n};\r\n\r\nnodeCreator.init( Frozen );\r\n//#build\r\n\r\nmodule.exports = Frozen;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/src/frozen.js\n// module id = 76\n// module chunks = 0","'use strict';\n\nvar Utils = require( './utils.js' );\n\n//#build\nvar nodeCreator = {\n\tinit: function( Frozen ){\n\n\t\tvar commonMethods = {\n\t\t\tset: function( attr, value ){\n\t\t\t\tvar attrs = attr,\n\t\t\t\t\tupdate = this.__.trans,\n\t\t\t\t\tisArray = this.constructor === Array,\n\t\t\t\t\tmsg = 'Freezer arrays only accept numeric attributes, given: '\n\t\t\t\t;\n\n\t\t\t\tif( typeof attr !== 'object' ){\n\t\t\t\t\tif( isArray && parseInt(attr) != attr ){\n\t\t\t\t\t\tUtils.warn( 0, msg + attr );\n\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t\t}\n\t\t\t\t\tattrs = {};\n\t\t\t\t\tattrs[ attr ] = value;\n\t\t\t\t}\n\n\t\t\t\tif( !update ){\n\t\t\t\t\tfor( var key in attrs ){\n\t\t\t\t\t\tif( isArray && parseInt(key) != key ){\n\t\t\t\t\t\t\tUtils.warn( 0, msg + key );\n\t\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate = update || this[ key ] !== attrs[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No changes, just return the node\n\t\t\t\t\tif( !update )\n\t\t\t\t\t\treturn Utils.findPivot( this ) || this;\n\t\t\t\t}\n\n\t\t\t\tvar name = isArray ? 'array.set' : 'object.set';\n\t\t\t\treturn this.__.store.notify( 'merge', this, attrs, name );\n\t\t\t},\n\n\t\t\treset: function( attrs ) {\n\t\t\t\treturn this.__.store.notify( 'replace', this, attrs, 'object.replace' );\n\t\t\t},\n\n\t\t\tgetListener: function(){\n\t\t\t\treturn Frozen.createListener( this );\n\t\t\t},\n\n\t\t\ttoJS: function(){\n\t\t\t\tvar js;\n\t\t\t\tif( this.constructor === Array ){\n\t\t\t\t\tjs = new Array( this.length );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tjs = {};\n\t\t\t\t}\n\n\t\t\t\tUtils.each( this, function( child, i ){\n\t\t\t\t\tif( child && child.__ )\n\t\t\t\t\t\tjs[ i ] = child.toJS();\n\t\t\t\t\telse\n\t\t\t\t\t\tjs[ i ] = child;\n\t\t\t\t});\n\n\t\t\t\treturn js;\n\t\t\t},\n\n\t\t\ttransact: function(){\n\t\t\t\treturn this.__.store.notify( 'transact', this );\n\t\t\t},\n\n\t\t\trun: function(){\n\t\t\t\treturn this.__.store.notify( 'run', this );\n\t\t\t},\n\n\t\t\tnow: function(){\n\t\t\t\treturn this.__.store.notify( 'now', this );\n\t\t\t},\n\n\t\t\tpivot: function(){\n\t\t\t\treturn this.__.store.notify( 'pivot', this );\n\t\t\t}\n\t\t};\n\n\t\tvar arrayMethods = Utils.extend({\n\t\t\tpush: function( el ){\n\t\t\t\treturn this.append( [el], 'array.push' );\n\t\t\t},\n\n\t\t\tappend: function( els, name ){\n\t\t\t\tif( els && els.length )\n\t\t\t\t\treturn this.__.store.notify( 'splice', this, [this.length, 0].concat( els ), name || 'array.append' );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tpop: function(){\n\t\t\t\tif( !this.length )\n\t\t\t\t\treturn this;\n\n\t\t\t\treturn this.__.store.notify( 'splice', this, [this.length -1, 1], 'array.pop' );\n\t\t\t},\n\n\t\t\tunshift: function( el ){\n\t\t\t\treturn this.prepend( [el], 'array.unshift' );\n\t\t\t},\n\n\t\t\tprepend: function( els ){\n\t\t\t\tif( els && els.length )\n\t\t\t\t\treturn this.__.store.notify( 'splice', this, [0, 0].concat( els ), 'array.prepend' );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tshift: function(){\n\t\t\t\tif( !this.length )\n\t\t\t\t\treturn this;\n\n\t\t\t\treturn this.__.store.notify( 'splice', this, [0, 1], 'array.shift' );\n\t\t\t},\n\n\t\t\tsplice: function( index, toRemove, toAdd ){\n\t\t\t\treturn this.__.store.notify( 'splice', this, arguments, 'array.splice' );\n\t\t\t},\n\n\t\t\tsort: function(){\n\t\t\t\tvar mutable = this.slice();\n\t\t\t\tmutable.sort.apply(mutable, arguments);\n\t\t\t\treturn this.__.store.notify( 'replace', this, mutable, 'array.sort' );\n\t\t\t}\n\t\t}, commonMethods );\n\n\t\tvar FrozenArray = Object.create( Array.prototype, Utils.createNE( arrayMethods ) );\n\n\t\tvar objectMethods = Utils.createNE( Utils.extend({\n\t\t\tremove: function( keys ){\n\t\t\t\tvar filtered = [],\n\t\t\t\t\tk = keys\n\t\t\t\t;\n\n\t\t\t\tif( keys.constructor !== Array )\n\t\t\t\t\tk = [ keys ];\n\n\t\t\t\tfor( var i = 0, l = k.length; i<l; i++ ){\n\t\t\t\t\tif( this.hasOwnProperty( k[i] ) )\n\t\t\t\t\t\tfiltered.push( k[i] );\n\t\t\t\t}\n\n\t\t\t\tif( filtered.length )\n\t\t\t\t\treturn this.__.store.notify( 'remove', this, filtered, 'object.remove' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, commonMethods));\n\n\t\tvar FrozenObject = Object.create( Object.prototype, objectMethods );\n\n\t\tvar createArray = (function(){\n\t\t\t// fast version\n\t\t\tif( [].__proto__ )\n\t\t\t\treturn function( length ){\n\t\t\t\t\tvar arr = new Array( length );\n\t\t\t\t\tarr.__proto__ = FrozenArray;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\n\t\t\t// slow version for older browsers\n\t\t\treturn function( length ){\n\t\t\t\tvar arr = new Array( length );\n\n\t\t\t\tfor( var m in arrayMethods ){\n\t\t\t\t\tarr[ m ] = arrayMethods[ m ];\n\t\t\t\t}\n\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t})();\n\n\t\tthis.clone = function( node ){\n\t\t\tvar cons = node.constructor;\n\t\t\tif( cons === Array ){\n\t\t\t\treturn createArray( node.length );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( cons === Object ){\n\t\t\t\t\treturn Object.create( FrozenObject );\n\t\t\t\t}\n\t\t\t\t// Class instances\n\t\t\t\telse {\n\t\t\t\t\treturn Object.create( cons.prototype, objectMethods );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n//#build\n\nmodule.exports = nodeCreator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/freezer-js/src/nodeCreator.js\n// module id = 77\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    parameterLimit: 1000,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n\n    for (var i = 0; i < parts.length; ++i) {\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder);\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder);\n            val = options.decoder(part.slice(pos + 1), defaults.decoder);\n        }\n        if (has.call(obj, key)) {\n            obj[key] = [].concat(obj[key]).concat(val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n    var leaf = val;\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]') {\n            obj = [];\n            obj = obj.concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys\n        // that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n    options.parseArrays = options.parseArrays !== false;\n    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options);\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/qs/lib/parse.js\n// module id = 78\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n        return prefix + '[]';\n    },\n    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n        return prefix;\n    }\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    formatter,\n    encodeValuesOnly\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    } else if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (Array.isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        if (Array.isArray(obj)) {\n            values = values.concat(stringify(\n                obj[key],\n                generateArrayPrefix(prefix, key),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        } else {\n            values = values.concat(stringify(\n                obj[key],\n                prefix + (allowDots ? '.' + key : '[' + key + ']'),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        }\n    }\n\n    return values;\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n    var sort = typeof options.sort === 'function' ? options.sort : null;\n    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n    if (typeof options.format === 'undefined') {\n        options.format = formats['default'];\n    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n        throw new TypeError('Unknown format option provided.');\n    }\n    var formatter = formats.formatters[options.format];\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (Array.isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    } else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (sort) {\n        objKeys.sort(sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        keys = keys.concat(stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encode ? encoder : null,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            formatter,\n            encodeValuesOnly\n        ));\n    }\n\n    var joined = keys.join(delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/qs/lib/stringify.js\n// module id = 79\n// module chunks = 0","(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/setimmediate/setImmediate.js\n// module id = 80\n// module chunks = 0","var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/timers-browserify/main.js\n// module id = 81\n// module chunks = 0"],"sourceRoot":""}