{"version":3,"file":"static/js/6028.c614819b.chunk.js","mappings":"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","sources":["app-react/components/base-components/orbit-component-with-state/orbit-component-with-state.ts","app-react/components/base-components/orbit-component/orbit-component.ts","app-react/components/raw-components/image/image.tsx","app-react/components/tap-handler/tap-handler.component.tsx","app-react/orbit-context.ts","app-react/services/dom/dom.service.ts","app-react/services/routing/route/fallback-route.ts","app-react/services/routing/route/route-base.ts","app-react/services/routing/routing-utils.ts","app-react/services/splash/splash.service.ts","common/utils/time-functions.ts","sdk/src/utils/device/detection/feature.ts","sdk/src/utils/device/detection/os.ts","sdk/src/utils/device/detection/viewport.ts","sdk/src/utils/device/detection/model.ts","sdk/src/utils/device/detection/browser.ts","sdk/src/utils/device/detection/hybrid.ts","sdk/src/utils/device/device.ts","sdk/src/utils/dom.ts","sdk/src/utils/logger.ts","sdk/src/utils/store.ts","sdk/src/utils/strings.ts","sdk/src/utils/underscore.ts","utils/array-helper.ts","utils/automation-helpers.ts","utils/lazy.ts","utils/string-helpers.ts"],"sourcesContent":["import React from 'react';\r\nimport {IServiceFactory} from '../../../services/service-factory.interface';\r\nimport {OrbitContext} from '../../../orbit-context';\r\nimport {reaction as mobxReaction, IReactionDisposer, IReactionOptions, IReactionPublic} from 'mobx';\r\n\r\n\r\nexport class OrbitComponentWithState extends React.Component {\r\n\r\n private _reactions: IReactionDisposer[] = [];\r\n\r\n protected get services(): IServiceFactory {\r\n /** This code is for unit tests, enzyme is not compatible wit the current react context api so we pass the context through a prop */\r\n if ((this.props as any)['context']) {\r\n return (this.props as any)['context'].services;\r\n }\r\n\r\n return (this.context as any).services;\r\n }\r\n\r\n //React life time hooks stubs for future use\r\n componentDidMount() {}\r\n\r\n componentWillUnmount() {\r\n this._disposeReactions();\r\n }\r\n\r\n\r\n reaction(expression: (r: IReactionPublic) => T, effect: (arg: T, prev: FireImmediately extends true ? T | undefined : T, r: IReactionPublic) => void, opts?: IReactionOptions): IReactionDisposer {\r\n let disposer = mobxReaction(expression, effect, opts);\r\n this._reactions.push(disposer);\r\n return disposer;\r\n }\r\n\r\n private _disposeReactions() {\r\n this._reactions.forEach(disposer => disposer());\r\n }\r\n}\r\n\r\nOrbitComponentWithState.contextType = OrbitContext;\r\n","import {ReactNode} from 'react';\r\nimport {OrbitComponentWithState} from \"../orbit-component-with-state/orbit-component-with-state\";\r\n\r\n\r\n\r\nexport class OrbitComponent extends OrbitComponentWithState {\r\n}\r\n\r\n\r\n\r\n","import React, {createRef, PropsWithChildren} from 'react';\r\nimport {TapHandlerLogic} from '../../tap-handler/tap-handler.component';\r\nimport {OrbitComponentWithState} from \"../../base-components/orbit-component-with-state/orbit-component-with-state\";\r\n\r\nenum IMAGE_TYPE {\r\n EMPTY_IMAGE_BASE64,\r\n FALLBACK,\r\n SRC\r\n};\r\nenum IMAGE_STATUS {\r\n LAZY,\r\n LOADING,\r\n SETTLED\r\n}\r\n\r\ninterface ImageSettleStatus {\r\n value: \"load\" | \"error\",\r\n type: IMAGE_TYPE,\r\n}\r\n\r\n/**\r\n * We could have defined this interface as \"ImageProps extends React.ImgHTMLAttributes\"\r\n * and define inside only what's extra (like \"lazy\" or \"fallbackSrc\") and props that alter the original def (like \"width: number\" instead of default \"width: string | number\")\r\n * But in case of someone styling the \"Image\" component with: styled(Image)<{squareIcon: boolean}>. The extra prop will bleed into the DOM and React will throw:\r\n * -- \"Warning: React does not recognize the `squareIcon` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `squareicon` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\r\n * Also, ocasionally I am getting this warning\r\n * -- \"Warning: React does not recognize the `forwardedRef` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `forwardedref` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\r\n *\r\n * So I am whitelisting props we actually use, and I am filtering based on that\r\n */\r\nexport interface ImageProps extends PropsWithChildren {\r\n // props common with React.ImgHTMLAttributes\r\n src: string;\r\n alt?: string;\r\n className?: string;\r\n style?: React.CSSProperties,\r\n title?: string;\r\n onClick?(event: React.MouseEvent): void;\r\n onLoad?(e: React.SyntheticEvent): void;\r\n onError?(e: React.SyntheticEvent): void;\r\n\r\n // props derived from React.ImgHTMLAttributes with slight changes\r\n width?: number; // instead of string | number\r\n height?: number; // instead of string | number\r\n\r\n // custom props\r\n fallbackSrc?: string;\r\n enableTap?: boolean;\r\n lazy?: boolean;\r\n onLoadStart?(): void;\r\n onSettled?(settleStatus: ImageSettleStatus): void;\r\n fetchPriority?: \"high\" | \"low\" | \"auto\"\r\n}\r\n\r\ninterface ImageState {\r\n src: string;\r\n type: IMAGE_TYPE;\r\n status: IMAGE_STATUS;\r\n}\r\n\r\nconst EMPTY_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r\n\r\nexport class Image extends OrbitComponentWithState {\r\n\r\n private _imgRef: React.RefObject = createRef();\r\n private _fetchPriority = {fetchpriority: this.props.fetchPriority || 'auto'}\r\n\r\n constructor(props: ImageProps) {\r\n super(props);\r\n this.state = this._getInitialSrcState();\r\n }\r\n\r\n componentDidMount() {\r\n super.componentDidMount();\r\n if (this._imgRef.current) {\r\n this._createTapLogicHandler(this._imgRef.current);\r\n this._createIntersectionObserver(this._imgRef.current);\r\n }\r\n }\r\n\r\n private _getInitialSrcState() {\r\n /**\r\n * If this is a lazy load image we initialize the state.src with the fallback image from props\r\n * but in case this is not provided we just set an empty image gif.\r\n * This will prevent the borders to be visible around the image while scrolled into the view.\r\n */\r\n if (this.props.lazy) {\r\n return {\r\n src: this.props.fallbackSrc || EMPTY_IMAGE,\r\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n status: IMAGE_STATUS.LAZY\r\n };\r\n }\r\n if (this.props.onLoadStart) {\r\n this.props.onLoadStart();\r\n }\r\n return {\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC,\r\n status: IMAGE_STATUS.LOADING\r\n };\r\n }\r\n\r\n private _onLoad = (e: React.SyntheticEvent) => {\r\n if (this.state.status === IMAGE_STATUS.LAZY) {\r\n return;\r\n }\r\n if (this.state.status === IMAGE_STATUS.LOADING) {\r\n this.setState({\r\n status: IMAGE_STATUS.SETTLED\r\n });\r\n if (this.state.type === IMAGE_TYPE.SRC && this.props.onLoad) {\r\n this.props.onLoad(e);\r\n }\r\n if (this.props.onSettled) {\r\n this.props.onSettled({\r\n value: \"load\",\r\n type: this.state.type\r\n });\r\n }\r\n }\r\n }\r\n private _onError = (e: React.SyntheticEvent) => {\r\n if (this.state.status === IMAGE_STATUS.LAZY && this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: EMPTY_IMAGE,\r\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n });\r\n }\r\n if (this.state.status === IMAGE_STATUS.LOADING) {\r\n if (this.state.type === IMAGE_TYPE.SRC) {\r\n this.setState({\r\n src: this.props.fallbackSrc || EMPTY_IMAGE,\r\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64\r\n });\r\n if (this.props.onError) {\r\n this.props.onError(e);\r\n }\r\n } else if (this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: EMPTY_IMAGE,\r\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n });\r\n } else if (this.state.type === IMAGE_TYPE.EMPTY_IMAGE_BASE64) {\r\n this.setState({\r\n status: IMAGE_STATUS.SETTLED\r\n });\r\n if (this.props.onSettled) {\r\n this.props.onSettled({\r\n value: \"error\",\r\n type: this.state.type\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n super.componentWillUnmount();\r\n this._destroyIntersectionObserver();\r\n this._destroyTapLogicHandler();\r\n }\r\n\r\n componentDidUpdate(prevProps: ImageProps) {\r\n if (this.props.fallbackSrc !== prevProps.fallbackSrc && this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: this.props.fallbackSrc\r\n });\r\n }\r\n if (this.props.src !== prevProps.src) {\r\n if (this.state.status === IMAGE_STATUS.SETTLED) {\r\n this.setState({\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC\r\n });\r\n }\r\n }\r\n }\r\n\r\n private _tapHandlerLogic: TapHandlerLogic | null = null;\r\n private _createTapLogicHandler(element: HTMLElement) {\r\n if (this.props.enableTap) {\r\n this._destroyTapLogicHandler();\r\n this._tapHandlerLogic = new TapHandlerLogic(element);\r\n }\r\n }\r\n\r\n private _destroyTapLogicHandler() {\r\n if (this._tapHandlerLogic) {\r\n this._tapHandlerLogic.dispose();\r\n this._tapHandlerLogic = null;\r\n }\r\n }\r\n\r\n private _intersectionObserver: IntersectionObserver | null;\r\n\r\n private _createIntersectionObserver(element: HTMLImageElement) {\r\n if (!this.props.lazy) {\r\n return;\r\n }\r\n\r\n // just in case this is called twice for this component we want to discard the existing intersection observer and create a new one\r\n this._destroyIntersectionObserver();\r\n\r\n this._intersectionObserver = new IntersectionObserver(this._intersectionObserverCallback, {\r\n rootMargin: '15px',\r\n threshold: 0.1\r\n });\r\n\r\n this._intersectionObserver.observe(element);\r\n }\r\n\r\n private _destroyIntersectionObserver() {\r\n if (this._intersectionObserver) {\r\n this._intersectionObserver.disconnect();\r\n this._intersectionObserver = null;\r\n }\r\n }\r\n\r\n private _intersectionObserverCallback = (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => {\r\n if (entries[0].intersectionRatio > 0 || entries[0].isIntersecting) {\r\n this._destroyIntersectionObserver();\r\n\r\n this.setState({\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC,\r\n status: IMAGE_STATUS.LOADING\r\n });\r\n if (this.props.onLoadStart) {\r\n this.props.onLoadStart();\r\n }\r\n } else {\r\n if(this._imgRef.current){\r\n this._createIntersectionObserver(this._imgRef.current);\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n\r\n let {\r\n // standard img props that need to be altered\r\n alt,\r\n // pass-through props\r\n className, title, width, height, style\r\n } = this.props;\r\n\r\n return ;\r\n }\r\n\r\n}\r\n","import React, {PropsWithChildren} from 'react';\r\nimport {OrbitComponent} from '../base-components/orbit-component/orbit-component';\r\nimport {ORBIT_TAP} from '../../themes/css-global-classes';\r\n\r\n\r\ninterface TapHandlerProps extends PropsWithChildren {\r\n enabled: boolean;\r\n elementRef: any;\r\n}\r\n\r\nexport class TapHandlerLogic {\r\n constructor(private _element: HTMLElement) {\r\n /**\r\n * No need to check device.feature.isTouch because on PC touchstart will not trigger\r\n * And mouseup will trigger afer any\r\n */\r\n this._element.addEventListener('touchstart', this._onMouseDownHandler);\r\n this._element.addEventListener('mousedown', this._onMouseDownHandler);\r\n this._element.addEventListener('touchend', this._onMouseUpHandler);\r\n this._element.addEventListener('touchcancel', this._onMouseUpHandler);\r\n this._element.addEventListener('mouseup', this._onMouseUpHandler);\r\n }\r\n\r\n private _onMouseDownHandler = () => {\r\n this._element.classList.add(ORBIT_TAP);\r\n }\r\n private _onMouseUpHandler = () => {\r\n this._element.classList.remove(ORBIT_TAP);\r\n }\r\n \r\n dispose() {\r\n this._element.removeEventListener('touchstart', this._onMouseDownHandler);\r\n this._element.removeEventListener('mousedown', this._onMouseDownHandler);\r\n this._element.removeEventListener('touchend', this._onMouseUpHandler);\r\n this._element.removeEventListener('touchcancel', this._onMouseUpHandler);\r\n this._element.removeEventListener('mouseup', this._onMouseUpHandler);\r\n }\r\n\r\n}\r\n\r\n\r\nexport class TapHandler extends OrbitComponent {\r\n\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.props.children}\r\n \r\n )\r\n }\r\n\r\n\r\n private _tapHandlerLogic: TapHandlerLogic | null = null;\r\n\r\n componentDidMount() {\r\n super.componentDidMount();\r\n if(this.props.enabled) {\r\n this._tapHandlerLogic = new TapHandlerLogic(this.props.elementRef.current);\r\n }\r\n\r\n }\r\n\r\n componentWillUnmount() {\r\n super.componentWillUnmount();\r\n if(this._tapHandlerLogic) {\r\n this._tapHandlerLogic.dispose();\r\n }\r\n }\r\n\r\n\r\n}\r\n","import React from 'react';\r\nimport {IServiceFactory} from './services/service-factory.interface';\r\n\r\n\r\n\r\nexport interface IOrbitContext {\r\n services: IServiceFactory\r\n}\r\n\r\nexport const OrbitContext = React.createContext(null!);\r\n\r\nexport const OrbitContextProvider = OrbitContext.Provider;\r\nexport const OrbitContextConsumer = OrbitContext.Consumer;\r\n","import {IDomService, IFormSubmitParams} from './dom.service.interface';\r\nimport {EventListenerRegistration} from '../../../utils/event-listener-registration';\r\nimport DOM from \"../../../sdk/src/utils/dom\";\r\nimport _ from \"../../../sdk/src/utils/underscore\";\r\nimport { observable, runInAction, makeObservable } from \"mobx\";\r\nimport {Check} from \"@sparkware/app-utils\";\r\n\r\n\r\nexport class DomService implements IDomService {\r\n constructor() {\r\n makeObservable(this);\r\n\r\n this._eventListenerRegistration = new EventListenerRegistration(document);\r\n DOM.addEventListener(document, 'webkitfullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'mozfullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'fullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'MSFullscreenChange', this._onFullScreenChange, false);\r\n this.isInFullScreen = _.isFullScreen();\r\n }\r\n\r\n private initialBodyPaddingRight: string | null = null;\r\n private bodyPaddingRightAltered = false;\r\n disableScrolling(): void {\r\n // before we add the class \"no-scrolling\" (that has overflow: hidden) on the body\r\n // we check if a scrollbar exists. If it exists, we compute the scrollbar thickness and we add it to body's padding-right\r\n // WE COULD HAVE USED CSS `scrollbar-gutter: stable;` on `html` but that has problems. The spacing auto-added by the browser is outside the DOM\r\n // and seems to be above everything. Above the overlay, so clicking in that area does not close it\r\n // and above the right drawer, so the scrollbar of the drawer is not visible on desktop (on Chrome, doesn't happen on Firefox)\r\n // and also creates positioning problems for right drawers (like user menu on rtl languages)\r\n\r\n // instead of comparing document.body.scrollHeight > window.innerHeight to see if we have scrollable content we compare the widths\r\n // to see if we have a scrollbar. And the difference is the scrollbar thickness.\r\n if (window.innerWidth > document.body.clientWidth) {\r\n let scrollbarThickness = window.innerWidth - document.body.clientWidth;\r\n let bodyComputedStyles: CSSStyleDeclaration = window.getComputedStyle(document.body);\r\n this.initialBodyPaddingRight = bodyComputedStyles.paddingRight;\r\n this.bodyPaddingRightAltered = true;\r\n\r\n // increase padding by the scrollbar thickness\r\n this.body.style.paddingRight = \"calc(\" + this.initialBodyPaddingRight + \" + \" + scrollbarThickness + \"px)\";\r\n }\r\n this.body.classList.add('no-scrolling');\r\n }\r\n\r\n enableScrolling(): void {\r\n this.body.classList.remove('no-scrolling');\r\n if (this.bodyPaddingRightAltered) {\r\n this.bodyPaddingRightAltered = false;\r\n this.body.style.paddingRight = this.initialBodyPaddingRight;\r\n }\r\n }\r\n\r\n querySelector(selector: string): Element | null {\r\n return document.querySelector(selector);\r\n }\r\n\r\n get body(): HTMLElement {\r\n return document.body;\r\n }\r\n\r\n get head(): HTMLElement {\r\n return document.head;\r\n }\r\n\r\n get html(): HTMLElement {\r\n return document.documentElement;\r\n }\r\n\r\n setDocumentTitle(title: string): void {\r\n if(title) {\r\n document.title = title;\r\n }\r\n }\r\n\r\n get locationPathName(): string {\r\n return document.location.pathname;\r\n }\r\n\r\n private readonly _eventListenerRegistration;\r\n get subscribeTo(): EventListenerRegistration {\r\n return this._eventListenerRegistration;\r\n }\r\n\r\n getElementsByClassName(className: string): HTMLCollectionOf {\r\n return document.getElementsByClassName(className);\r\n }\r\n\r\n getElementsByTagName(tagName: string): HTMLCollectionOf {\r\n return document.getElementsByTagName(tagName);\r\n }\r\n\r\n getElementById(id: string): HTMLElement | null {\r\n return document.getElementById(id);\r\n }\r\n\r\n createElement(tagName: string): HTMLElement {\r\n return document.createElement(tagName);\r\n }\r\n\r\n @observable.ref\r\n isInFullScreen: boolean;\r\n\r\n private _onFullScreenChange = () => {\r\n runInAction(() => {\r\n this.isInFullScreen = _.isFullScreen()\r\n });\r\n }\r\n\r\n enterFullScreen(): void {\r\n _.openFullScreen();\r\n }\r\n exitFullScreen(): void {\r\n _.closeFullScreen();\r\n }\r\n\r\n\r\n performFormPostForUrl(url: string, options?: Pick): void {\r\n const urlBuilder = new URL(url);\r\n const urlParams: Record = {};\r\n\r\n urlBuilder.searchParams.forEach((paramValue, paramName) => {\r\n urlParams[paramName] = paramValue;\r\n });\r\n\r\n urlBuilder.search = \"\";\r\n urlBuilder.hash = \"\";\r\n\r\n this.submitForm({\r\n ...options,\r\n method: 'post',\r\n url: urlBuilder.href,\r\n extraParams: urlParams\r\n });\r\n }\r\n\r\n submitForm(params: IFormSubmitParams) {\r\n const form: HTMLFormElement = this.createElement(\"form\") as HTMLFormElement;\r\n form.className = 'cy-form-post-form';\r\n form.setAttribute('method', params.method);\r\n form.setAttribute('target', Check.isNullOrUndefined(params.target) ? '_blank' : params.target);\r\n form.setAttribute('action', params.url);\r\n\r\n let hiddenField: HTMLInputElement = null;\r\n if (!Check.isNullOrUndefined(params.extraParams)) {\r\n for (const key in params.extraParams) {\r\n hiddenField = document.createElement('input');\r\n hiddenField.setAttribute('type', 'hidden');\r\n hiddenField.setAttribute('name', key);\r\n hiddenField.setAttribute('value', params.extraParams[key]);\r\n form.appendChild(hiddenField);\r\n }\r\n }\r\n\r\n this.body.appendChild(form);\r\n form.submit();\r\n //Timeout is for automation purposes.\r\n setTimeout(() => this.body.removeChild(form), 500);\r\n }\r\n}\r\n","import {RouteDefinition, RouteParams, RouteRender} from '../../routing-configuration/route-definition/route-definition';\r\nimport {IRoute} from \"./route.interface\";\r\nimport React from \"react\";\r\n\r\nexport class FallbackRoute implements IRoute{\r\n private readonly _routeDefinition: RouteDefinition;\r\n\r\n constructor(render: RouteRender) {\r\n this._routeDefinition = {\r\n paths: [],\r\n render: render\r\n }\r\n }\r\n\r\n render(): React.ReactNode {\r\n return this._routeDefinition.render(this.routeParams);\r\n }\r\n\r\n get routeParams(): RouteParams {\r\n return {};\r\n }\r\n\r\n get isOrbitRoute(): boolean {\r\n return false;\r\n }\r\n\r\n get data(): any {\r\n return {};\r\n }\r\n\r\n get routeDefinition(): RouteDefinition {\r\n return this._routeDefinition;\r\n }\r\n\r\n protected _isMiniOrbitRoute(): boolean {\r\n return false;\r\n }\r\n}\r\n","import {IRoute} from './route.interface';\r\nimport {RouteData, RouteDefinition, RouteParams} from '../../routing-configuration/route-definition/route-definition';\r\nimport React from 'react';\r\n\r\nexport abstract class RouteBase implements IRoute {\r\n constructor(private _routeDefinition: RouteDefinition, private _routeParams: RouteParams) {}\r\n\r\n render(): React.ReactNode {\r\n return this._routeDefinition?.render(this._routeParams);\r\n }\r\n\r\n get routeParams(): RouteParams {\r\n return this._routeParams;\r\n }\r\n\r\n get isOrbitRoute(): boolean {\r\n return this._isOrbitRoute();\r\n }\r\n\r\n get data(): RouteData {\r\n return this._routeDefinition.data;\r\n }\r\n\r\n get routeDefinition(): RouteDefinition {\r\n return this._routeDefinition;\r\n }\r\n\r\n\r\n protected abstract _isOrbitRoute(): boolean;\r\n\r\n}\r\n","import { matchPath } from 'react-router';\r\nimport {RouteDefinition, RouteParams} from '../routing-configuration/route-definition/route-definition';\r\n\r\n\r\nexport interface RouteMatchResult {\r\n routeDefinition: RouteDefinition;\r\n routeParams: RouteParams;\r\n}\r\nexport function tryMatchPath(pathToMatch: string, routes: RouteDefinition[]): RouteMatchResult {\r\n for(let i = 0; i < routes.length; i++) {\r\n let routeDefinition = routes[i];\r\n\r\n for(let j = 0; j < routeDefinition.paths.length; j++) {\r\n let pattern = routeDefinition.paths[j];\r\n let match = matchPath({\r\n path: pattern,\r\n caseSensitive: false,\r\n end: routeDefinition.exact ?? true\r\n }, pathToMatch.toLowerCase());\r\n\r\n if(match) {\r\n return {\r\n routeDefinition: routeDefinition,\r\n routeParams: match.params\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}","import {ISplashService} from './splash-service.interface';\r\nimport {Check} from '@sparkware/app-utils';\r\nimport {isInsideAutomation} from \"../../../utils/automation-helpers\";\r\n\r\n\r\nexport class SplashService implements ISplashService {\r\n constructor(private readonly onAfterRemoveSplash?: () => void) {\r\n\r\n //document.body.style.position = 'fixed';\r\n document.body.classList.add('disable-animations');\r\n }\r\n\r\n computeSplashTimeInSeconds(startTime: number): number {\r\n return parseFloat(((performance.now() - startTime) / 1000).toFixed(2));\r\n }\r\n\r\n splashTime: number = null;\r\n\r\n removeSplash(): void {\r\n if(!Check.isNull(this.splashTime)) {\r\n console.error('removeSplash called second time!');\r\n return;\r\n }\r\n //document.body.style.removeProperty('position');\r\n document.body.classList.remove('disable-animations');\r\n let splashPageElement = document.getElementById('splash-page');\r\n if(splashPageElement) {\r\n splashPageElement.remove();\r\n }\r\n this.splashTime = this.computeSplashTimeInSeconds(window['splashStart']);\r\n\r\n this._splashRemovedSubscribers.forEach(callback => callback());\r\n\r\n this._enablePrerender();\r\n\r\n if(this.onAfterRemoveSplash) {\r\n this.onAfterRemoveSplash();\r\n }\r\n }\r\n\r\n private _splashRemovedSubscribers: Array<() => void> = [];\r\n onSplashRemoved(callback: () => void) {\r\n this._splashRemovedSubscribers.push(callback);\r\n }\r\n\r\n private _enablePrerender() {\r\n const timeoutValue = isInsideAutomation() ? 0 : 5000;\r\n //We want to give 5 more sec of delay before pre render take the snapshot to make sure all b2c banner loaded\r\n setTimeout(() => {\r\n window['prerenderReady'] = true;\r\n }, timeoutValue);\r\n }\r\n}\r\n","import {getCypressToOrbitHooks, NamedIntervalType, isInsideAutomation} from '../../utils/automation-helpers';\r\nimport {TimeIntervalName} from './time-interval-names';\r\nimport {Check, TimeSpan} from '@sparkware/app-utils';\r\n\r\nfunction convertToTimeSpan(interval: number | TimeSpan): TimeSpan {\r\n if(Check.isNumber(interval)) {\r\n return TimeSpan.fromMilliseconds(interval);\r\n } else {\r\n return interval;\r\n }\r\n}\r\n\r\nfunction namedTimer(name: TimeIntervalName | null | undefined,\r\n handler: () => void,\r\n interval: TimeSpan | number | undefined,\r\n intervalType: NamedIntervalType,\r\n javascriptFunction: (handler: () => void, timeout: number) => number): number {\r\n\r\n if(Check.isNullOrUndefined(handler)) {\r\n throw new Error('namedInterval: handler argument cannot be null or undefined');\r\n }\r\n\r\n if(Check.isNullOrUndefined(interval)) {\r\n interval = TimeSpan.fromMilliseconds(0);\r\n }\r\n\r\n let timeSpan = convertToTimeSpan(interval);\r\n\r\n if(name && isInsideAutomation()) {\r\n const response = getCypressToOrbitHooks().onTimeIntervalCreation(name, handler, timeSpan, intervalType);\r\n if(response.ignoreJavaScriptImplementation) {\r\n // we are here because current running test decided to fake this timer\r\n return response.timerId;\r\n }\r\n }\r\n\r\n\r\n\r\n return javascriptFunction(handler, timeSpan.totalMilliseconds);\r\n}\r\n\r\n\r\n\r\nexport function namedSetInterval(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\r\n return namedTimer(name, handler, interval, NamedIntervalType.setInterval, setInterval);\r\n}\r\n\r\nexport function namedSetTimeout(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\r\n return namedTimer(name, handler, interval, NamedIntervalType.setTimeout, setTimeout);\r\n}","export class DeviceFeatureDetection {\r\n /**\r\n * The device supports touch, does it have a touchscreen\r\n */\r\n public get isTouch() {\r\n return (\r\n ('ontouchstart' in window)\r\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\r\n || (window.navigator.maxTouchPoints !== undefined && window.navigator.maxTouchPoints > 0)\r\n );\r\n }\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceOSDetection {\r\n private os: UAParser.IOS;\r\n constructor(private parser: UAParser) {\r\n this.os = this.parser.getOS();\r\n }\r\n\r\n /**\r\n * Returns the name of the operating system\r\n *\r\n * Possible 'os.name' - data taken from ua-parser-js\r\n * AIX, AmigaOS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, ChromiumOS, Contiki,\r\n * Fedora, FirefoxOS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,\r\n * Joli, Linpus, Linux, MacOS, Mageia, Mandriva, MeeGo, Minix, Mint, MorphOS, NetBSD,\r\n * Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,\r\n * RIM Tablet OS, RISCOS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,\r\n * Ubuntu, UNIX, VectorLinux, WebOS, Windows[Phone/Mobile], Zenwalk\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mac OS\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.os.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the operating system\r\n */\r\n public get version() {\r\n return parseInt(this.os.version.split(\".\")[0]);\r\n }\r\n\r\n public get isIOS() {\r\n return this.name === 'ios';\r\n }\r\n\r\n public get isAndroid() {\r\n return this.name === 'android';\r\n }\r\n\r\n public get isPC() {\r\n return [\"centos\", \"fedora\", \"debian\", \"linux\", \"macos\", \"pclinuxos\", \"redhat\", \"ubuntu\", \"unix\", \"vectorlinux\", \"windows\"].indexOf(this.name) && !this.isMobileOS;\r\n }\r\n\r\n public get isMacOS() {\r\n return this.name === 'macos';\r\n }\r\n\r\n public get isMobileOS() {\r\n return (this.isIOS || this.isAndroid);\r\n }\r\n\r\n}\r\n","export class DeviceViewportDetection {\r\n\r\n /**\r\n * Get viewport width.\r\n */\r\n public get width() {\r\n return window.innerWidth;\r\n }\r\n\r\n /**\r\n * Get viewport height.\r\n */\r\n public get height() {\r\n return window.innerHeight;\r\n }\r\n\r\n /**\r\n * Get screen height.\r\n */\r\n public get screenHeight() {\r\n return window.screen.height;\r\n }\r\n\r\n /**\r\n * Get screen width.\r\n */\r\n public get screenWidth() {\r\n return window.screen.width;\r\n }\r\n\r\n /**\r\n * Get the pixel ratio for the current running device.\r\n */\r\n public get pixelRatio() {\r\n var ratio = 1;\r\n\r\n const screen = window.screen as any;\r\n\r\n // To account for zoom, change to use deviceXDPI instead of systemXDPI\r\n if (screen.systemXDPI !== undefined && screen.logicalXDPI !== undefined && screen.systemXDPI > screen.logicalXDPI) {\r\n // Only allow for values > 1\r\n ratio = screen.systemXDPI / screen.logicalXDPI;\r\n } else if (window.devicePixelRatio !== undefined) {\r\n ratio = window.devicePixelRatio;\r\n }\r\n return ratio;\r\n }\r\n\r\n public get isPortrait() {\r\n return window.matchMedia(\"(orientation: portrait)\").matches;\r\n }\r\n}","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceModelDetection {\r\n private device: UAParser.IDevice;\r\n constructor(private parser: UAParser) {\r\n this.device = this.parser.getDevice();\r\n }\r\n\r\n /**\r\n * Is it an iPhone?\r\n */\r\n public get isIphone() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPhone\";\r\n }\r\n\r\n public get isIpad() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPad\";\r\n }\r\n\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n//https://confluence/pages/viewpage.action?spaceKey=WEB&title=iframe-allow-camera\r\nimport { getAllowAttr } from '@888webteam/iframe-allow-camera';\r\n\r\nexport class DeviceBrowserDetection {\r\n private browser: UAParser.IBrowser;\r\n constructor(private parser: UAParser) {\r\n this.browser = this.parser.getBrowser();\r\n }\r\n\r\n /**\r\n * Returns the name of the browser\r\n *\r\n * Possible values :\r\n * Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,\r\n * Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,\r\n * Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,\r\n * Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,\r\n * Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,\r\n * Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],\r\n * Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox,\r\n * Tizen, UCBrowser, Vivaldi, w3m, Yandex\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mobile Safari\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.browser.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the browser\r\n */\r\n public get version() {\r\n return parseInt(this.browser.version.split(\".\")[0]);\r\n }\r\n\r\n /**\r\n * Is it a Firefox?\r\n */\r\n public get isFirefox() {\r\n return this.name === \"firefox\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Chrome?\r\n */\r\n public get isChrome() {\r\n return this.name === \"chrome\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Safari?\r\n */\r\n public get isSafari() {\r\n // Can be \"Safari\" or \"Mobile Safari\"\r\n return this.name.indexOf(\"safari\") !== -1;\r\n }\r\n\r\n /**\r\n * Is it a Opera?\r\n */\r\n public get isOpera() {\r\n // Can be \"Opera\", \"Opera Mobi\", \"Opera Mini\", \"Opera Tablet\"\r\n return this.name.indexOf(\"opera\") !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Is browser an Edge instance?\r\n */\r\n public get isEdge() {\r\n return this.name === \"edge\";\r\n }\r\n\r\n getIframeAllowAttributeValue(){\r\n let allowAttrValue = getAllowAttr();\r\n if(allowAttrValue.indexOf('autoplay') >= 0) {\r\n return allowAttrValue;\r\n } else {\r\n return `autoplay; ${allowAttrValue}`;\r\n }\r\n }\r\n\r\n}\r\n","import Store from '../../store';\r\nimport Logger from '../../logger';\r\nimport { DeviceOSDetection } from \"./os\";\r\n\r\nconst NATIVE_TYPE = {\r\n CASINO_IOS: 'cbCallBackHandlerCGP',\r\n CASINO_ANDROID: 'WrapperInterfaceCGP',\r\n POKER_IOS: 'NativeInterface',\r\n POKER_ANDROID: 'NativeInterface',\r\n POKER_7_ANDROID: 'PokerSecondWebView',\r\n CIP8_ANDROID: 'pokerNativeInterface',//TODO - will be also used in CGP so that we have a unique source\r\n SPORT_IOS: 'callbackHandler',\r\n SPORT_CIS_WEBVIEW: 'sportNativeInterface',\r\n SPORT_ANDROID: 'WrapperInterface'\r\n};\r\n\r\nexport class DeviceHybridDetection {\r\n private logger: Logger;\r\n private _hybrid = false;\r\n private _inCasino = false;\r\n private _inPoker = false;\r\n private _inSport = false;\r\n private _embedded = false;\r\n\r\n constructor(private os: DeviceOSDetection) {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n this.buildHybridInfo();\r\n }\r\n\r\n public get isHybrid() {\r\n return this._hybrid;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Casino\r\n */\r\n public get inCasino() {\r\n return this._inCasino;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Poker\r\n */\r\n public get inPoker() {\r\n return this._inPoker;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Sport\r\n */\r\n public get inSport() {\r\n return this._inSport;\r\n }\r\n\r\n /**\r\n * The hybrid type is embedded (like AOD - Apple On Demand Resources). All games are bundled and deployed at Apple servers and downloaded by demand by the hybrid app\r\n */\r\n public get isEmbedded() {\r\n return this._embedded;\r\n }\r\n\r\n\r\n /**\r\n * FOR BUILDING HYBRID INFO I AM BEING EXTRA CAREFULL AND DOUBLECHECKING THE RESULTS FROM DIFFERENT DATA\r\n */\r\n private buildHybridInfo() {\r\n\r\n const genericHybridEmbedded = window['cgp_isHybridEmbedded'] || false;\r\n\r\n const inPokerHybrid = this.build_isInPokerHybrid();\r\n\r\n const casinoHybrid = this.build_isCasinoHybrid(inPokerHybrid);\r\n\r\n const inSportHybrid = this.build_isInSportHybrid();\r\n\r\n if (casinoHybrid || inPokerHybrid || inSportHybrid || genericHybridEmbedded) {\r\n this._hybrid = true;\r\n }\r\n\r\n if (genericHybridEmbedded) {\r\n this._embedded = true;\r\n }\r\n\r\n this._inCasino = false;\r\n this._inPoker = false;\r\n this._inSport = false;\r\n\r\n if (casinoHybrid) {\r\n this._inCasino = true;\r\n }\r\n\r\n if (inPokerHybrid) {\r\n this._inPoker = true;\r\n }\r\n\r\n if (inSportHybrid) {\r\n this._inSport = true;\r\n }\r\n\r\n this.dataSanityCheck(casinoHybrid, inPokerHybrid, inSportHybrid, genericHybridEmbedded);\r\n }\r\n\r\n private build_isCasinoHybrid(inPoker) {\r\n // checks for normal casino hybrid\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS() && !inPoker;//isNativeIOS include cip8\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private build_isInPokerHybrid() {\r\n if (this.os.isIOS) {\r\n\r\n // On iOS, first check if poker put a known object in global namespace. If it's there, we know it's poker hybrid, we don't need anything else\r\n if ((window as any).NativeInterface && (this.isNativeIOS(NATIVE_TYPE.POKER_IOS))) {\r\n return true;\r\n }\r\n // Otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n // Once poker7 will use AOD in NJ this code below can be removed\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n // we are in NJ, so now we have to check for the ClientVersion key in storage. If exists and starts with \"mp-\" or \"sp-\", then it is poker hybrid\r\n let storedClientVersion = Store.get('ClientVersion');\r\n if (storedClientVersion && (storedClientVersion.toLowerCase().startsWith('mp-') || storedClientVersion.toLowerCase().startsWith('sp-'))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n if (this.os.isAndroid) {\r\n // On Android, first check if poker put a known object in global namespace. If it's there, we know it's poker7 hybrid, we don't need anything else\r\n if ((window as any)[NATIVE_TYPE.POKER_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_ANDROID)) {\r\n return true;\r\n }\r\n // For Some reason poker 7 have 2 different name.. do we need to check both\r\n if ((window as any)[NATIVE_TYPE.POKER_7_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_7_ANDROID)) {\r\n return true;\r\n }\r\n\r\n //For Poker8 (new Poker) - Same check for CIP8_ANDROID, because it is a different object name\r\n if ((window as any)[NATIVE_TYPE.CIP8_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.CIP8_ANDROID)) {\r\n return true;\r\n }\r\n\r\n //Once poker7 Baruch will go live with the the new POKER_7_ANDROID name we can remove the code below - for now we leave it for backward\r\n // ... otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n //Todo check this store get logic, I think we have timing issue here\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n\r\n let storedSourceProductPackage = Store.get('sourceProductPackage');\r\n if (storedSourceProductPackage && (storedSourceProductPackage.toString() === '52' || storedSourceProductPackage.toString() === '95')) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private build_isInSportHybrid(): boolean {\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid(NATIVE_TYPE.SPORT_ANDROID) || this.isNativeAndroid(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Is it an IOS Hybrid?\r\n */\r\n private isNativeIOS(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_IOS;\r\n\r\n return ('object' === typeof ((window as any).webkit)\r\n && 'object' === typeof ((window as any).webkit.messageHandlers[className]));\r\n }\r\n\r\n /**\r\n * Is it an Android Hybrid?\r\n */\r\n private isNativeAndroid(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_ANDROID;\r\n return ('object' === typeof ((window as any)[className]));\r\n }\r\n\r\n\r\n private dataSanityCheck(casinoHybrid: boolean, inPokerHybrid: boolean, inSportHybrid: boolean, genericHybridEmbedded: boolean) {\r\n // Casino in Poker and casino in sport cannot be true at the same time\r\n if (inPokerHybrid === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 1. inPokerHybrid and inSportHybrid are both true\");\r\n }\r\n\r\n if (casinoHybrid === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 2. casinoHybrid and inSportHybrid are both true\");\r\n }\r\n\r\n if (inPokerHybrid === true && casinoHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 3. inPokerHybrid and casinoHybrid are both true\");\r\n }\r\n\r\n // From the trio: casinoHybrid, inPokerHybrid, inSportHybrid at most one need to be true.\r\n // And this, only if genericHybridEmbedded is true\r\n if (genericHybridEmbedded === true && (casinoHybrid === false || inPokerHybrid === false || inSportHybrid === false)) {\r\n this.logger.error(\"Hybrid data sanity check. 4. if genericHybridEmbedded is false, none of any other embedded flags can be true\");\r\n }\r\n\r\n }\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { UAParser } from 'ua-parser-js';\r\nimport Logger from '../logger';\r\nimport { DeviceFeatureDetection } from './detection/feature';\r\nimport { DeviceOSDetection } from './detection/os';\r\nimport { DeviceViewportDetection } from './detection/viewport';\r\nimport { DeviceModelDetection } from './detection/model';\r\nimport { DeviceBrowserDetection } from './detection/browser';\r\nimport { DeviceHybridDetection } from './detection/hybrid';\r\n\r\nclass Device {\r\n public logger: Logger;\r\n private _uaParser: UAParser = new UAParser();\r\n public readonly feature = new DeviceFeatureDetection();\r\n public readonly os = new DeviceOSDetection(this._uaParser);\r\n public readonly viewport = new DeviceViewportDetection();\r\n public readonly model = new DeviceModelDetection(this._uaParser);\r\n public readonly browser = new DeviceBrowserDetection(this._uaParser);\r\n public readonly hybrid = new DeviceHybridDetection(this.os);\r\n\r\n /**\r\n * Initialize the device.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n }\r\n\r\n /**\r\n * Getter for the user-agent for the client being handled in this request.\r\n *\r\n * @example 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'\r\n */\r\n public get userAgent() {\r\n return this._uaParser.getUA();\r\n }\r\n\r\n /**\r\n * Generates a GUID\r\n */\r\n public generateGuid(): string {\r\n return uuidv4();\r\n }\r\n\r\n private matchMedia(media: string) {\r\n return window.matchMedia(media).matches;\r\n }\r\n\r\n /**\r\n * Used to detected if user clicked and loaded the app using home screen\r\n *\r\n * Returns true if the app is running in standalone mode (iOS only)\r\n */\r\n public get isStandalone() {\r\n return 'standalone' in window.navigator ? (window.navigator as any).standalone : false;\r\n }\r\n\r\n public get isProgressiveWebApp(): boolean {\r\n\t\t// PWA setting is \"display\": \"fullscreen\"\r\n\t\t// but installed on desktop it's detected as \"standalone\" if app is not in fullscreen mode or \"fullscreen\" if user enters fullscreen mode\r\n // iOS is identified through check the navigator to have attribute 'standalone'\r\n\r\n\t\treturn !this.hybrid.isHybrid && (this.isStandalone ||\r\n this.matchMedia('(display-mode: fullscreen)') ||\r\n this.matchMedia('(display-mode: standalone)'));\r\n\r\n }\r\n\r\n public get isSupportHTML5() {\r\n return 'function' === typeof document.createElement('canvas').getContext;\r\n }\r\n\r\n public get isMobileWebApp() {\r\n return (this.os.isMobileOS || this.isProbablyIOSDevice) && !this.hybrid.isHybrid;\r\n }\r\n\r\n /**\r\n * Check whether the browser has cookie enable 3rd party.\r\n */\r\n public get isCookieEnable() {\r\n return window.navigator.cookieEnabled;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iOS and iOS + \"Request Desktop Website\", iPhone INCLUDED\r\n */\r\n public get isProbablyIOSDevice() {\r\n if (this.os.isIOS) {\r\n return true;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that we are on Mac\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iPad and iOS + \"Request Desktop Website\", iPhone NOT INCLUDED\r\n * HOWEVER, FOR IPHONE THAT HAVE \"Request Desktop Website\", this method will return true\r\n */\r\n public get isProbablyIPad() {\r\n // Pre iOS 13 detection\r\n if (this.model.isIpad) {\r\n return true;\r\n }\r\n if (this.model.isIphone) {\r\n return false;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that is a Safari browser on Mac (in the past, Safari was available for Windows too)\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * Check the device is in a portrait mode.\r\n *\r\n * @deprecated use \"Device.viewport.isPortrait\"\r\n */\r\n public get isPortrait(): boolean {\r\n if (this.isMobile() && this.os.isAndroid) {\r\n // fix for Samsung S8 series (S8-S9...).\r\n // In full screen mode window.screen.width and window.screen.height after single rotation get wrong values (width equal to height)\r\n // So we should test it by innerWidth and innerHeight like in iOS\r\n if (this.viewport.screenWidth === this.viewport.screenHeight) {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n return this.viewport.screenWidth < this.viewport.screenHeight;\r\n } else {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n *\r\n * Getting the current running iPhone device version, hardware version.\r\n * Able to detect iPhone 4 and 5 and iphone x (10)\r\n * Returns NULL if device is not an iPhone. Will return a Number of the hardware version.\r\n * @deprecated\r\n */\r\n public getIphoneVersion() {\r\n\r\n if (this.os.isIOS && 11 <= this.os.version &&\r\n (\r\n //iphone 12 pro max\r\n (926 === window.screen.height && 428 === window.screen.width) || (926 === window.screen.width && 428 === window.screen.height)\r\n ||\r\n //iphone 12 pro\r\n (844 === window.screen.height && 390 === window.screen.width) || (844 === window.screen.width && 390 === window.screen.height)\r\n ||\r\n // iPhone X / Xs\r\n (812 === window.screen.height && 375 === window.screen.width) || (812 === window.screen.width && 375 === window.screen.height)\r\n ||\r\n // iPhone Xr / Xs Max\r\n (896 === window.screen.height && 414 === window.screen.width) || (896 === window.screen.width && 414 === window.screen.height)\r\n )\r\n ) {\r\n return 10;\r\n }\r\n\r\n if (this.os.isIOS && 8 <= this.os.version && 375 === window.screen.width) {\r\n return 6;\r\n }\r\n\r\n if (this.os.isIOS && 6 <= this.os.version && 320 === window.screen.width) {\r\n return 5;\r\n }\r\n\r\n // iphone 4/s (Retina)\r\n if (this.os.isIOS && 5 <= this.os.version && 640 === window.screen.width) {\r\n return 4;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n * Is IphoneX\r\n * Returns true if the device is IphoneX\r\n * @deprecated\r\n */\r\n public isIphoneX(): boolean {\r\n return 10 === this.getIphoneVersion();\r\n }\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobileNotTablet(): boolean {\r\n return this.viewport.width < 1280 && !this.isTablet();\r\n }\r\n\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * Returns true only for ipads smaller than 1280\r\n * @deprecated\r\n */\r\n public isTablet(): boolean {\r\n return this.model.isIpad && this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Those are not the droids you are looking for\r\n * Use media queries, feature detection, client hints, os detection.\r\n * Think of what you want to achieve with your code and put a condition for that, not a general isMobile condition\r\n *\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobile(): boolean {\r\n return this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Get benchmark.\r\n */\r\n public getBenchMark() {\r\n var b = { m: 0 }, bd = [], bmt = + new Date() + 50;\r\n do {\r\n var t, count = 0, tt = + new Date();\r\n do { t = + new Date(); } while (t === tt);\r\n do { count++; tt = +new Date(); } while (t === tt);\r\n if ((tt - t) === 1) { bd[bd.length] = count; }\r\n } while ((bd.length < 20) && (t < bmt));\r\n\r\n if (bd.length === 0) b.m = 0; else b.m = Math.max.apply(Math, bd);\r\n\r\n return b.m;\r\n }\r\n\r\n}\r\n\r\nexport default new Device();\r\n","import _ from './underscore';\r\nimport Logger from './logger';\r\nimport {namedSetInterval, namedSetTimeout} from '../../../common/utils/time-functions';\r\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\r\n\r\nexport interface TimeoutSubscription {\r\n clear(): void;\r\n}\r\n\r\n\r\n\r\nexport interface ElementDimensions {\r\n\r\n width: number,\r\n height: number,\r\n horizontMargin: number,\r\n verticalMargin: number,\r\n horizontPadding: number,\r\n verticalPadding: number,\r\n horizontBorder: number,\r\n verticalBorder: number,\r\n fullWidth: number,\r\n fullHeight: number,\r\n marginRight: number,\r\n marginLeft: number,\r\n marginTop: number,\r\n marginBottom: number\r\n}\r\n\r\nexport interface ElementSize {\r\n width: number,\r\n height: number\r\n}\r\n\r\nexport interface DomEventSubscription {\r\n remove: () => void\r\n}\r\n\r\n\r\n\r\nclass DOM {\r\n\r\n static CLASS = 'DOM';\r\n\r\n constructor() {\r\n this._createLogger();\r\n }\r\n\r\n logger: Logger;\r\n _createLogger() {\r\n this.logger = new Logger(DOM.CLASS);\r\n }\r\n\r\n\r\n getBody() : HTMLElement {\r\n return document.body;\r\n }\r\n\r\n\r\n getHTML(): HTMLElement {\r\n return document.documentElement;\r\n }\r\n\r\n\r\n /**\r\n * Draw element into the DOM.\r\n */\r\n draw(element: Element) : DOM {\r\n\r\n this.append(this.getBody(), element);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Selector jQuery like for getting the object from the dom.\r\n * $$ is double the fun, $ is cool, $$ is cooler.\r\n */\r\n $$(query: any): any {\r\n let el = null;\r\n\r\n // first off if it's not a string assume it's already an element\r\n if (!_.isString(query)) {\r\n el = query;\r\n } else if ( this.isTag(query) ) {\r\n // check if it's a tag\r\n let tag = query.substring(1, query.length - 1);\r\n el = document.createElement( tag );\r\n } else if ( this.isId(query) ) {\r\n // check if it's an id\r\n let id = query.substr(1);\r\n el = document.getElementById( id );\r\n } else {\r\n // run a basic query\r\n el = document.querySelectorAll(query);\r\n }\r\n\r\n if (_.isNodeList(el)) {\r\n el = [].slice.call(el);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n querySelector(selector: string): Element {\r\n return document.querySelector(selector);\r\n }\r\n\r\n\r\n injectStyleToDOM(content: string): HTMLStyleElement {\r\n let newStyle = document.createElement('style');\r\n newStyle.innerHTML = content;\r\n return document.body.appendChild(newStyle);\r\n }\r\n\r\n createElement(type: string = 'div', html: string = '', classList = []): HTMLElement {\r\n let domElement = document.createElement(type);\r\n if(html) {\r\n domElement.innerHTML = html;\r\n }\r\n\r\n if(classList.length > 0){\r\n classList.forEach(_class => this.addClass(domElement, _class));\r\n }\r\n\r\n return domElement;\r\n }\r\n\r\n append(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n target.appendChild(el);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n removeElement(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n el.parentNode.removeChild(el);\r\n\r\n return this;\r\n }\r\n\r\n appendFirst(target: Element, el: Element): void {\r\n\r\n if (!_.isElement(target)) {\r\n throw new Error('target argument must be an Element');\r\n }\r\n\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an Element');\r\n }\r\n\r\n target.insertBefore(el, target.firstChild);\r\n }\r\n\r\n addClass(el: Element, className: any) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className || 0 === className.length) {\r\n return this;\r\n }\r\n\r\n let name = _.isArray(className) ? className[0] : className;\r\n\r\n if (el.classList) {\r\n el.classList.add(name);\r\n } else {\r\n el.className += ' ' + name;\r\n }\r\n\r\n return _.isArray(className) ? this.addClass(el, className.slice(1)) : this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * toggle class to element\r\n */\r\n toggleClass(el: Element, className: string) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className) {\r\n return this;\r\n }\r\n\r\n el.classList.toggle(className);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * if element already has the class\r\n */\r\n hasClass(el: Element, className: string) : boolean {\r\n if (!_.isElement(el)) {\r\n throw new Error(`el argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n if (!className) {\r\n throw new Error(`className argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n return el.classList.contains(className);\r\n }\r\n\r\n\r\n /**\r\n * Add attribute to the element.\r\n */\r\n addAttribute(el: Element, attribute: string = '', value: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.setAttribute(attribute, value);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Add Style to the element.\r\n */\r\n addStyle(el: HTMLElement, key: string, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style[key] = value;\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove Style from the element.\r\n */\r\n removeStyle(el: HTMLElement, key: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style.removeProperty(key);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get current element dimensions\r\n */\r\n getDimensions(el: HTMLElement): ElementDimensions {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n\r\n let style = this.getCurrentStyle(el);\r\n let horizontMargin = parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n let verticalMargin = parseFloat(style.marginBottom) + parseFloat(style.marginTop);\r\n\r\n return {\r\n width: el.offsetWidth,\r\n height: el.offsetHeight,\r\n horizontMargin: horizontMargin,\r\n verticalMargin: verticalMargin,\r\n horizontPadding: parseFloat(style.paddingLeft) + parseFloat(style.paddingRight),\r\n verticalPadding: parseFloat(style.paddingBottom) + parseFloat(style.paddingTop),\r\n horizontBorder: parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth),\r\n verticalBorder: parseFloat(style.borderBottomWidth) + parseFloat(style.borderTopWidth),\r\n fullWidth: el.offsetWidth + horizontMargin,\r\n fullHeight: el.offsetHeight + verticalMargin,\r\n marginRight: parseFloat(style.marginRight),\r\n marginLeft: parseFloat(style.marginLeft),\r\n marginTop: parseFloat(style.marginTop),\r\n marginBottom: parseFloat(style.marginBottom)\r\n };\r\n }\r\n\r\n setElementSize(element: HTMLElement, size: ElementSize, unit: string = 'px') : void {\r\n element.style.width = size.width + unit;\r\n element.style.height = size.height + unit;\r\n }\r\n\r\n getCurrentStyle(el: HTMLElement) : CSSStyleDeclaration {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n return window.getComputedStyle(el) || el['currentStyle'];\r\n }\r\n\r\n\r\n /**\r\n * Hide element from dom.\r\n */\r\n hide(el: Element): DOM {\r\n this.removeClass(el, 'show');\r\n this.addClass(el, 'hide');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Get element to be invisible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n invisible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-visible');\r\n this.addClass(el, 'cgp-invisible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Show element on dom\r\n * @param el\r\n */\r\n show(el: Element): DOM {\r\n this.removeClass(el, 'hide');\r\n this.addClass(el, 'show');\r\n return this;\r\n }\r\n\r\n /**\r\n * Get element to be visible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n visible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-invisible');\r\n this.addClass(el, 'cgp-visible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove class from element.\r\n * @param el\r\n * @param className\r\n */\r\n removeClass(el: Element, className: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.classList.remove(className);\r\n return this;\r\n }\r\n\r\n\r\n removeAttribute(el: Element, attr: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.removeAttribute(attr);\r\n return this;\r\n }\r\n\r\n isInputElement(tagName: string = ''): boolean {\r\n return 'INPUT' === tagName;\r\n }\r\n\r\n\r\n /**\r\n * Sets the innerHTML for the provided element\r\n */\r\n html(html: string, el: Element): DOM {\r\n if (_.isNullOrUndefined(html)) {\r\n this.logger.error('Html is not valid parameter');\r\n return this;\r\n }\r\n el.innerHTML = html;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Clear elements from his node childs nor content.\r\n */\r\n clear(target: Element): DOM {\r\n while (target.firstChild) {\r\n target.removeChild(target.firstChild);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n camelCase(str: string): string {\r\n return str.replace(/-([a-z])/g, (g) => {\r\n return g[1].toUpperCase();\r\n });\r\n }\r\n\r\n\r\n isTag(str: string): boolean {\r\n return 0 === str.search(/^<\\w+>$/);\r\n }\r\n\r\n isId(str: string ) {\r\n return 0 === str.search(/^#\\w+$/);\r\n }\r\n\r\n parseDataAttributes(el: Element): object {\r\n let data = {};\r\n\r\n [].forEach.call(el.attributes, (attr) => {\r\n if (/^data-/.test(attr.name)) {\r\n let camelCaseName = attr.name.substr(5).replace(/-(.)/g, ($0, $1) => {\r\n return $1.toUpperCase();\r\n });\r\n data[camelCaseName] = attr.value;\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n\r\n text(el: Element, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be a HTMLElement');\r\n }\r\n el.textContent = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * wrapper for add event listeners on DOM, returns a self removing method.\r\n */\r\n addEventListener(el: Element | Document, type: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n el.addEventListener(type, callback, useCapture);\r\n\r\n return {\r\n remove: function(msgElement: Element | Document, msgType: string, msgCallback: EventListenerOrEventListenerObject) {\r\n return () => {\r\n return msgElement.removeEventListener(msgType, msgCallback);\r\n };\r\n }(el, type, callback)\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n *\r\n *\r\n * @description - Generic event handler, all the component should subscribe to one event function,\r\n * They should pass the element it self define specific id inside the element,\r\n * Event type, And the event callback.\r\n *\r\n * @usage:\r\n * onDOMEvent(DOMElement, '#testid', 'click', ()=> {alert('onClick happend'});\r\n * onDOMEvent(DOMElement, 'click', ()=> {alert('onClick happend'});\r\n */\r\n onDOMElementEvent(element: Element, eventName: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n if (!_.isElement(element)) {\r\n throw new Error('element argument must be of type HTMLElement');\r\n }\r\n\r\n if(!_.isString(eventName)) {\r\n throw new Error('eventName argument must be of type String');\r\n }\r\n\r\n if(!_.isFunction(callback)) {\r\n throw new Error('callback argument must be of type Function');\r\n }\r\n\r\n element.addEventListener(eventName, callback, useCapture);\r\n\r\n return {\r\n remove: () => element.removeEventListener(eventName, callback)\r\n };\r\n }\r\n\r\n\r\n setInterval(callback: () => void, timeout: number, name?: TimeIntervalName) : number {\r\n return namedSetInterval(name, callback, timeout);\r\n }\r\n\r\n\r\n clearInterval(handle: number): void {\r\n clearInterval(handle);\r\n }\r\n\r\n\r\n setTimeout(callback: () => void, timeout: number, name?: TimeIntervalName): number {\r\n return namedSetTimeout(name, callback, timeout);\r\n }\r\n\r\n clearTimeout(handle: number): void {\r\n clearTimeout(handle);\r\n }\r\n}\r\n\r\nexport default new DOM();\r\n","import logger from 'js-logger';\r\n\r\nlogger.useDefaults();\r\n\r\nexport default class Logger {\r\n\r\n static SET_LOG_LEVEL(level = 'ERROR'): any {\r\n switch (level.toString().toUpperCase()) {\r\n case 'DEBUG':\r\n return logger.DEBUG;\r\n case 'INFO':\r\n return logger.INFO;\r\n case 'WARN':\r\n return logger.WARN;\r\n case 'ERROR':\r\n default:\r\n return logger.ERROR;\r\n case 'OFF':\r\n return logger.OFF;\r\n }\r\n }\r\n\r\n _logger;\r\n\r\n\r\n constructor(name: string) {\r\n let logLevel = this._getQueryParameters()['logLevel'] || window['LOG_LEVEL'];\r\n this._logger = logger.get(name);\r\n this._logger.setLevel(Logger.SET_LOG_LEVEL(logLevel));\r\n }\r\n\r\n\r\n /**\r\n * Fatal errors. Mission critical - application can not run properly when present.\r\n */\r\n error(...log): void {\r\n this._log('error', log);\r\n }\r\n\r\n\r\n /**\r\n * Warning only. Should be fixed but application been able to recover.\r\n */\r\n warn(...log): void {\r\n this._log('warn', log);\r\n }\r\n\r\n\r\n /**\r\n * Information only. General info printed.\r\n */\r\n info(...log): void {\r\n this._log('info', log);\r\n }\r\n\r\n\r\n /**\r\n * Debug mode. Print as much as possible to allow quick and easy debugging when needed.\r\n */\r\n debug(...log): void {\r\n this._log('debug', log);\r\n }\r\n\r\n\r\n /**\r\n * ULTRA Debug mode, almost silly to use. Print as much as possible to allow quick and easy debugging when needed.\r\n * But very useful debugging, should contain ALOT of prints via this method.\r\n */\r\n silly(...log) : void {\r\n this._log('silly', log);\r\n }\r\n\r\n\r\n /**\r\n * Private method, provides single point of access to the \"console.log\" API.\r\n * Prevents mess around the code and a clean way to prevent the output of the log or the severity level.\r\n */\r\n _log(severity: string, log: any) {\r\n if (this._isConsoleEnabled(severity)) {\r\n this._logger[severity](log);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Checks that console is globally defined and able to use it to print out log data to it.\r\n */\r\n private _isConsoleEnabled(severity: string): boolean {\r\n return 'undefined' !== typeof console && 'undefined' !== typeof console[severity]; // eslint-disable-line no-console\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n */\r\n private _getQueryParameters(str?: string) {\r\n return (str || document.location.search).replace(/(^\\?)/, '').split(\"&\").map(function (n) {\r\n n = n.split(\"=\");\r\n this[n[0]] = n[1];\r\n\r\n return this;\r\n }.bind({}))[0];\r\n }\r\n\r\n}","import CGPLogger from './logger';\r\nimport Strings from './strings';\r\nimport _ from './underscore';\r\n\r\ninterface IStorage {\r\n set(key: string, value: any) : boolean;\r\n\r\n del(key: string): boolean;\r\n\r\n get(key: string, defaultValue: any): any | null;\r\n\r\n clear(): void;\r\n};\r\n\r\nconst logger = new CGPLogger('Store');\r\n\r\nclass CGPStorage {\r\n /**\r\n * @property\r\n * @type {null|LocalStorage|WindowStorage}\r\n */\r\n _selectedStorage: IStorage = null;\r\n\r\n\r\n /**\r\n * CGP storage business logic place.\r\n */\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initialize the storage and initialize the currect instance of storage\r\n * Or from the window['localStorage'] or our window cgp storage ;).\r\n *\r\n * @returns {LocalStorage}\r\n */\r\n init() : void {\r\n if (this.isLocalStorageNameSupported()) {\r\n logger.debug('Selected to be main priority cgp storage from localstorage.');\r\n this._selectedStorage = new LocalStorage();\r\n } else {\r\n logger.debug('Selected to be main priority cgp storage from window unique localstorage.');\r\n this._selectedStorage = new WindowStorage();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Create cookie that shared/not between sub domains\r\n * @param name\r\n * @param value\r\n */\r\n setCookie(name: string, value: string) : void {\r\n let now = new Date();\r\n now.setFullYear(now.getFullYear() + 1);\r\n document.cookie = name + '=' + value + ';expires=' + now.toUTCString() + ';path=/';\r\n }\r\n\r\n /**\r\n * Get cookie by key\r\n * @param name\r\n * @returns {string}\r\n */\r\n getCookie(name: string): string {\r\n let match = document.cookie.match(new RegExp(name + '=([^;]+)'));\r\n if (match) {\r\n return match[1];\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Remove cookie by key\r\n * @param name\r\n */\r\n removeCookie(name: string) : void {\r\n document.cookie = name + \"=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/\";\r\n }\r\n\r\n /**\r\n * Check wheter local storage supported.\r\n *\r\n * @returns {boolean}\r\n */\r\n isLocalStorageNameSupported(): boolean {\r\n let testKey = 'test';\r\n\r\n try\r\n {\r\n const storage: Storage = window.localStorage;\r\n storage.setItem(testKey, '1');\r\n storage.removeItem(testKey);\r\n return 'localStorage' in window && null !== window.localStorage;\r\n }\r\n catch (error)\r\n {\r\n logger.error('Local storage is not supported the user might running under incognito mode on safari yak!');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n return this._selectedStorage.set(key, value);\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: any): boolean {\r\n if(typeof key === 'string') {\r\n return this.delKey(key);\r\n } else {\r\n return this.delArray(key);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n delKey(key: string): boolean {\r\n return this._selectedStorage.del(key);\r\n }\r\n\r\n /**\r\n * remove array of keys from storage, also check if exists.\r\n * @param keys\r\n * @returns {boolean} stating the delete was successfully or not\r\n */\r\n delArray(keys: string[]): boolean {\r\n let result = true;\r\n keys.forEach(function (key) {\r\n result = result && this._selectedStorage.del(key);\r\n }, this);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n return this._selectedStorage.get(key, defaultValue);\r\n }\r\n\r\n clearLocalStorage() {\r\n this._selectedStorage.clear();\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nclass LocalStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _perfix = 'cgp_';\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n localStorage.setItem(this.getKeyConvention(key), value);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.localStorageExists() || null === this.get(key)) {\r\n return false;\r\n }\r\n\r\n localStorage.removeItem(this.getKeyConvention(key));\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n key = this.getKeyConvention(key);\r\n\r\n return null === localStorage.getItem(key) && 'undefined' !== typeof defaultValue ? defaultValue : localStorage.getItem(key);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll() : any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.localStorageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(localStorage)\r\n .filter(key => this.isKeyConvention(key))\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Verify localStore is defined and can be used in here :)\r\n *\r\n *\r\n * @returns {boolean} makes sure that localStorage exists and we are allowed to use it.\r\n * @public\r\n */\r\n localStorageExists() {\r\n try {\r\n return 'localStorage' in window && null !== window.localStorage;\r\n } catch (error) {\r\n logger.error(['localStorage not found, features related to store will be disabled for this session.']);\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clearLocalStorage() {\r\n * // if the localStorage is defined in the global window.\r\n * return true;\r\n * };\r\n *\r\n * @public\r\n */\r\n clear() : void {\r\n if (!this.localStorageExists()) {\r\n return;\r\n }\r\n\r\n localStorage.clear();\r\n }\r\n\r\n\r\n /**\r\n * This function will check key start with cgp prefix.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * isKeyConvention('test') {\r\n * return false;\r\n * };\r\n *\r\n * getKeyConvention('cgp_test') {\r\n * return true;\r\n * };\r\n *\r\n *\r\n * @param {string} key - that needs to be verified for convention.\r\n * @returns {boolean} if they key is valid.\r\n * @public\r\n */\r\n isKeyConvention(key: string) {\r\n let stringUtil = new Strings(key);\r\n if (stringUtil.startsWith(this._perfix)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n /**\r\n * Get string convention for localStorage key.\r\n * Extend the input key with the static prefix we define.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * getKeyConvention('test') {\r\n * return cgp_test\r\n * };\r\n *\r\n * @param {string} key - that needs to be converted to our convention.\r\n * @returns {string} of the key to be stored. With naming convention set.\r\n * @public\r\n */\r\n getKeyConvention(key: string) {\r\n if (!key) {\r\n return '';\r\n }\r\n\r\n // remove unwanted white spaces.\r\n let keyConvention = key.trim();\r\n let stringUtil = new Strings(keyConvention);\r\n if (!stringUtil.startsWith(this._perfix)) {\r\n return this._perfix + keyConvention;\r\n }\r\n\r\n return keyConvention;\r\n }\r\n}\r\n\r\nclass WindowStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _storgeKeyName = 'cgpStorage';\r\n\r\n\r\n /**\r\n * @property\r\n * @type {null|object}\r\n * @private\r\n */\r\n private _cgpStorage: {[key: string]: any} = null;\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initializing the CGP window local storage.\r\n */\r\n init() {\r\n // Define CGP storage on the global window.\r\n this._cgpStorage = (window as any)[this._storgeKeyName] = {};\r\n\r\n logger.debug('Defined a new window cgp local storage.');\r\n logger.debug('Finish initializing window storage.');\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.storageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n this._cgpStorage[key] = value;\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.storageExists() || _.isUndefined(this.get(key))) {\r\n return false;\r\n }\r\n\r\n delete this._cgpStorage[key];\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.storageExists()) {\r\n return defaultValue;\r\n }\r\n\r\n const defaultGetter = _.isUndefined(defaultValue) ? undefined : defaultValue;\r\n return this._cgpStorage[key] || defaultGetter;\r\n }\r\n\r\n\r\n /**\r\n * Check if window cgp stroage is exist.\r\n *\r\n * @returns {boolean}\r\n */\r\n storageExists(): boolean {\r\n return !_.isNull(this._cgpStorage);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll(): any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.storageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(this._cgpStorage)\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clear() {\r\n * };\r\n *\r\n * @returns {boolean} stating the clear was successfully or not.\r\n * @public\r\n */\r\n clear() : void {\r\n (window as any)[this._storgeKeyName] = {};\r\n }\r\n}\r\n\r\n\r\nexport default new CGPStorage();\r\n","interface ICurlyBracesBinding {\r\n to: string,\r\n value: string,\r\n fn: string\r\n}\r\n\r\n/**\r\n * Basic String\r\n *\r\n * Enables chaning events, output must be called, else will return a chain\r\n *\r\n *\r\n */\r\nexport default class Strings {\r\n\r\n\r\n private _curlyBracesPattern = /{([^}]+)}/g;\r\n\r\n\r\n /**\r\n * Initialized the object with the source string to work with.\r\n */\r\n constructor(str: string) {\r\n this._string = str || '';\r\n }\r\n\r\n _string: string;\r\n\r\n\r\n\r\n /**\r\n * Make a string's first character uppercase\r\n * @see: http://php.net/manual/en/function.ucfirst.php\r\n */\r\n ucFirst() : string {\r\n return this._string.charAt(0).toUpperCase() + this._string.slice(1);\r\n }\r\n\r\n getCurlyBracesBinding(): Array {\r\n let found: Array = []; // an array to collect the strings that are found\r\n\r\n let currentMatch = this._curlyBracesPattern.exec(this._string);\r\n while (currentMatch) {\r\n found.push(this._getBindingMethod(currentMatch[1]));\r\n currentMatch = this._curlyBracesPattern.exec(this._string)\r\n }\r\n\r\n return found;\r\n }\r\n\r\n private _getBindingMethod(bindExpression: string) : ICurlyBracesBinding {\r\n let bindMap = {\r\n to: bindExpression,\r\n value: '',\r\n fn: ''\r\n };\r\n\r\n let bindRelatedMethod = bindExpression.split('|');\r\n if (2 === bindRelatedMethod.length) {\r\n bindMap.value = bindRelatedMethod[0].trim();\r\n bindMap.fn = bindRelatedMethod[1].trim();\r\n }\r\n\r\n return bindMap;\r\n }\r\n\r\n\r\n /**\r\n * @description - Insert char at a specific position in the string.\r\n */\r\n insertAt(index: number, stringToInjectT: string, stringToInject: string) {\r\n return stringToInjectT.substr(0, index) + stringToInject + stringToInjectT.substr(index);\r\n }\r\n\r\n /**\r\n *\r\n * @returns {string}\r\n */\r\n stripslashes(): string {\r\n return (this._string + '')\r\n .replace(/\\\\(.?)/g, function (s, n1) {\r\n switch (n1) {\r\n case '\\\\':\r\n return '\\\\'\r\n case '0':\r\n return '\\u0000'\r\n case '':\r\n return ''\r\n default:\r\n return n1\r\n }\r\n });\r\n }\r\n replaceAll(from: string, to: string)\r\n {\r\n return this._string.replace(new RegExp(to, 'g'), from);\r\n }\r\n\r\n getString() :string {\r\n return this._string;\r\n }\r\n\r\n setString(str): void {\r\n this._string = str;\r\n }\r\n\r\n /**\r\n * @description - Determines if a value is a empty string.\r\n */\r\n isEmpty(): boolean {\r\n return this._string.length === 0 || !this._string.trim();\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param partialString\r\n */\r\n startsWith(partialString) {\r\n if (!String.prototype.startsWith) {\r\n // eslint-disable-next-line\r\n String.prototype.startsWith = function (searchString, position) {\r\n position = position || 0;\r\n return this.substr(position, searchString.length) === searchString;\r\n };\r\n }\r\n\r\n return this._string.startsWith(partialString);\r\n }\r\n\r\n injectIntoCurly(bindingParams: object): string {\r\n if (bindingParams === undefined || bindingParams === null) {\r\n return this._string;\r\n }\r\n Object\r\n .keys(bindingParams)\r\n .forEach((bindTo) => {\r\n let tokens = this._string.split('{' + bindTo + '}');\r\n this._string = tokens.join(bindingParams[bindTo]);\r\n });\r\n\r\n return this._string;\r\n }\r\n}\r\n","import DOM from './dom';\r\nimport assign from 'assign-deep';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n\r\nclass Underscore {\r\n isArguments(input) : boolean {\r\n return '[object Arguments]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isFunction(input) : boolean {\r\n return '[object Function]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isString(input) : boolean {\r\n return '[object String]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isNumber(input) : boolean {\r\n return '[object Number]' === Object.prototype.toString.call(input) && !isNaN(input);\r\n }\r\n\r\n isObject(input) : boolean {\r\n return '[object Object]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isDate(input) : boolean {\r\n return '[object Date]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isArray(expectedArray) : boolean {\r\n return Array.isArray(expectedArray);\r\n }\r\n\r\n isBoolean(input) : boolean {\r\n return true === input || false === input || '[object Boolean]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isError(input) : boolean {\r\n return '[object Error]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isSymbol(input) : boolean {\r\n return '[object Symbol]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isUndefined(input) : boolean {\r\n return '[object Undefined]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLDivElement(input) : boolean {\r\n return '[object HTMLDivElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLImgElement(input) : boolean {\r\n return '[object HTMLImageElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isNull(value) : boolean {\r\n return 'null' === value || value === null;\r\n }\r\n\r\n isNullOrUndefined(input) : boolean {\r\n return this.isNull(input) || this.isUndefined(input);\r\n }\r\n\r\n\tpropertyChainExists(obj: any, propChain: string) : boolean {\r\n let properties = propChain.split('.');\r\n while (properties.length > 0) {\r\n obj = obj[properties.shift()];\r\n if (this.isUndefined(obj)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n isEmpty(input) : boolean {\r\n\r\n return this.isNullOrUndefined(input) || 0 === input.length || (input.constructor === Object && Object.keys(input).length === 0);\r\n }\r\n\r\n\r\n safeStringToNumber(str: string, defaultValue?: number) : number {\r\n\r\n if(this.isNullOrUndefined(str)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`str parameter is null or undefined and no default value provided`);\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n let result = Number(str);\r\n\r\n if (Number.isNaN(result)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`${str} is not a number and no default value provided`);\r\n }\r\n return defaultValue;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n\r\n isNodeList(expectedNodeList: any) : boolean {\r\n var stringRepr = Object.prototype.toString.call(expectedNodeList);\r\n\r\n return typeof expectedNodeList === 'object' &&\r\n /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) &&\r\n (typeof expectedNodeList.length === 'number') &&\r\n (expectedNodeList.length === 0 || (typeof expectedNodeList[0] === \"object\" && expectedNodeList[0].nodeType > 0));\r\n }\r\n\r\n\r\n isElement(expectedElement: any) : boolean {\r\n return expectedElement instanceof HTMLElement;\r\n }\r\n\r\n /**\r\n * Check if string includes another substring\r\n *\r\n */\r\n includes(str: string, substr: string) : boolean{\r\n return str.indexOf(substr) !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Load async js script code.\r\n *\r\n */\r\n loadAsyncScript(src: string, id: string = 'cgp-dynamic-script-' + Date.now(), type: string = 'text/javascript') : Promise {\r\n return new Promise((resolve, reject) => {\r\n var s;\r\n s = document.createElement('script');\r\n s.src = src;\r\n s.id = id;\r\n s.type = type;\r\n s.onload = resolve;\r\n s.onerror = reject;\r\n document.body.appendChild(s);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Generate GUID\r\n */\r\n getGuid(): string {\r\n return uuidv4();\r\n }\r\n\r\n isGuid(testedValue: string): boolean {\r\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(testedValue);\r\n }\r\n\r\n /**\r\n * Make id.\r\n *\r\n */\r\n makeid() : string {\r\n var text = \"\";\r\n var possible = \"abcdefghijklmnopqrstuvwxyz\";\r\n\r\n for (var i = 0; i < 10; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * return if the link is absolute\r\n * @param link\r\n * @returns {boolean}\r\n */\r\n isAbsoluteLink(link) {\r\n let regex = /^https?:\\/\\//i;\r\n return regex.test(link);\r\n }\r\n\r\n /**\r\n * Get hostname.\r\n *\r\n */\r\n getHostName(url: string) : string {\r\n const match = url.match(/(https?:\\/\\/[^/?#]+)/i);\r\n if (match != null && match.length === 2 && typeof match[1] === 'string' && match[1].length > 0) {\r\n return match[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Determinate if the given URL is valid(support also mailto url)\r\n *\r\n */\r\n isValidUrl(url: any): boolean {\r\n if (!this.isString(url))\r\n return false;\r\n var rg = /(^(((https?):\\/\\/)|(\\/))[^\\s]+$)|((^(mailto:))[^\\s]+@[^\\s]+$)/;\r\n return rg.test(url);\r\n }\r\n\r\n isAbsolutUrl(url: string): boolean {\r\n try {\r\n new URL(url);\r\n }catch (err) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * toggle option, kicks into and out of fullscreen mode.\r\n */\r\n toggleFullScreen(): void {\r\n if (this.isFullScreen()) {\r\n this.closeFullScreen();\r\n } else {\r\n this.openFullScreen();\r\n }\r\n }\r\n\r\n openFullScreen(): void {\r\n if (document.documentElement['requestFullScreen']) {\r\n document.documentElement['requestFullScreen']();\r\n } else if (document.documentElement['mozRequestFullScreen']) {\r\n document.documentElement['mozRequestFullScreen']();\r\n } else if (document.documentElement['webkitRequestFullScreen']) {\r\n document.documentElement['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']);\r\n } else if (document.documentElement['msRequestFullscreen']) {\r\n if (!DOM.hasClass(document.body, 'cgp-ie-fullscreen')) {\r\n DOM.addClass(document.body, 'cgp-ie-fullscreen');\r\n }\r\n document.documentElement['msRequestFullscreen']();\r\n }\r\n\r\n }\r\n\r\n closeFullScreen(): void {\r\n if (document['cancelFullScreen']) {\r\n document['cancelFullScreen']();\r\n } else if (document['mozCancelFullScreen']) {\r\n document['mozCancelFullScreen']();\r\n } else if (document['webkitCancelFullScreen']) {\r\n document['webkitCancelFullScreen']();\r\n } else if (document['msExitFullscreen']) {\r\n DOM.removeClass(document.body, 'cgp-ie-fullscreen');\r\n document['msExitFullscreen']();\r\n }\r\n }\r\n\r\n isFullScreen() : boolean {\r\n return !this.isNullOrUndefined(document['mozFullScreenElement'])\r\n || !this.isNullOrUndefined(document['webkitFullscreenElement'])\r\n || !this.isNullOrUndefined(document['webkitCurrentFullScreenElement'])\r\n || !this.isNullOrUndefined(document['msFullscreenElement'])\r\n || !this.isNullOrUndefined(document['fullscreenElement']);\r\n }\r\n\r\n\r\n /**\r\n * If the user is caps lock.\r\n */\r\n isCapslock(event: any) : boolean {\r\n event = (event) ? event : window.event;\r\n\r\n let charCode: number = null;\r\n if (event.which) {\r\n charCode = event.which;\r\n } else if (event.keyCode) {\r\n charCode = event.keyCode;\r\n }\r\n\r\n let shiftOn = false;\r\n if (event.shiftKey) {\r\n shiftOn = event.shiftKey;\r\n } else if (event.modifiers) {\r\n shiftOn = !!(event.modifiers & 4);\r\n }\r\n\r\n if (charCode >= 97 && charCode <= 122 && shiftOn) {\r\n return true;\r\n }\r\n\r\n if (charCode >= 65 && charCode <= 90 && !shiftOn) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Merge/Extend Object\r\n *\r\n */\r\n mergeDeep(target: any, ...source) : any {\r\n source.forEach(curr => {\r\n assign(target, curr);\r\n });\r\n\r\n return target;\r\n }\r\n\r\n _createXmlDoc(xmlStr: string) {\r\n const xmlDoc = new (window as any).ActiveXObject(\"Microsoft.XMLDOM\");\r\n xmlDoc.async = \"false\";\r\n xmlDoc.loadXML(xmlStr);\r\n return xmlDoc;\r\n }\r\n\r\n parseXml(xmlStr: string)\r\n {\r\n try {\r\n if ((window as any).DOMParser) {\r\n return new DOMParser().parseFromString(xmlStr, \"text/xml\");\r\n } else if ((window as any).ActiveXObject) {\r\n return this._createXmlDoc(xmlStr);\r\n } else {\r\n return null;\r\n }\r\n }\r\n catch(err) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n *\r\n */\r\n getQueryParameters() : any {\r\n let pairs = window.location.search.slice(1).split('&');\r\n let result = {};\r\n\r\n pairs.forEach(pair => {\r\n try {\r\n let pairMatch = pair.match(/([^?=]+)=(([^&]*))/).slice(1);\r\n result[pairMatch[0]] = decodeURIComponent(pairMatch[1] || '');\r\n } catch(e) {\r\n //failed to parse QS\r\n }\r\n });\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n jsonToQueryString(json: any): string {\r\n return this.isEmpty(json) ? '' : '?' +\r\n Object.keys(json).map(function(key) {\r\n return encodeURIComponent(key) + '=' +\r\n encodeURIComponent(json[key]);\r\n }).join('&');\r\n }\r\n\r\n\r\n /**\r\n * Add stop scrolling class to body.\r\n *\r\n */\r\n stopScrolling() {\r\n DOM.addClass(DOM.getBody(), 'stop-scrolling');\r\n }\r\n\r\n\r\n /**\r\n * Safe way to parse json stringfy.\r\n *\r\n * @param toParse - The string we want to parse to json.\r\n * @param defaultInException - The default value to return when exception thrown.\r\n * @returns {undefined}\r\n */\r\n safeJSON(toParse: string, defaultInException?: any) : any {\r\n try {\r\n return JSON.parse(toParse);\r\n } catch (ex) {\r\n return defaultInException || ex;\r\n }\r\n }\r\n\r\n safeJSONandDecode(input: string): object{\r\n try {\r\n const json = decodeURIComponent(input);\r\n return JSON.parse(json);\r\n } catch(e) {\r\n }\r\n return {};\r\n }\r\n\r\n getJSONVal(json: object, key: string): any {\r\n\r\n let val;\r\n try {\r\n val = json[key];\r\n } catch (e) {\r\n }\r\n return (undefined !== val) ? val : '';\r\n }\r\n\r\n\r\n dasherize(str: string): string {\r\n return (str[0].toLowerCase() + str.slice(1)).trim().replace(/[_\\s]+/g, '-').replace(/([A-Z])/g, '-$1').replace(/-+/g, '-').toLowerCase();\r\n }\r\n\r\n\r\n /**\r\n * Parse string function.\r\n */\r\n parseStringFunction(strFunction: string) : {rawStringFunction: string, functionName: string, functionStringParams:string, functionArrayParams: Array} {\r\n const START = 0;\r\n\r\n let startFunctionParams = strFunction.indexOf('('),\r\n endFunctionParams = strFunction.indexOf(')');\r\n\r\n let strFunctionName = strFunction.substring(START, startFunctionParams),\r\n strFunctionParams = strFunction.substring(startFunctionParams + 1, endFunctionParams),\r\n arrayFunctionParams = strFunctionParams.replace(/\\s+/g, '').split(',');\r\n\r\n return {\r\n rawStringFunction: strFunction,\r\n functionName: strFunctionName,\r\n functionStringParams: strFunctionParams,\r\n functionArrayParams: arrayFunctionParams\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Returns the object without nullable or undefined parameters\r\n */\r\n cleanObject(obj: any, options: any) : any {\r\n options = Object.assign({removeUndefined: true, removeNull: false}, options);\r\n var cleanObject = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if ((undefined === value && true === options.removeUndefined) || (null === value && true === options.removeNull)) {\r\n return;\r\n } else {\r\n cleanObject[key] = value;\r\n }\r\n });\r\n return cleanObject;\r\n }\r\n\r\n\r\n /**\r\n * Generic convert to boolean\r\n */\r\n toBoolean(value) {\r\n if (this.isString(value) && (value === 'false' || value === 'true')) {\r\n return value === 'true';\r\n }\r\n return Boolean(value);\r\n }\r\n\r\n\r\n /**\r\n * Scroll with smooth animation\r\n * @param direction\r\n * @param scrollSize\r\n * @param container\r\n * @param duration\r\n * @param smooothLevel\r\n * @private\r\n */\r\n smoothScrolling(direction: string, scrollSize: number, duration: number, container: HTMLElement, smoothLevel: number = 20): Promise {\r\n return new Promise((res) => {\r\n let stepInterval = Math.ceil(duration / smoothLevel); // 1000 / 20 = 50\r\n let restSize = scrollSize;\r\n let scrollStepSize = Math.ceil(scrollSize / smoothLevel); // 100 / 50 = 2 (0.5 rest)\r\n\r\n let scrollStepFn = () => {\r\n scrollSize = restSize > scrollStepSize ? scrollStepSize : restSize;\r\n switch (direction) {\r\n case 'left':\r\n container.scrollLeft -= scrollSize;\r\n break;\r\n case 'right':\r\n container.scrollLeft += scrollSize;\r\n break;\r\n case 'up':\r\n container.scrollTop -= scrollSize;\r\n break;\r\n case 'down':\r\n container.scrollTop += scrollSize;\r\n break;\r\n }\r\n restSize -= scrollSize;\r\n if (0 < restSize) {\r\n DOM.setTimeout(scrollStepFn, stepInterval, null);\r\n } else {\r\n res();\r\n }\r\n };\r\n scrollStepFn();\r\n // DOM.setTimeout(scrollStepFn, stepInterval);\r\n });\r\n\r\n }\r\n\r\n toLowerCaseKeys(obj: object): object {\r\n return Object.keys(obj).reduce((accum, key) => {\r\n accum[key.toLowerCase()] = obj[key];\r\n return accum;\r\n }, {});\r\n }\r\n\r\n removeEmptyPropertiesfromObject(obj) {\r\n if(typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n\r\n Object.keys(obj).forEach((prop)=> {\r\n if(this.isNullOrUndefined(obj[prop])) {\r\n delete obj[prop];\r\n }\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * @description Remove the localhost\r\n */\r\n removeLocalhost(url){\r\n try {\r\n return url.replace(/^[a-z]{4,5}:\\/{2}[a-z]{1,}:[0-9]{1,4}.(.*)/, '$1');\r\n }catch (e) {\r\n return url;\r\n }\r\n }\r\n\r\n capitalizeFirstLetter(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n\r\n\r\n lowerFirstLetter(str: string): string {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n }\r\n\r\n\r\n arraysAreEqual(arr1: any[], arr2: any[], areItemsEqual?: (item1: any, item2: any) => boolean): boolean {\r\n arr1 = arr1 || [];\r\n arr2 = arr2 || [];\r\n\r\n if(arr1.length !== arr2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < arr1.length; i++) {\r\n if(this.isNullOrUndefined(areItemsEqual)) {\r\n if(arr1[i] !== arr2[i]) {\r\n return false;\r\n }\r\n } else {\r\n if(!areItemsEqual(arr1[i], arr2[i])) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * should return the number as bytes notation.\r\n * for example:\r\n * formatNumberToBytesNotation(1000, 0) will return 1K\r\n * formatNumberToBytesNotation(3000000, 0) will return 3M\r\n * formatNumberToBytesNotation(1500, 1) will return 1.5K\r\n * @param num\r\n * @param digits\r\n */\r\n formatNumberToBytesNotation(num: number, digits: number) {\r\n const formatMap = [\r\n { value: 1, symbol: \"\" },\r\n { value: 1E3, symbol: \"K\" },\r\n { value: 1E6, symbol: \"M\" },\r\n { value: 1E9, symbol: \"G\" },\r\n { value: 1E12, symbol: \"T\" },\r\n { value: 1E15, symbol: \"P\" },\r\n { value: 1E18, symbol: \"E\" }\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n let index;\r\n for (index = formatMap.length - 1; index > 0; index--) {\r\n if (num >= formatMap[index].value) {\r\n break;\r\n }\r\n }\r\n return (num / formatMap[index].value).toFixed(digits).replace(rx, \"$1\") + formatMap[index].symbol;\r\n }\r\n\r\n once(fn, context = this) {\r\n let result;\r\n return function() {\r\n if (fn) {\r\n result = fn.apply(context || this, arguments);\r\n fn = null;\r\n }\r\n return result;\r\n };\r\n }\r\n}\r\n\r\nexport default new Underscore();","\r\nexport function splitArrayToChunks(originalArray: T[], chunkSize: number): Array {\r\n\r\n if(!originalArray || originalArray.length === 0) {\r\n return [];\r\n }\r\n\r\n let result: Array = [];\r\n for(let i = 0; i * chunkSize < originalArray.length; i++) {\r\n result.push(originalArray.slice(i * chunkSize, i * chunkSize + chunkSize));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function arraysEqual(arr1: T[], arr2: T[]) {\r\n if (arr1 === arr2) return true;\r\n if (arr1 == null || arr2 == null) return false;\r\n if (arr1.length !== arr2.length) return false;\r\n\r\n for (let i = 0; i < arr1.length; ++i) {\r\n if (arr1[i] !== arr2[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Shuffle an array using the Fisher-Yates unbiased algorithm\r\n * Read more about the algorithm here: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\r\n * The implementation is taken from here: https://bost.ocks.org/mike/shuffle/\r\n * and updated a bit for typescript\r\n */\r\nexport function shuffle(array: unknown[]) {\r\n let m = array.length, t: unknown;\r\n\r\n // While there remain elements to shuffle…\r\n while (m) {\r\n\r\n // Pick a remaining element…\r\n let i = Math.floor(Math.random() * m--);\r\n\r\n // And swap it with the current element.\r\n t = array[m];\r\n array[m] = array[i];\r\n array[i] = t;\r\n }\r\n\r\n return array;\r\n}\r\n","import {Check, TimeSpan} from '@sparkware/app-utils';\r\nimport {ApplicationStartupConfigurations} from '../app-react/app-bootstrap/config-interfaces/application-startup.configurations';\r\nimport {TimeIntervalName} from '../common/utils/time-interval-names';\r\n\r\nexport const CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME = 'CypressToOrbitHooks';\r\nexport const CYPRESS_GLOBAL_OBJECT_NAME = 'Cypress';\r\n\r\nexport function isInsideAutomation(): boolean {\r\n return !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME])\r\n && !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME])\r\n}\r\n\r\n\r\nexport function mockApplicationStartupConfigs(configs: ApplicationStartupConfigurations): ApplicationStartupConfigurations {\r\n if(isInsideAutomation()) {\r\n getCypressToOrbitHooks().onAppStartupConfigs(configs);\r\n }\r\n return configs;\r\n}\r\n\r\nexport function getCypressToOrbitHooks(): ICypressToOrbitHooks {\r\n if(!isInsideAutomation()) {\r\n throw new Error('You can only call getCypressToOrbitHooks inside automation');\r\n }\r\n return window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME] as ICypressToOrbitHooks;\r\n}\r\n\r\nexport interface OnTimeIntervalCreationResult {\r\n ignoreJavaScriptImplementation: boolean;\r\n timerId?: number;\r\n}\r\n\r\nexport enum NamedIntervalType {\r\n setInterval,\r\n setTimeout\r\n}\r\n\r\nexport interface ICypressToOrbitHooks {\r\n onAppStartupConfigs(configs: ApplicationStartupConfigurations);\r\n onTimeIntervalCreation(name: TimeIntervalName, callback: () => void, interval: TimeSpan, intervalType: NamedIntervalType): OnTimeIntervalCreationResult;\r\n}\r\n\r\n","import {Check} from '@sparkware/app-utils';\r\nimport {ILazy} from \"./lazy.interface\";\r\n\r\nexport class Lazy implements ILazy {\r\n constructor(private _valueFactory: () => T) {\r\n }\r\n\r\n readonly isLazy = true;\r\n\r\n private _value = undefined;\r\n private _initializing = false;\r\n private _initValue() {\r\n if (this._initializing) {\r\n throw new Error('Lazy circular dependency detected: ' + this._valueFactory)\r\n }\r\n if (Check.isUndefined(this._value)) {\r\n this._initializing = true;\r\n try {\r\n this._value = this._valueFactory();\r\n }\r\n finally {\r\n this._initializing = false;\r\n }\r\n\r\n }\r\n }\r\n\r\n get value(): T {\r\n this._initValue();\r\n\r\n return this._value;\r\n }\r\n\r\n forceInit() {\r\n this._initValue();\r\n }\r\n\r\n tryGetResolvedValue(): any | Promise {\r\n return this.value;\r\n }\r\n\r\n}\r\n","export function matchAllWords(text: string, words: RegExp[]): boolean {\r\n for(let index = 0; index < words.length; index++) {\r\n if(!text.match(words[index])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function removeSpaces(str) {\r\n return str.replace(/\\s/g, '');\r\n}\r\n\r\nexport function removeSpecialCharacters(str: string): string {\r\n return str.replace(/[^a-zA-Z0-9 ]/g, \"\");\r\n}\r\n\r\n/**\r\n * Given a string extracts all the words from it and converts them in case insensitive regular expressions\r\n * @param {string} text\r\n * @return {RegExp[]}\r\n */\r\nexport function extractWordsRegularExpressions(text: string): RegExp[] {\r\n if(!text) {\r\n return [];\r\n }\r\n\r\n return text.split(' ')\r\n .map(word => word.trim())\r\n .filter(word => word)\r\n .map(word => new RegExp(word, 'gi'));\r\n}\r\n\r\nexport function convertStringArrayToString(messages: string[], joinCharacters: string): string {\r\n return messages.join(joinCharacters);\r\n\r\n}\r\n\r\nexport function parseCommaSeparatedNumbers(values: string): number[] {\r\n return values.split(',')\r\n .map(n => n.trim())\r\n .filter(n => n !== '')\r\n .map(n => parseInt(n))\r\n}"],"names":["OrbitComponentWithState","_reactions","this","props","services","context","_disposeReactions","expression","effect","opts","disposer","mobxReaction","push","forEach","React","contextType","OrbitContext","OrbitComponent","IMAGE_TYPE","IMAGE_STATUS","EMPTY_IMAGE","Image","_imgRef","createRef","_fetchPriority","fetchpriority","fetchPriority","_onLoad","e","state","status","LAZY","LOADING","setState","SETTLED","type","SRC","onLoad","onSettled","value","_onError","FALLBACK","src","EMPTY_IMAGE_BASE64","fallbackSrc","onError","_tapHandlerLogic","_intersectionObserver","_intersectionObserverCallback","entries","observer","intersectionRatio","isIntersecting","_destroyIntersectionObserver","onLoadStart","current","_createIntersectionObserver","_getInitialSrcState","_createTapLogicHandler","lazy","_destroyTapLogicHandler","prevProps","element","enableTap","TapHandlerLogic","dispose","IntersectionObserver","rootMargin","threshold","observe","disconnect","alt","className","title","width","height","style","ref","onClick","_element","_onMouseDownHandler","classList","add","ORBIT_TAP","_onMouseUpHandler","remove","addEventListener","removeEventListener","TapHandler","children","enabled","elementRef","OrbitContextProvider","Provider","Consumer","DomService","observable","initialBodyPaddingRight","bodyPaddingRightAltered","_eventListenerRegistration","_onFullScreenChange","runInAction","isInFullScreen","_","makeObservable","EventListenerRegistration","document","DOM","window","innerWidth","body","clientWidth","scrollbarThickness","bodyComputedStyles","getComputedStyle","paddingRight","selector","querySelector","head","documentElement","location","pathname","getElementsByClassName","tagName","getElementsByTagName","id","getElementById","createElement","url","options","urlBuilder","URL","urlParams","searchParams","paramValue","paramName","search","hash","submitForm","method","href","extraParams","params","form","setAttribute","Check","target","hiddenField","key","appendChild","submit","setTimeout","removeChild","FallbackRoute","render","_routeDefinition","paths","routeParams","RouteBase","_routeParams","_isOrbitRoute","data","tryMatchPath","pathToMatch","routes","i","length","routeDefinition","j","pattern","match","matchPath","path","caseSensitive","end","exact","toLowerCase","SplashService","onAfterRemoveSplash","splashTime","_splashRemovedSubscribers","startTime","parseFloat","performance","now","toFixed","splashPageElement","computeSplashTimeInSeconds","callback","_enablePrerender","console","error","timeoutValue","isInsideAutomation","namedTimer","name","handler","interval","intervalType","javascriptFunction","Error","TimeSpan","timeSpan","convertToTimeSpan","response","getCypressToOrbitHooks","onTimeIntervalCreation","ignoreJavaScriptImplementation","timerId","totalMilliseconds","namedSetInterval","NamedIntervalType","setInterval","namedSetTimeout","DeviceFeatureDetection","DocumentTouch","undefined","navigator","maxTouchPoints","DeviceOSDetection","parser","os","getOS","replace","parseInt","version","split","indexOf","isMobileOS","isIOS","isAndroid","DeviceViewportDetection","innerHeight","screen","ratio","systemXDPI","logicalXDPI","devicePixelRatio","matchMedia","matches","DeviceModelDetection","device","getDevice","vendor","model","DeviceBrowserDetection","browser","getBrowser","allowAttrValue","getAllowAttr","NATIVE_TYPE","DeviceHybridDetection","logger","_hybrid","_inCasino","_inPoker","_inSport","_embedded","Logger","constructor","CLASS","buildHybridInfo","genericHybridEmbedded","inPokerHybrid","build_isInPokerHybrid","casinoHybrid","build_isCasinoHybrid","inSportHybrid","build_isInSportHybrid","dataSanityCheck","inPoker","isNativeIOS","isNativeAndroid","NativeInterface","Store","storedClientVersion","startsWith","storedSourceProductPackage","toString","webkit","messageHandlers","_uaParser","UAParser","feature","viewport","hybrid","getUA","uuidv4","media","standalone","isHybrid","isStandalone","getContext","isProbablyIOSDevice","cookieEnabled","isMacOS","isTouch","isIpad","isIphone","isMobile","screenWidth","screenHeight","getIphoneVersion","isTablet","b","m","bd","bmt","Date","t","count","tt","Math","max","apply","_createLogger","append","getBody","query","el","isTag","tag","substring","isId","substr","querySelectorAll","slice","call","content","newStyle","innerHTML","html","domElement","_class","addClass","parentNode","insertBefore","firstChild","toggle","contains","attribute","removeProperty","getCurrentStyle","horizontMargin","marginLeft","marginRight","verticalMargin","marginBottom","marginTop","offsetWidth","offsetHeight","horizontPadding","paddingLeft","verticalPadding","paddingBottom","paddingTop","horizontBorder","borderLeftWidth","borderRightWidth","verticalBorder","borderBottomWidth","borderTopWidth","fullWidth","fullHeight","size","unit","removeClass","attr","removeAttribute","str","g","toUpperCase","attributes","test","camelCaseName","$0","$1","textContent","msgElement","msgType","msgCallback","useCapture","eventName","timeout","handle","clearInterval","clearTimeout","_logger","logLevel","_getQueryParameters","setLevel","SET_LOG_LEVEL","log","_log","severity","_isConsoleEnabled","map","n","bind","CGPLogger","CGPStorage","_selectedStorage","init","isLocalStorageNameSupported","debug","LocalStorage","WindowStorage","setFullYear","getFullYear","cookie","toUTCString","RegExp","testKey","storage","localStorage","setItem","removeItem","set","delKey","delArray","del","keys","result","defaultValue","get","clear","_perfix","localStorageExists","getKeyConvention","getItem","Object","filter","isKeyConvention","Strings","keyConvention","trim","_storgeKeyName","_cgpStorage","storageExists","defaultGetter","_curlyBracesPattern","_string","charAt","found","currentMatch","exec","_getBindingMethod","bindExpression","bindMap","to","fn","bindRelatedMethod","index","stringToInjectT","stringToInject","s","n1","from","partialString","String","prototype","searchString","position","bindingParams","bindTo","tokens","join","Underscore","input","isNaN","expectedArray","Array","isArray","isNull","isUndefined","obj","propChain","properties","shift","isNullOrUndefined","Number","expectedNodeList","stringRepr","nodeType","expectedElement","HTMLElement","Promise","resolve","reject","onload","onerror","testedValue","text","possible","floor","random","link","isString","err","isFullScreen","closeFullScreen","openFullScreen","Element","event","charCode","which","keyCode","shiftOn","shiftKey","modifiers","source","curr","assign","xmlStr","xmlDoc","ActiveXObject","async","loadXML","DOMParser","parseFromString","_createXmlDoc","pairs","pair","pairMatch","decodeURIComponent","JSON","parse","stringify","json","isEmpty","encodeURIComponent","toParse","defaultInException","ex","val","strFunction","startFunctionParams","endFunctionParams","strFunctionName","strFunctionParams","arrayFunctionParams","rawStringFunction","functionName","functionStringParams","functionArrayParams","removeUndefined","removeNull","cleanObject","Boolean","direction","scrollSize","duration","container","smoothLevel","res","stepInterval","ceil","restSize","scrollStepSize","scrollStepFn","scrollLeft","scrollTop","reduce","accum","prop","arr1","arr2","areItemsEqual","num","digits","formatMap","symbol","arguments","splitArrayToChunks","originalArray","chunkSize","arraysEqual","shuffle","array","CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME","CYPRESS_GLOBAL_OBJECT_NAME","mockApplicationStartupConfigs","configs","onAppStartupConfigs","Lazy","_valueFactory","isLazy","_value","_initializing","_initValue","matchAllWords","words","removeSpaces","removeSpecialCharacters","extractWordsRegularExpressions","word","parseCommaSeparatedNumbers","values"],"sourceRoot":""}