{"version":3,"file":"home.abda3ced.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/shared/documentVisibility.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js"],"sourcesContent":["import React from 'react'\r\nimport { type To } from 'react-router-dom'\r\n\r\nimport { ButtonSizeType } from '../main/components/button'\r\nimport { DateRangeBaseOption } from '../main/components/timeframe-bar/daterange-select'\r\nimport { TimeframeBaseOption } from '../main/components/timeframe-bar/timeframe-select'\r\nimport { TIMEFRAME } from '../main/constants'\r\nimport { Instrument } from '../main/types'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ChartLayoutProps = {\r\n config: object\r\n onRegisterChartLayoutModel?: (chartLayout: any) => void\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n isWithNotifications?: boolean\r\n}\r\n\r\nexport type ChartLayoutHeaderProps = {\r\n model: any\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport type SidebarProps = {\r\n onShouldResize: () => void\r\n direction: SidebarDirection\r\n tabsClassName?: string\r\n}\r\n\r\ninterface ChartsLib {\r\n FREE_DATE_RANGES: string[]\r\n ChartLayout: React.FC\r\n ChartLayoutHeader: React.FC\r\n ChartLayoutWithGlobalState: React.FC\r\n Sidebar: React.FC\r\n\r\n chartSettingsAsyncModule: {\r\n cacheKey: string\r\n importFn: () => Promise<{\r\n ChartSettings: React.FC<{\r\n onClose: () => void\r\n onActiveSettingsTabChange?: (settingsComponent: SettingsTab) => void\r\n activeSettingsTab?: SettingsTab\r\n }>\r\n\r\n PreventClosingUnsavedChanges: React.FC<{\r\n onHide: () => void\r\n children: (props: { checkForUnsavedChangesAndClose: () => void }) => React.ReactElement\r\n }>\r\n\r\n useChartLayoutGlobalModel: () => {\r\n chartLayoutModel: any | null\r\n chartLayoutModelConfigSnapshot: Record | null\r\n lastGlobalRerender: number\r\n setChartLayoutModel: (chartLayoutModel: any) => void\r\n getChartLayoutModelConfig: (props: { fallback: Record }) => Record\r\n forceGlobalRerender: () => void\r\n generateNewLayoutModelConfigSnapshot: () => void\r\n }\r\n }>\r\n }\r\n\r\n StockDetailTimeframeBar: React.FC<{\r\n size?: ButtonSizeType\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: TimeframeBaseOption) => void\r\n onDateRangeSelect?: (timeframe: DateRangeBaseOption) => void\r\n }>\r\n\r\n useAsyncModule: (props: {\r\n importFn: () => Promise\r\n cacheKey: string\r\n shouldLoadModule?: boolean\r\n isSuspenseMode?: SuspenseMode\r\n }) => [SuspenseMode extends true ? T : T | null, { isLoading: boolean; loadModule: () => Promise }]\r\n\r\n withSuspense:

>(\r\n Component: React.ComponentType

,\r\n fallback?: NonNullable | null\r\n ) => (props: P) => React.ReactElement\r\n\r\n Quote: {\r\n create(quote: any): any\r\n select: (query: (quote: any) => boolean) => any\r\n deleteAll: () => void\r\n findByAttribute: (attribute: string, value: any) => any\r\n get(params: { ticker: string; instrument: Instrument; timeframe: TIMEFRAME; options: any }): any\r\n getAll: (tickersAndTimeframes: any) => any\r\n all: () => any[]\r\n bind(ev: string, callback: (obj: any, ...rest: any[]) => any): any\r\n unbind(ev: string, callback: (obj: any, ...rest: any[]) => any): any\r\n }\r\n\r\n Settings: {\r\n MarketSentiment: any\r\n Indicator: any\r\n Chart: any\r\n Thumb: any\r\n Element: any\r\n Colors: string[]\r\n updateColors: (type: string, name: string, theme: 'light' | 'dark', value: string) => void\r\n }\r\n\r\n Utils: {\r\n dateFromUnixTimestamp: (date: string) => Date\r\n }\r\n\r\n convertTa: {\r\n getPanes: (taConfig: any) => any\r\n }\r\n\r\n useModelState: (\r\n model: Model | null,\r\n options: { watchProperties?: Array; listenOnEvents?: string[] }\r\n ) => Model | null\r\n\r\n getTimeframeGroupsWithHref: ({\r\n isPremium,\r\n generatePath,\r\n }: {\r\n isPremium: boolean\r\n generatePath: (timeframe: TimeframeBaseOption) => To\r\n }) => Array<{ label: string; timeframes: TimeframeBaseOption[] }>\r\n\r\n getIntradayChartConfig: (props: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n maxWidth: number\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n }) => {\r\n fullChartWidth: number\r\n chartWidthWithOffset: number\r\n offsetInPx: number\r\n offsetChartAfter: number\r\n }\r\n\r\n withCompleteLayoutModelInit: (Component: any) => (props: { config: any }) => JSX.Element | null\r\n withQuotePolling: (Component: any) => (props: { chartLayoutModel: any }) => JSX.Element | null\r\n}\r\n\r\n// @ts-ignore\r\nconst chartsLib = (window.FLibs.Charts as ChartsLib) ?? {}\r\n\r\nexport const FREE_DATE_RANGES = chartsLib.FREE_DATE_RANGES\r\nexport const ChartLayout = chartsLib.ChartLayout\r\nexport const ChartLayoutWithGlobalState = chartsLib.ChartLayoutWithGlobalState\r\nexport const ChartLayoutHeader = chartsLib.ChartLayoutHeader\r\nexport const Sidebar = chartsLib.Sidebar\r\nexport const chartSettingsAsyncModule = chartsLib.chartSettingsAsyncModule\r\nexport const useAsyncModule = chartsLib.useAsyncModule\r\nexport const withSuspense = chartsLib.withSuspense\r\nexport const StockDetailTimeframeBar = chartsLib.StockDetailTimeframeBar\r\nexport const Quote = chartsLib.Quote\r\nexport const Settings = chartsLib.Settings\r\nexport const Utils = chartsLib.Utils\r\nexport const convertTa = chartsLib.convertTa\r\nexport const useModelState = chartsLib.useModelState\r\nexport const getTimeframeGroupsWithHref = chartsLib.getTimeframeGroupsWithHref\r\nexport const getIntradayChartConfig = chartsLib.getIntradayChartConfig\r\nexport const withCompleteLayoutModelInit = chartsLib.withCompleteLayoutModelInit\r\nexport const withQuotePolling = chartsLib.withQuotePolling\r\n","import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\ninterface MarketSentimentProps {}\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: { layout: string } | null\r\n}\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig = {\r\n layout: '1h1v',\r\n theme: document.documentElement.classList.contains('dark') ? 'dark' : 'light',\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: 'i3',\r\n scale: 'linear',\r\n ticker: ticker,\r\n instrument: 'market_sentiment',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: 'charts/market_sentiment',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n

\r\n \r\n
\r\n )}\r\n \r\n \r\n this._vote(e, 'bull')}\r\n >\r\n Bull\r\n \r\n \r\n this._vote(e, 'bear')}\r\n >\r\n Bear\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: Function, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker).updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nfunction mount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n}\r\n\r\nfunction unmount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.unmountComponentAtNode(el)\r\n }\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { PerfData } from '../maps/types'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(result: string) {\r\n const newDocument = new DOMParser().parseFromString(result, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n // Replace market stats\r\n const oldMarketStats = document.getElementsByClassName('market-stats')\r\n const newMarketStats = newDocument.getElementsByClassName('market-stats')\r\n if (oldMarketStats.length === newMarketStats.length) {\r\n Array.from(oldMarketStats).forEach((_, index) => {\r\n const oldElement = oldMarketStats.item(index)\r\n const newElement = newMarketStats.item(index)\r\n if (oldElement && newElement) {\r\n oldElement.innerHTML = newElement.innerHTML\r\n }\r\n })\r\n }\r\n\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n // Update indices\r\n try {\r\n const newIndicesData = parseJSONFromScript('js-indices', newDocument)\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n } catch (error) {\r\n Sentry.withScope((scope: any) => {\r\n scope.setContext('Body', { size: result.length })\r\n Sentry.captureException(error)\r\n })\r\n }\r\n\r\n try {\r\n // Render maps\r\n const mapData = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData }>('map-data', newDocument)\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, mapData?.perfDataSec)\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, mapData?.perfDataGeo)\r\n } catch {}\r\n\r\n /**\r\n * Re-render recent quotes. The script (recent_quotes.js) is only included for premium users or if HasEnabledRedesign\r\n * so we need to check if it's defined\r\n */\r\n if (typeof window['RenderRecentQuotes'] === 'function') {\r\n RenderRecentQuotes()\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible(interval, async function handleRefresh() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n\r\n if (data) {\r\n refreshPage(data)\r\n }\r\n })\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n hasChartEvents: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n const rutQ = Quote.findByAttribute('ticker', 'RUSSELL 2000')\r\n if (rutQ) rutQ.updateAttributes(getData('^RUT', 'RUSSELL 2000', indices))\r\n\r\n if (!dowQ || !nasdaqQ || !sap500Q || !rutQ) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n extra: {\r\n allAvailableTickers: Quote.all()\r\n .reduce((acc: string[], cur: { ticker: string }) => {\r\n acc.push(cur.ticker)\r\n return acc\r\n }, [])\r\n .join(','),\r\n },\r\n })\r\n }\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\nimport { SpecificChartFunctionality, getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport { getData } from './indices-data'\r\nimport type { Indices } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: '1h1v',\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n theme: document.documentElement.classList.contains('dark') ? 'dark' : 'light',\r\n charts: [\r\n {\r\n height: 190,\r\n timeframe: 'i10',\r\n scale: 'linear',\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: 'charts/candle_stick',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderChart({ ticker, element }: { ticker: string; element: HTMLElement | null }) {\r\n if (element) {\r\n ReactDOM.render(\r\n
\r\n \r\n
,\r\n element\r\n )\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n Quote.create(getData('^RUT', 'RUSSELL 2000', indices)).save()\r\n\r\n renderChart({ ticker: 'DOW', element: document.getElementById('dow') })\r\n renderChart({ ticker: 'NASDAQ', element: document.getElementById('nasdaq') })\r\n renderChart({ ticker: 'S&P 500', element: document.getElementById('sp500') })\r\n renderChart({ ticker: 'RUSSELL 2000', element: document.getElementById('rut') })\r\n})\r\n","function getCurrentDateInMs() {\r\n return new Date().valueOf()\r\n}\r\n\r\nfunction getIsDocumentVisible() {\r\n return document.visibilityState === 'visible' || document.hidden === false\r\n}\r\n\r\n/**\r\n * Calls callback based on interval and document visibility. Returns unsubscribe function.\r\n * How it works:\r\n * - document is hidden: interval cleared\r\n * - document visible: interval set-up with remaining time from last interval. Call immediately if interval elapsed\r\n */\r\nexport function intervalCallbackOnWindowVisible(interval: number, callback: () => unknown) {\r\n let nextRefresh = getCurrentDateInMs() + interval\r\n let refreshTimeout: NodeJS.Timeout | null = null\r\n\r\n function refresh() {\r\n nextRefresh = getCurrentDateInMs() + interval\r\n // Queue next refresh\r\n refreshTimeout = setTimeout(refresh, interval)\r\n // Call callback asynchronously\r\n setTimeout(callback, 0)\r\n }\r\n\r\n /**\r\n * Handle the visibility change event, compute callback remaining time or call immediately\r\n */\r\n function handleVisibilityChange() {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n\r\n if (getIsDocumentVisible()) {\r\n const currentDateMs = getCurrentDateInMs()\r\n // Refresh if the document is stale, otherwise set a timeout to refresh later\r\n if (nextRefresh <= currentDateMs) {\r\n refresh()\r\n } else {\r\n refreshTimeout = setTimeout(refresh, nextRefresh - currentDateMs)\r\n }\r\n }\r\n }\r\n\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = setTimeout(refresh, interval)\r\n }\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange)\r\n\r\n return () => {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n document.removeEventListener('visibilitychange', handleVisibilityChange)\r\n }\r\n}\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n"],"names":["SettingsTab","SidebarDirection","chartsLib","window","FLibs","Charts","FREE_DATE_RANGES","ChartLayout","ChartLayoutWithGlobalState","ChartLayoutHeader","Sidebar","chartSettingsAsyncModule","useAsyncModule","withSuspense","StockDetailTimeframeBar","Quote","Utils","Settings","convertTa","useModelState","getTimeframeGroupsWithHref","getIntradayChartConfig","withCompleteLayoutModelInit","withQuotePolling","ticker","marketSentimentChartConfig","layout","theme","document","documentElement","classList","contains","width","height","scrollable","editable","cross","charts","timeframe","scale","instrument","refreshData","stretch","panes","elements","type","overlays","MarketSentiment","Component","state","loading","enabled","chartConfig","_timer","_lastRequest","componentDidMount","this","_fetchData","setState","componentWillUnmount","cancel","clearTimeout","render","_jsx","cellPadding","cellSpacing","border","style","visibility","children","_jsxs","id","config","valign","className","disabled","onClick","e","_vote","src","alt","display","FinvizSettings","hasRedesignEnabled","sentiment","preventDefault","undefined","_this","async","urlQuery","arguments","length","callback","setTimer","hidden","setTimeout","apiRequest","json","quoteData","getData","updateAttributes","save","refresh","data","close","sum","volume","weight","date","Array","from","repeat","map","x","parseInt","premarket","aftermarket","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","el","getElementById","ReactDOM","mount","refreshInfo","parseJSONFromScript","refreshPage","result","newDocument","DOMParser","parseFromString","newRefreshInfo","userId","version","location","reload","oldMarketStats","getElementsByClassName","newMarketStats","forEach","_","index","oldElement","item","newElement","innerHTML","oldSignalsLeft","newSignalsLeft","oldSignalsRight","newSignalsRight","oldHomepageBottom","newHomepageBottom","newIndicesData","indices","dowQ","nasdaqQ","sap500Q","rutQ","Sentry","captureMessage","extra","allAvailableTickers","reduce","acc","cur","push","join","updateIndices","error","withScope","scope","setContext","size","captureException","mapData","mapActionCreators","FinvizIndexSecMap","perfDataSec","FinvizIndexGeoMap","perfDataGeo","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","interval","hasChartEvents","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","renderChart","_ref","element","intervalCallbackOnWindowVisible","pathname","headers","ContentType","ready","getCurrentDateInMs","Date","valueOf","getIsDocumentVisible","visibilityState","nextRefresh","refreshTimeout","handleVisibilityChange","currentDateMs","addEventListener","removeEventListener","doc","isValidElement","tagName","getAttribute","JSON","parse","textContent","fn","readyState","module","exports","Dispatcher","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","register","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","dispatch","payload","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","c","d","f","Error","args","argIndex","replace","framesToPop","obj","key","ret","Object","isArray","hasOwnProperty"],"sourceRoot":""}