{"version":3,"file":"flybits.mjs","sources":["flybits.mjs"],"sourcesContent":["/**\r\n * ES6 Promise object.\r\n * @external Promise\r\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise|Promise API}\r\n * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects|Promise spec}\r\n */\r\n\r\n/**\r\n * ISO 8601 date format.\r\n * @external ISO 8601\r\n * @see {@link https://en.wikipedia.org/wiki/ISO_8601| ISO 8601 spec}\r\n */\r\n\r\n/**\r\n * This is the root namespace for the Flybits SDK.  If included in a browser environment it will be accessible from the `window` object.\r\n * @namespace\r\n */\r\nvar Flybits = {\r\n  /**\r\n   * Promise that resolves when the SDK has completed initialization.\r\n   * @memberof Flybits\r\n   * @member {external:Promise}\r\n   */\r\n  ready: null,\r\n  /**\r\n   * SDK state related utilities.\r\n   * @namespace\r\n   */\r\n  store: {\r\n    Property: {},\r\n    Record: {},\r\n    _storageEngines: {}\r\n  },\r\n  /**\r\n   * Reporting manager to facilitate the reporting of application events.\r\n   * @namespace\r\n   * @memberof Flybits\r\n   */\r\n  analytics: {},\r\n  /**\r\n   * Utility classes and reporting manager for collecting and reporting context about a user.\r\n   * @namespace\r\n   * @memberof Flybits\r\n   */\r\n  context: {},\r\n  /**\r\n   * Flybits API wrappers for core models\r\n   * @namespace\r\n   */\r\n  api: {\r\n    /**\r\n     * Object that represents the paging status of a API query.\r\n     * @typedef Paging\r\n     * @memberof Flybits.api\r\n     * @type Object\r\n     * @property {number} offset Offset from first element of first page.\r\n     * @property {number} limit Number of results per page.\r\n     * @property {number} total Total number of objects that is available to page over.\r\n     */\r\n    /**\r\n      * Result Object that is returned from a successful API query if the query is for multiple models.\r\n      * @typedef Result\r\n      * @memberof Flybits.api\r\n      * @type Object\r\n      * @property {BaseModel[]} result Resultant list of models from API request.\r\n      * @property {function} [nextPageFn] If the resultant list of models is only a subset of total records, that is to say the paged result has additional pages, this function can be invoked to request the next page of results based on the initial query parameters.  If this is `undefined` there are no more pages to view.\r\n      * @property {Flybits.api.Paging} paging Paging details of request.\r\n      */\r\n  },\r\n  initFile: {},\r\n  /**\r\n   * Utilities for various aspects of the SDK\r\n   * @namespace\r\n   */\r\n  util: {},\r\n  /**\r\n   * Interfaces to ensure SDK model integrity.\r\n   * @namespace\r\n   */\r\n  interface: {},\r\n  /**\r\n   * Identity providers available for authentication.\r\n   * @namespace\r\n   */\r\n  idp: {},\r\n  /**\r\n   * Event bus primarily for subscribing to SDK events.\r\n   * @namespace\r\n   */\r\n  evt: {\r\n    /**\r\n     * Event payload for a {@link Flybits.evt.type.CTXREPORT | CTXREPORT} event.\r\n     * @typedef CtxReportEvent\r\n     * @memberof Flybits.evt\r\n     * @type Object\r\n     * @property {string} status \"success\" or \"failed\" status of Context Data report attempt.\r\n     * @property {Flybits.context.Manager.CtxReport[]} data Context Data objects that the attempt report was made for.\r\n     * @property {Flybits.Validation} [validation] Error objects should the report have failed.\r\n     */\r\n    /**\r\n     * @member {Object} type A mapping of SDK event types.\r\n     * @memberof Flybits.evt\r\n     * @constant\r\n     * @property {string} SESSIONSTART=sessionStart This event occurs whenever the SDK is connected to a Flybits tenant (initialized with a Flybits access token).\r\n     * @property {string} SESSIONEND=sessionEnd This event occurs whenever the SDK is disconnected from a Flybits tenant (flushed of its Flybits access token).\r\n     * @property {string} CTXREPORT=ctxreported This event occurs whenever the {@link Flybits.context.Manager | Context Manager} attempts to report locally batched Context Data. {@link Flybits.evt.CtxReportEvent | Event payload spec}.\r\n     */\r\n    type: {\r\n      SESSIONSTART: 'sessionStart',\r\n      SESSIONEND: 'sessionEnd',\r\n      CTXREPORT: 'ctxreported'\r\n    },\r\n    handlerMap: {}\r\n  },\r\n};\r\n\r\n//defaults\r\nFlybits.cfg = {\r\n  HOST: 'http://api.flybits.com',\r\n  CTXREPORTDELAY: 60000,\r\n  analytics: {\r\n    REPORTDELAY: 3600000,\r\n    REPORTDELAYUNIT: 'milliseconds',\r\n    MAXSTORESIZE: 100\r\n  },\r\n  store: {\r\n    SDKPROPS: 'flb.sdk.properties',\r\n    RESOURCEPATH: './res',\r\n    DEVICEID: 'flb_device',\r\n    USERTOKEN: 'flb_usertoken',\r\n    USER: 'flb_user',\r\n    USERTOKENEXP: 'flb_usertoken_expiry',\r\n    PROJECTID: 'flb_projectid',\r\n    IDPTYPE: 'flb_idptype',\r\n    ANALYTICSLASTREPORTED: 'flb_analytics_lastreported',\r\n    ANALYTICSLASTREPORTATTEMPTED: 'flb_analytics_lastreportattempted',\r\n    CONTEXTLASTREPORTED: 'flb_context_lastreported',\r\n    CONTEXTLASTREPORTATTEMPTED: 'flb_context_lastreportattempted',\r\n  },\r\n  res: {\r\n    CONTEXT: '/context/ctxdata',\r\n    UNAUTHENTICATE: '/sso/auth/logout',\r\n    AUTHENTICATE: '/sso/auth/authenticate',\r\n    ANONYMOUSAUTH: '/sso/auth/anonymous',\r\n    OAUTH: '/sso/auth/oauth',\r\n    OIDC: '/sso/auth/oidc',\r\n    SIGNEDLOGIN: '/sso/auth/signedLogin',\r\n    JWTSIGNEDLOGIN: '/sso/auth/jwtlogin/sessions',\r\n    REFRESHAUTH: '/sso/auth/refreshToken',\r\n    AUTHUSER: '/sso/auth/me',\r\n    AUTHPROJECT: '/sso/auth/project',\r\n    REQRESETEMAIL: '/sso/auth/sendResetPasswordEmail',\r\n    REQCONFIRMEMAIL: '/sso/auth/sendConfirmEmail',\r\n    CONTENTS: '/kernel/content/instances',\r\n    RELEVANTCONTENTS: '/kernel/experiences/contents',\r\n    USERSETTINGS: '/kernel/userpref',\r\n    ZONESCONFIGURATION: '/kernel/experiences/tenantzoneconfigurations',\r\n    ZONESRELEVANTCONTENTS: '/kernel/experiences/zoneconfigurations/contents'\r\n  },\r\n};\r\n\r\n/**\r\n * @memberof Flybits\r\n * @member {string} VERSION SDK version string\r\n */\r\nFlybits.VERSION = '--flbversion';\r\n\r\n/**\r\n * Subscribes to SDK events.\r\n * @param {string} evtName The event key name to subscribe to. Supported events include: `sessionStart`,`sessionEnd`. Event names also support namespacing. For example, you can subscribe with an event key name `sessionStart.carousel`. All function handlers subscribed to `sessionStart` and `sessionStart.carousel` will receive callbacks upon the SDK session initialization. However this becomes useful when unsubscribing as it allows for unsubscription without providing the original `handler` function and without affecting other subscribers.\r\n * @param {function} handler Handler function to be invoked upon subscribed event occurrence.\r\n * @returns {Flybits.evt} Flybits.evt namespace allowing for chaining subscriptions and unsubscriptions.\r\n * ```\r\n * Flybits.evt.on('sessionStart', function(){\r\n *   // do stuff\r\n * }).on('sessionEnd', function(){\r\n *   // do stuff\r\n * })\r\n * ```\r\n * @throws {Flybits.Validation} {@link Flybits.Validation.type| MISSINGARG} When no `evtName` is provided.\r\n * @throws {Flybits.Validation} {@link Flybits.Validation.type| MISSINGARG} When no `handler` function is provided.\r\n * @throws {Flybits.Validation} {@link Flybits.Validation.type| INVALIDARG} When an `evtName` is provided that is not part of the internal supported {@link Flybits.evt.type|event types}\r\n */\r\nFlybits.evt.on = function(evtName, handler){\r\n  const availableEvtNames = Object.keys(Flybits.evt.type).map(function(evtKey){\r\n    return Flybits.evt.type[evtKey];\r\n  });\r\n  const mainEvtName = evtName ? evtName.split('.')[0]: null;\r\n\r\n  if(!mainEvtName){\r\n    throw new Flybits.Validation().addError('Missing argument','Must provide event name to subscribe to.',{\r\n      code: Flybits.Validation.type.MISSINGARG,\r\n      context: 'evtName'\r\n    });\r\n  } else if(availableEvtNames.indexOf(mainEvtName) < 0){\r\n    throw new Flybits.Validation().addError('Event name not supported','',{\r\n      code: Flybits.Validation.type.INVALIDARG,\r\n      context: mainEvtName\r\n    });\r\n  }\r\n\r\n  if(!handler){\r\n    throw new Flybits.Validation().addError('Missing argument', 'Must provide event handler function.',{\r\n      code: Flybits.Validation.type.MISSINGARG,\r\n      context: 'handler'\r\n    });\r\n  }\r\n\r\n  if(!Flybits.evt.handlerMap[evtName]){\r\n    Flybits.evt.handlerMap[evtName] = [];\r\n  }\r\n\r\n  if(Flybits.evt.handlerMap[evtName].indexOf(handler) < 0){\r\n    Flybits.evt.handlerMap[evtName].push(handler);\r\n  } else{\r\n    console.warn('> handler already registered', evtName, handler);\r\n  }\r\n  return Flybits.evt;\r\n}\r\n\r\n/**\r\n * Unsubscribes to SDK events.\r\n * @param {string} evtName The event key name to unsubscribe to. Supported events include: `sessionStart`,`sessionEnd`.  Event names support namespacing.  For example if you subscribed with a namespaced event key, `sessionStart.carousel`, then you can unsubscribe via `sessionStart.carousel` without affecting other subscribers to the `sessionStart` event.\r\n * @param {function} [handler] Handler function that was used for subscription.  If provided, the exact handler function will be unsubscribed to specified `evtName`. If *not provided*, **all handler functions** subscribed to the specified `evtName` will be removed.\r\n * <br>**Note**: if you unsubscribe via a namespaced event key for example, `sessionStart.carousel` without a specified `handler`, all registered handlers will be removed for said namespaced event key. However if you unsubscribe via an non-namespaced event key and without a `handler`, then all registered handlers for all namespaces under the event key will be removed.\r\n * <br> Examples:\r\n * ```\r\n * const callbackFn = function(){\r\n *   // do stuff\r\n * };\r\n * \r\n * // unsubscribes `callbackFn` from `sessionStart.carousel`\r\n * Flybits.evt.off('sessionStart.carousel', callbackFn);\r\n * // unsubscribes `callbackFn` from specifically `sessionStart`\r\n * Flybits.evt.off('sessionStart', callbackFn);\r\n * \r\n * // unsubscribes all handler functions from `sessionStart.carousel`\r\n * Flybits.evt.off('sessionStart.carousel');\r\n * // unsubscribes all handler functions from events that contain the key name\r\n * // `sessionStart` including all namespaces such as `sessionStart.carousel`.\r\n * Flybits.evt.off('sessionStart');\r\n * ```\r\n * @returns {Flybits.evt} Flybits.evt namespace allowing for chaining subscriptions and unsubscriptions.\r\n * @throws {Flybits.Validation} {@link Flybits.Validation.type| MISSINGARG} When no `evtName` is provided.\r\n * @throws {Flybits.Validation} {@link Flybits.Validation.type| INVALIDARG} When an `evtName` is provided that is not part of the internal supported {@link Flybits.evt.type|event types}\r\n */\r\nFlybits.evt.off = function(evtName, handler){\r\n  const availableEvtNames = Object.keys(Flybits.evt.type).map(function(evtKey){\r\n    return Flybits.evt.type[evtKey];\r\n  });\r\n  const mainEvtName = evtName ? evtName.split('.')[0]: null;\r\n  const evtModifier = evtName ? evtName.split('.')[1]: null;\r\n\r\n  if(!mainEvtName){\r\n    throw new Flybits.Validation().addError('Missing argument', 'Must provide event name to unsubscribe to.',{\r\n      code: Flybits.Validation.type.MISSINGARG,\r\n      context: 'evtName'\r\n    });\r\n  } else if(availableEvtNames.indexOf(mainEvtName) < 0){\r\n    throw new Flybits.Validation().addError('Event name not supported','',{\r\n      code: Flybits.Validation.type.INVALIDARG,\r\n      context: mainEvtName\r\n    });\r\n  }\r\n\r\n  if(mainEvtName && evtModifier){\r\n    if(Flybits.evt.handlerMap[evtName]){\r\n      if(handler){\r\n        Flybits.util.Obj.removeObject(Flybits.evt.handlerMap[evtName], handler);\r\n      } else{\r\n        Flybits.evt.handlerMap[evtName] = [];\r\n      }\r\n    } else{\r\n      console.warn('> Event name not found', evtName);\r\n    }\r\n  } else if(mainEvtName && !evtModifier){\r\n    const evtKeys = Object.keys(Flybits.evt.handlerMap).filter(function(key){\r\n      return key && key.split('.')[0] === mainEvtName;\r\n    });\r\n\r\n    if(evtKeys.length){\r\n      if(handler){\r\n        evtKeys.forEach(function(key){\r\n          Flybits.util.Obj.removeObject(Flybits.evt.handlerMap[key], handler);\r\n        })\r\n      } else{\r\n        evtKeys.forEach(function(key){\r\n          Flybits.evt.handlerMap[key] = [];\r\n        })\r\n      }\r\n    } else{\r\n      console.warn('> Event name not found', mainEvtName);\r\n    }\r\n  }\r\n\r\n  return Flybits.evt;\r\n}\r\n\r\nFlybits.evt.emit = function(evtName, payload){\r\n  const availableEvtNames = Object.keys(Flybits.evt.type).map(function(evtKey){\r\n    return Flybits.evt.type[evtKey];\r\n  });\r\n  const mainEvtName = evtName ? evtName.split('.')[0]: null;\r\n  const evtModifier = evtName ? evtName.split('.')[1]: null;\r\n\r\n  if(!mainEvtName){\r\n    throw new Flybits.Validation().addError('Missing argument', 'Must provide event name to emit event.',{\r\n      code: Flybits.Validation.type.MISSINGARG,\r\n      context: 'evtName'\r\n    });\r\n  } else if(availableEvtNames.indexOf(mainEvtName) < 0){\r\n    throw new Flybits.Validation().addError('Event name not supported','',{\r\n      code: Flybits.Validation.type.INVALIDARG,\r\n      context: mainEvtName\r\n    });\r\n  }\r\n\r\n  const registeredKeys = Object.keys(Flybits.evt.handlerMap);\r\n  registeredKeys.forEach(function(key){\r\n    if((evtModifier && key === evtName) || \r\n       (!evtModifier && key.indexOf(mainEvtName+'.') > -1) ||\r\n       (!evtModifier && key === mainEvtName)){\r\n      Flybits.evt.handlerMap[key].forEach(function(callbackFn){\r\n        callbackFn(payload);\r\n      })\r\n    }\r\n  })\r\n}\r\n\r\nvar initBrowserFileConfig = function(url){\r\n  var def = new Flybits.Deferred();\r\n\r\n  fetch(url).then(function(resp){\r\n    if(resp.status !== 200){\r\n      throw new Flybits.Validation().addError('Configuration file not found','Reverting to default configuration. No configuration found at:'+url,{\r\n        code: Flybits.Validation.type.INVALIDARG,\r\n        context: 'url'\r\n      });\r\n    }\r\n    return resp.json();\r\n  }).then(function(json){\r\n    Flybits.cfg = Flybits.util.Obj.extend(Flybits.cfg,json);\r\n    def.resolve(Flybits.cfg);\r\n  }).catch(function(ex){\r\n    if(ex instanceof Flybits.Validation){\r\n      def.reject(ex);\r\n    } else{\r\n      def.reject(new Flybits.Validation().addError('Failed to read configuration file.','Reverting to default configuration. Configuration format incorrect at:'+url,{\r\n        code: Flybits.Validation.type.MALFORMED,\r\n        context: 'url'\r\n      }));\r\n    }\r\n  });\r\n\r\n  return def.promise;\r\n};\r\n\r\nvar initServerFileConfig = function(filePath){\r\n  if(!filePath){\r\n    console.log('> config file path not provided: using defaults');\r\n    return false;\r\n  }\r\n\r\n  try{\r\n    /*global fs*/ //only invoked in nodejs env\r\n    var data = fs.readFileSync(filePath);\r\n  } catch(e){\r\n    console.error(e);\r\n    throw new Error('Config file read failed: '+filePath);\r\n  }\r\n  try{\r\n    Flybits.cfg = Flybits.util.Obj.extend(Flybits.cfg,JSON.parse(data));\r\n  } catch(e){\r\n    console.error(e);\r\n    throw new Error('Malformed Config file: '+filePath);\r\n  }\r\n};\r\n\r\nvar restoreSessionDetails = function(){\r\n  var def = new Flybits.Deferred();\r\n  \r\n  Flybits.store.Property.ready.then(function(){\r\n    return Flybits.Session._restoreState();\r\n  }).then(function(){\r\n    if(!Flybits.Session._deviceID){\r\n      Flybits.Session._deviceID = resolveDeviceID();\r\n      return Flybits.Session._persistState();\r\n    }\r\n    return Promise.resolve();\r\n  }).then(function(){\r\n    def.resolve();\r\n  }).catch(function(e){\r\n    def.reject(e);\r\n  });\r\n\r\n  return def.promise;\r\n};\r\n\r\nvar resolveDeviceID = function(){\r\n  if(typeof window === 'object'){\r\n    var agent = navigator.userAgent;\r\n    var browserName = Flybits.util.Browser.getName(agent);\r\n    return browserName || Flybits.util.Obj.guid();\r\n  } else{\r\n    return Flybits.util.Obj.guid();\r\n  }\r\n};\r\n\r\nvar setUserAgent = function(){\r\n  var retObj = {\r\n    physicalDeviceId: Flybits.Session._deviceID,\r\n    sdkVersion: Flybits.VERSION\r\n  };\r\n  if(typeof window === 'object'){\r\n    retObj.make = navigator.userAgent;\r\n    retObj.deviceType = 'browser';\r\n  } else{\r\n    retObj.osVersion = process.version;\r\n    retObj.deviceType = 'node';\r\n  }\r\n\r\n  Flybits.Session.userAgent = retObj;\r\n\r\n  return retObj;\r\n};\r\n\r\nvar setStaticDefaults = function(){\r\n  Flybits.context.Manager.reportDelay = Flybits.cfg.CTXREPORTDELAY;\r\n  Flybits.analytics.Manager.reportDelay = Flybits.cfg.analytics.REPORTDELAY;\r\n  Flybits.analytics.Manager.reportDelayUnit = Flybits.cfg.analytics.REPORTDELAYUNIT;\r\n  Flybits.analytics.Manager.maxStoreSize = Flybits.cfg.analytics.MAXSTORESIZE;\r\n};\r\n\r\n/*global deferredReady*/\r\nFlybits.initFile.server = function(configFileURL){\r\n  initServerFileConfig(configFileURL);\r\n  restoreSessionDetails().then(function(){\r\n    setUserAgent();\r\n    setStaticDefaults();\r\n    deferredReady.resolve(Flybits.cfg);\r\n  }).catch(function(e){\r\n    deferredReady.reject(e);\r\n  });\r\n\r\n  return Flybits.ready;\r\n};\r\n\r\n/**\r\n * Initializes the Flybits SDK via URI.\r\n * @param {string} configFileURL URI of the configuration file that contains the `Object` to override SDK defaults.\r\n * @function initFile\r\n * @memberof Flybits\r\n * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves when the SDK has completed initialization.  The same Promise can be accessed at {@link Flybits.ready}.\r\n */\r\nFlybits.initFile.browser = function(configFileURL){\r\n  initBrowserFileConfig(configFileURL).then(function(){\r\n    return restoreSessionDetails();\r\n  }).then(function(){\r\n    setUserAgent();\r\n    setStaticDefaults();\r\n    deferredReady.resolve(Flybits.cfg);\r\n  }).catch(function(e){\r\n    deferredReady.reject(e);\r\n  });\r\n\r\n  return Flybits.ready;\r\n};\r\n\r\n/**\r\n * Configuration `Object` used to override default SDK settings.\r\n * @typedef ConfigObject\r\n * @memberof Flybits\r\n * @type Object\r\n * @property {string} HOST Flybits core host URL.\r\n * @property {number} CTXREPORTDELAY The period length between {@link Flybits.context.Manager} reporting in milliseconds.  After said period, the {@link Flybits.context.Manager|Context Manager} will gather all locally stored context values from all registered {@link Flybits.context.ContextPlugin|context plugins} and report them to the core.\r\n */\r\n\r\n/**\r\n * Initializes the Flybits SDK.\r\n * @param {Flybits.ConfigObject=} configObj Configuration `Object` used to override SDK defaults.\r\n * @function\r\n * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves when the SDK has completed initialization.  The same Promise can be accessed at {@link Flybits.ready}.\r\n */\r\nFlybits.init = function(configObj){\r\n  configObj = configObj || {};\r\n  Flybits.cfg = Flybits.util.Obj.extend(Flybits.cfg,configObj);\r\n  restoreSessionDetails().then(function(){\r\n    setUserAgent();\r\n    setStaticDefaults();\r\n    deferredReady.resolve(Flybits.cfg);\r\n  }).catch(function(e){\r\n    deferredReady.reject(e);\r\n  });\r\n\r\n  return Flybits.ready;\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc A helper class for {@link external:Promise|ES6 Promises} which allows for deferred asynchronous task management.  Not all asynchronous operations can be wrapped in a promise callback.  Sometimes the resolution of a promise needs to be deferred for another entity to resolve or reject, hence the paradigm of the deferred `Object`.\r\n * @class\r\n * @memberof Flybits\r\n */\r\nFlybits.Deferred = (function(){\r\n  var Deferred = function(){\r\n    var def = this;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Deferred\r\n     * @member {external:Promise} promise Instance of an ES6 Promise to be fulfilled.\r\n     */\r\n    this.promise = new Promise(function(resolve,reject){\r\n      /**\r\n       * @instance\r\n       * @memberof Flybits.Deferred\r\n       * @member {function} resolve Callback to be invoked when the asychronous task that initiated the promise is successfully completed.\r\n       */\r\n      def.resolve = resolve;\r\n      /**\r\n       * @instance\r\n       * @memberof Flybits.Deferred\r\n       * @member {function} reject Callback to be invoked when the asychronous task that initiated the promise has failed to complete successfully.\r\n       */\r\n      def.reject = reject;\r\n    });\r\n\r\n    this.then = this.promise.then.bind(this.promise);\r\n    this.catch = this.promise.catch.bind(this.promise);\r\n  };\r\n\r\n  Deferred.settlePromises = Deferred.prototype.settlePromises = function(promisesArr){\r\n    var reflectedArr = promisesArr.map(function(promise){\r\n      return promise.then(function(successResult){\r\n        return {\r\n          result: successResult,\r\n          status: 'resolved'\r\n        };\r\n      },function(errorResult){\r\n        return {\r\n          result: errorResult,\r\n          status: 'rejected'\r\n        };\r\n      });\r\n    });\r\n    return Promise.all(reflectedArr);  \r\n  };\r\n\r\n  return Deferred;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Obj\r\n * @classdesc Basic utilities for dealing with Objects.\r\n * @hideconstructor\r\n * @memberof Flybits.util\r\n */\r\nFlybits.util.Obj = (function(){\r\n  var s4 = function(){\r\n    return Math.floor((1 + Math.random()) * 0x10000)\r\n      .toString(16)\r\n      .substring(1);\r\n  };\r\n\r\n  var obj = {\r\n    createGUID: function(tuples){\r\n      var str = '';\r\n      if(tuples && tuples > 0){\r\n        for(var i = 0; i < tuples; i++){\r\n          str += str !== ''?'-'+s4():s4();\r\n        }\r\n        return str.toUpperCase();\r\n      }\r\n      return (s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n           s4() + '-' + s4() + s4() + s4()).toUpperCase();\r\n    },\r\n    guid:function(tuples){\r\n      return 'JS' + this.createGUID(tuples)\r\n    },\r\n    removeObject:function(arr,obj,findCallback){\r\n      var index = arr.indexOf(obj);\r\n\r\n      if(findCallback){\r\n        var objs = arr.filter(findCallback);\r\n        if(objs.length > 0){\r\n          index = arr.indexOf(objs[0]);\r\n        }\r\n      }\r\n\r\n      if(index >= 0){\r\n        return arr.splice(index,1);\r\n      }\r\n      return arr;\r\n    },\r\n    debounce: function(func, wait, immediate) {\r\n      var timeout;\r\n      return function(...args) {\r\n        var context = this;\r\n        var callNow = immediate && !timeout;\r\n        clearTimeout(timeout);\r\n        timeout = setTimeout(function() {\r\n          timeout = null;\r\n          if (!immediate) {\r\n            func.apply(context, args);\r\n          }\r\n        }, wait);\r\n        if (callNow) {\r\n          func.apply(context, args);\r\n        }\r\n      };\r\n    },\r\n    functionName: function(func){\r\n      var result = /^function\\s+([\\w$]+)\\s*\\(/.exec( func.toString() );\r\n    \r\n      return  result?result[ 1 ]:'';\r\n    },\r\n    isNull: function(obj){\r\n      return obj === null || obj === undefined || obj === '';\r\n    },\r\n    /**\r\n     * Transforms localized object structure into a locale mapping centered around a particular property\r\n     * @memberof Flybits.util.Obj\r\n     * @param {Object} root Root localization structure\r\n     * @param {string} propKey Property key for value within provided `root` localization structure.\r\n     * @function toLocaleValueMap\r\n     * @return Value map of locales and values for specified `propKey`.\r\n     * @example\r\n     * // Example input Root localization structure\r\n     * {\r\n     *   localizations: {\r\n     *     en: {\r\n     *       x: 'abc',\r\n     *       y: 'asdf'\r\n     *     },\r\n     *     fr: {\r\n     *       x: 'efg',\r\n     *       y: 'jkl;'  \r\n     *     }\r\n     *   }\r\n     * }\r\n     * // Example output if `propKey` is equal to `x`\r\n     * {\r\n     *   en: 'abc',\r\n     *   fr: 'efg'\r\n     * }\r\n     */\r\n    toLocaleValueMap: function(root, propKey) {\r\n      var valueObj = {};\r\n      var localeObj = root.locales || root.localizations;\r\n      var localeKeys = localeObj?Object.keys(localeObj):[];\r\n      for (var keyIndex = 0; keyIndex < localeKeys.length; keyIndex++) {\r\n        var localeKey = localeKeys[keyIndex];\r\n        var value = localeObj[localeKey][propKey];\r\n        if (value) {\r\n          valueObj[localeKey] = value;\r\n        }\r\n      }\r\n      return valueObj;\r\n    }\r\n  };\r\n\r\n  obj.extend = (function(){\r\n    function isMergeableObject(val) {\r\n      var nonNullObject = val && typeof val === 'object';\r\n\r\n      return nonNullObject && Object.prototype.toString.call(val) !== '[object RegExp]' && Object.prototype.toString.call(val) !== '[object Date]';\r\n    }\r\n\r\n    function emptyTarget(val) {\r\n      return Array.isArray(val) ? [] : {};\r\n    }\r\n\r\n    function cloneIfNecessary(value, optionsArgument) {\r\n      var clone = optionsArgument && optionsArgument.clone === true;\r\n      return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value;\r\n    }\r\n\r\n    function defaultArrayMerge(target, source, optionsArgument) {\r\n      var destination = target.slice();\r\n      source.forEach(function (e, i) {\r\n        if (typeof destination[i] === 'undefined') {\r\n          destination[i] = cloneIfNecessary(e, optionsArgument);\r\n        } else if (isMergeableObject(e)) {\r\n          destination[i] = deepmerge(target[i], e, optionsArgument);\r\n        } else if (target.indexOf(e) === -1) {\r\n          destination.push(cloneIfNecessary(e, optionsArgument));\r\n        }\r\n      });\r\n      return destination;\r\n    }\r\n\r\n    function mergeObject(target, source, optionsArgument) {\r\n      var destination = optionsArgument && optionsArgument.mutate? target:{};\r\n      if (isMergeableObject(target)) {\r\n        Object.keys(target).forEach(function (key) {\r\n          destination[key] = cloneIfNecessary(target[key], optionsArgument);\r\n        });\r\n      }\r\n      Object.keys(source).forEach(function (key) {\r\n        if (!isMergeableObject(source[key]) || !target[key]) {\r\n          destination[key] = cloneIfNecessary(source[key], optionsArgument);\r\n        } else {\r\n          destination[key] = deepmerge(target[key], source[key], optionsArgument);\r\n        }\r\n      });\r\n      return destination;\r\n    }\r\n\r\n    function deepmerge(target, source, optionsArgument) {\r\n      var array = Array.isArray(source);\r\n      var options = optionsArgument || { arrayMerge: defaultArrayMerge };\r\n      var arrayMerge = options.arrayMerge || defaultArrayMerge;\r\n\r\n      if (array) {\r\n        return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument);\r\n      } else {\r\n        return mergeObject(target, source, optionsArgument);\r\n      }\r\n    }\r\n\r\n    deepmerge.all = function deepmergeAll(array, optionsArgument) {\r\n      if (!Array.isArray(array) || array.length < 2) {\r\n        throw new Error('first argument should be an array with at least two elements');\r\n      }\r\n\r\n      // we are sure there are at least 2 values, so it is safe to have no initial value\r\n      return array.reduce(function (prev, next) {\r\n        return deepmerge(prev, next, optionsArgument);\r\n      });\r\n    };\r\n\r\n    return deepmerge;\r\n  })();\r\n\r\n  return obj;\r\n})();\r\n\n/*global Flybits*/\r\nFlybits.util.Api = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var ObjUtil = Flybits.util.Obj;\r\n\r\n  var defaultAjaxOpts = {\r\n    method: 'GET',\r\n    credentials: 'omit',\r\n  };\r\n\r\n  var api = {\r\n    flbFetch: function(url,opts){\r\n      opts = opts || {};\r\n      return this.fetch(url,ObjUtil.extend({\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          'x-user-agent': JSON.stringify(Flybits.Session.userAgent),\r\n          'x-authorization': Flybits.Session.userToken\r\n        },\r\n        credentials: 'omit',\r\n        respType: 'json'\r\n      },opts));\r\n    },\r\n    fetch: function(url,opts){\r\n      opts = opts || {};\r\n      var def = new Deferred();\r\n      var ajaxOpts = ObjUtil.extend({},defaultAjaxOpts);\r\n      var isJSON = opts.respType === 'json';\r\n      delete opts.respType;\r\n      ajaxOpts = ObjUtil.extend(ajaxOpts,opts);\r\n\r\n      fetch(url,ajaxOpts).then(this.checkResult).then(this.getResultBody)\r\n        .then(function(respObj){\r\n          if(isJSON){\r\n            try{\r\n              respObj.body = api.parseResponse(respObj.body);\r\n              def.resolve(respObj);\r\n            } catch(e){\r\n              console.error(e);\r\n              def.reject(new Flybits.Validation().addError('Request Failed','Unexpected server response.',{\r\n                code: Flybits.Validation.type.MALFORMED,\r\n              }));\r\n            }\r\n          } else{\r\n            def.resolve(respObj);\r\n          }\r\n        }).catch(function(resp){\r\n          api.getResultBody(resp).then(function(resultObj){\r\n            var validation = new Flybits.Validation();\r\n            var parsedError = api.parseErrorMsg(resultObj.body);\r\n            var errObj = {\r\n              serverCode: resp.status,\r\n              context: parsedError.raw?parsedError.raw:undefined\r\n            };\r\n            validation.addError('Request error',parsedError.msg,errObj);\r\n\r\n            def.reject(validation);\r\n          });\r\n        });\r\n\r\n      return def.promise;\r\n    },\r\n    checkResult: function(resp){\r\n      if(resp.status >= 200 && resp.status < 300){\r\n        return resp;\r\n      }\r\n      throw resp;\r\n    },\r\n    getResultBody: function(resp){\r\n      var def = new Deferred();\r\n      if(resp && resp.text){\r\n        var respHeaders = {};\r\n        resp.headers.forEach(function(val,key){\r\n          respHeaders[key] = val;\r\n        });\r\n        resp.text().then(function(str){\r\n          def.resolve({\r\n            body: str,\r\n            headers: respHeaders\r\n          });\r\n        }).catch(function(e){\r\n          def.reject(e);\r\n        });\r\n      } else{\r\n        def.resolve({\r\n          body: '',\r\n          headers: {}\r\n        });\r\n      }\r\n\r\n      return def.promise;\r\n    },\r\n    toURLParams: function(obj){\r\n      var keys = Object.keys(obj);\r\n      var keyLength = keys.length;\r\n      var str = '';\r\n      while(keyLength--){\r\n        var key = keys[keyLength];\r\n        if(str !== ''){\r\n          str += '&';\r\n        }\r\n        str += key + '=' + encodeURIComponent(obj[key]);\r\n      }\r\n\r\n      return str;\r\n    },\r\n    htmlEncode:function(value){\r\n      return encodeURIComponent(value);\r\n    },\r\n    htmlDecode:function(str){\r\n      return str.replace(/&#?(\\w+);/g, function(match, dec) {\r\n        if(isNaN(dec)) {\r\n          var chars = {quot: 34, amp: 38, lt: 60, gt: 62, nbsp: 160, copy: 169, reg: 174, deg: 176, frasl: 47, trade: 8482, euro: 8364, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221, THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252, yacute: 253, thorn: 254, yuml: 255, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, permil: 8240, lsaquo: 8249, rsaquo: 8250, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830, oline: 8254, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, hellip: 133, ndash: 150, mdash: 151, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, brkbar: 166, sect: 167, uml: 168, die: 168, ordf: 170, laquo: 171, not: 172, shy: 173, macr: 175, hibar: 175, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190, iquest: 191, Alpha: 913, alpha: 945, Beta: 914, beta: 946, Gamma: 915, gamma: 947, Delta: 916, delta: 948, Epsilon: 917, epsilon: 949, Zeta: 918, zeta: 950, Eta: 919, eta: 951, Theta: 920, theta: 952, Iota: 921, iota: 953, Kappa: 922, kappa: 954, Lambda: 923, lambda: 955, Mu: 924, mu: 956, Nu: 925, nu: 957, Xi: 926, xi: 958, Omicron: 927, omicron: 959, Pi: 928, pi: 960, Rho: 929, rho: 961, Sigma: 931, sigma: 963, Tau: 932, tau: 964, Upsilon: 933, upsilon: 965, Phi: 934, phi: 966, Chi: 935, chi: 967, Psi: 936, psi: 968, Omega: 937, omega: 969}\r\n          if (chars[dec] !== undefined){\r\n            dec = chars[dec];\r\n          }\r\n        }\r\n        return String.fromCharCode(dec);\r\n      });\r\n    },\r\n    base64Decode: function(str){\r\n      return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {\r\n        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n      }).join(''));\r\n    },\r\n    base64Encode: function(str){\r\n      return btoa(str);\r\n    },\r\n    parseResponse: function(rawResponse){\r\n      return JSON.parse(rawResponse,function(key,val){\r\n        if(typeof val === 'string'){\r\n          return api.htmlDecode(val);\r\n        }\r\n        return val;\r\n      });\r\n    },\r\n    parseErrorMsg: function(rawResponse){\r\n      var retObj = {};\r\n      var GENERIC = 'Unexpected error has occurred';\r\n      \r\n      try{\r\n        var resp = this.parseResponse(rawResponse);\r\n        resp = resp.error || resp.errors || resp;\r\n  \r\n        if(resp instanceof Array){\r\n          resp = resp[0];\r\n        }\r\n  \r\n        if(resp){\r\n          retObj.msg =  resp.exceptionMessage || resp.message || resp.messageJSON || resp.detail || GENERIC;\r\n          if(retObj.msg === GENERIC){\r\n            retObj.raw = resp;\r\n          }\r\n        }\r\n      } catch(e){\r\n        console.error(e);\r\n        retObj.msg = GENERIC;\r\n        retObj.raw = rawResponse;\r\n      }\r\n\r\n      return retObj;\r\n    },\r\n    parsePaging: function(jsonResp, paginationKey){\r\n      paginationKey = paginationKey || 'pagination';\r\n      var pagingObj = jsonResp[paginationKey];\r\n      return {\r\n        offset: pagingObj?jsonResp[paginationKey].offset:0,\r\n        limit: pagingObj?jsonResp[paginationKey].limit:20,\r\n        total: pagingObj?jsonResp[paginationKey].totalRecords:1\r\n      };\r\n    },\r\n    createNextPageCall: function(requestFunction,reqParams,paging){\r\n      if(paging.offset + paging.limit >= paging.total){\r\n        return null;\r\n      }\r\n      reqParams = reqParams?reqParams:{};\r\n      return function(){\r\n        reqParams.paging = {\r\n          limit: paging.limit,\r\n          offset: paging.offset + paging.limit\r\n        };\r\n        return requestFunction(reqParams);\r\n      };\r\n    }\r\n  };\r\n\r\n  return api;\r\n})();\r\n\n/*global Flybits*/\r\nFlybits.util.Browser = (function(){\r\n  var browser = {\r\n    getCookie: function(key) {\r\n      var value = '; ' + document.cookie;\r\n      var parts = value.split('; ' + key + '=');\r\n      if (parts.length == 2) {\r\n        return parts.pop().split(';').shift();\r\n      } else{\r\n        return null;\r\n      }\r\n    },\r\n    setCookie: function(key,value,expiryDateObj){\r\n      var expires = '';\r\n      if (expiryDateObj) {\r\n        expires = '; expires=' + expiryDateObj.toGMTString();\r\n      }\r\n      document.cookie = key + '=' + value + expires + '; path=/';\r\n    },\r\n    getName: function(userAgentString){\r\n      userAgentString = userAgentString?userAgentString.toLowerCase():'';\r\n      var hasChrome = userAgentString.indexOf('chrome') > -1;\r\n      var hasChromium = userAgentString.indexOf('chromium') > -1;\r\n      var hasFirefox = userAgentString.indexOf('firefox') > -1;\r\n      var hasSafari = (userAgentString.indexOf('applewebkit') > -1 || userAgentString.indexOf('safari') > -1) && !hasChrome && !hasChromium;\r\n      var hasIE = userAgentString.indexOf('msie') > -1 || userAgentString.indexOf('.net') > -1;\r\n      var hasOpera = userAgentString.indexOf('opr') > -1 || userAgentString.indexOf('opera') > -1;\r\n      \r\n      var isMobile = userAgentString.indexOf('mobi') > -1;\r\n\r\n      var name;\r\n      if(hasChrome){\r\n        name = 'chrome';\r\n      } else if(hasChromium){\r\n        name = 'chromium';\r\n      } else if(hasFirefox){\r\n        name = 'firefox';\r\n      } else if(hasSafari){\r\n        name = 'safari';\r\n      } else if(hasIE){\r\n        name = 'ie';\r\n      } else if(hasOpera){\r\n        name = 'opera';\r\n      }\r\n\r\n      if(name && isMobile){\r\n        name += '_mobile';\r\n      }\r\n\r\n      return name;\r\n    }\r\n  };\r\n\r\n  return browser;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Content\r\n * @classdesc Utilities for manipulating and working with Flybits Content.\r\n * @hideconstructor\r\n * @memberof Flybits.util\r\n */\r\nFlybits.util.Content = (function(){\r\n  return {\r\n    /**\r\n     * Transforms localized Flybits Content data payload objects into plain objects with flattened localization objects whereby localized strings will be resolved based on preferred locale.  Logic contains failover support if preferred locale is not found for an attribute.  **Precedence for localized attribute lookup is as follows: preferred locale, english locale, and then first locale key available.**\r\n     * @memberof Flybits.util.Content\r\n     * @function flattenLocales\r\n     * @param {Object} obj Flybits Content inner data payload objects containing `localizations` and/or `locales` nested objects with localized strings.\r\n     * @param {string} [preferredLocale=en] Preferred locale key by which to resolve localized strings.  By default, English(en) will be used.\r\n     * @returns {Object} Object with localized values flattened into parent objects.\r\n     * @example\r\n     * // Example input root structure\r\n     * {\r\n     *   title: 'titlestr',\r\n     *   locales: {\r\n     *     en: {\r\n     *       description: 'english description string'\r\n     *     },\r\n     *     fr: {\r\n     *       description: 'french description string'\r\n     *     }\r\n     *   }\r\n     * }\r\n     * // Example output if preferred locale is `fr`\r\n     * {\r\n     *   title: 'titlestr',\r\n     *   description: 'french description string'\r\n     * }\r\n     */\r\n    flattenLocales: function (obj, preferredLocale) {\r\n      var result = {};\r\n      var keys = obj ? Object.keys(obj) : null;\r\n      keys?.forEach(function (key) {\r\n        if (key === 'localizations' || key === 'locales') {\r\n          const allLocales = obj[key];\r\n          if(allLocales){\r\n            var attrList = new Set();\r\n            Object.keys(allLocales).forEach(function(localeKey){\r\n              const localeObj = allLocales[localeKey];\r\n              Object.keys(localeObj).forEach(item => attrList.add(item));\r\n            })\r\n            attrList = Array.from(attrList);\r\n\r\n            var preferredLocaleObj = obj[key][preferredLocale];\r\n            var enLocaleObj = obj[key].en;\r\n            var firstLocaleObj = obj[key][Object.keys(obj[key])[0]];\r\n            var primaryLocaleObj = preferredLocaleObj || enLocaleObj || firstLocaleObj;\r\n            \r\n            attrList.forEach(function(attrKey){\r\n              if(primaryLocaleObj?.[attrKey]){\r\n                result[attrKey] = primaryLocaleObj[attrKey];\r\n              } else if(primaryLocaleObj !== enLocaleObj && enLocaleObj?.[attrKey]){\r\n                result[attrKey] = enLocaleObj[attrKey];\r\n              } else if(firstLocaleObj !== primaryLocaleObj && firstLocaleObj !== enLocaleObj && firstLocaleObj?.[attrKey]){\r\n                result[attrKey] = firstLocaleObj[attrKey];\r\n              }\r\n            });\r\n          }\r\n        } else if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n          result[key] = Flybits.util.Content.flattenLocales(obj[key], preferredLocale);\r\n        } else if (Array.isArray(obj[key]) && typeof obj[key][0] === 'object') {\r\n          result[key] = obj[key].map(function (o) {\r\n            return Flybits.util.Content.flattenLocales(o, preferredLocale);\r\n          });\r\n        } else {\r\n          result[key] = obj[key];\r\n        }\r\n      });\r\n  \r\n      return result;\r\n    }\r\n  }\r\n})();\n/*global Flybits*/\r\nFlybits.util.Geo = (function(){\r\n  var geo = {\r\n    _toDeg : function(rad) {\r\n      return rad * 180 / Math.PI;\r\n    },\r\n    _toRad : function(deg) {\r\n      return deg * Math.PI / 180;\r\n    },\r\n    getBoundingBox: function(latLngArr){\r\n      if(!latLngArr || latLngArr.length < 3){\r\n        throw new Flybits.Validation().addError('Invalid Argument','Must provide an array of lat,lng coordinates greater than 2.',{\r\n          code: Flybits.Validation.type.INVALIDARG\r\n        });\r\n      }\r\n      var latMin = latLngArr[0].lat;\r\n      var latMax = latLngArr[0].lat;\r\n      var lngMin = latLngArr[0].lng;\r\n      var lngMax = latLngArr[0].lng;\r\n\r\n      for(var i = 1; i < latLngArr.length; i++){\r\n        var pt = latLngArr[i];\r\n        latMin = pt.lat < latMin? pt.lat:latMin;\r\n        latMax = pt.lat > latMax? pt.lat:latMax;\r\n        lngMin = pt.lng < lngMin? pt.lng:lngMin;\r\n        lngMax = pt.lng > lngMax? pt.lng:lngMax;\r\n      }\r\n\r\n      return {\r\n        min: {\r\n          lat: latMin,\r\n          lng: lngMin\r\n        },\r\n        max: {\r\n          lat: latMax,\r\n          lng: lngMax\r\n        }\r\n      };\r\n    },\r\n    getCenter: function(latLngArr){\r\n      if(!latLngArr || latLngArr.length < 3){\r\n        throw new Flybits.Validation().addError('Invalid Argument','Must provide an array of lat,lng coordinates greater than 2.',{\r\n          code: Flybits.Validation.type.INVALIDARG\r\n        });\r\n      }\r\n      var bounds = this.getBoundingBox(latLngArr);\r\n      return {\r\n        lat: (bounds.max.lat + bounds.min.lat) / 2,\r\n        lng: (bounds.max.lng + bounds.min.lng) / 2\r\n      };\r\n    },\r\n    getBearing: function(pt1,pt2){\r\n      var dLng = (pt2.lng-pt1.lng);\r\n      var y = Math.sin(dLng) * Math.cos(pt2.lat);\r\n      var x = Math.cos(pt1.lat)*Math.sin(pt2.lat) - Math.sin(pt1.lat)*Math.cos(pt2.lat)*Math.cos(dLng);\r\n      var brng = this._toDeg(Math.atan2(y, x));\r\n      return 360 - ((brng + 360) % 360);\r\n    }\r\n  };\r\n\r\n  return geo;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for implementing context plugins.\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.ContextPlugin = {\r\n  /**\r\n   * Checks for availability of this plugin on the current platform.\r\n   * @function\r\n   * @memberof Flybits.interface.ContextPlugin\r\n   * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if this context plugin is supported on the current platform.\r\n   */\r\n  isSupported: function(){},\r\n  /**\r\n   * Retrieves current value of this particular context plugin.\r\n   * @function\r\n   * @memberof Flybits.interface.ContextPlugin\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves with context plugin specific data structure representing current value of context plugin.\r\n   */\r\n  getState: function(){},\r\n\r\n  /**\r\n   * Converts context value object into the server expected format.\r\n   * @function\r\n   * @memberof Flybits.interface.ContextPlugin\r\n   * @param {Object} contextValue\r\n   * @return {Object} Expected server format of context value.\r\n   */\r\n  _toServerFormat: function(contextValue){} // eslint-disable-line no-unused-vars\r\n\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for implementing identity providers.\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.IDP = {\r\n  /**\r\n   * Returns Flybits endpoint to report IDP payload.\r\n   * @function getURL\r\n   * @memberof Flybits.interface.IDP\r\n   * @return {string} URL to authentication endpoint for this particular IDP\r\n   */\r\n  getURL: function(){},\r\n  /**\r\n   * Returns payload required for IDP to authenticate with Flybits.\r\n   * @function getPayload\r\n   * @memberof Flybits.interface.IDP\r\n   * @return {Object} IDP specific payload used to authenticate with Flybits.\r\n   * @throws {Flybits.Validation} If IDP parameters are incorrect an exception will be thrown in the form of a standard {@link Flybits.Validation|Validation} object.\r\n   */\r\n  getPayload: function(){},\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for implementing data stores that operate on key/value pairs.\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.KeyDataStore = {\r\n  /**\r\n   * Retrieves the amount of entries in the data store.\r\n   * @function\r\n   * @memberof Flybits.interface.KeyDataStore\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves with the number of entries in the data store.\r\n   */\r\n  getSize: function(){},\r\n  /**\r\n   * Adds/Replaces/Removes an item in the data store.\r\n   * @function\r\n   * @memberof Flybits.interface.KeyDataStore\r\n   * @param {string} id ID of item to be stored.\r\n   * @param {Object} item Item to be stored in data store.  If `null` or `undefined` is supplied the related item that has provided `id` will be removed from the data store.\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves without value if data is successfully set in data store.\r\n   */\r\n  set: function(id,item){}, // eslint-disable-line no-unused-vars\r\n\r\n  /**\r\n   * Retrieves an item from the data store.\r\n   * @function\r\n   * @memberof Flybits.interface.KeyDataStore\r\n   * @param {string} id ID of item to be retrieved.\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves with data store item based on `id` if it exists.\r\n   */\r\n  get: function(id){}, // eslint-disable-line no-unused-vars\r\n\r\n  /**\r\n   * Retrieves all item keys from the data store.\r\n   * @function\r\n   * @memberof Flybits.interface.KeyDataStore\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves with all item keys in the data store.\r\n   */\r\n  getKeys: function(){},\r\n\r\n  /**\r\n   * Clears the entire data store of its entries.\r\n   * @function\r\n   * @memberof Flybits.interface.KeyDataStore\r\n   * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if data clear is successful.\r\n   */\r\n  clear: function(){}\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for models which have localized properties.\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.Localizable = {\r\n  /**\r\n   * Parses server localized properties for a single locale object. For instance if a model has localized properties {'en':{},'fr':{}}, each object mapped to each locale key would pass through this function.\r\n   * @function\r\n   * @instance\r\n   * @memberof Flybits.interface.Localizable\r\n   * @param {Object} serverObj server locale object containing localized properties.\r\n   * @return {Object} Server localized properties of a locale key parsed to SDK equivalent objects.\r\n   */\r\n  _fromLocaleJSON: function(serverObj){}, // eslint-disable-line no-unused-vars\r\n\r\n  /**\r\n   * Maps SDK localized objects back to server equivalent objects.\r\n   * @function\r\n   * @instance\r\n   * @memberof Flybits.interface.Localizable\r\n   * @param {Object} appObj application locale object containing localized properties\r\n   * @return {Object} SDK localized properties of a locale key parsed to server equivalent objects.\r\n   */\r\n  _toLocaleJSON: function(appObj){} // eslint-disable-line no-unused-vars\r\n\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for implementing property stores (key-value pair storage).\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.PropertyStore = {\r\n  /**\r\n   * Checks for availability of this property storage type.\r\n   * @function\r\n   * @memberof Flybits.interface.PropertyStore\r\n   * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if storage type is supported and rejects if it is not.\r\n   */\r\n  isSupported: function(){},\r\n  /**\r\n   * Retrieves property value based on key.\r\n   * @function\r\n   * @memberof Flybits.interface.PropertyStore\r\n   * @instance\r\n   * @param key Key by which to fetch the requested property.\r\n   * @return {external:Promise<string,Flybits.Validation>} Promise that resolves with property store value unless a problem occurs.\r\n   */\r\n  getItem: function(key){}, // eslint-disable-line no-unused-vars\r\n\r\n  /**\r\n   * Converts context value object into the server expected format.\r\n   * @function\r\n   * @memberof Flybits.interface.PropertyStore\r\n   * @instance\r\n   * @param {string} key Key by which to store provided `value`\r\n   * @param {string} value Value that is to be stored based on provided `key`\r\n   * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if value has been successfully stored based on specified key.\r\n   */\r\n  setItem: function(key, value){}, // eslint-disable-line no-unused-vars\r\n\r\n  /**\r\n   * Completely remove key and value from property store.\r\n   * @function\r\n   * @memberof Flybits.interface.PropertyStore\r\n   * @instance\r\n   * @param {string} key Key by which to store provided `value`\r\n   * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if key and value have been successfully removed based on specified key.\r\n   */\r\n  removeItem: function(key){}, // eslint-disable-line no-unused-vars\r\n\r\n};\r\n\n/*global Flybits*/\r\n/**\r\n * Interface for SDK models that are abstracted from server models.\r\n * @memberof Flybits.interface\r\n * @interface\r\n */\r\nFlybits.interface.Serializable = {\r\n  /**\r\n   * Parses raw server models into SDK model properties that implement this interface.\r\n   * @function\r\n   * @instance\r\n   * @memberof Flybits.interface.Serializable\r\n   * @param {Object} serverObj Raw server model.\r\n   */\r\n  fromJSON: function(serverObj){}, // eslint-disable-line no-unused-vars\r\n  /**\r\n   * Maps SDK model properties to abstracted server models.\r\n   * @function\r\n   * @instance\r\n   * @memberof Flybits.interface.Serializable\r\n   * @returns {Object} Raw server model.\r\n   */\r\n  toJSON: function(){}\r\n};\r\n\n/**\r\n * @classdesc Base class from which all core Flybits classes are extended.\r\n * @class\r\n */\r\nvar BaseObj = (function(){ // eslint-disable-line no-unused-vars\r\n  function BaseObj(){}\r\n  BaseObj.prototype = {\r\n    implements: function(interfaceName){\r\n      if(!this._interfaces){\r\n        this._interfaces = [];\r\n      }\r\n      this._interfaces.push(interfaceName);\r\n    }\r\n  };\r\n\r\n  return BaseObj;\r\n})();\r\n\n/*global Flybits*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar Path = (function(){\r\n  function Path(){\r\n    this.nodes = [];\r\n  }\r\n\r\n  Path.prototype.getNode = function(className){\r\n    return this.nodes.filter(function(obj){\r\n      return Flybits.util.Obj.functionName(obj.constructor) === className;\r\n    })[0];\r\n  };\r\n\r\n  Path.prototype.append = function(obj){\r\n    this.nodes.push(obj);\r\n    return this;\r\n  };\r\n\r\n  Path.prototype.serialize = function(){\r\n    var pathStr = '';\r\n    for(var i = 0; i < this.nodes.length; i++){\r\n      pathStr += '/' + this.nodes[i]._pathName;\r\n      if(this.nodes[i].id){\r\n        pathStr += '/' + this.nodes[i].id;\r\n      }\r\n    }\r\n    \r\n    return pathStr;\r\n  };\r\n\r\n  return Path;\r\n})();\r\n\n/*global BaseObj*/\r\n/**\r\n * @classdesc Base class from which all core Flybits models are extended.\r\n * @class\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from API.\r\n */\r\nvar BaseModel = (function(){ // eslint-disable-line no-unused-vars\r\n  var BaseModel = function(serverObj){\r\n    BaseObj.call(this);\r\n    /**\r\n     * @instance\r\n     * @memberof BaseModel\r\n     * @member {string} id Parsed ID of the Flybits core model.\r\n     */\r\n    this.id;\r\n\r\n    if(serverObj && serverObj.id){\r\n      this.id = serverObj.id;\r\n    }\r\n  };\r\n\r\n  BaseModel.prototype = Object.create(BaseObj.prototype);\r\n  BaseModel.prototype.constructor = BaseModel;\r\n\r\n  BaseModel.prototype.reqKeys = {\r\n    id: 'id'\r\n  };\r\n\r\n  return BaseModel;\r\n})();\r\n\n/*global Flybits,BaseModel,Path*/\r\n/**\r\n * @classdesc Flybits core Content model. A Content model instance represents the content created from a corresponding Content Template. That is to say it is the entity through which we can access/modify JSON data that fits the structure specified in the template.\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @implements {Flybits.interface.Serializable}\r\n * @implements {Flybits.interface.Localizable}\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from API.\r\n */\r\nFlybits.Content = ( function(){\r\n  var ApiUtil = Flybits.util.Api;\r\n\r\n  /**\r\n   * @typedef LocalizedObject\r\n   * @memberof Flybits.Content\r\n   * @type Object\r\n   * @property {string} name Name of the Content instance.\r\n   * @property {string} description Description of the Content instance.\r\n   */\r\n\r\n  function Content( serverObj ){\r\n    BaseModel.call( this, serverObj );\r\n    serverObj = serverObj || {};\r\n    this.fromJSON( serverObj );\r\n  }\r\n\r\n  Content.prototype = Object.create( BaseModel.prototype );\r\n  Content.prototype.constructor = Content;\r\n  Content.prototype.implements( 'Serializable' );\r\n  Content.prototype.implements( 'Localizable' );\r\n\r\n  Content.prototype.types = Content.types = {\r\n    DEFAULT: 'default',\r\n    SURVEY: 'SurveyQuestions'\r\n  };\r\n  Content.prototype._pathName = Content._pathName = 'content/instances';\r\n\r\n  Content.prototype.reqKeys = Content.reqKeys = {\r\n    name: 'name',\r\n    description: 'description',\r\n    createdDate: 'createdAt',\r\n    lastModifiedDate: 'modifiedAt',\r\n    id: 'id'\r\n  };\r\n\r\n  /**\r\n   * @typedef renderTypes\r\n   * @memberof Flybits.Content\r\n   * @type Object\r\n   * @property {string} ALL (\"all\") Used to retrieve Content of any render type.\r\n   * @property {string} HTML (\"html\") Used to retrieve only HTML based Content.\r\n   * @property {string} DEFAULT (\"default\") Used to retrieve only non-HTML based Content.\r\n   */\r\n  Content.prototype.renderTypes = Content.renderTypes = {\r\n    ALL: 'all',\r\n    HTML: 'html',\r\n    DEFAULT: 'default'\r\n  }\r\n\r\n  /***** Localizable function overloading *****/\r\n  Content.prototype._fromLocaleJSON = function( serverObj ) {\r\n    var retObj = {\r\n      name: serverObj.name,\r\n      description: serverObj.description\r\n    };\r\n\r\n    return retObj;\r\n  };\r\n\r\n  Content.prototype._toLocaleJSON = function ( appObj ) {\r\n    var retObj = {\r\n      name: appObj.name,\r\n      description: appObj.description\r\n    };\r\n\r\n    return retObj;\r\n  };\r\n\r\n  Content.prototype.parseContents = function(serverObj){\r\n    var paging = ApiUtil.parsePaging( serverObj );\r\n    var contentObj = this;\r\n    \r\n    var allContentData = serverObj.data.map( function(obj){\r\n      var routePath = new Path().append(contentObj);\r\n      try{\r\n        return new Flybits.ContentData( obj, routePath );\r\n      } catch(e){\r\n        console.error(e);\r\n        throw new Flybits.Validation().addError('Parse Failed','Failed to parse Content data model.',{\r\n          code: Flybits.Validation.type.MALFORMED,\r\n          context: obj\r\n        });\r\n      }\r\n    });\r\n\r\n    return {\r\n      result: allContentData,\r\n      nextPageFn: ApiUtil.createNextPageCall( Flybits.api.ContentData.getAll, {\r\n        contentID: contentObj.id\r\n      }, paging )\r\n    };\r\n  };\r\n\r\n  /**\r\n   * Synchronously retrieve the data from the Content model instance.  This will only be possible if the instance was fetched with its inner data object via the [`data` request param](Flybits.api.Content.html#.RequestParams) set to `true` as it is by default.\r\n   * @memberof Flybits.Content\r\n   * @instance\r\n   * @function getDataObj\r\n   * @param {Object} [opts] Optional specification of output formatting (eg. localization flattening).\r\n   * @param {string} [opts.locale=en] [Two character locale key](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) (eg. en, fr, es, etc) to flatten content attributes instead of returning entire embedded localization objects.  If \"auto\" is used, the locale key in {@link Flybits.Session.preferredLanguage} will be used.\r\n   * @return {Object|null} Content Instance JSON payload object or `null` if Content Instance does not locally have one.\r\n   */\r\n  Content.prototype.getDataObj = function(opts){\r\n    if(this.data && this.data.result && this.data.result.length){\r\n      if(opts?.locale){\r\n        if(opts.locale === 'auto'){\r\n          return Flybits.util.Content.flattenLocales(this.data.result[0].payload, Flybits.Session.preferredLanguage);\r\n        } else if(opts.locale.length === 2){\r\n          return Flybits.util.Content.flattenLocales(this.data.result[0].payload, opts.locale);\r\n        } else{\r\n          throw new Flybits.Validation().addError('Invalid locale', 'Only two letter locale keys are supported [ISO 3166-1 alpha-2]',{\r\n            code: Flybits.Validation.type.INVALIDARG,\r\n            context: opts.locale\r\n          })\r\n        }\r\n      }\r\n      return this.data.result[0].payload;\r\n    }\r\n\r\n    return null;\r\n  };\r\n\r\n  /**\r\n   * Asynchronously retrieve the data from the Content model instance.  This can be useful if the instance was originally fetched without its inner data object via the [`data` request param](Flybits.api.Content.html#.RequestParams) set to `false`.  If the instance does not locally have a data object a request to the server will be made to attempt to fetch one. \r\n   * @memberof Flybits.Content\r\n   * @instance\r\n   * @function getData\r\n   * @return {external:Promise<Object,Flybits.Validation>} Promise that resolves with the Content instance's JSON payload object.\r\n   */\r\n  Content.prototype.getData = function(){\r\n    var obj = this;\r\n    if(this.data && this.data.result && this.data.result.length > 0){\r\n      return Promise.resolve(this.data.result[0].payload);\r\n    } else{\r\n      var def = new Flybits.Deferred();\r\n      Flybits.api.ContentData.getAll({\r\n        contentID: this.id\r\n      }).then(function(respObj){\r\n        if(respObj && respObj.result && respObj.result.length > 0){\r\n          obj.data = respObj;\r\n          def.resolve(respObj.result[0].payload);\r\n        } else{\r\n          def.resolve();\r\n        }\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    }\r\n  };\r\n\r\n  /***** Serializable function overloading *****/\r\n  Content.prototype.fromJSON = function(serverObj){\r\n    var obj = this;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} id - id value of the content instance.\r\n     */\r\n    obj.id = serverObj.id;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} tenantID - id value of the tenant(project) of instance\r\n     */\r\n    obj.tenantID = serverObj.tenantId;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} templateID - id value of the content template of the fetched content instance.\r\n     */\r\n    obj.templateID = serverObj.templateId;\r\n    /**\r\n     * @instance\r\n     */\r\n    obj.experienceIDs = serverObj.experienceIds || [];\r\n    if(!serverObj.experienceIds && serverObj.experienceId){\r\n      obj.experienceIDs.push(serverObj.experienceId);\r\n    }\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} type - content template type from which this instance was created from.\r\n     */\r\n    obj.type = serverObj.templateType || Content.types.DEFAULT;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} iconURL - URL of the icon image associated with this content instance.\r\n     */\r\n    obj.iconURL = serverObj.iconUrl;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {Date} createdDate - Date of model creation.\r\n     */\r\n    obj.createdDate = serverObj.createdAt? new Date(serverObj.createdAt*1000):null;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {Date} lastModifiedDate - Date of last modification of model.\r\n     */\r\n    obj.lastModifiedDate = serverObj.modifiedAt? new Date(serverObj.modifiedAt*1000):null;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @see Flybits.Content.LocalizedObject\r\n     * @member {Object} locales - Map of available locale keys to {@link Flybits.Content.LocalizedObject} objects containing information.\r\n     * @example\r\n     * { \r\n     *   en: {\r\n     *     name: 'Falafel',\r\n     *     description: 'Falafel is good'\r\n     *   },\r\n     *   fr: {\r\n     *     name: 'Falafel',\r\n     *     description: 'Falafel est bon'\r\n     *   }\r\n     * }\r\n     */\r\n    obj.locales = {};\r\n\r\n    var localeKeys = serverObj.localizations ? Object.keys(serverObj.localizations) : [];\r\n    localeKeys.forEach( function( key ) {\r\n      obj.locales[key] = obj._fromLocaleJSON( serverObj.localizations[key] );\r\n    });\r\n\r\n    obj.name = obj.locales?.en?.name;\r\n    obj.description = obj.locales?.en?.description;\r\n\r\n    // if( localeKeys.length > 0 && this.defaultLang ) {\r\n    //   this.defaultLocaleObj = this.locales[ this.defaultLang ];\r\n    // }\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} \r\n     */\r\n    obj.linkedFields = serverObj.linkedFields;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string[]}\r\n     */\r\n    obj.labels = serverObj.labels || [];\r\n\r\n    obj.data = serverObj.content? this.parseContents(serverObj.content):undefined;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} [renderType=\"\"] - Indicates whether specific type of rendering is available.  Will be set to `html` if content has html/css UI defined.\r\n     */\r\n    obj.renderType = serverObj.renderType;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {string} [accessType=rule] Indicates whether or not this Content Instance is strictly governed by rules or accessible via ID regardless.  By default this SDK will create strictly governed instances.\r\n     */\r\n    obj.accessType = serverObj.accessType || 'rule';\r\n    \r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {Object} defaultUI Rendering layout for the Content instance if it is of HTML {@link Flybits.Content.renderType}\r\n     * @property {string} [layout=\"\"] Out of the box layout type.  Flybits Concierge will come with referenceable Content UI components.  This attribute will be overriden if there is a defined {@link Flybits.Content.defaultUI.layoutHTML}\r\n     * @property {string} [layoutHTML=\"\"] Raw HTML for Content UI rendering.\r\n     * @property {string} [styleCSS=\"\"] Raw CSS for Content UI styling.\r\n     * @property {string} [styleCSSURL=\"\"] URL of CSS resource.  This attribute will be overriden by {@link Flybits.Content.defaultUI.styleCSSURL}\r\n     */\r\n    obj.defaultUI = serverObj.defaultUIConfig?serverObj.defaultUIConfig:{\r\n      layout: '',\r\n      layoutHTML: '',\r\n      styleCSS: '',\r\n      styleCSSURL: ''\r\n    };\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {Object} detailsUI Rendering layout for the Content instance details page if supported and is of HTML {@link Flybits.Content.renderType}.  This is optional as not all Content instances have a drilled down full page details view.\r\n     * @property {string} [layout=\"\"] Out of the box layout type.  Flybits Concierge will come with referenceable Content UI components.  This attribute will be overriden if there is a defined {@link Flybits.Content.defaultUI.layoutHTML}\r\n     * @property {string} [layoutHTML=\"\"] Raw HTML for Content UI rendering.\r\n     * @property {string} [styleCSS=\"\"] Raw CSS for Content UI styling.\r\n     * @property {string} [styleCSSURL=\"\"] URL of CSS resource.  This attribute will be overriden by {@link Flybits.Content.defaultUI.styleCSSURL}\r\n     */\r\n    obj.detailsUI = serverObj.detailsUIConfig?serverObj.detailsUIConfig:{\r\n      layout: '',\r\n      layoutHTML: '',\r\n      styleCSS: '',\r\n      styleCSSURL: ''\r\n    };\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Content\r\n     * @member {Array} usedByJourneys - Array of Journey IDs and names that are using this content instance.\r\n     */\r\n    obj.usedByJourneys = serverObj.usedBy || [];\r\n\r\n    obj.metadata = serverObj.metadata || {};\r\n\r\n    return this;\r\n  };\r\n\r\n  Content.prototype.toJSON = function(){\r\n    var obj = this;\r\n    \r\n    var retObj = {\r\n      iconUrl: obj.iconURL,\r\n      localizations: {},\r\n      labels: obj.labels,\r\n      defaultUIConfig: this.defaultUI,\r\n      detailsUIConfig: this.detailsUI,\r\n      accessType: this.accessType\r\n    };\r\n\r\n    if((\r\n      this.defaultUI && \r\n        (this.defaultUI.layout || this.defaultUI.layoutHTML)\r\n    ) || \r\n      (\r\n        this.detailsUI &&\r\n        (this.detailsUI.layout || this.detailsUI.layoutHTML)\r\n      )){\r\n      retObj.renderType = 'html';\r\n    } else {\r\n      retObj.renderType = '';\r\n    }\r\n\r\n    if(obj.createdDate){\r\n      retObj.createdAt = Math.round(obj.createdDate.getTime()/1000);\r\n    }\r\n    if(obj.lastModifiedDate){\r\n      retObj.modifiedAt = Math.round(obj.lastModifiedDate.getTime()/1000);\r\n    }\r\n\r\n    if(obj.name || obj.description){\r\n      obj.locales = {\r\n        en: {\r\n          name: obj.name,\r\n          description: obj.description\r\n        }\r\n      }\r\n    }\r\n\r\n    if( Object.keys( obj.locales ).length > 0 ) {\r\n      var localeKeys = Object.keys( obj.locales );\r\n      localeKeys.forEach( function( key ) {\r\n        retObj.localizations[key] = obj._toLocaleJSON( obj.locales[key] );\r\n      });\r\n    }\r\n\r\n    /* id rendering: thrown in for just safety purpose\r\n     * id validations(content instance, content template, tenant) moved to the content API\r\n     * id is not passed in the body of JSON (PUT, POST) requests anymore (Part of Header and URL)\r\n     */\r\n    if( obj.id ) {\r\n      retObj.id = obj.id;\r\n    }\r\n\r\n    if( obj.tenantID ) {\r\n      retObj.tenantId = obj.tenantID;\r\n    }\r\n\r\n    if( obj.templateID ) {\r\n      retObj.templateId = obj.templateID;\r\n    }\r\n\r\n    if( obj.experienceIDs ) {\r\n      retObj.experienceIds = obj.experienceIDs;\r\n    }\r\n\r\n    if( obj.type ){\r\n      retObj.templateType = obj.type;\r\n    }\r\n\r\n    if (Array.isArray(obj.usedByJourneys) && obj.usedByJourneys.length > 0) {\r\n      retObj.usedBy = obj.usedByJourneys;\r\n    }\r\n\r\n    if (obj.metadata) {\r\n      retObj.metadata = obj.metadata;\r\n    } else {\r\n      retObj.metadata = {};\r\n    }\r\n\r\n    if (obj.data) {\r\n      retObj.content = {\r\n        data: [obj.data.result?.[0]?.toJSON() || {}],\r\n        pagination: {\r\n          limit: 20,\r\n          offset: 0,\r\n          totalRecords: 1\r\n        }\r\n      }\r\n    }\r\n\r\n    return retObj;\r\n  };\r\n\r\n  Content.getInstance = function(serverObj){\r\n    if(serverObj.templateType === Content.types.SURVEY && serverObj.surveyMetadata){\r\n      return new Flybits.Survey(serverObj);\r\n    } else{\r\n      return new Content(serverObj);\r\n    }\r\n  };\r\n\r\n  return Content;\r\n})();\r\n\n/*global Flybits,BaseModel,Path*/\r\n/**\r\n * @classdesc Flybits core Content Root Data model. This is the root data of a content instance\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @implements {Flybits.interface.Serializable}\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from API.\r\n */\r\nFlybits.ContentData = ( function(){\r\n  function ContentData( serverObj, path ){\r\n    BaseModel.call( this, serverObj );\r\n    this.id = serverObj._id;\r\n    this.path = path || new Path();\r\n    this.path.append(this);\r\n\r\n    if( serverObj ){\r\n      this.fromJSON( serverObj );\r\n    }\r\n  }\r\n\r\n  ContentData.prototype = Object.create( BaseModel.prototype );\r\n  ContentData.prototype.constructor = ContentData;\r\n  ContentData.prototype.implements('Serializable');\r\n\r\n  ContentData.prototype._pathName = ContentData._pathName = 'data';\r\n\r\n  var getRecursiveParseValue = function(value, path){\r\n    if(value instanceof Object && !Array.isArray(value)){\r\n      return recursiveObjParse(value, path);\r\n    } else if(Array.isArray(value)){\r\n      return value.map(function(obj){\r\n        return getRecursiveParseValue(obj, path);\r\n      });\r\n    }\r\n    return value;\r\n  };\r\n\r\n  var recursiveObjParse = function(parentObj, path){\r\n    var retObj = {};\r\n    var parentKeys = Object.keys(parentObj);\r\n    parentKeys.forEach(function(key){\r\n      var value = parentObj[key];\r\n      if(key === '_id'){\r\n        return;\r\n      }\r\n      if(key === 'localizations'){\r\n        key = 'locales';\r\n      }\r\n\r\n      var pageKey = key+'.pagination';\r\n      if(Object.prototype.hasOwnProperty.call(parentObj,pageKey)){\r\n        retObj[key] = new Flybits.PagedData({\r\n          data: value,\r\n          paging: parentObj[pageKey],\r\n          key: key,\r\n          path: path\r\n        });\r\n      } else if(key.indexOf('.pagination') < 0){\r\n        retObj[key] = getRecursiveParseValue(value, path);\r\n      }\r\n    });\r\n\r\n    return retObj;\r\n  };\r\n\r\n  var getRecursiveSerializationValue = function(value){\r\n    if(value instanceof Flybits.PagedData){\r\n      return value.toJSON();\r\n    } else if(value instanceof Object && !Array.isArray(value)){\r\n      return recursiveObjSerialization(value);\r\n    } else if(Array.isArray(value)){\r\n      return value.map(function(obj){\r\n        return getRecursiveSerializationValue(obj);\r\n      });\r\n    }\r\n    \r\n    return value;\r\n  };\r\n\r\n  var recursiveObjSerialization = function(parentObj){\r\n    var serialized = {};\r\n    var parentKeys = Object.keys(parentObj);\r\n    parentKeys.forEach(function(key){\r\n      var value = parentObj[key];\r\n      key = key === 'locales'?'localizations':key;\r\n      serialized[key] = getRecursiveSerializationValue(value);\r\n    });\r\n\r\n    return serialized;\r\n  };\r\n\r\n  /***** Serializable function overloading *****/\r\n  ContentData.prototype.fromJSON = function( serverObj ){\r\n    if(serverObj._id){\r\n      this.id = serverObj._id;\r\n    }\r\n    this.payload = recursiveObjParse(serverObj, this.path);\r\n  };\r\n\r\n  ContentData.prototype.toJSON = function(){\r\n    var serverPayload =  recursiveObjSerialization(this.payload);\r\n    if(this.id){\r\n      serverPayload._id = this.id;\r\n    }\r\n    return serverPayload;\r\n  };\r\n\r\n  return ContentData;\r\n})();\r\n\n/*global Flybits, BaseModel*/\r\n\r\n/**\r\n * @classdesc Flybits core Module model. A Flybits Module contains a set of filtered {@link Flybits.Content} as well as associated layout UI.\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @param {Object} module Raw Flybits core model `Object` directly from API.\r\n * @param {Object} contentMap Object map of content instance IDs to {@link Flybits.Content}.\r\n */\r\nFlybits.Module = (function () {\r\n  function Module(module, contentMap) {\r\n    BaseModel.call(this, module);\r\n    this.content = [];\r\n\r\n    if (module) {\r\n      this.fromJSON(module, contentMap);\r\n    }\r\n  }\r\n\r\n  Module.prototype = Object.create(BaseModel.prototype);\r\n  Module.prototype.constructor = Module;\r\n\r\n  Module.prototype.fromJSON = function (module, contentMap) {\r\n    this.name = module.name;\r\n    this.styleCSS = module.styleCSS;\r\n    this.styleCSSURL = module.styleCSSURL;\r\n    this.layout = module.layout;\r\n    this.layoutHTML = module.layoutHTML;\r\n    this.query = module.query;\r\n    this.viewAll = module.viewAll;\r\n    this.options = module.options;\r\n    this.allowDeprioritization = !!module.allowDeprioritization;\r\n\r\n    const model = this;\r\n    if (module.contentIDs?.length && contentMap) {\r\n      module.contentIDs.forEach(function (cID) {\r\n        if (contentMap[cID]) {\r\n          model.content.push(contentMap[cID]);\r\n        }\r\n      })\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Produces module payload meant to be injected into the Concierge\r\n   * @memberof Flybits.Module\r\n   * @instance\r\n   * @function toConciergeModuleContainer\r\n   * @param {Object} [opts] Optional serialization specifications such as locale.\r\n   * @param {string} [opts.locale=en] Preferred locale key\r\n   * @returns {Object} Prepared Module payload object to be injected into a Concierge instance.\r\n   */\r\n  Module.prototype.toConciergeModuleContainer = function (opts) {\r\n    var preferredLocale = 'en';\r\n    if (opts?.locale) {\r\n      let sanitizedLocale = opts.locale.toLowerCase();\r\n      if (sanitizedLocale.indexOf('-') > -1) {\r\n        sanitizedLocale = sanitizedLocale.split('-')[0];\r\n      }\r\n      if (sanitizedLocale?.length === 2) {\r\n        preferredLocale = sanitizedLocale;\r\n      }\r\n    }\r\n\r\n    return {\r\n      id: this.id,\r\n      name: this.name,\r\n      style: this.styleCSSURL,\r\n      styleStr: this.styleCSS,\r\n      layout: this.layout,\r\n      layoutStr: this.layoutHTML,\r\n      query: this.query,\r\n      allowDeprioritization: this.allowDeprioritization,\r\n      content: this.content?.map(function (content) {\r\n        const asJson = content.toJSON()\r\n        return {\r\n          contentInfo: {\r\n            id: asJson.id,\r\n            labels: asJson.labels,\r\n            experienceIDs: content.experienceIDs,\r\n            templateType: asJson.templateType,\r\n          },\r\n          id: asJson.id,\r\n          uiTemplate: asJson.defaultUIConfig.layoutHTML,\r\n          layout: asJson.defaultUIConfig.layout,\r\n          style: asJson.defaultUIConfig.styleCSSURL,\r\n          styleStr: asJson.defaultUIConfig.styleCSS,\r\n          data: asJson.content.data?.length > 0 ? Flybits.util.Content.flattenLocales(asJson.content.data[0], preferredLocale) : []\r\n        }\r\n      })\r\n    };\r\n  }\r\n\r\n  return Module;\r\n})();\r\n\n/*global Flybits,BaseModel*/\r\n/**\r\n * @classdesc Helper representation of nested Content data arrays that are pageable.\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @implements {Flybits.interface.Serializable}\r\n * @param {Flybits.PagedData.InputObject} inputObj.\r\n */\r\nFlybits.PagedData = ( function(){\r\n  var ApiUtil = Flybits.util.Api;\r\n  var Deferred = Flybits.Deferred;\r\n\r\n  /**\r\n   * @typedef InputObject\r\n   * @memberof Flybits.PagedData\r\n   * @type Object\r\n   * @property {Flybits.Path} path Helper object that tracks depth of paged array in ancestor hierarchy for API paging purposes.\r\n   * @property {string} key Key name that paged data array is mapped to in parent object.\r\n   * @property {Object[]} data Array of paged data objects.\r\n   * @property {Object} paging Pagination information of data array.\r\n   */\r\n\r\n  function PagedData( inputObj ){\r\n    BaseModel.call( this, inputObj );\r\n    /**\r\n     * Array of nested Content data values.  As more pages are retrieved from the server this array will continue be updated.\r\n     * @instance\r\n     * @memberof Flybits.PagedData\r\n     * @member {Array} data\r\n     */\r\n    this.data = [];\r\n    if(inputObj){\r\n      this.path = inputObj.path;\r\n      this.key = inputObj.key;\r\n      var paging = {\r\n        total: inputObj.paging.totalRecords,\r\n        limit: inputObj.paging.limit,\r\n        offset: inputObj.paging.offset\r\n      };\r\n\r\n      /**\r\n       * Function to request this nested Content data's next page. Do not invoke directly as it will not update the {@link Flybits.PagedData.data|data} array.  Instead invoke {@link Flybits.PagedData#getNext}\r\n       * @instance\r\n       * @memberof Flybits.PagedData\r\n       * @member {function} nextPageFn\r\n       */\r\n      this.nextPageFn = ApiUtil.createNextPageCall(Flybits.api.ContentData.getPagedData,{\r\n        path: this.path,\r\n        key: this.key\r\n      },paging);\r\n    }\r\n\r\n    if(inputObj && inputObj.data){\r\n      this.fromJSON(inputObj.data);\r\n    }\r\n  }\r\n\r\n  PagedData.prototype = Object.create( BaseModel.prototype );\r\n  PagedData.prototype.constructor = PagedData;\r\n  PagedData.prototype.implements( 'Serializable' );\r\n\r\n  /**\r\n   * Used to check the existence of a next page of data.\r\n   * @function hasNext\r\n   * @instance\r\n   * @memberof Flybits.PagedData\r\n   * @return Truthy value depending on the existence of a {@link Flybits.PagedData.nextPageFn|next page}.\r\n   */\r\n  PagedData.prototype.hasNext = function(){\r\n    return this.nextPageFn;\r\n  };\r\n\r\n  /**\r\n   * Retrieves the next page of nested Content data and also appends it to this instance's {@link Flybits.PagedData.data|data array}.\r\n   * @function getNext\r\n   * @instance\r\n   * @memberof Flybits.PagedData\r\n   * @return {external:Promise<Array,Flybits.Validation>} Promise that resolves with the next page of nested Content data.\r\n   */\r\n  PagedData.prototype.getNext = function(){\r\n    if(!this.hasNext()){\r\n      return Promise.resolve([]);\r\n    }\r\n    var def = new Deferred();\r\n    var pagedData = this;\r\n    this.nextPageFn().then(function(resp){\r\n      pagedData.nextPageFn = resp.nextPageFn;\r\n      pagedData.data.push.apply(pagedData.data,resp.result);\r\n      def.resolve(resp.result);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  PagedData.prototype.fetchAll = function(){\r\n    var def = new Flybits.Deferred();\r\n    var pagedData = this;\r\n\r\n    var recursiveFetch = function(){\r\n      if(pagedData.hasNext()){\r\n        pagedData.getNext().then(function(){\r\n          recursiveFetch();\r\n        }).catch(function(e){\r\n          def.reject(e);\r\n        });\r\n      } else{\r\n        def.resolve(pagedData.data);\r\n      }\r\n    };\r\n    recursiveFetch();\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /***** Serializable function overloading *****/\r\n  PagedData.prototype.fromJSON = function(dataArr){\r\n    var obj = this;\r\n\r\n    for(var i = 0; i < dataArr.length; i++){\r\n      var val = dataArr[i];\r\n      if(val.constructor === Object){\r\n        if(Object.prototype.hasOwnProperty.call(val,'localizations')){\r\n          val.locales = val.localizations;\r\n          delete val.localizations;\r\n        }\r\n      }\r\n      obj.data.push(val);\r\n    }\r\n  };\r\n\r\n  PagedData.prototype.toJSON = function(){\r\n    var obj = this;\r\n    var retObj = [];\r\n\r\n    for(var i = 0; i < obj.data.length; i++){\r\n      var val = obj.data[i];\r\n      if(val.constructor === Object){\r\n        if(Object.prototype.hasOwnProperty.call(val,'locales')){\r\n          val.localizations = val.locales;\r\n          delete val.locales;\r\n        }\r\n      }\r\n      retObj.push(val);\r\n    }\r\n\r\n    return retObj;\r\n  };\r\n\r\n  return PagedData;\r\n})();\r\n\n/*global Flybits,SurveyAnswer*/\r\n/**\r\n * @classdesc Flybits core Survey model. Contains questions and can facilitate survey submission.\r\n * @deprecated\r\n * @class\r\n * @extends Flybits.Content\r\n * @memberof Flybits\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from the API.\r\n */\r\nFlybits.Survey = (function(){\r\n  var Content = Flybits.Content;\r\n  \r\n  function Survey( serverObj ){\r\n    console.warn('This class is deprecated');\r\n    Content.call( this, serverObj );\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Survey\r\n     * @member {Flybits.SurveyQuestion[]} questions Questions of the survey\r\n     */\r\n    this.questions = [];\r\n    var surveyMeta = serverObj.surveyMetadata || {};\r\n    this.resultID = surveyMeta.surveyResultInstanceID;\r\n    this.answerID = surveyMeta.surveyAnswersInstanceID;\r\n\r\n    if(this.data){\r\n      this.parseQuestions(this.data);\r\n    }\r\n  }\r\n\r\n  Survey.prototype = Object.create( Content.prototype );\r\n  Survey.prototype.constructor = Survey;\r\n  Survey.prototype.implements( 'Serializable' );\r\n\r\n  Survey.prototype.parseQuestions = function(dataObj){\r\n    var dataRoot = {};\r\n    if(dataObj && dataObj.result && dataObj.result.length){\r\n      dataRoot = dataObj.result[0].payload;\r\n    }\r\n\r\n    if(dataRoot.questions && dataRoot.questions.data){\r\n      this.questions = dataRoot.questions.data.map(function(q){\r\n        return new Flybits.SurveyQuestion(q);\r\n      });\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Retrieves questions of the survey.\r\n   * @function getQuestions\r\n   * @instance\r\n   * @memberof Flybits.Survey\r\n   * @return {external:Promise<Flybits.SurveyQuestion[],Flybits.Validation>} An array containing the questions of the survey or a `Validation` object if unsuccessful.\r\n   */\r\n  Survey.prototype.getQuestions = function(){\r\n    var survey = this;\r\n    var def = new Flybits.Deferred();\r\n    var pagedData;\r\n    this.getData().then(function(dataRoot){\r\n      pagedData = dataRoot.questions;\r\n      return pagedData.fetchAll();\r\n    }).then(function(){\r\n      survey.questions = pagedData.data.map(function(q){\r\n        return new Flybits.SurveyQuestion(q);\r\n      });\r\n      def.resolve(survey.questions);\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  var createNextPageWrapperFn = function(fn,survey){\r\n    return function(){\r\n      var def = new Flybits.Deferred();\r\n      var nextPageFn;\r\n      \r\n      fn().then(function(resp){\r\n        var fetchPromises = resp.result.map(function(obj){\r\n          return Flybits.SurveyResponse.parseResponse(obj, survey);\r\n        });\r\n        nextPageFn = resp.nextPageFn;\r\n        return Flybits.Deferred.settlePromises(fetchPromises);\r\n      }).then(function(promises){\r\n        def.resolve({\r\n          result: promises.map(function(result){\r\n            return result.result;\r\n          }),\r\n          contentID: survey.answerID,\r\n          nextPageFn: createNextPageWrapperFn(nextPageFn,survey)\r\n        });\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    };\r\n  };\r\n\r\n  /**\r\n   * Retrieves previously submitted responses to the survey.  If you are an admin you will see all responses from all users, otherwise you will only see your own responses.\r\n   * @function getResponses\r\n   * @instance\r\n   * @memberof Flybits.Survey\r\n   * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves with result object containing and array of {@link Flybits.SurveyResponse}.\r\n   */\r\n  Survey.prototype.getResponses = function(){\r\n    var survey = this;\r\n\r\n    return createNextPageWrapperFn(function(){\r\n      return Flybits.api.ContentData.getAll({\r\n        contentID: survey.answerID,\r\n        paging: {\r\n          limit: 2\r\n        }\r\n      });\r\n    },survey)();\r\n  };\r\n\r\n  /**\r\n   * Triggers the validation of all answers pertaining to all questions within the survey.\r\n   * @function validate\r\n   * @instance\r\n   * @memberof Flybits.Survey\r\n   * @return {Flybits.Validation} `Validation` instance pertaining to the result of validation checks on all question answers.\r\n   */\r\n  Survey.prototype.validate = function(){\r\n    var validation = this.questions.reduce(function(accumalator, question){\r\n      return accumalator.merge(question.validate());\r\n    }, new Flybits.Validation());\r\n    \r\n    return validation;\r\n  };\r\n\r\n  /**\r\n   * Submits a response to the survey which includes all answers to the associated questions.\r\n   * @function submit\r\n   * @instance\r\n   * @memberof Flybits.Survey\r\n   * @return {external:Promise<Flybits.api.Result,Flybits.Validation>} `Validation` instance if unsuccessful.\r\n   */\r\n  Survey.prototype.submit = function(){\r\n    var def = new Flybits.Deferred();\r\n\r\n    var answer = new SurveyAnswer({\r\n      id: this.answerID,\r\n      surveyID: this.id\r\n    });\r\n    for(var i = 0; i < this.questions.length; i++){\r\n      answer.parseAnswer(this.questions[i]);\r\n    }\r\n\r\n    Flybits.api.ContentData.submitData(answer.data).then(function(resp){\r\n      def.resolve(resp);\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  return Survey;\r\n})();\n/*global Flybits,Path*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar SurveyAnswer = (function(){\r\n  var Content = Flybits.Content;\r\n\r\n  function SurveyAnswer(obj){\r\n    console.warn('This class is deprecated');\r\n    Content.call(this, obj);\r\n    this.surveyID = obj.surveyID;\r\n    this.qAnswers = [];\r\n    this.path = new Path().append(this);\r\n    this.data = new Flybits.ContentData({},this.path);\r\n    this.data.payload = {\r\n      surveyId: this.surveyID,\r\n      answers: this.qAnswers\r\n    };\r\n  }\r\n\r\n  SurveyAnswer.prototype = Object.create(Content.prototype);\r\n  SurveyAnswer.prototype.constructor = SurveyAnswer;\r\n  SurveyAnswer.prototype._pathName = SurveyAnswer._pathName = 'content/survey/instances';\r\n\r\n  SurveyAnswer.prototype.parseAnswer = function(question){\r\n    if(question.id && !Flybits.util.Obj.isNull(question.answer)){\r\n\r\n      this.qAnswers.push({\r\n        questionNumber: question.id,\r\n        answer: question.answer instanceof Array?question.answer:[question.answer+'']\r\n      });\r\n    }\r\n\r\n    return this;\r\n  };\r\n\r\n  return SurveyAnswer;\r\n})();\n/*global Flybits*/\r\n/**\r\n * @classdesc A SurveyChoice model instance represents a possible answer to a {@link Flybits.SurveyQuestion| SurveyQuestion}.\r\n * @deprecated\r\n * @class\r\n * @memberof Flybits\r\n * @param {Object} serverObj Raw `Object` directly from the API from within the question model.\r\n */\r\nFlybits.SurveyChoice = (function(){\r\n  /**\r\n   * A dictionary mapping of locale keys to localized string values.  \r\n   * @typedef LocalizedObject\r\n   * @memberof Flybits.SurveyChoice\r\n   * @type Object\r\n   * @example\r\n   * { \r\n   *   en: 'falafel',\r\n   *   fr: 'falafel'\r\n   * }\r\n   */\r\n\r\n  function SurveyChoice(serverObj){\r\n    console.warn('This class is deprecated');\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyChoice\r\n     * @member {string} key ID of the choice.\r\n     */\r\n    this.key = serverObj.key;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyChoice\r\n     * @member {Flybits.SurveyChoice.LocalizedObject} title Localized display title for the answer choice.\r\n     */\r\n    this.title = Flybits.util.Obj.toLocaleValueMap(serverObj, 'value');\r\n  }\r\n\r\n  return SurveyChoice;\r\n})();\n/*global Flybits,SurveyValidation*/\r\n/**\r\n * @classdesc Flybits core SurveyQuestion model. A SurveyQuestion model instance represents a question within a Survey instance.\r\n * @deprecated\r\n * @class\r\n * @memberof Flybits\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from the API.\r\n */\r\nFlybits.SurveyQuestion = (function(){\r\n  \r\n  /**\r\n   * A dictionary mapping of locale keys to localized string values.  \r\n   * @typedef LocalizedObject\r\n   * @memberof Flybits.SurveyQuestion\r\n   * @type Object\r\n   * @example\r\n   * { \r\n   *   en: 'falafel',\r\n   *   fr: 'falafel'\r\n   * }\r\n   */\r\n\r\n  /**\r\n   * UI Constraints based on question type.\r\n   * @typedef UIConstraints\r\n   * @memberof Flybits.SurveyQuestion\r\n   * @type Object\r\n   * @property {Object} number UI Constraints for the `NUMBER` type of question\r\n   * @property {boolean} number.validation Flag indicating whether or not question has number constraints.\r\n   * @property {number} number.min Minimum value for a number.\r\n   * @property {number} number.max Maximum value for a number.\r\n   * @property {number} number.increment Allowed answer step size. For instance if the `increment` was set to `2` and the `min` was set to `0`, the user should only be allowed to enter `0,2,4,6,...`\r\n   */\r\n\r\n  function SurveyQuestion( serverObj ){\r\n    console.warn('This class is deprecated');\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {boolean} isRequired Flag to indicate whether or not this survey question is mandatory.\r\n     */\r\n    this.isRequired = false;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {number} id Unique identifier of survey question.\r\n     */\r\n    this.id =  0;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {Flybits.SurveyChoice[]} choices Predefined answer options for questions that only allow selection from a subset of responses. For instance questions that contain a dropdown or radio buttons/checkboxes.\r\n     */\r\n    this.choices = [];\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {Flybits.SurveyQuestion.LocalizedObject} title The localized string label of the question.\r\n     */\r\n    this.title = {};\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {string} type Question type that can be found in class {@link Flybits.SurveyQuestion.types|constants.}\r\n     */\r\n    this.type = 'shortAnswer';\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyQuestion\r\n     * @member {Flybits.SurveyQuestion.UIConstraints} meta Metadata for the question type.  This may include UI constraints based on question type.\r\n     */\r\n    this.meta = {\r\n      number: {}\r\n    };\r\n    this.answer = undefined;\r\n    this.validation = undefined;\r\n\r\n    if(serverObj){\r\n      this.fromJSON(serverObj);\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * @memberof Flybits.SurveyQuestion\r\n   * @member {Object} types Mapping of question types\r\n   * @constant\r\n   * @property {string} SHORTANSWER Short answer that should be displayed as a single line input box.\r\n   * @property {string} LONGANSWER Long answer that should be displayed as a text area input box.\r\n   * @property {string} NUMBER Answer that only accepts numbers.\r\n   * @property {string} MULTIPLECHOICE Type that allows the user to select only one answer out of multiple predefined {@link Flybits.SurveyQuestion#choices|choice options}.\r\n   * @property {string} CHECKBOXES Type that allows the user to select multiple answers out of multiple predefined {@link Flybits.SurveyQuestion#choices|choice options}.\r\n   * @property {string} DROPDOWN Type that allows the user to select only one answer out of multiple predefined {@link Flybits.SurveyQuestion#choices|choice options}.  This is different from {@link Flybits.SurveyQuestion.types|MULTIPLECHOICE} simply by its UI component.  The question choices should be displayed in a dropdown picker.\r\n   * @property {string} DATE Simple type that should provide the user with a date picker.  Dates should be stored in the form of an {@link external:ISO 8601|ISO 8601} string.\r\n   * @property {string} TIME Simple type that should provide the user with a time picker. Dates should be stored in the form of an {@link external:ISO 8601|ISO 8601} string.\r\n   */\r\n  SurveyQuestion.prototype.types = SurveyQuestion.types = {\r\n    SHORTANSWER: 'shortAnswer',\r\n    LONGANSWER: 'longAnswer',\r\n    NUMBER: 'number',\r\n    MULTIPLECHOICE: 'multipleChoice',\r\n    CHECKBOXES: 'checkboxes',\r\n    DROPDOWN: 'dropdown',\r\n    DATE: 'date',\r\n    TIME: 'time',\r\n    LOCATION: 'location',\r\n    FILEUPLOAD: 'fileUpload'\r\n  };\r\n\r\n  SurveyQuestion.prototype.fromJSON = function(serverObj){\r\n    if (serverObj.metadata) {\r\n      this.meta = JSON.parse(serverObj.metadata);\r\n    }\r\n    this.isRequired = this.meta.isRequired;\r\n    this.id = serverObj.questionNumber;\r\n    this.type = this.meta.uiType;\r\n    this.title = Flybits.util.Obj.toLocaleValueMap(serverObj, 'question');\r\n\r\n    if(serverObj.choices && serverObj.choices.length){\r\n      this.choices = serverObj.choices.map(function(choice){\r\n        return new Flybits.SurveyChoice(choice);\r\n      });\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Sets the answer of the survey question.\r\n   * @function setAnswer\r\n   * @instance\r\n   * @memberof Flybits.SurveyQuestion\r\n   * @param {string} answer Answer can be a singular string value or an array of string answers depending on question type.  Only CHECKBOXES type questions can have multiple answers.\r\n   * @return {Flybits.SurveyQuestion} The `SurveyQuestion` instance the method has been invoked upon to allow for method chaining.\r\n   */\r\n  SurveyQuestion.prototype.setAnswer = function(answer){\r\n    if(this.type !== SurveyQuestion.types.CHECKBOXES && answer instanceof Array){\r\n      throw new Flybits.Validation().addError('Invalid answer','Only CHECKBOXES type questions can contain multiple answers.',{\r\n        context: answer,\r\n        code: Flybits.Validation.type.INVALIDARG\r\n      });\r\n    }\r\n\r\n    this.answer = answer;\r\n\r\n    return this;\r\n  };\r\n\r\n  /**\r\n   * Triggers the validation of the question answer.\r\n   * @function validate\r\n   * @instance\r\n   * @memberof Flybits.SurveyQuestion\r\n   * @return {Flybits.Validation} `Validation` instance pertaining to the result of validation checks on this question's answer.\r\n   */\r\n  SurveyQuestion.prototype.validate = function(){\r\n    var validator = SurveyValidation.getValidator(this);\r\n    this.validation = validator.validate();\r\n    return this.validation;\r\n  };\r\n\r\n  return SurveyQuestion;\r\n\r\n})();\n/*global Flybits*/\r\n/**\r\n * @classdesc A SurveyResponse model instance represents a user submitted response to a {@link Flybits.Survey|Survey} instance.\r\n * @deprecated\r\n * @class\r\n * @memberof Flybits\r\n * @param {Object} serverObj Raw `Object` directly from the API.\r\n */\r\nFlybits.SurveyResponse = (function(){\r\n  /**\r\n   * A map of a {@link Flybits.SurveyQuestion|SurveyQuestion} to its corresponding answer.\r\n   * @typedef QuestionAnswerMap\r\n   * @memberof Flybits.SurveyResponse\r\n   * @type Object\r\n   * @property {Flybits.SurveyQuestion} question Full survey question model.\r\n   * @property {string|Flybits.SurveyChoice[]} answer Corresponding answer to question.  If question {@link Flybits.SurveyQuestion#type|type} is one of which that contains bucketed {@link Flybits.SurveyChoice|choice options}, then the `answer` will be an array of user selected {@link Flybits.SurveyChoice|choice options}.  Otherwise, primitive answers will simply be a `string`.\r\n   */\r\n\r\n  function SurveyResponse(serverObj){\r\n    console.warn('This class is deprecated');\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyResponse\r\n     * @member {string} id ID of reponse.  Equivalent to a {@link Flybits.ContentData|ContentData} ID.\r\n     */\r\n    this.id;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.SurveyResponse\r\n     * @member {Flybits.SurveyResponse.QuestionAnswerMap[]} answers \r\n     */\r\n    this.answers = [];\r\n    if(serverObj){\r\n      this.fromJSON(serverObj);\r\n    }\r\n  }\r\n\r\n  SurveyResponse.prototype.fromJSON = function(serverObj){\r\n    this.id = serverObj.id;\r\n  };\r\n\r\n  /**\r\n   * Factory method that creates an instance and conveniently maps raw response IDs to {@link Flybits.SurveyQuestion|SurveyQuestion} entities. \r\n   * @memberof Flybits.SurveyResponse\r\n   * @function\r\n   * @param {object} serverObj \r\n   * @param {Flybits.Survey} survey \r\n   */\r\n  SurveyResponse.parseResponse = function(serverObj,survey){\r\n    var def = new Flybits.Deferred();\r\n    var instance = new Flybits.SurveyResponse(serverObj);\r\n    var pagedAnswers = serverObj.payload.answers;\r\n\r\n    pagedAnswers.fetchAll().then(function(allAnswers){\r\n      instance.answers = allAnswers.map(function(answerObj){\r\n        var question = survey.questions.filter(function(question){\r\n          return question.id === answerObj.questionNumber;\r\n        })[0];\r\n        var answer = answerObj.answer[0];\r\n        if(question.choices.length){\r\n          answer = answerObj.answer.map(function(id){\r\n            return question.choices.filter(function(choice){\r\n              return choice.key === id;\r\n            })[0];\r\n          });\r\n        }\r\n        return {\r\n          answer: answer,\r\n          question: question\r\n        };\r\n      });\r\n      def.resolve(instance);\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  return SurveyResponse;\r\n})();\n/*global Flybits*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar SurveyValidation = (function(){\r\n  \r\n  /**\r\n   * Base Validator class\r\n   */\r\n  var BaseValidator = (function(){\r\n    function BaseValidator(question){\r\n      console.warn('This class is deprecated');\r\n      this.question = question;\r\n    }\r\n  \r\n    BaseValidator.prototype.validate = function(){\r\n      var validation = new Flybits.Validation();\r\n      if(this.question.isRequired){\r\n        if(this.question.answer instanceof Array){\r\n          var emptyAnswers = this.question.answer.filter(function(a){\r\n            return Flybits.util.Obj.isNull(a);\r\n          });\r\n          if(!this.question.answer.length || emptyAnswers.length){\r\n            validation.addError('Missing answer','This is a required question.',{\r\n              code: Flybits.Validation.type.MISSINGARG,\r\n              context: this.question\r\n            });\r\n          }\r\n        } else if(Flybits.util.Obj.isNull(this.question.answer)){\r\n          validation.addError('Missing answer','This is a required question.',{\r\n            code: Flybits.Validation.type.MISSINGARG,\r\n            context: this.question\r\n          });\r\n        }\r\n      }\r\n  \r\n      return validation;\r\n    };\r\n\r\n    return BaseValidator;\r\n  })();\r\n\r\n  /**\r\n   * Number Validator\r\n   */\r\n  var NumberValidator = (function(){\r\n    function NumberValidator(question){\r\n      BaseValidator.call(this, question);\r\n    }\r\n\r\n    NumberValidator.prototype = Object.create(BaseValidator.prototype);\r\n    NumberValidator.prototype.constructor = NumberValidator;\r\n\r\n    NumberValidator.prototype.validate = function(){\r\n      var validation = BaseValidator.prototype.validate.call(this);\r\n      if(isNaN(this.question.answer)){\r\n        validation.addError('Invalid answer type','Answer must be a number.',{\r\n          code: Flybits.Validation.type.INVALIDARG,\r\n          context: this.question\r\n        });\r\n      }\r\n\r\n      var questionMeta = this.question.meta;\r\n      if(questionMeta && questionMeta.number){\r\n        var numMeta = questionMeta.number;\r\n        if(Object.prototype.hasOwnProperty.call(numMeta,'min') && this.question.answer < numMeta.min){\r\n          validation.addError('Invalid range','Answer must be greater than or equal to '+numMeta.min,{\r\n            code: Flybits.Validation.type.INVALIDARG,\r\n            context: this.question\r\n          });\r\n        }\r\n        if(Object.prototype.hasOwnProperty.call(numMeta,'max') && this.question.answer > numMeta.max){\r\n          validation.addError('Invalid range','Answer must be less than or equal to '+numMeta.max,{\r\n            code: Flybits.Validation.type.INVALIDARG,\r\n            context: this.question\r\n          });\r\n        }\r\n        if(Object.prototype.hasOwnProperty.call(numMeta,'increment') && (this.question.answer % (((numMeta.min || 0) + numMeta.increment) !== 0) || this.question.answer === (numMeta.min || 0))){\r\n          validation.addError('Invalid range','Answer must be a multiple of '+((numMeta.min || 0)+numMeta.increment),{\r\n            code: Flybits.Validation.type.INVALIDARG,\r\n            context: this.question\r\n          });\r\n        }\r\n      }\r\n\r\n      return validation;\r\n    }\r\n  })();\r\n\r\n  var MultipleChoiceValidator = (function(){\r\n    function MultipleChoiceValidator(question){\r\n      BaseValidator.call(this, question);\r\n    }\r\n\r\n    MultipleChoiceValidator.prototype = Object.create(BaseValidator.prototype);\r\n    MultipleChoiceValidator.prototype.constructor = MultipleChoiceValidator;\r\n\r\n    MultipleChoiceValidator.prototype.validate = function(){\r\n      var validation = BaseValidator.prototype.validate.call(this);\r\n\r\n      var nullAnswers = this.question.answer.filter(function(q){\r\n        return Flybits.util.Obj.isEmpty(q);\r\n      });\r\n      \r\n      if(nullAnswers.length){\r\n        validation.addError('Invalid values','Cannot have null values',{\r\n          code: Flybits.Validation.type.INVALIDARG,\r\n          context: this.question\r\n        });\r\n      }\r\n\r\n      return validation;\r\n    };\r\n  })();\r\n\r\n  var SurveyValidation = {\r\n    validatorMap: {\r\n      shortAnswer: BaseValidator,\r\n      longAnswer: BaseValidator,\r\n      number: NumberValidator,  \r\n      multipleChoice: BaseValidator,\r\n      checkboxes: MultipleChoiceValidator,\r\n      dropdown: BaseValidator\r\n    },\r\n    getValidator: function(surveyQuestion){\r\n      var ValidatorClass = this.validatorMap[surveyQuestion.type] || BaseValidator;\r\n\r\n      return new ValidatorClass(surveyQuestion);\r\n    }\r\n  };\r\n\r\n  return SurveyValidation;\r\n})();\n/*global Flybits,BaseModel*/\r\n/**\r\n * @classdesc Flybits core user model\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @implements {Flybits.interface.Serializable}\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from API.\r\n */\r\nFlybits.User = (function(){\r\n  var ObjUtil = Flybits.util.Obj;\r\n\r\n  function User(serverObj){\r\n    BaseModel.call(this,serverObj);\r\n    if(serverObj){\r\n      this.fromJSON(serverObj);\r\n    }\r\n  }\r\n  User.prototype = Object.create(BaseModel.prototype);\r\n  User.prototype.constructor = User;\r\n  User.prototype.implements('Serializable');\r\n\r\n  /**\r\n   * @memberof Flybits.User\r\n   * @constant {Object} reqKeys Map of model properties that can be used to order by and search for this model.  Currently comprising of, `id`, `email`, `firstName`, and `lastName`\r\n   */\r\n  User.prototype.reqKeys = User.reqKeys = ObjUtil.extend(BaseModel.prototype.reqKeys,{\r\n    email: 'email',\r\n    firstName: 'firstName',\r\n    lastName: 'lastName'\r\n  });\r\n\r\n  User.prototype.fromJSON = function(serverObj){\r\n    if(serverObj && serverObj.id){\r\n      this.id = serverObj.id;\r\n    }\r\n    \r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.User\r\n     * @member {string} email Registered email of the user.\r\n     */\r\n    this.email = serverObj.email;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.User\r\n     * @member {string} firstName First name of the user.\r\n     */\r\n    this.firstName = serverObj.firstName;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.User\r\n     * @member {string} lastName Last name of the user.\r\n     */\r\n    this.lastName = serverObj.lastName;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.User\r\n     * @member {boolean} isConfirmed Flag indicating whether or not this user has successfully verified their account.\r\n     */\r\n    this.isConfirmed = serverObj.isConfirmed;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.User\r\n     * @member {number} permissionLevel Permission level of the signed in user.\r\n     */\r\n    this.permissionLevel = serverObj.level;\r\n\r\n    return this;\r\n  };\r\n\r\n  User.prototype.toJSON = function(){\r\n    var retObj = {\r\n      email: this.email,\r\n      firstName: this.firstName,\r\n      lastName: this.lastName,\r\n      isConfirmed: this.isConfirmed,\r\n      level: this.permissionLevel\r\n    };\r\n\r\n    if(this.id){\r\n      retObj.id = this.id;\r\n    }\r\n\r\n    return retObj;\r\n  };\r\n\r\n  return User;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc Standard class used across the SDK to indicate the state of an asynchronous validation event or error.  It is comprised of a `state` which indicates the result of an operation and also an `errors` array should the `state` be `false`.  This class is often used as the error object returned from API operations and also as the result of model based validation which can incur multiple errors at once.\r\n * @class\r\n * @memberof Flybits\r\n */\r\nFlybits.Validation = (function(){\r\n  /**\r\n   * @typedef ValidationError\r\n   * @memberof Flybits.Validation\r\n   * @type Object\r\n   * @property {string} header Generally a short and broad error message\r\n   * @property {string} message A more in depth explanation of the error.\r\n   * @property {string} context This is populated if an error occurs that relates to one of the input properties of an operation and will be the property's key.\r\n   * @property {number} code An internal error code indicating error type. This property is only populated when errors that can be discerned by the SDK occur. Errors that occur server side and cannot be discerned by the SDK will populate an HTTP status code in the `serverCode` property.  For instance, if you forget to supply required property the `code` property would be populated with `Flybits.Validation.type.MISSINGARG`.  On the other hand if there's a server outage, the `serverCode` would be populated with a 404 or 500.\r\n   * @property {number} serverCode This is populated with an HTTP status code when a server side error occurs that cannot be discerned by the SDK.\r\n   */\r\n\r\n  function Validation(){\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @member {boolean} state Indicates the resultant state of an asynchronous task.\r\n     */\r\n    this.state = true;\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @member {Flybits.Validation.ValidationError[]} errors An array of errors that have accumulated because of an asynchronous task.\r\n     */\r\n    this.errors = [];\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @member {string} stacktrace Stacktrace of where the Validation model was created.  Ideally it should mark where the error has occurred.  This can be explicitly marked by calling {@link Flybits.Validation#setStackTrace}\r\n     */\r\n    this.stacktrace = '';\r\n\r\n    this.setStackTrace();\r\n  }\r\n\r\n  Validation.prototype = {\r\n    /**\r\n     * Used to add error objects to the `Validation` instance.\r\n     * @function\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @param {string} header Generally a short and broad error message\r\n     * @param {string} message A more in depth explanation of the error.\r\n     * @param {Object} detailsObj Optional extra details about the error.\r\n     * @param {string} detailsObj.context This is populated if an error occurs that relates to one of the input properties of an operation and will be the property's key.\r\n     * @param {number} detailsObj.code An internal error code indicating error type. This property is only populated when errors that can be discerned by the SDK occur. Errors that occur server side and cannot be discerned by the SDK will populate an HTTP status code in the `serverCode` property.  For instance, if you forget to supply required property the `code` property would be populated with `Flybits.Validation.type.MISSINGARG`.  On the other hand if there's a server outage, the `serverCode` would be populated with a 404 or 500.\r\n     * @param {number} detailsObj.serverCode This is populated with an HTTP status code when a server side error occurs that cannot be discerned by the SDK.\r\n     * @return {Flybits.Validation} The `Validation` instance the method has been invoked upon to allow for method chaining.\r\n     */\r\n    addError: function(header,message,detailsObj){\r\n      this.state = false;\r\n      var retObj = {\r\n        header: header,\r\n        message: message\r\n      };\r\n      if(detailsObj){\r\n        retObj.context = detailsObj.context;\r\n        retObj.code = detailsObj.code;\r\n        retObj.serverCode = detailsObj.serverCode;\r\n      }\r\n      this.errors.push(retObj);\r\n\r\n      return this;\r\n    },\r\n    /**\r\n     * Used to merge two validation objects together.\r\n     * @function\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @param {Flybits.Validation} validation The `Validation` instance that is to be merged into this instance.\r\n     * @return {Flybits.Validation} The `Validation` instance the method has been invoked upon to allow for method chaining.\r\n     */\r\n    merge: function(validation){\r\n      Array.prototype.push.apply(this.errors,validation.errors);\r\n      this.state = this.errors.length < 1;\r\n\r\n      return this;\r\n    },\r\n    /**\r\n     * Used to retrieve the first available error if available.\r\n     * @function\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @return {Flybits.Validation.ValidationError} First available error if validation state is `false` and errors have been found.\r\n     * @return {null} `null` if no errors are available.\r\n     */\r\n    firstError: function(){\r\n      if(this.errors.length > 0){\r\n        return this.errors[0];\r\n      }\r\n      return null;\r\n    },\r\n    /**\r\n     * Sets the stack trace origin point.  This is useful for when the `Validation`\r\n     * instance is created early in a code block but only sent in the promise \r\n     * rejection later in a code block.\r\n     * @function\r\n     * @instance\r\n     * @memberof Flybits.Validation\r\n     * @return {Flybits.Validation} The `Validation` instance the method has been invoked upon to allow for method chaining.\r\n     */\r\n    setStackTrace: function(){\r\n      var flyError = new Error();\r\n      flyError.name = 'FlybitsError';\r\n      this.stacktrace = flyError.stack;\r\n      if(this.stacktrace){\r\n        this.stacktrace = this.stacktrace.split('\\n').filter(function(str){\r\n          return str.indexOf('Validation') < 0;\r\n        }).join('\\n');\r\n      }\r\n      return this;\r\n    },\r\n\r\n    toJSON: function(){\r\n      return {\r\n        state: this.state,\r\n        errors: this.errors,\r\n        stacktrace: this.stacktrace\r\n      };\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Static method parses a JSON string constructing a `Flybits.Validation` instance.\r\n   * @memberof Flybits.Validation\r\n   * @static\r\n   * @function parse\r\n   * @param {string} str JSON string to be parsed.\r\n   * @returns {Flybits.Validation} Validation instance based on string input.\r\n   * @throws {TypeError} Invalid JSON structures that do not represent a `Flybits.Validation` instance will throw this error.\r\n   * @throws {SyntaxError} Invalid JSON strings will throw this error.\r\n   */\r\n  Validation.prototype.parse = Validation.parse = function(str){\r\n    var obj = JSON.parse(str);\r\n    return Validation.parseObj(obj);\r\n  };\r\n\r\n  /**\r\n   * Static method parses an Object constructing a `Flybits.Validation` instance.\r\n   * @memberof Flybits.Validation\r\n   * @static\r\n   * @function parseObj\r\n   * @param {Object} obj Object to be parsed.\r\n   * @returns {Flybits.Validation} Validation instance based on string input.\r\n   * @throws {TypeError} Invalid JSON structures that do not represent a `Flybits.Validation` instance will throw this error.\r\n   */\r\n  Validation.prototype.parseObj = Validation.parseObj = function(obj){\r\n    var validation = new Validation();\r\n    if(!Object.prototype.hasOwnProperty.call(obj, 'state')){\r\n      throw new TypeError('Missing \\'state\\' attribute');\r\n    } else if(typeof obj.state !== 'boolean'){\r\n      throw new TypeError('Unexpected type \\'state\\'. Expected boolean attribute');\r\n    }\r\n    if(!Object.prototype.hasOwnProperty.call(obj,'errors')){\r\n      throw new TypeError('Missing \\'errors\\' array attribute');\r\n    }\r\n    if(obj.stacktrace){\r\n      validation.stack = obj.stacktrace;\r\n    }\r\n    validation.state = obj.state;\r\n    validation.errors = obj.errors.map(function(errObj){\r\n      if(!Object.prototype.hasOwnProperty.call(errObj,'header')){\r\n        throw new TypeError('Missing \\'errors[].header\\' attribute');\r\n      }\r\n      if(!Object.prototype.hasOwnProperty.call(errObj,'message')){\r\n        throw new TypeError('Missing \\'errors[].message\\' attribute');\r\n      }\r\n      if(!Object.prototype.hasOwnProperty.call(errObj,'code') && !Object.prototype.hasOwnProperty.call(errObj,'serverCode')){\r\n        throw new TypeError('Missing \\'errors[].code\\' and/or \\'errors[].serverCode\\' attribute');\r\n      }\r\n\r\n      return errObj;\r\n    });\r\n\r\n    return validation;\r\n  };\r\n\r\n  /**\r\n   * @member {Object} type A mapping of SDK error codes.\r\n   * @memberof Flybits.Validation\r\n   * @constant\r\n   * @property {number} MALFORMED=1000 This error is usually thrown when an input property supplied to an library operation is incorrectly formatted, or sometimes a server response is not recognized by the library.\r\n   * @property {number} INVALIDARG=1001 This error is thrown when an input property supplied to an library operation is semantically incorrect.\r\n   * @property {number} MISSINGARG=1002 This error is thrown when a required property is not supplied to an library operation.\r\n   * @property {number} NOTFOUND=1003 Usually thrown when model retrieval has yielded no results with provided input parameters.\r\n   * @property {number} CONNECTIONERROR=1004 Error thrown when the library loses connection to particular resources.\r\n   * @property {number} UNAUTHENTICATED=1005 Error is thrown when library operation requires authentication and current session is not found or expired.\r\n   * @property {number} RETRIEVALERROR=1006 This error is thrown when any retrieval library operation fails to complete.\r\n   * @property {number} NOTSUPPORTED=1007 Error is thrown when an operation or entity is not supported by the library.\r\n   * @property {number} UNEXPECTED=1008 Error is thrown when an operation failed due to unexpected behavior.\r\n   * @property {number} NOOP=1009 Error is thrown when an operation ceases execution and requires no follow up action.  This could be an intentional valid scenario.\r\n   */\r\n  Validation.prototype.type = Validation.type = {};\r\n  Validation.prototype.type.MALFORMED = Validation.type.MALFORMED = 1000;\r\n  Validation.prototype.type.INVALIDARG = Validation.type.INVALIDARG = 1001;\r\n  Validation.prototype.type.MISSINGARG = Validation.type.MISSINGARG = 1002;\r\n  Validation.prototype.type.NOTFOUND = Validation.type.NOTFOUND = 1003;\r\n  Validation.prototype.type.CONNECTIONERROR = Validation.type.CONNECTIONERROR = 1004;\r\n  Validation.prototype.type.UNAUTHENTICATED = Validation.type.UNAUTHENTICATED = 1005;\r\n  Validation.prototype.type.RETRIEVALERROR = Validation.type.RETRIEVALERROR = 1006;\r\n  Validation.prototype.type.NOTSUPPORTED = Validation.type.NOTSUPPORTED = 1007;\r\n  Validation.prototype.type.UNEXPECTED = Validation.type.UNEXPECTED = 1008;\r\n  Validation.prototype.type.NOOP = Validation.type.NOOP = 1009;\r\n\r\n  return Validation;\r\n})();\r\n\n/*global Flybits, BaseModel*/\r\n\r\n/**\r\n * @classdesc Flybits core Zone class. A Zone represents an embeddable container meant to be injected into the digital channel.\r\n * @class\r\n * @memberof Flybits\r\n * @extends BaseModel\r\n * @param {Object} zone Raw Flybits core model `Object` directly from API.\r\n * @param {Object} modulesMap Object map of module IDs to {@link Flybits.Module}\r\n */\r\nFlybits.Zone = (function () {\r\n  function Zone(zone, modulesMap) {\r\n    BaseModel.call(this, zone);\r\n    this.modules = [];\r\n    \r\n    if (zone) {\r\n      this.fromJSON(zone, modulesMap);\r\n    }\r\n  }\r\n\r\n  Zone.prototype = Object.create(BaseModel.prototype);\r\n  Zone.prototype.constructor = Zone;\r\n\r\n  Zone.prototype.fromJSON = function (zone, modulesMap) {\r\n    this.labels = zone.labels;\r\n    this.height = zone.height;\r\n    this.name = zone.name;\r\n    this.referenceID = zone.referenceID;\r\n\r\n    const model = this;\r\n    if(zone.modulesIDs?.length && modulesMap){\r\n      zone.modulesIDs.forEach(function(mID){\r\n        if(modulesMap[mID]){\r\n          model.modules.push(modulesMap[mID]);\r\n        }\r\n      });\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.Zone\r\n   * @instance\r\n   * @function toConciergeContainer\r\n   * @param {Object} [opts] Optional serialization specifications such as locale and text direction.\r\n   * @param {string} [opts.textDirection=ltr] Text direction based on language type. Supports: 'ltr','rtl','auto'.\r\n   * @param {string} [opts.locale=en] [Two character locale key](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) (eg. en, fr, es, etc) that specifies the preferred locale by which to render content.\r\n   * @returns {Object} Prepared Zone payload object to be injected into a Concierge instance. \r\n   */\r\n  Zone.prototype.toConciergeContainer = function (opts) {\r\n    var textDir = 'ltr';\r\n\r\n    switch(opts?.textDirection) {\r\n    case 'rtl':\r\n    case 'auto':\r\n      textDir = opts?.textDirection\r\n      break;\r\n    }\r\n    \r\n    return {\r\n      name: this.name,\r\n      textDirection: textDir,\r\n      containers: this.modules?.map(function (module) {\r\n        return module.toConciergeModuleContainer(opts); \r\n      }),\r\n    };\r\n  };\r\n\r\n  return Zone;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc Flybits core ZonesMetadata class. ZoneMetadata contains a list of non-sensitive metadata (eg. height) for all available Zones in a Flybits project.\r\n * @class\r\n * @memberof Flybits\r\n * @param {Object} serverObj Raw Flybits core model `Object` directly from API.\r\n */\r\nFlybits.ZonesMetadata = (function () {\r\n  var Zone = Flybits.Zone;\r\n\r\n  function ZonesMetadata(serverObj) {\r\n    if (serverObj) {\r\n      this.fromJSON(serverObj);\r\n    }\r\n  }\r\n\r\n  ZonesMetadata.prototype.fromJSON = function (serverObj) {\r\n    this.zones = serverObj.zones\r\n      .filter(\r\n        (e) =>\r\n          e.height !== undefined &&\r\n          e.height > 0 &&\r\n          e.referenceID !== undefined &&\r\n          e.referenceID.length > 0\r\n      )\r\n      .map((e) => new Zone(e));\r\n  };\r\n\r\n  /**\r\n   * @typedef ZoneMetadata\r\n   * @memberof Flybits.ZonesMetadata\r\n   * @type Flybits.Zone\r\n   * @property {string} id Zone ID.\r\n   * @property {string} name Zone name.\r\n   * @property {string} referenceID Zone Reference ID.\r\n   * @property {string[]} labels List of labels categorizing the Zone.\r\n   * @property {number} height Pixel height of entire Zone container.\r\n   */\r\n\r\n  /**\r\n   * Returns a list of Zone metadata for specified Zone Reference IDs.\r\n   * @memberof Flybits.ZonesMetadata\r\n   * @instance\r\n   * @function getZones\r\n   * @property {string[]} referenceIDs Array of Zone Reference IDs.\r\n   * @return {Flybits.ZonesMetadata.ZoneMetadata} List of Zone metadata for specified zones.\r\n   * >**Note:** Results may appear of type {@link Flybits.Zone} however only metadata attributes will be populated as defined in {@link Flybits.ZonesMetadata.ZoneMetadata}\r\n   */\r\n  ZonesMetadata.prototype.getZones = function (referenceIDs) {\r\n    return this.zones.filter((e) => referenceIDs.includes(e.referenceID));\r\n  };\r\n\r\n  return ZonesMetadata;\r\n})();\r\n\n/*global Flybits,ForageStore,IDBStore,LocalStorageStore,FileStore,MemoryStore*/\r\nFlybits.store.Property = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var _ready = new Deferred();\r\n\r\n  var resolveStorageEngine = function(){\r\n    var def = new Deferred();\r\n    var availableStorage = [ForageStore,IDBStore,LocalStorageStore,CookieStore,FileStore,MemoryStore];\r\n    var checkStorageEngine = function(){\r\n      if(availableStorage.length < 1){\r\n        def.reject(new Validation().addError('No supported property storage engines'))\r\n      }\r\n      var CurEngine = availableStorage.shift();\r\n      CurEngine.isSupported().then(function(){\r\n        def.resolve(new CurEngine(Flybits.cfg.store.SDKPROPS));\r\n      }).catch(function(){\r\n        checkStorageEngine();\r\n      });\r\n    };\r\n    checkStorageEngine();\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  var Property = {\r\n    ready: _ready.promise,\r\n    init: function(){\r\n      var property = this;\r\n      var engineInit = resolveStorageEngine();\r\n      engineInit.then(function(engine){\r\n        property.storageEngine = engine;\r\n        _ready.resolve();\r\n      });\r\n      return engineInit;\r\n    },\r\n    remove: function(key){\r\n      return this.storageEngine.removeItem(key);\r\n    },\r\n    set: function(key, value){\r\n      if(!value){\r\n        return this.remove(key);\r\n      }\r\n      return this.storageEngine.setItem(key, value);\r\n    },\r\n    get: function(key){\r\n      return this.storageEngine.getItem(key);\r\n    }\r\n  };\r\n\r\n  return Property;\r\n})();\r\n\n/*global Flybits,BaseObj,ForageStore,IDBStore,FileStore,MemoryStore*/\r\nFlybits.store.Record = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  var resolveStorageEngine = function(storeName){\r\n    var def = new Deferred();\r\n    var availableStorage = [ForageStore,IDBStore,FileStore,MemoryStore];\r\n    var checkStorageEngine = function(){\r\n      if(availableStorage.length < 1){\r\n        def.reject(new Validation().addError('No supported property storage engines'))\r\n      }\r\n      var CurEngine = availableStorage.shift();\r\n      CurEngine.isSupported().then(function(){\r\n        def.resolve(new CurEngine(storeName));\r\n      }).catch(function(){\r\n        checkStorageEngine();\r\n      });\r\n    };\r\n    checkStorageEngine();\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  function RecordStore(storeName){\r\n    BaseObj.call(this);\r\n    var store = this;\r\n    this.storeName = storeName || 'flb.records.'+Date.now();\r\n    var def = new Deferred();\r\n    this.ready = def.promise;\r\n\r\n    var engineInit = resolveStorageEngine(this.storeName);\r\n    engineInit.then(function(engine){\r\n      store.storageEngine = engine;\r\n      def.resolve();\r\n    });\r\n  }\r\n\r\n  RecordStore.prototype = Object.create(BaseObj.prototype);\r\n  RecordStore.prototype.constructor = RecordStore;\r\n\r\n  RecordStore.prototype.remove = function(key){\r\n    return this.storageEngine.removeItem(key);\r\n  };\r\n  RecordStore.prototype.set = function(key, value){\r\n    if(!value){\r\n      return this.remove(key);\r\n    }\r\n    return this.storageEngine.setItem(key, value);\r\n  };\r\n  RecordStore.prototype.get = function(key){\r\n    return this.storageEngine.getItem(key);\r\n  };\r\n  RecordStore.prototype.keys = function(){\r\n    return this.storageEngine.getKeys();\r\n  };\r\n  RecordStore.prototype.clear = function(){\r\n    return this.storageEngine.clearAll();\r\n  };\r\n\r\n  return RecordStore;\r\n})();\n/*global Flybits,BaseObj*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar CookieStore = Flybits.store._storageEngines.CookieStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var BrowserUtil = Flybits.util.Browser;\r\n\r\n  function CookieStore(){\r\n    BaseObj.call(this);\r\n  }\r\n\r\n  CookieStore.prototype = Object.create(BaseObj.prototype);\r\n  CookieStore.prototype.constructor = CookieStore;\r\n  CookieStore.prototype.implements('PropertyStore');\r\n\r\n  CookieStore.prototype.isSupported = CookieStore.isSupported = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n    var support = typeof document === 'object' && 'cookie' in document;\r\n    if(support){\r\n      try{\r\n        BrowserUtil.setCookie('flbstoresupport','true');\r\n        BrowserUtil.setCookie('flbstoresupport','true',new Date(0));\r\n        def.resolve();\r\n      } catch(e){\r\n        def.reject(validation.addError('Storage not supported','Access error:' + e,{\r\n          context: 'cookie'\r\n        }));\r\n      }\r\n    } else{\r\n      def.reject(validation.addError('Storage not supported','Missing reference in namespace.',{\r\n        context: 'cookie'\r\n      }));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  CookieStore.prototype.getItem = function(key){\r\n    return Promise.resolve(BrowserUtil.getCookie(key));\r\n  };\r\n  CookieStore.prototype.setItem = function(key, value){\r\n    BrowserUtil.setCookie(key, value);\r\n    return Promise.resolve();\r\n  };\r\n  CookieStore.prototype.removeItem = function(key){\r\n    BrowserUtil.setCookie(key, '', new Date(0));\r\n    return Promise.resolve();\r\n  };\r\n\r\n  return CookieStore;\r\n\r\n})();\n/*global Flybits,BaseObj,Persistence*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar FileStore = Flybits.store._storageEngines.FileStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  function FileStore(storeName){\r\n    BaseObj.call(this);\r\n    storeName = storeName || 'flb.general';\r\n    this.cache = {};\r\n    this.promiseQueue = [];\r\n    this.storage = Persistence.create({\r\n      dir: Flybits.cfg.store.RESOURCEPATH + '/'+storeName,\r\n      writeQueue: true,\r\n    });\r\n    this.storage.initSync();\r\n  }\r\n\r\n  FileStore.prototype = Object.create(BaseObj.prototype);\r\n  FileStore.prototype.constructor = FileStore;\r\n  FileStore.prototype.implements('PropertyStore');\r\n\r\n  FileStore.prototype.isSupported = FileStore.isSupported = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n    var support = typeof fs === 'object' && typeof Persistence === 'object' && typeof __dirname === 'string';\r\n    if(support){\r\n      def.resolve();\r\n    } else{\r\n      def.reject(validation.addError('Storage not supported','Missing reference in namespace.',{\r\n        context: 'fs'\r\n      }));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  FileStore.prototype.getItem = function(key){\r\n    return this.cache[key] ? \r\n      Promise.resolve(JSON.parse(JSON.stringify(this.cache[key]))):\r\n      this.storage.getItem(key);\r\n  };\r\n  FileStore.prototype.setItem = function(key, value){\r\n    let def = new Deferred();\r\n    if(!value){\r\n      return this.removeItem(key);\r\n    } else{\r\n      this.cache[key] = JSON.parse(JSON.stringify(value));\r\n      const promise = this.storage.setItem(key,value);\r\n      const queueObj = {\r\n        key: key, \r\n        promise: promise\r\n      };\r\n      this.promiseQueue.push(queueObj);\r\n      promise.catch(() => {}).then(() => {\r\n        Flybits.util.Obj.removeObject(this.promiseQueue, queueObj);\r\n        def.resolve();\r\n      });\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n  FileStore.prototype.removeItem = function(key){\r\n    let def = new Deferred();\r\n    delete this.cache[key];\r\n    let foundPromise = Promise.resolve();\r\n    for(let i = this.promiseQueue.length-1; i >= 0; i--){\r\n      let queueObj = this.promiseQueue[i];\r\n      if(queueObj.key === key){\r\n        foundPromise = queueObj.promise;\r\n        break;\r\n      }\r\n    }\r\n\r\n    foundPromise.catch(() => {} ).then(async () => {\r\n      await this.storage.removeItem(key);\r\n      def.resolve();\r\n    })\r\n\r\n    return def.promise;\r\n  };\r\n  FileStore.prototype.getKeys = function(){\r\n    const cachedKeys = Object.keys(this.cache);\r\n    return cachedKeys.length ? \r\n      cachedKeys :\r\n      this.storage.keys();\r\n  };\r\n  FileStore.prototype.clearAll = function(){\r\n    this.cache = {};\r\n    return this.storage.clear();\r\n  };\r\n\r\n  return FileStore;\r\n\r\n})();\n/*global Flybits,BaseObj,localforage*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar ForageStore = Flybits.store._storageEngines.ForageStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  function ForageStore(storeName){\r\n    BaseObj.call(this);\r\n    this.store = localforage.createInstance({\r\n      name: storeName\r\n    });\r\n  }\r\n\r\n  ForageStore.prototype = Object.create(BaseObj.prototype);\r\n  ForageStore.prototype.constructor = ForageStore;\r\n  ForageStore.prototype.implements('PropertyStore');\r\n\r\n  ForageStore.prototype.isSupported = ForageStore.isSupported = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n    var support = typeof window === 'object' && Object.prototype.hasOwnProperty.call(window,'localforage');\r\n    if(support){\r\n      localforage.setItem('flbstoresupport',true).then(function(){\r\n        return localforage.removeItem('flbstoresupport');\r\n      }).then(function(){\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(validation.addError('Storage not supported','Access error:' + e,{\r\n          context: 'localforage'\r\n        }));\r\n      });\r\n    } else{\r\n      def.reject(validation.addError('Storage not supported','No library detected',{\r\n        context: 'localforage'\r\n      }));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  ForageStore.prototype.getItem = function(key){\r\n    return this.store.getItem(key);\r\n  };\r\n  ForageStore.prototype.setItem = function(key, value){\r\n    return this.store.setItem(key, value);\r\n  };\r\n  ForageStore.prototype.removeItem = function(key){\r\n    return this.store.removeItem(key);\r\n  };\r\n  ForageStore.prototype.getKeys = function(){\r\n    return this.store.keys();\r\n  };\r\n  ForageStore.prototype.clearAll = function(){\r\n    return this.store.clear();\r\n  };\r\n\r\n  return ForageStore;\r\n\r\n})();\nvar IDB = function() {\r\n  function toArray(arr) {\r\n    return Array.prototype.slice.call(arr);\r\n  }\r\n\r\n  function promisifyRequest(request) {\r\n    return new Promise(function(resolve, reject) {\r\n      request.onsuccess = function() {\r\n        resolve(request.result);\r\n      };\r\n\r\n      request.onerror = function() {\r\n        reject(request.error);\r\n      };\r\n    });\r\n  }\r\n\r\n  function promisifyRequestCall(obj, method, args) {\r\n    var request;\r\n    var p = new Promise(function(resolve, reject) {\r\n      request = obj[method].apply(obj, args);\r\n      promisifyRequest(request).then(resolve, reject);\r\n    });\r\n\r\n    p.request = request;\r\n    return p;\r\n  }\r\n\r\n  function promisifyCursorRequestCall(obj, method, args) {\r\n    var p = promisifyRequestCall(obj, method, args);\r\n    return p.then(function(value) {\r\n      if (!value) return;\r\n      return new Cursor(value, p.request);\r\n    });\r\n  }\r\n\r\n  function proxyProperties(ProxyClass, targetProp, properties) {\r\n    properties.forEach(function(prop) {\r\n      Object.defineProperty(ProxyClass.prototype, prop, {\r\n        get: function() {\r\n          return this[targetProp][prop];\r\n        },\r\n        set: function(val) {\r\n          this[targetProp][prop] = val;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  function proxyRequestMethods(ProxyClass, targetProp, Constructor, properties) {\r\n    properties.forEach(function(prop) {\r\n      if (!(prop in Constructor.prototype)) return;\r\n      ProxyClass.prototype[prop] = function() {\r\n        return promisifyRequestCall(this[targetProp], prop, arguments);\r\n      };\r\n    });\r\n  }\r\n\r\n  function proxyMethods(ProxyClass, targetProp, Constructor, properties) {\r\n    properties.forEach(function(prop) {\r\n      if (!(prop in Constructor.prototype)) return;\r\n      ProxyClass.prototype[prop] = function() {\r\n        return this[targetProp][prop].apply(this[targetProp], arguments);\r\n      };\r\n    });\r\n  }\r\n\r\n  function proxyCursorRequestMethods(ProxyClass, targetProp, Constructor, properties) {\r\n    properties.forEach(function(prop) {\r\n      if (!(prop in Constructor.prototype)) return;\r\n      ProxyClass.prototype[prop] = function() {\r\n        return promisifyCursorRequestCall(this[targetProp], prop, arguments);\r\n      };\r\n    });\r\n  }\r\n\r\n  function Index(index) {\r\n    this._index = index;\r\n  }\r\n\r\n  proxyProperties(Index, '_index', [\r\n    'name',\r\n    'keyPath',\r\n    'multiEntry',\r\n    'unique'\r\n  ]);\r\n\r\n  proxyRequestMethods(Index, '_index', IDBIndex, [\r\n    'get',\r\n    'getKey',\r\n    'getAll',\r\n    'getAllKeys',\r\n    'count'\r\n  ]);\r\n\r\n  proxyCursorRequestMethods(Index, '_index', IDBIndex, [\r\n    'openCursor',\r\n    'openKeyCursor'\r\n  ]);\r\n\r\n  function Cursor(cursor, request) {\r\n    this._cursor = cursor;\r\n    this._request = request;\r\n  }\r\n\r\n  proxyProperties(Cursor, '_cursor', [\r\n    'direction',\r\n    'key',\r\n    'primaryKey',\r\n    'value'\r\n  ]);\r\n\r\n  proxyRequestMethods(Cursor, '_cursor', IDBCursor, [\r\n    'update',\r\n    'delete'\r\n  ]);\r\n\r\n  // proxy 'next' methods\r\n  ['advance', 'continue', 'continuePrimaryKey'].forEach(function(methodName) {\r\n    if (!(methodName in IDBCursor.prototype)) return;\r\n    Cursor.prototype[methodName] = function() {\r\n      var cursor = this;\r\n      var args = arguments;\r\n      return Promise.resolve().then(function() {\r\n        cursor._cursor[methodName].apply(cursor._cursor, args);\r\n        return promisifyRequest(cursor._request).then(function(value) {\r\n          if (!value) return;\r\n          return new Cursor(value, cursor._request);\r\n        });\r\n      });\r\n    };\r\n  });\r\n\r\n  function ObjectStore(store) {\r\n    this._store = store;\r\n  }\r\n\r\n  ObjectStore.prototype.createIndex = function() {\r\n    return new Index(this._store.createIndex.apply(this._store, arguments));\r\n  };\r\n\r\n  ObjectStore.prototype.index = function() {\r\n    return new Index(this._store.index.apply(this._store, arguments));\r\n  };\r\n\r\n  proxyProperties(ObjectStore, '_store', [\r\n    'name',\r\n    'keyPath',\r\n    'indexNames',\r\n    'autoIncrement'\r\n  ]);\r\n\r\n  proxyRequestMethods(ObjectStore, '_store', IDBObjectStore, [\r\n    'put',\r\n    'add',\r\n    'delete',\r\n    'clear',\r\n    'get',\r\n    'getAll',\r\n    'getKey',\r\n    'getAllKeys',\r\n    'count'\r\n  ]);\r\n\r\n  proxyCursorRequestMethods(ObjectStore, '_store', IDBObjectStore, [\r\n    'openCursor',\r\n    'openKeyCursor'\r\n  ]);\r\n\r\n  proxyMethods(ObjectStore, '_store', IDBObjectStore, [\r\n    'deleteIndex'\r\n  ]);\r\n\r\n  function Transaction(idbTransaction) {\r\n    this._tx = idbTransaction;\r\n    this.complete = new Promise(function(resolve, reject) {\r\n      idbTransaction.oncomplete = function() {\r\n        resolve();\r\n      };\r\n      idbTransaction.onerror = function() {\r\n        reject(idbTransaction.error);\r\n      };\r\n      idbTransaction.onabort = function() {\r\n        reject(idbTransaction.error);\r\n      };\r\n    });\r\n  }\r\n\r\n  Transaction.prototype.objectStore = function() {\r\n    return new ObjectStore(this._tx.objectStore.apply(this._tx, arguments));\r\n  };\r\n\r\n  proxyProperties(Transaction, '_tx', [\r\n    'objectStoreNames',\r\n    'mode'\r\n  ]);\r\n\r\n  proxyMethods(Transaction, '_tx', IDBTransaction, [\r\n    'abort'\r\n  ]);\r\n\r\n  function UpgradeDB(db, oldVersion, transaction) {\r\n    this._db = db;\r\n    this.oldVersion = oldVersion;\r\n    this.transaction = new Transaction(transaction);\r\n  }\r\n\r\n  UpgradeDB.prototype.createObjectStore = function() {\r\n    return new ObjectStore(this._db.createObjectStore.apply(this._db, arguments));\r\n  };\r\n\r\n  proxyProperties(UpgradeDB, '_db', [\r\n    'name',\r\n    'version',\r\n    'objectStoreNames'\r\n  ]);\r\n\r\n  proxyMethods(UpgradeDB, '_db', IDBDatabase, [\r\n    'deleteObjectStore',\r\n    'close'\r\n  ]);\r\n\r\n  function DB(db) {\r\n    this._db = db;\r\n  }\r\n\r\n  DB.prototype.transaction = function() {\r\n    return new Transaction(this._db.transaction.apply(this._db, arguments));\r\n  };\r\n\r\n  proxyProperties(DB, '_db', [\r\n    'name',\r\n    'version',\r\n    'objectStoreNames'\r\n  ]);\r\n\r\n  proxyMethods(DB, '_db', IDBDatabase, [\r\n    'close'\r\n  ]);\r\n\r\n  // Add cursor iterators\r\n  // TODO: remove this once browsers do the right thing with promises\r\n  ['openCursor', 'openKeyCursor'].forEach(function(funcName) {\r\n    [ObjectStore, Index].forEach(function(Constructor) {\r\n      Constructor.prototype[funcName.replace('open', 'iterate')] = function() {\r\n        var args = toArray(arguments);\r\n        var callback = args[args.length - 1];\r\n        var nativeObject = this._store || this._index;\r\n        var request = nativeObject[funcName].apply(nativeObject, args.slice(0, -1));\r\n        request.onsuccess = function() {\r\n          callback(request.result);\r\n        };\r\n      };\r\n    });\r\n  });\r\n\r\n  // polyfill getAll\r\n  [Index, ObjectStore].forEach(function(Constructor) {\r\n    if (Constructor.prototype.getAll) return;\r\n    Constructor.prototype.getAll = function(query, count) {\r\n      var instance = this;\r\n      var items = [];\r\n\r\n      return new Promise(function(resolve) {\r\n        instance.iterateCursor(query, function(cursor) {\r\n          if (!cursor) {\r\n            resolve(items);\r\n            return;\r\n          }\r\n          items.push(cursor.value);\r\n\r\n          if (count !== undefined && items.length == count) {\r\n            resolve(items);\r\n            return;\r\n          }\r\n          cursor.continue();\r\n        });\r\n      });\r\n    };\r\n  });\r\n\r\n  var exp = {\r\n    open: function(name, version, upgradeCallback) {\r\n      var p = promisifyRequestCall(indexedDB, 'open', [name, version]);\r\n      var request = p.request;\r\n\r\n      request.onupgradeneeded = function(event) {\r\n        if (upgradeCallback) {\r\n          upgradeCallback(new UpgradeDB(request.result, event.oldVersion, request.transaction));\r\n        }\r\n      };\r\n\r\n      return p.then(function(db) {\r\n        return new DB(db);\r\n      });\r\n    },\r\n    delete: function(name) {\r\n      return promisifyRequestCall(indexedDB, 'deleteDatabase', [name]);\r\n    }\r\n  };\r\n\r\n  return exp;\r\n};\r\n\r\n/*global Flybits,BaseObj*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar IDBStore = Flybits.store._storageEngines.IDBStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  var INTERNALSTORENAME = 'keyvaluepairs';\r\n\r\n  function IDBStore(storeName, internalStoreName){\r\n    BaseObj.call(this);\r\n    storeName = storeName || 'flb.general';\r\n    this.storeName = storeName;\r\n    this.internalStoreName = internalStoreName || INTERNALSTORENAME;\r\n    this._ready = IDB().open(storeName, undefined,(db) => {\r\n      db.createObjectStore(this.internalStoreName);\r\n    });\r\n  }\r\n\r\n  IDBStore.prototype = Object.create(BaseObj.prototype);\r\n  IDBStore.prototype.constructor = IDBStore;\r\n  IDBStore.prototype.implements('PropertyStore');\r\n\r\n  IDBStore.prototype.isSupported = IDBStore.isSupported = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n    var support = typeof window === 'object' && \r\n                  Object.prototype.hasOwnProperty.call(window,'indexedDB') && \r\n                  typeof navigator === 'object' &&\r\n                  (!(/^Apple/.test(navigator.vendor)) ||\r\n                  (/^Apple/.test(navigator.vendor) && /AppleWebKit[/]60.*Version[/][89][.]/.test(navigator.appVersion)));\r\n    if(support){\r\n      def.resolve();\r\n    } else{\r\n      def.reject(validation.addError('Storage not supported','No compatible interface detected',{\r\n        context: 'indexedDB'\r\n      }));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  IDBStore.prototype.getItem = function(key){\r\n    return this._ready.then((db) => {\r\n      return db.transaction(this.internalStoreName).objectStore(this.internalStoreName).get(key);\r\n    });\r\n  };\r\n  IDBStore.prototype.setItem = function(key, value){\r\n    return this._ready.then((db) => {\r\n      var tx = db.transaction(this.internalStoreName,'readwrite');\r\n      tx.objectStore(this.internalStoreName).put(value,key);\r\n      return tx.complete;\r\n    });\r\n  };\r\n  IDBStore.prototype.removeItem = function(key){\r\n    return this._ready.then((db) => {\r\n      var tx = db.transaction(this.internalStoreName,'readwrite');\r\n      tx.objectStore(this.internalStoreName).delete(key);\r\n      return tx.complete;\r\n    });\r\n  };\r\n  IDBStore.prototype.getKeys = function(){\r\n    return this._ready.then((db) => {\r\n      var tx = db.transaction(this.internalStoreName);\r\n      var keys = [];\r\n      var store = tx.objectStore(this.internalStoreName);\r\n\r\n      (store.iterateKeyCursor || store.iterateCursor).call(store, function(cursor){\r\n        if (!cursor) return;\r\n        keys.push(cursor.key);\r\n        cursor.continue();\r\n      });\r\n\r\n      return tx.complete.then(function(){\r\n        return keys;\r\n      });\r\n    });\r\n  };\r\n  IDBStore.prototype.clearAll = function(){\r\n    return this._ready.then((db) => {\r\n      var tx = db.transaction(this.internalStoreName, 'readwrite');\r\n      tx.objectStore(this.internalStoreName).clear();\r\n      return tx.complete;\r\n    });\r\n  };\r\n\r\n  return IDBStore;\r\n})();\n/*global Flybits,BaseObj*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar LocalStorageStore = Flybits.store._storageEngines.LocalStorageStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  function LocalStorageStore(){\r\n    BaseObj.call(this);\r\n    this.store = localStorage;\r\n  }\r\n\r\n  LocalStorageStore.prototype = Object.create(BaseObj.prototype);\r\n  LocalStorageStore.prototype.constructor = LocalStorageStore;\r\n  LocalStorageStore.prototype.implements('PropertyStore');\r\n\r\n  LocalStorageStore.prototype.isSupported = LocalStorageStore.isSupported = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n    var support = typeof window === 'object' && Object.prototype.hasOwnProperty.call(window,'localStorage');\r\n    if(support){\r\n      try {\r\n        localStorage.setItem('flbstoresupport', true);\r\n        localStorage.removeItem('flbstoresupport');\r\n        def.resolve()\r\n      } catch (e) {\r\n        def.reject(validation.addError('Storage not supported','Access error:' + e,{\r\n          context: 'localStorage'\r\n        }));\r\n      }\r\n    } else{\r\n      def.reject(validation.addError('Storage not supported','Missing reference in namespace.',{\r\n        context: 'localStorage'\r\n      }));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  LocalStorageStore.prototype.getItem = function(key){\r\n    return Promise.resolve(this.store.getItem(key));\r\n  };\r\n  LocalStorageStore.prototype.setItem = function(key, value){\r\n    this.store.setItem(key, value);\r\n    return Promise.resolve();\r\n  };\r\n  LocalStorageStore.prototype.removeItem = function(key){\r\n    this.store.removeItem(key);\r\n    return Promise.resolve();\r\n  };\r\n\r\n  return LocalStorageStore;\r\n\r\n})();\n/*global Flybits,BaseObj*/\r\n// eslint-disable-next-line no-unused-vars\r\nvar MemoryStore = Flybits.store._storageEngines.MemoryStore = (function(){\r\n  function MemoryStore(){\r\n    BaseObj.call(this);\r\n    this.store = {};\r\n  }\r\n\r\n  MemoryStore.prototype = Object.create(BaseObj.prototype);\r\n  MemoryStore.prototype.constructor = MemoryStore;\r\n  MemoryStore.prototype.implements('PropertyStore');\r\n\r\n  MemoryStore.prototype.isSupported = MemoryStore.isSupported = function(){\r\n    return Promise.resolve();\r\n  };\r\n\r\n  MemoryStore.prototype.getItem = function(key){\r\n    return Promise.resolve(this.store[key]);\r\n  };\r\n  MemoryStore.prototype.setItem = function(key, value){\r\n    this.store[key] = value;\r\n    return Promise.resolve();\r\n  };\r\n  MemoryStore.prototype.removeItem = function(key){\r\n    delete this.store[key];\r\n    return Promise.resolve();\r\n  };\r\n  MemoryStore.prototype.getKeys = function(){\r\n    return Promise.resolve(Object.keys(this.store));\r\n  };\r\n  MemoryStore.prototype.clearAll = function(){\r\n    this.store = {};\r\n    return Promise.resolve(this.store);\r\n  };\r\n\r\n  return MemoryStore;\r\n\r\n})();\n/*global Flybits,BaseObj*/\r\n/**\r\n * @classdesc Abstract base class from which all identity providers are extended.\r\n * @memberof Flybits.idp\r\n * @implements {Flybits.interface.IDP}\r\n * @abstract\r\n * @class IDP\r\n * @param {Object} opts Configuration object to override default configuration\r\n * @param -\r\n */\r\nFlybits.idp.IDP = (function(){\r\n\r\n  function IDP(opts){\r\n    if(this.constructor === Object){\r\n      throw new Error('Abstract classes cannot be instantiated');\r\n    }\r\n    BaseObj.call(this);\r\n    this.providerName = opts.providerName;\r\n    this.projectID = opts.projectID;\r\n  }\r\n\r\n  IDP.prototype = Object.create(BaseObj.prototype);\r\n  IDP.prototype.constructor = IDP;\r\n  IDP.prototype.implements('IDP');\r\n\r\n  /**\r\n   * Returns any required headers, depending on IDP, for the facilitation of authentication with Flybits.\r\n   * @instance\r\n   * @memberof Flybits.idp.IDP\r\n   * @function getHeaders\r\n   * @return {Object} IDP specific headers to authenticate to Flybits in the form of a key-value map.\r\n   */\r\n  IDP.prototype.getHeaders = function(){\r\n    return {};\r\n  };\r\n\r\n  /**\r\n   * @abstract\r\n   * @instance\r\n   * @memberof Flybits.idp.IDP\r\n   * @function getURL\r\n   * @see Flybits.interface.IDP.getURL\r\n   */\r\n\r\n  /**\r\n   * @abstract\r\n   * @instance\r\n   * @memberof Flybits.idp.IDP\r\n   * @function getPayload\r\n   * @see Flybits.interface.IDP.getPayload\r\n   */\r\n\r\n  return IDP;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc \r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.IDP\r\n * @class OAuthIDP\r\n * @param {Object} opts Configuration object to override default configuration.\r\n * @param {string} opts.providerName name of OAuth provider.  Currently supported providers are listed as {@link Flybits.idp.OAuthIDP.provider|constants} of this IDP.\r\n * @param {string} opts.token OAuth token returned from third party IDP.\r\n * @param {string} [opts.projectID] ID of the specific Flybits project for which to obtain authorization.\r\n */\r\nFlybits.idp.OAuthIDP = (function(){\r\n  var Validation = Flybits.Validation;\r\n\r\n  function OAuthIDP(opts){\r\n    Flybits.idp.IDP.call(this,opts);\r\n    this.token = opts.token;\r\n  }\r\n\r\n  OAuthIDP.prototype = Object.create(Flybits.idp.IDP.prototype);\r\n  OAuthIDP.prototype.constructor = OAuthIDP;\r\n\r\n  /**\r\n   * @memberof Flybits.idp.OAuthIDP\r\n   * @member {Object} provider A mapping of available identity provider (IDP) names.\r\n   * @constant\r\n   * @property {string} FACEBOOK Internal string identifier for the Facebook IDP.\r\n   * @property {string} GOOGLE Internal string identifier for the Google IDP.\r\n   */\r\n  OAuthIDP.prototype.provider = OAuthIDP.provider = {};\r\n  OAuthIDP.prototype.provider.FACEBOOK = OAuthIDP.provider.FACEBOOK = 'facebook';\r\n  OAuthIDP.prototype.provider.GOOGLE = OAuthIDP.provider.GOOGLE = 'gplus';\r\n\r\n  /**\r\n   * @memberof Flybits.idp.OAuthIDP\r\n   * @instance \r\n   * @function getURL\r\n   */\r\n  OAuthIDP.prototype.getURL = function(){\r\n    return this.providerName === 'oidc' ?\r\n      Flybits.cfg.HOST + Flybits.cfg.res.OIDC :\r\n      Flybits.cfg.HOST + Flybits.cfg.res.OAUTH;\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.OAuthIDP\r\n   * @instance \r\n   * @function getPayload\r\n   */\r\n  OAuthIDP.prototype.getPayload = function(){\r\n    var validation = new Validation();\r\n    var retObj = {\r\n      provider: this.providerName,\r\n    };\r\n\r\n    if(!this.providerName){\r\n      validation.addError('Missing provider name','An OAuth provider name must be supplied',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'providerName'\r\n      });\r\n    }\r\n    if(!this.token){\r\n      validation.addError('Missing token','No OAuth access token was supplied',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'token'\r\n      });\r\n    }\r\n\r\n    if(this.projectID){\r\n      retObj.projectId = this.projectID;\r\n    }\r\n\r\n    if(this.providerName === 'oidc'){\r\n      retObj.idToken = this.token;\r\n    } else{\r\n      retObj.accessToken = this.token;\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    return retObj;\r\n  };  \r\n\r\n  return OAuthIDP;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc IDP class used to establish a session anonymously.\r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.IDP\r\n * @class AnonymousIDP\r\n * @param {Object} opts Configuration object to override default configuration.\r\n * @param {string} opts.projectID ID of the specific Flybits project for which to obtain authorization.\r\n */\r\nFlybits.idp.AnonymousIDP = (function(){\r\n  var Validation = Flybits.Validation;\r\n\r\n  function AnonymousIDP(opts){\r\n    opts = opts || {};\r\n    Flybits.idp.IDP.call(this,opts);\r\n    this.providerName = 'Anonymous';\r\n  }\r\n\r\n  AnonymousIDP.prototype = Object.create(Flybits.idp.IDP.prototype);\r\n  AnonymousIDP.prototype.constructor = AnonymousIDP;\r\n\r\n  /**\r\n   * @memberof Flybits.idp.AnonymousIDP\r\n   * @instance \r\n   * @function getURL\r\n   */\r\n  AnonymousIDP.prototype.getURL = function(){\r\n    return Flybits.cfg.HOST + Flybits.cfg.res.ANONYMOUSAUTH;\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.AnonymousIDP\r\n   * @instance \r\n   * @function getPayload\r\n   */\r\n  AnonymousIDP.prototype.getPayload = function(){\r\n    var validation = new Validation();\r\n    var retObj = {\r\n      projectId: this.projectID\r\n    };\r\n\r\n    if(!this.projectID){\r\n      validation.addError('Missing project ID','Anonymous authentication can only be approved for a specific project ID',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'projectID'\r\n      });\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    return retObj;\r\n  };  \r\n\r\n  return AnonymousIDP;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc\r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.OAuthIDP\r\n * @class ApiKeyIDP\r\n * @param {Object} opts Configuration object to override default configuration.\r\n * @param {string} opts.email Identifier of the user.\r\n * @param {string} opts.apiKey Flybits generated API key. Must be in the form of a GUID.\r\n * @param {string} opts.projectID ID of the specific Flybits project for which to obtain authorization.\r\n * @param {string} [opts.firstName] First name of the user. (Can only be set upon new user creation; ie. first use of `email`.)\r\n * @param {string} [opts.lastName] Last name of the user. (Can only be set upon new user creation; ie. first use of `email`.)\r\n */\r\nFlybits.idp.ApiKeyIDP = (function(){\r\n  function ApiKeyIDP(opts){\r\n    opts = opts || {};\r\n    Flybits.idp.OAuthIDP.call(this, opts);\r\n    this.providerName = 'apikey';\r\n    var validation = new Flybits.Validation();\r\n\r\n    if(!opts.projectID){\r\n      validation.addError('Missing project ID','',{\r\n        code: Flybits.Validation.type.MISSINGARG,\r\n        context: 'projectID'\r\n      });\r\n    }\r\n\r\n    if(!opts.email){\r\n      validation.addError('Missing user email','',{\r\n        code: Flybits.Validation.type.MISSINGARG,\r\n        context: 'email'\r\n      });\r\n    } else{\r\n      this.email = opts.email;\r\n    }\r\n    if(!opts.apiKey){\r\n      validation.addError('Missing api key','',{\r\n        code: Flybits.Validation.type.MISSINGARG,\r\n        context: 'apiKey'\r\n      });\r\n    } else{\r\n      this.apiKey = opts.apiKey;\r\n    }\r\n\r\n    if(opts.firstName){\r\n      this.firstName = opts.firstName;\r\n    }\r\n\r\n    if(opts.lastName){\r\n      this.lastName = opts.lastName;\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    this.token = this.createToken();\r\n  }\r\n\r\n  ApiKeyIDP.prototype = Object.create(Flybits.idp.OAuthIDP.prototype);\r\n  ApiKeyIDP.prototype.constructor = ApiKeyIDP;\r\n\r\n  ApiKeyIDP.prototype.provider = ApiKeyIDP.provider = {};\r\n  ApiKeyIDP.prototype.provider.APIKEY = ApiKeyIDP.provider.APIKEY = 'apikey';\r\n\r\n  ApiKeyIDP.prototype.createToken = function(){\r\n    var tokenPayload = {\r\n      email: this.email,\r\n      apikey: this.apiKey\r\n    };\r\n\r\n    if(this.firstName){\r\n      tokenPayload['firstName'] = this.firstName;\r\n    }\r\n\r\n    if(this.firstName){\r\n      tokenPayload['lastName'] = this.lastName;\r\n    }\r\n\r\n    return Flybits.util.Api.base64Encode(JSON.stringify(tokenPayload));\r\n  };\r\n\r\n  return ApiKeyIDP;\r\n})();\n/*global Flybits*/\r\n/**\r\n * @deprecated This IdP type is no longer supported by the Flybits platform.\r\n * @classdesc IDP class used to establish a session with a Flybits user.\r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.IDP\r\n * @class FlybitsIDP\r\n * @param {Object} opts Configuration object to override default configuration\r\n * @param {string} opts.email Email of user.\r\n * @param {string} opts.password Flybits user password.\r\n * @param {string} [opts.firstName] First name of user for Flybits user profile.  This field is only used when registering for a new Flybits user and will not update existing user profiles.  If either `firstName` or `lastName` is specified, both fields will become mandatory.\r\n * @param {string} [opts.lastName] Last name of user for Flybits user profile. This field is only used when registering for a new Flybits user and will not update existing user profiles.  If either `firstName` or `lastName` is specified, both fields will become mandatory.\r\n * @param {string} [opts.projectID] ID of the specific Flybits project for which to obtain authorization.\r\n */\r\nFlybits.idp.FlybitsIDP = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var ApiUtil = Flybits.util.Api;\r\n\r\n  function FlybitsIDP(opts){\r\n    console.warn('This class is deprecated');\r\n    Flybits.idp.IDP.call(this,opts);\r\n    this.providerName = 'Flybits';\r\n    this.email = opts.email;\r\n    this.password = opts.password;\r\n    this.firstName = opts.firstName;    \r\n    this.lastName = opts.lastName;\r\n  }\r\n\r\n  FlybitsIDP.prototype = Object.create(Flybits.idp.IDP.prototype);\r\n  FlybitsIDP.prototype.constructor = FlybitsIDP;\r\n\r\n  /**\r\n   * @memberof Flybits.idp.FlybitsIDP\r\n   * @instance \r\n   * @function getURL\r\n   */\r\n  FlybitsIDP.prototype.getURL = function(){\r\n    return Flybits.cfg.HOST + Flybits.cfg.res.AUTHENTICATE;\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.FlybitsIDP\r\n   * @instance \r\n   * @function getPayload\r\n   */\r\n  FlybitsIDP.prototype.getPayload = function(){\r\n    var validation = new Validation();\r\n    var retObj = {\r\n      email: this.email,\r\n      password: this.password\r\n    };\r\n\r\n    if(!this.email){\r\n      validation.addError('Missing email','No email address provided',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'email'\r\n      });\r\n    }\r\n    if(!this.password){\r\n      validation.addError('Missing password','No email address provided',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'password'\r\n      });\r\n    }\r\n    if(this.firstName && !this.lastName){\r\n      validation.addError('Missing last name','First name was supplied without an associated last name.',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'lastName'\r\n      });\r\n    } else if(!this.firstName && this.lastName){\r\n      validation.addError('Missing last name','First name was supplied without an associated last name.',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'lastName'\r\n      });\r\n    } else if(this.firstName && this.lastName){\r\n      retObj.firstName = this.firstName;\r\n      retObj.lastName = this.lastName;\r\n    }\r\n\r\n    if(this.projectID){\r\n      retObj.projectId = this.projectID;\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    return retObj;\r\n  };\r\n\r\n  /**\r\n   * Requests Flybits to send a password reset email to the email address associated with the currently authenticated user.  This is only available to users who have been created by the {@link Flybits.idp.FlybitsIDP}.\r\n   * @memberof Flybits.idp.FlybitsIDP\r\n   * @function requestCurrentPasswordReset\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if a password reset email is sent.  Promise rejects with {@link Flybits.Validation|Validation} object if an error has occurred.  Possible errors can include invalid current session or if the current user session was not created using the {@link Flybits.idp.FlybitsIDP}.\r\n   */\r\n  FlybitsIDP.prototype.requestCurrentPasswordReset = FlybitsIDP.requestCurrentPasswordReset = function(){\r\n    var def = new Deferred();\r\n    var validation = new Validation();\r\n\r\n    if(!Flybits.Session.user || !Flybits.Session.userToken){\r\n      validation.addError('No valid session','',{\r\n        code: Validation.type.UNAUTHENTICATED\r\n      });\r\n    }\r\n    if(!Flybits.Session._idpType || Flybits.Session._idpType !== 'FlybitsIDP'){\r\n      validation.addError('Invalid IDP type','Current session user was not created using the FlybitsIDP',{\r\n        code: Validation.type.INVALIDARG\r\n      });\r\n    }\r\n\r\n    if(!validation.state){\r\n      def.reject(validation);\r\n      return def.promise;\r\n    }\r\n\r\n    var email = Flybits.Session.user.email;\r\n    return this.requestPasswordReset(email);\r\n  };\r\n\r\n  /**\r\n   * Requests Flybits to send a password reset email to the specified email address.\r\n   * @memberof Flybits.idp.FlybitsIDP\r\n   * @function requestPasswordReset\r\n   * @param {string} email Email address for Flybits user that would like to reset their password.\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value if a password reset email is sent.  Promise rejects with {@link Flybits.Validation|Validation} object if an error has occurred.\r\n   */\r\n  FlybitsIDP.prototype.requestPasswordReset = FlybitsIDP.requestPasswordReset = function(email){\r\n    var def = new Deferred();\r\n    var url = Flybits.cfg.HOST + Flybits.cfg.res.REQRESETEMAIL;\r\n    \r\n    if(!email){\r\n      def.reject(new Validation().addError('Missing email','',{\r\n        code: Validation.type.MISSINGARG\r\n      }));\r\n      return def.promise;\r\n    }\r\n\r\n    ApiUtil.flbFetch(url,{\r\n      method: 'POST',\r\n      body: JSON.stringify({\r\n        email: email\r\n      }),\r\n      respType: 'empty'\r\n    }).then(function(){\r\n      def.resolve();\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  FlybitsIDP.prototype.requestConfirmationEmail = FlybitsIDP.requestConfirmationEmail = function(noProject){\r\n    var def = new Deferred();\r\n    var url = Flybits.cfg.HOST + Flybits.cfg.res.REQCONFIRMEMAIL;\r\n\r\n    if(!Flybits.Session.userToken){\r\n      return Promise.reject(new Validation().addError('Session not found.','Must have a valid session to request a confirmation email.',{\r\n        code: Validation.type.UNAUTHENTICATED\r\n      }));\r\n    }\r\n\r\n    var opts = {\r\n      method: 'POST',\r\n      respType: 'empty'\r\n    };\r\n    if(!noProject){\r\n      opts.body = JSON.stringify({\r\n        projectID: Flybits.Session._projectID\r\n      });\r\n    }\r\n\r\n    ApiUtil.flbFetch(url,opts).then(function(){\r\n      def.resolve();\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    })\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  return FlybitsIDP;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @classdesc IDP class used to establish a Flybits session using a secure JSON Web Token (JWT) as an authentication claim from an independent IDP.\r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.IDP\r\n * @class JWTSignedIDP\r\n * @param {Object} opts Configuration object to override default configuration.\r\n * @param {string} opts.jwt JSON Web Token (JWT) String\r\n */\r\nFlybits.idp.JWTSignedIDP = (function(){\r\n  function JWTSignedIDP(opts){\r\n    opts = opts || {};\r\n    Flybits.idp.IDP.call(this, opts);\r\n    this.providerName = 'JWTSigned';\r\n    this.jwt = opts.jwt;\r\n  }\r\n\r\n  JWTSignedIDP.prototype = Object.create(Flybits.idp.IDP.prototype);\r\n  JWTSignedIDP.prototype.constructor = JWTSignedIDP;\r\n\r\n  /**\r\n   * @memberof Flybits.idp.JWTSignedIDP\r\n   * @instance \r\n   * @function getHeaders\r\n   */\r\n  JWTSignedIDP.prototype.getHeaders = function(){\r\n    return {\r\n      Authorization: 'Bearer ' + this.jwt\r\n    };\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.JWTSignedIDP\r\n   * @instance \r\n   * @function getURL\r\n   */\r\n  JWTSignedIDP.prototype.getURL = function(){\r\n    return Flybits.cfg.HOST + Flybits.cfg.res.JWTSIGNEDLOGIN;\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.JWTSignedIDP\r\n   * @instance \r\n   * @function getPayload\r\n   */\r\n  JWTSignedIDP.prototype.getPayload = function(){\r\n    return;\r\n  };\r\n\r\n  return JWTSignedIDP;\r\n})();\n/*global Flybits*/\r\n/**\r\n * @classdesc IDP class used to establish a session using a secure signed token.\r\n * @memberof Flybits.idp\r\n * @extends Flybits.idp.IDP\r\n * @class SignedIDP\r\n * @param {Object} opts Configuration object to override default configuration.\r\n * @param {string} opts.accessToken Signed token used for identification.\r\n * @param {string} opts.signature Signature of token used for verification.\r\n */\r\nFlybits.idp.SignedIDP = (function(){\r\n  var Validation = Flybits.Validation;\r\n\r\n  function SignedIDP(opts){\r\n    opts = opts || {};\r\n    Flybits.idp.IDP.call(this,opts);\r\n    this.providerName = 'Signed';\r\n    this.accessToken = opts.accessToken;\r\n    this.signature = opts.signature;\r\n  }\r\n\r\n  SignedIDP.prototype = Object.create(Flybits.idp.IDP.prototype);\r\n  SignedIDP.prototype.constructor = SignedIDP;\r\n\r\n  /**\r\n   * @memberof Flybits.idp.SignedIDP\r\n   * @instance \r\n   * @function getURL\r\n   */\r\n  SignedIDP.prototype.getURL = function(){\r\n    return Flybits.cfg.HOST + Flybits.cfg.res.SIGNEDLOGIN;\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.idp.SignedIDP\r\n   * @instance \r\n   * @function getPayload\r\n   */\r\n  SignedIDP.prototype.getPayload = function(){\r\n    var validation = new Validation();\r\n    var retObj = {\r\n      accessToken: this.accessToken,\r\n      signature: this.signature\r\n    };\r\n\r\n    if(!this.accessToken){\r\n      validation.addError('Missing access token','',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'accessToken'\r\n      });\r\n    }\r\n\r\n    if(!this.signature){\r\n      validation.addError('Missing signature','',{\r\n        code: Validation.type.MISSINGARG,\r\n        context: 'signature'\r\n      });\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    return retObj;\r\n  };  \r\n\r\n  return SignedIDP;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class\r\n * @classdesc Main utility class to establish and manage authenticated sessions with Flybits.\r\n * @memberof Flybits\r\n */\r\nFlybits.Session = (function(){\r\n  var Validation = Flybits.Validation;\r\n  var Deferred = Flybits.Deferred;\r\n  var User = Flybits.User;\r\n\r\n  var deferredReady = new Flybits.Deferred();\r\n\r\n  var Session = {\r\n    /**\r\n     * Promise that resolves when the SDK has a valid session. If disconnect is invoked\r\n     * a new deferred promise will be set.\r\n     * @memberof Flybits.Session\r\n     * @member {external:Promise}\r\n     */\r\n    ready: deferredReady.promise,\r\n    /**\r\n     * @memberof Flybits.Session\r\n     * @member {string} AUTHHEADER Header key that is used by the core to hold authorization tokens in HTTP requests and responses.\r\n     * @constant\r\n     */\r\n    AUTHHEADER: 'x-authorization',\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Session\r\n     * @member {Flybits.User} user {@link Flybits.User|User} currently authenticated to Flybits core.  Set to `null` if session is explicitly cleared such as after logout.\r\n     */\r\n    user: null,\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Session\r\n     * @member {string} userToken Current session authorization token.  Set to `null` if session is explicitly cleared such as after logout.\r\n     */\r\n    userToken: null,\r\n    userAgent: null,\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Session\r\n     * @member {string} [preferredLanguage=en] Resolved preferred Content language.  This attribute will not persist across SDK initializations.  Initialization will attempt to detect browser locale using `navigator.language`.  If your application manages user scoped application preferences you can set this attribute using {@link Flybits.Session.setLocale}\r\n     */\r\n    preferredLanguage: 'en',\r\n    _idpType: undefined,\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Session\r\n     * @member {string} _projectID Current session project ID.  Set to `null` if session is explicitly cleared such as after logout.\r\n     */\r\n    _projectID: undefined,\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.Session\r\n     * @member {string} _deviceID Current session user device ID.  Set to `null` if session is explicitly cleared such as after logout.\r\n     */\r\n    _deviceID: null,\r\n    _userTokenRetrievedAt: null,\r\n    _userTokenExpiry: null,\r\n    /**\r\n     * Establishes authenticated session with Flybits using an {@link Flybits.idp.IDP|IDP}\r\n     * @memberof Flybits.Session\r\n     * @function connect\r\n     * @param {Flybits.idp.IDP} idp Instance of an identity provider that is an implementation of the abstract class {@link Flybits.idp.IDP}\r\n     * @returns {external:Promise<Flybits.User,Flybits.Validation>} Promise that resolves with the {@link Flybits.User|User} model of authenticated User if session exists.  Promise rejects with {@link Flybits.Validation|Validation} object if an error has occurred.  Possible errors can include invalid/insufficient values to the {@link Flybits.idp.IDP|IDP} instance.\r\n     */\r\n    connect: function(idp){\r\n      var session = this;\r\n      var def = new Deferred();\r\n      if(!(idp instanceof Flybits.idp.IDP)){\r\n        def.reject(new Validation().addError('Invalid IDP','The provided parameter was not an instance of Flybits.idp.IDP',{\r\n          code: Validation.type.INVALIDARG\r\n        }));\r\n        return def.promise;\r\n      }\r\n      try{\r\n        var authPayload = idp.getPayload();\r\n        var authHeaders = idp.getHeaders();\r\n        var requestOptions = {\r\n          method: 'POST'\r\n        };\r\n        if(authPayload){\r\n          requestOptions.body = JSON.stringify(authPayload);\r\n        }\r\n        if(authHeaders){\r\n          requestOptions.headers = authHeaders;\r\n        }\r\n\r\n        Flybits.util.Api.flbFetch(idp.getURL(), requestOptions).then(function(respObj){\r\n          if(!respObj.headers[session.AUTHHEADER]){\r\n            throw new Validation().addError('Session could not be refreshed','Missing/Unreadable token',{\r\n              context: 'x-authorization',\r\n              code: Validation.type.MALFORMED\r\n            });\r\n          }\r\n          var user = new User(respObj.body);\r\n          session.user = user;\r\n          session.setUserToken(respObj.headers[session.AUTHHEADER]);\r\n          session._idpType = resolveIDPTypeName(idp);\r\n          session._projectID = idp.projectID;\r\n          \r\n          def.resolve(user);\r\n        }).catch(function(e){\r\n          def.reject(e);\r\n        });\r\n      } catch(e){\r\n        def.reject(e);\r\n      }\r\n      \r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Destroys any existing session with Flybits\r\n     * @memberof Flybits.Session\r\n     * @function disconnect\r\n     * @returns {external:Promise<undefined,undefined>} Promise that resolves without value.\r\n     */\r\n    disconnect: function(){\r\n      var session = this;\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.UNAUTHENTICATE;\r\n      var reqHeaders = {};\r\n      reqHeaders[this.AUTHHEADER] = this.userToken;\r\n      \r\n      Flybits.util.Api.flbFetch(url,{\r\n        method: 'POST',\r\n        headers: reqHeaders\r\n      }).catch(function(){}).then(function(){\r\n        session.clearSession();\r\n        def.resolve();\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    notifyReady: function(){\r\n      Flybits.evt.emit(Flybits.evt.type.SESSIONSTART);\r\n      deferredReady.resolve();\r\n    },\r\n    /**\r\n     * Resets session ready promise.  Meant to be invoked before calling {@link Flybits.Session.bindSession|bindSession} or {@link Flybits.Session.refreshSession|refreshSession} if you wish to be notified when a valid session is ready in a modular way.\r\n     * @memberof Flybits.Session\r\n     * @function resetReady\r\n     */\r\n    resetReady: function(){\r\n      deferredReady.reject();\r\n      deferredReady = new Deferred();\r\n      this.ready = deferredReady.promise;\r\n    },\r\n    /**\r\n     * Verifies user session existence and viability.\r\n     * @memberof Flybits.Session\r\n     * @function resolveSession\r\n     * @param {boolean} [doNotCheckServer=false] Flag to specify whether or not session resolution should make an AJAX call to verify session or simply draw from cache. `true` to bypass server and resolve session from cache, `false` if otherwise.  Note: `false` to check the server is the most accurate and also the default.\r\n     * @returns {external:Promise<string,Flybits.Validation>} Promise that resolves with the current user's session token if session exists.\r\n     */\r\n    resolveSession: function(doNotCheckServer){\r\n      var session = this;\r\n      var def = new Deferred();\r\n\r\n      if(this.userToken && doNotCheckServer){\r\n        session.notifyReady();\r\n        def.resolve(this.userToken);\r\n      } else if(this.userToken && !doNotCheckServer){\r\n        return this.refreshSession();\r\n      } else{\r\n        def.reject(new Validation().addError('Session not found.','',{\r\n          code: Validation.type.UNAUTHENTICATED\r\n        }));\r\n      }\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Shifts the sliding window of the user session by refreshing the user's session token.\r\n     * @memberof Flybits.Session\r\n     * @function refreshSession\r\n     * @returns {external:Promise<string,Flybits.Validation>} Promise that resolves with the current user's new  session token.\r\n     */\r\n    refreshSession: function(){\r\n      var session = this;\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.REFRESHAUTH;\r\n\r\n      Flybits.util.Api.flbFetch(url,{\r\n        respType: 'empty'\r\n      }).then(function(respObj){\r\n        if(!respObj.headers[session.AUTHHEADER]){\r\n          throw new Validation().addError('Session could not be refreshed','Missing/Unreadable token',{\r\n            context: 'x-authorization',\r\n            code: Validation.type.MALFORMED\r\n          });\r\n        } else{\r\n          session.setUserToken(respObj.headers[session.AUTHHEADER]);\r\n          def.resolve(session.userToken);\r\n        }\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Binds existing session to a new project.  In the Flybits platform sessions are project specific.  Also there exists non-project specific sessions for developer portal management.  Thus this method is used to bind an authenticated user to a new project.\r\n     * @memberof Flybits.Session\r\n     * @function bindSession\r\n     * @param {string} projectID ID of project for which to bind new session to.\r\n     * @returns {external:Promise<string,Flybits.Validation>} Promise that resolves with the current user's new  session token.\r\n     * @deprecated\r\n     */\r\n    bindSession: function(projectID){\r\n      console.warn('@deprecated Flybits.Session.bindSession');\r\n      var session = this;\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.AUTHPROJECT + '?projectId='+projectID;\r\n      var validation = new Validation();\r\n\r\n      if(!this.user){\r\n        validation.addError('No session','An existing session is required to bind to a project.',{\r\n          code: Validation.type.UNAUTHENTICATED\r\n        });\r\n      }\r\n      if(!projectID){\r\n        validation.addError('Missing argument','A project ID is required to bind to a project.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'projectID'\r\n        });\r\n      }\r\n\r\n      if(!validation.state){\r\n        def.reject(validation);\r\n        return def.promise;\r\n      }\r\n\r\n      Flybits.util.Api.flbFetch(url).then(function(respObj){\r\n        session._projectID = projectID;\r\n        if(!respObj.headers[session.AUTHHEADER]){\r\n          throw new Validation().addError('Session could not be set','Missing/Unreadable token',{\r\n            context: 'x-authorization',\r\n            code: Validation.type.MALFORMED\r\n          });\r\n        }\r\n        session.setUserToken(respObj.headers[session.AUTHHEADER]);\r\n        def.resolve(session.userToken);\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Inject pre-existing or independently retrieved Flybits session token into SDK for subsequent use.  This will locally store and persist the specified token making all subsequent API requests utilize this session.\r\n     * @memberof Flybits.Session\r\n     * @function setUserToken\r\n     * @param {string} token Flybits issued session token.\r\n     */\r\n    setUserToken: function(token){\r\n      this.userToken = token;\r\n      \r\n      if(token){\r\n        this.notifyReady();\r\n        var jwtData = Flybits.util.Api.base64Decode(token.split('.')[1]);\r\n        var jwt = JSON.parse(jwtData);\r\n        this._userTokenExpiry = jwt.exp?jwt.exp*1000:0;\r\n        this._userTokenRetrievedAt = new Date().getTime();\r\n        this._projectID = jwt.tenantID;\r\n        this._persistState();\r\n      } else{\r\n        this._userTokenExpiry = null;\r\n        this._userTokenRetrievedAt = null;\r\n        this._projectID = null;\r\n        this._persistState();\r\n      }\r\n    },\r\n    /**\r\n     * Set user preferred language for use when localizing Content.  Set language will not persist across SDK initializations so be sure to set this upon SDK initialization.\r\n     * @memberof Flybits.Session\r\n     * @function setLocale\r\n     * @param {string} localeKey String language code as defined in [RFC 5646: Tags for Identifying Languages](https://datatracker.ietf.org/doc/html/rfc5646). Examples of valid language codes include \"en\", \"en-US\", \"fr\", \"fr-FR\", \"es-ES\", etc.  Default preferred language is English defined by language code \"en\".  This can be retrieved at {@link Flybits.Session.preferredLanguage}.\r\n     */\r\n    setLocale: function(localeKey){\r\n      const cleansed = this._translateLocale(localeKey);\r\n      if(!cleansed){\r\n        throw new Flybits.Validation().addError('Invalid locale','locale key not recognized', {\r\n          code: Flybits.Validation.type.MALFORMED,\r\n          context: localeKey\r\n        });\r\n      }\r\n\r\n      this.preferredLanguage = cleansed;\r\n    },\r\n    /**\r\n     * Clear locally stored and persisted Flybits session token.\r\n     * @memberof Flybits.Session\r\n     * @function clearSession\r\n     */\r\n    clearSession: function(){\r\n      this.user = null;\r\n      this.setUserToken(null);\r\n      this.resetReady();\r\n      Flybits.evt.emit(Flybits.evt.type.SESSIONEND);\r\n    },\r\n    _translateLocale: function(localeKey){\r\n      if(!localeKey){\r\n        return null;\r\n      }\r\n      localeKey = localeKey.toLowerCase().split('-')[0];\r\n\r\n      return localeKey;\r\n    },\r\n    _persistState: function(){\r\n      var store = Flybits.store.Property;\r\n      store.set(Flybits.cfg.store.USERTOKEN,this.userToken);\r\n      store.set(Flybits.cfg.store.USERTOKENEXP,this._userTokenExpiry);\r\n      store.set(Flybits.cfg.store.PROJECTID,this._projectID);\r\n      store.set(Flybits.cfg.store.IDPTYPE,this._idpType);\r\n      store.set(Flybits.cfg.store.DEVICEID,this._deviceID);\r\n      store.set(Flybits.cfg.store.USER,this.user?this.user.toJSON():undefined);\r\n    },\r\n    _restoreState: function(){\r\n      var def = new Deferred();\r\n      var session = this;\r\n      var store = Flybits.store.Property;\r\n      var promises = [];\r\n      promises.push(store.get(Flybits.cfg.store.USERTOKEN));\r\n      promises.push(store.get(Flybits.cfg.store.USERTOKENEXP));\r\n      promises.push(store.get(Flybits.cfg.store.PROJECTID));\r\n      promises.push(store.get(Flybits.cfg.store.DEVICEID));\r\n      promises.push(store.get(Flybits.cfg.store.IDPTYPE));\r\n      promises.push(store.get(Flybits.cfg.store.USER));\r\n      Flybits.Deferred.settlePromises(promises).then(function(resultArr){\r\n        if(resultArr[0].status){\r\n          session.userToken = resultArr[0].result;\r\n        }\r\n        if(resultArr[1].status){\r\n          session._userTokenExpiry = resultArr[1].result;\r\n        }\r\n        if(resultArr[2].status){\r\n          session._projectID = resultArr[2].result;\r\n        }\r\n        if(resultArr[3].status){\r\n          session._deviceID = resultArr[3].result;\r\n        }\r\n        if(resultArr[4].status){\r\n          session._idpType = resultArr[4].result;\r\n        }\r\n        if(resultArr[5].status){\r\n          session.user = new Flybits.User(resultArr[5].result);\r\n        }\r\n\r\n        if(typeof navigator !== 'undefined' && navigator.language){\r\n          session.setLocale(navigator.language);\r\n        }\r\n        \r\n        def.resolve();\r\n      });\r\n\r\n      return def.promise;\r\n    }\r\n  };\r\n\r\n  var resolveIDPTypeName = function(idp){\r\n    var availableIDPs = Object.keys(Flybits.idp);\r\n\r\n    for(var i = 1; i < availableIDPs.length; i++){\r\n      if(idp instanceof Flybits.idp[availableIDPs[i]]){\r\n        return availableIDPs[i];\r\n      }\r\n    }\r\n\r\n    return '';\r\n  };\r\n\r\n  return Session;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Manager\r\n * @classdesc Main manager to handle scheduled context retrieval from context sources and reporting to Flybits core.\r\n * @memberof Flybits.context\r\n */\r\nFlybits.context.Manager = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var ObjUtil = Flybits.util.Obj;\r\n  var ApiUtil = Flybits.util.Api;\r\n\r\n  const CTXPLUGINREGEX = /ctx\\.([\\w]+)\\.([\\w]+)/;\r\n  const paramCtxRegex = {\r\n    ATTRKEY: /for attribute (.*?) of plugin/g,\r\n    NUMBERS: /expect (\\d+) but got (\\d+)/g\r\n  }\r\n\r\n  var debouncedReportingRestart;\r\n\r\n  var _ready = new Deferred();\r\n\r\n  var restoreTimestamps = function(){\r\n    var lastReportedPromise = Flybits.store.Property.get(Flybits.cfg.store.CONTEXTLASTREPORTED).then(function(epoch){\r\n      if(epoch){\r\n        contextManager.lastReported = +epoch;\r\n      }\r\n    });\r\n    var lastReportAttemptedPromise = Flybits.store.Property.get(Flybits.cfg.store.CONTEXTLASTREPORTATTEMPTED).then(function(epoch){\r\n      if(epoch){\r\n        contextManager.lastReportAttempted = +epoch;\r\n      }\r\n    });\r\n\r\n    return Flybits.Deferred.settlePromises([lastReportedPromise,lastReportAttemptedPromise]);\r\n  };\r\n\r\n  /**\r\n   * Context Data report object.\r\n   * @typedef CtxReport\r\n   * @memberof Flybits.context.Manager\r\n   * @type Object\r\n   * @property {string} dataTypeID Context Plugin ID (eg. ctx.provider.pluginName).\r\n   * @property {number} timestamp Epoch time (seconds) for which the Context Data applies.\r\n   * @property {Object} value Context plugin specific key/value map of plugin attribute data.\r\n   */\r\n\r\n  var contextManager = {\r\n    /**\r\n     * Promise that resolves when the Context Manager has completed initialization.\r\n     * @memberof Flybits.context.Manager\r\n     * @member {external:Promise}\r\n     */\r\n    ready: _ready.promise,\r\n    /**\r\n     * Array of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @member {Array<Flybits.context.ContextPlugin>} services\r\n     */\r\n    services: [],\r\n    _defaultServices:{\r\n      contentAnalytics: null,\r\n      pushAnalytics: null\r\n    },\r\n    /**\r\n     * @memberof Flybits.context.Manager\r\n     * @member {number} reportDelay=60000 Delay in milliseconds before the next interval of context reporting begins.  Note that the timer starts after the previous interval's context reporting has completed.\r\n     */\r\n    reportDelay: 60000,\r\n    _reportTimeout: null,\r\n    /**\r\n     * @memberof Flybits.context.Manager\r\n     * @member {boolean} isReporting Flag indicating whether scheduled context reporting is enabled.\r\n     */\r\n    isReporting: false,\r\n    /**\r\n     * @memberof Flybits.context.Manager\r\n     * @member {boolean} isReportSending Flag indicating if the manager is currently sending a context value report.\r\n     */\r\n    isReportSending: false,\r\n    isRestarting: false,\r\n\r\n    /**\r\n     * @memberof Flybits.context.Manager\r\n     * @member {number} lastReported Datetime of last successful report.\r\n     */\r\n    lastReported: null,\r\n    /**\r\n     * @memberof Flybits.context.Manager\r\n     * @member {number} lastReportAttempted \r\n     */\r\n    lastReportAttempted: null,\r\n\r\n    /**\r\n     * Initialization function to setup internal properties and will start reporting interval.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves with no value when initialization has completed.\r\n     */\r\n    initialize: function(){\r\n      var def = new Deferred();\r\n      var manager = this;\r\n\r\n      debouncedReportingRestart = Flybits.util.Obj.debounce(function(){\r\n        manager.startReporting();\r\n      },manager.reportDelay,true);\r\n\r\n      restoreTimestamps().then(function(){\r\n        return manager._registerDefaults();\r\n      }).then(function(){\r\n        return manager.startReporting();\r\n      }).then(function(){\r\n        _ready.resolve();\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Used to register a context plugin with the manager to begin scheduled retrieval of context values.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @param {Flybits.context.ContextPlugin} contextPlugin Instance of a context plugin to be registered for scheduled retrieval and reporting.\r\n     * @return {external:Promise<Flybits.context.ContextPlugin,Flybits.Validation>} Promise that resolves with the successfully registered context plugin if supported. Context plugin will now begin scheduled retrieval.\r\n     */\r\n    register: function(contextPlugin){\r\n      var manager = this;\r\n      var def = new Deferred();\r\n      if(!(contextPlugin instanceof Flybits.context.ContextPlugin)){\r\n        def.reject(new Validation().addError('Invalid Context Plugin','Provided parameter was not a valid Flybits.context.ContextPlugin instance.',{\r\n          code: Validation.type.NOTSUPPORTED,\r\n          context: 'contextPlugin'\r\n        }));\r\n        return def.promise;\r\n      }\r\n\r\n      contextPlugin.isSupported().then(function(){\r\n        if(contextPlugin.refreshDelay === contextPlugin.refreshInterval.ONETIME){\r\n          contextPlugin.collectState().then(function(){\r\n            manager.services.push(contextPlugin);\r\n            def.resolve(contextPlugin);\r\n          }).catch(function(e){\r\n            def.reject(e);\r\n          });\r\n        } else{\r\n          contextPlugin.startService();\r\n          manager.services.push(contextPlugin);\r\n          def.resolve(contextPlugin);\r\n        }\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Used to unregister a context plugin with the manager to and stop it's scheduled retrieval of context values.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @param {Flybits.context.ContextPlugin} contextPlugin Instance of a context plugin to be unregistered and have its scheduled retrieval and reporting stopped.\r\n     * @return {Flybits.context.ContextPlugin} Context plugin instance that was unregistered.\r\n     */\r\n    unregister: function(contextPlugin){\r\n      if(contextPlugin instanceof Flybits.context.ContextPlugin){\r\n        ObjUtil.removeObject(this.services,contextPlugin);\r\n        contextPlugin.stopService();\r\n      }\r\n      return contextPlugin;\r\n    },\r\n    /**\r\n     * Used to unregister a context plugin with the manager to stop it's scheduled retrieval of context values based on specified type ID.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @param {string} typeID Context Plugin type ID string found in the class definition `TYPEID`.  For most Context Plugins this type ID is the type string for the Context Plugin found in the Flybits Project Settings identifying the Context Plugin schema.\r\n     * @returns {Flybits.context.ContextPlugin|null} Context plugin instance that was unregisterd or `null` if Context plugin instance was not found.\r\n     */\r\n    unregisterTypeID: function(typeID){\r\n      const plugin = this.services.filter(function(pluginService){\r\n        return pluginService.TYPEID === typeID;\r\n      })[0];\r\n      \r\n      if(plugin){\r\n        return this.unregister(plugin);\r\n      }\r\n      return null;\r\n    },\r\n    /**\r\n     * Unregisters all context plugins from the context manager.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @return {Flybits.context.Manager} Reference to the context manager to allow for method chaining.\r\n     */\r\n    unregisterAll: function(){\r\n      this.stopAllServices();\r\n      this.services = [];\r\n      return this;\r\n    },\r\n    /**\r\n     * Stops all scheduled retrieval services of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @return {Flybits.context.Manager} Reference to the context manager to allow for method chaining.\r\n     */\r\n    stopAllServices: function(){\r\n      var services = this.services;\r\n      for (var i = 0; i < services.length; i++){\r\n        services[i].stopService();\r\n      }\r\n      return this;\r\n    },\r\n    /**\r\n     * Starts all scheduled retrieval services of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @function\r\n     * @return {Flybits.context.Manager} Reference to the context manager to allow for method chaining.\r\n     */\r\n    startAllServices: function(){\r\n      var services = this.services;\r\n      for (var i = 0; i < services.length; i++){\r\n        services[i].startService();\r\n      }\r\n      return this;\r\n    },\r\n    /**\r\n     * Starts the scheduled service that continuously batch reports collected context data of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @function startReporting\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without a return value and rejects with a common Flybits Validation model instance.\r\n     */\r\n    startReporting: function(){\r\n      var def = new Deferred();\r\n      var manager = this;\r\n      if(this.isRestarting){\r\n        throw new Validation().addError('Already restarting service','',{\r\n          code: Validation.type.UNEXPECTED,\r\n          context: 'context.Manager'\r\n        });\r\n      }\r\n      this.isRestarting = true;\r\n      manager.stopReporting();\r\n\r\n      var sessionPromise = Flybits.Session.userToken?Promise.resolve(Flybits.Session.userToken):Flybits.Session.resolveSession();\r\n      sessionPromise.then(function(){\r\n        var interval;\r\n        interval = function(){\r\n          manager.report().catch(function(){}).then(function(){\r\n            if(manager.isReporting){\r\n              manager._reportTimeout = setTimeout(function(){\r\n                interval();\r\n              },manager.reportDelay);\r\n            }\r\n          });\r\n\r\n          manager.isReporting = true;\r\n        };\r\n        interval();\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      }).then(function(){\r\n        manager.isRestarting = false;\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Stops the scheduled service that continuously batch reports collected context data of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @function stopReporting\r\n     * @return {Flybits.context.Manager} Reference to this context manager to allow for method chaining.\r\n     */\r\n    stopReporting: function(){\r\n      this.isReporting = false;\r\n      clearTimeout(this._reportTimeout);\r\n      return this;\r\n    },\r\n    /**\r\n     * By default all reported Context Data is locally batched before a report attempt.  This function will clear all locally cached data.\r\n     * @memberof Flybits.context.Manager\r\n     * @function flushCollected\r\n     * @returns {external:Promise<undefined,string[]>} Resolves once all registered Context Plugin services have cleared locally cached Context Data.\r\n     */\r\n    flushCollected: function(){\r\n      let def = new Deferred();\r\n      let promiseArr = this.services.map((s) => {\r\n        return s._flushCollected();\r\n      });\r\n\r\n      Promise.allSettled(promiseArr).then((results) => {\r\n        const errors = results.filter((r) => {\r\n          return r.status === 'rejected'\r\n        });\r\n        if(errors.length){\r\n          def.reject(errors.map((e) => {\r\n            return e.reason;\r\n          }))\r\n        } else{\r\n          def.resolve();\r\n        }\r\n      })\r\n\r\n      return def.promise;\r\n    },\r\n    _registerDefaults: function(){\r\n      Flybits.context.Manager.unregisterTypeID(Flybits.context.ContentAnalytics.TYPEID);\r\n      Flybits.context.Manager.unregisterTypeID(Flybits.context.PushAnalytics.TYPEID);\r\n      Flybits.context.Manager.unregisterTypeID(Flybits.context.GenericPlugin.TYPEID);\r\n      var contentAnalytics = this._defaultServices.contentAnalytics = new Flybits.context.ContentAnalytics({\r\n        refreshDelay: 3600000\r\n      });\r\n      var pushAnalytics = this._defaultServices.pushAnalytics = new Flybits.context.PushAnalytics({\r\n        refreshDelay: 3600000\r\n      });\r\n      var genericPlugin = this._defaultServices.genericPlugin = new Flybits.context.GenericPlugin({\r\n        refreshDelay: 3600000\r\n      });\r\n\r\n      return Flybits.Deferred.settlePromises([\r\n        Flybits.context.Manager.register(contentAnalytics),\r\n        Flybits.context.Manager.register(pushAnalytics),\r\n        Flybits.context.Manager.register(genericPlugin)\r\n      ]);\r\n    },\r\n    _gatherAllData: function(){\r\n      var def = new Deferred();\r\n      var services = this.services;\r\n      var data = [];\r\n      var serviceDeletions = [];\r\n      var promises = [];\r\n\r\n      for(var i = 0; i < services.length; i++){\r\n        (function(service){\r\n          var retrievalPromise = service._fetchCollected();\r\n          promises.push(retrievalPromise);\r\n          retrievalPromise.then(function(values){\r\n            Array.prototype.push.apply(data,values.data);\r\n            serviceDeletions.push({\r\n              serviceRef: service,\r\n              keys: values.keys\r\n            });\r\n          });\r\n        })(services[i]);\r\n      }\r\n\r\n      Flybits.Deferred.settlePromises(promises).then(function(){\r\n        def.resolve({\r\n          data: data,\r\n          keys: serviceDeletions\r\n        });\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    _sendReport: function(data){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.CONTEXT;\r\n\r\n      ApiUtil.flbFetch(url,{\r\n        method: 'POST',\r\n        body: JSON.stringify(data),\r\n        respType: 'empty'\r\n      }).then(function(){\r\n        def.resolve();\r\n      }).catch(function(resp){\r\n        if(resp instanceof Flybits.Validation && resp.firstError()){\r\n          let err = resp.firstError();\r\n          let errMsg = err?.message;\r\n          if(errMsg.includes('can\\'t find plugin for dataTypeID')){\r\n            err.code = Flybits.Validation.type.NOTFOUND;\r\n            let pluginIDMatch = errMsg.match(CTXPLUGINREGEX);\r\n            if(pluginIDMatch){\r\n              err.context = pluginIDMatch[0];\r\n            }\r\n          } else if(errMsg.includes('could not get value for attribute ')){\r\n            let attrStr = errMsg.split('could not get value for attribute ')[1];\r\n            let pluginID = '';\r\n            if(Array.isArray(data)){\r\n              const dataTypeReport = data.find((dtReport) => {\r\n                const valueObj = dtReport.value;\r\n                if(valueObj){\r\n                  const attrKeys = Object.keys(valueObj);\r\n                  return attrKeys.includes(attrStr);\r\n                }\r\n                return false;\r\n              })\r\n              if(dataTypeReport){\r\n                pluginID = dataTypeReport.dataTypeID;\r\n              }\r\n            }\r\n            err.code = Flybits.Validation.type.INVALIDARG;\r\n            err.context = {\r\n              pluginID: pluginID,\r\n              attribute: attrStr\r\n            };\r\n          } else if(errMsg.includes('incorrect number of parameters')){\r\n            let pluginID = errMsg.match(CTXPLUGINREGEX)?.[0];\r\n            let attribute = Array.from(errMsg.matchAll(paramCtxRegex.ATTRKEY))?.[0]?.[1];\r\n            let numbers = Array.from(errMsg.matchAll(paramCtxRegex.NUMBERS))?.[0];\r\n\r\n            err.code = Flybits.Validation.type.INVALIDARG;\r\n            err.context = {\r\n              pluginID: pluginID,\r\n              attribute: attribute,\r\n              paramCounts: {\r\n                expected: numbers?.[1] ? +(numbers?.[1]): undefined,\r\n                actual: numbers?.[2] ? +(numbers?.[2]): undefined\r\n              } \r\n            }\r\n          }\r\n        }\r\n\r\n        def.reject(resp);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    _cleanupServices: function(serviceKeyArr){\r\n      var def = new Deferred();\r\n      var promises = [];\r\n\r\n      for(var i = 0; i < serviceKeyArr.length; i++){\r\n        (function(serviceKeyMap){\r\n          promises.push(serviceKeyMap.serviceRef._deleteCollected(serviceKeyMap.keys));\r\n        })(serviceKeyArr[i]);\r\n      }\r\n\r\n      Flybits.Deferred.settlePromises(promises).then(function(){\r\n        def.resolve();\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    _cleanInvalidServiceData: function(serviceKeyArr, context){\r\n      var def = new Deferred();\r\n\r\n      if(typeof context === 'string'){\r\n        let pluginServiceObjs = serviceKeyArr.filter((serviceKeyObj) => {\r\n          return serviceKeyObj.serviceRef.TYPEID === context || serviceKeyObj.serviceRef.TYPEID === 'ctx.sdk.generic';\r\n        });\r\n        if(pluginServiceObjs.length){\r\n          let promiseArr = [];\r\n          pluginServiceObjs.forEach((pso) => {\r\n            promiseArr.push(pso.serviceRef._cleanInvalidData(context));\r\n          });\r\n\r\n          Promise.allSettled(promiseArr).then(() => {\r\n            def.resolve();\r\n          })\r\n        } else{\r\n          def.resolve();\r\n        }\r\n      } else if(typeof context === 'object' && !context.paramCounts){\r\n        let pluginServiceObjs = serviceKeyArr.filter((serviceKeyObj) => {\r\n          return serviceKeyObj.serviceRef.TYPEID === context.pluginID || serviceKeyObj.serviceRef.TYPEID === 'ctx.sdk.generic';\r\n        });\r\n        if(pluginServiceObjs.length){\r\n          let promiseArr = [];\r\n          pluginServiceObjs.forEach((pso) => {\r\n            promiseArr.push(pso.serviceRef._cleanInvalidData(context.pluginID, context.attribute));\r\n          })\r\n\r\n          Promise.allSettled(promiseArr).then(() => {\r\n            def.resolve();\r\n          })\r\n        } else{\r\n          def.resolve();\r\n        }\r\n      } else if(typeof context === 'object' && context.paramCounts){\r\n        let pluginServiceObjs = serviceKeyArr.filter((serviceKeyObj) => {\r\n          return serviceKeyObj.serviceRef.TYPEID === context.pluginID || serviceKeyObj.serviceRef.TYPEID === 'ctx.sdk.generic';\r\n        });\r\n        if(pluginServiceObjs.length){\r\n          let promiseArr = [];\r\n          pluginServiceObjs.forEach((pso) => {\r\n            promiseArr.push(pso.serviceRef._cleanInvalidData(context.pluginID, context.attribute, context.paramCounts));\r\n          })\r\n\r\n          Promise.allSettled(promiseArr).then(() => {\r\n            def.resolve();\r\n          })\r\n        } else{\r\n          def.resolve();\r\n        }\r\n      }\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Batch reports collected context data of registered context plugins.\r\n     * @memberof Flybits.context.Manager\r\n     * @function report\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without a return value and rejects with a common Flybits Validation model instance.\r\n     */\r\n    report: function(){\r\n      var manager = this;\r\n      var def = new Deferred();\r\n      var serviceCleanup = [];\r\n      var sentData = [];\r\n      this._gatherAllData().then(function(result){\r\n        if(!result.data || !result.data.length){\r\n          throw new Validation().addError('No context to upload.','',{\r\n            code: Validation.type.NOOP\r\n          });\r\n        }\r\n        serviceCleanup = result.keys;\r\n        sentData = result.data;\r\n        manager.isReportSending = true;\r\n        return manager._sendReport(sentData);\r\n      }).then(function(){\r\n        manager.lastReported = Date.now();\r\n        Flybits.store.Property.set(Flybits.cfg.store.CONTEXTLASTREPORTED,manager.lastReported);\r\n        return manager._cleanupServices(serviceCleanup);\r\n      }).then(function(){\r\n        Flybits.evt.emit(Flybits.evt.type.CTXREPORT, {\r\n          status: 'success',\r\n          data: sentData\r\n        });\r\n        def.resolve();\r\n      }).catch(async function(e){\r\n        if(e instanceof Validation){\r\n          const err = e.firstError();\r\n          if(err?.code === Flybits.Validation.type.NOTFOUND && err?.context){\r\n            await manager._cleanInvalidServiceData(serviceCleanup, err.context)\r\n            console.error('> invalid ctxdata report', e);\r\n          } else if(err?.code === Flybits.Validation.type.INVALIDARG && err?.context){\r\n            await manager._cleanInvalidServiceData(serviceCleanup, err.context);\r\n            console.error('> invalid ctxdata report', e);\r\n          } else if(err.code !== Flybits.Validation.type.NOOP){\r\n            let genericErr = new Validation().addError('Context report failed.',err.message,{\r\n              code: Validation.UNEXPECTED\r\n            });\r\n            console.error('> invalid ctxdata report', genericErr);\r\n          }\r\n          if(err.code !== Flybits.Validation.type.NOOP){\r\n            Flybits.evt.emit(Flybits.evt.type.CTXREPORT, {\r\n              status: 'failed',\r\n              validation: e,\r\n              data: sentData\r\n            });\r\n          }\r\n          def.reject(e);\r\n        } else {\r\n          let genericErr = new Validation().addError('Context report failed.',e,{\r\n            code: Validation.UNEXPECTED\r\n          });\r\n          Flybits.evt.emit(Flybits.evt.type.CTXREPORT, {\r\n            status: 'failed',\r\n            validation: genericErr,\r\n            data: sentData\r\n          });\r\n          console.error('> invalid ctxdata report', genericErr);\r\n          def.reject(genericErr);\r\n        }\r\n      }).then(function(){\r\n        manager.lastReportAttempted = Date.now();\r\n        Flybits.store.Property.set(Flybits.cfg.store.CONTEXTLASTREPORTATTEMPTED,manager.lastReportAttempted);\r\n        manager.isReportSending = false;\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n\r\n    warmReporting: function(){\r\n      var diff = this.lastReported? Date.now() - this.lastReported:this.reportDelay + 1;\r\n\r\n      if(this.isReporting && !this.isReportSending && diff > this.reportDelay){\r\n        debouncedReportingRestart.apply(this);\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Explicit report of context data. A simple way to report via known Context Plugin IDs without the need to implement and register custom Context Plugin instances. Value will be batched locally before reporting.\r\n     * @memberof Flybits.context.Manager\r\n     * @function reportCtx\r\n     * @param {string} pluginID Context plugin ID string.\r\n     * @param {Object} contextValue Context plugin specific key/value map of plugin attribute data.\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without a return value and rejects with a common Flybits Validation model instance.\r\n     * @throws {Error} \r\n     */\r\n    reportCtx: function(pluginID, contextValue){\r\n      if(!this._defaultServices.genericPlugin){\r\n        throw Error('Context Manager not initialized. Missing required plugin service');\r\n      }\r\n\r\n      return this._defaultServices.genericPlugin.setGenericState(pluginID, contextValue);\r\n    }\r\n  };\r\n  \r\n\r\n  return contextManager;\r\n})();\r\n\n/*global Flybits,BaseObj*/\r\n/**\r\n * @classdesc Abstract base class from which all context plugins are extended.\r\n * @memberof Flybits.context\r\n * @implements {Flybits.interface.ContextPlugin}\r\n * @abstract\r\n * @class ContextPlugin\r\n * @param {Object} opts Configuration object to override default configuration\r\n * @param {number} opts.refreshDelay {@link Flybits.context.ContextPlugin#refreshDelay}\r\n */\r\nFlybits.context.ContextPlugin = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n\r\n  function ContextPlugin(opts){\r\n    if(this.constructor === Object){\r\n      throw new Error('Abstract classes cannot be instantiated');\r\n    }\r\n    BaseObj.call(this);\r\n\r\n    this._refreshTimeout = null;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.context.ContextPlugin\r\n     * @member {number} [refreshDelay=60000] Delay in milliseconds before the next interval of context refreshing begins for this particular plugin.  Note that the timer starts after the previous interval's context refresh has completed.\r\n     */\r\n    this.refreshDelay = opts && opts.refreshDelay?opts.refreshDelay:this.refreshInterval.ONEMINUTE;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.context.ContextPlugin\r\n     * @member {number} [maxStoreEntries=80] Maximum amount of entries this context type can store locally before old entries are flushed from the local store.\r\n     */\r\n    this.maxStoreSize = opts && opts.maxStoreSize?opts.maxStoreSize:80;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.context.ContextPlugin\r\n     * @member {number} [maxStoreAge=86400000] Maximum age of an entry of this context type before it is flushed from the local store.  Default maximum age is 1 day old.\r\n     */\r\n    this.maxStoreAge = opts && opts.maxStoreAge?opts.maxStoreAge:86400000;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.context.ContextPlugin\r\n     * @member {boolean} isServiceRunning flag indicating whether or not a context retrieval service is running for this context plugin.\r\n     */\r\n    this.isServiceRunning = false;\r\n\r\n    this.collectHistorical = opts && opts.collectHistorical;\r\n\r\n    /**\r\n     * @instance\r\n     * @memberof Flybits.context.ContextPlugin\r\n     * @member {number} lastCollected Timestamp of the last context state retrieval and local storage;\r\n     */\r\n    this.lastCollected = -1;\r\n\r\n    this.lastLocalValue = null;\r\n    this.lastLocalKey = null;\r\n\r\n    this._store = new Flybits.store.Record(this.TYPEID);\r\n  }\r\n\r\n  ContextPlugin.prototype = Object.create(BaseObj.prototype);\r\n  ContextPlugin.prototype.constructor = ContextPlugin;\r\n  ContextPlugin.prototype.implements('ContextPlugin');\r\n\r\n  /**\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @member {Object} refreshInterval Common context refresh delays.\r\n   * @constant\r\n   * @property {number} ONETIME Indicates the value of the context should be fetched only a single time and should not be refreshed on a continuous interval.\r\n   * @property {number} THIRTYSECONDS Common refresh delay of 30 seconds.\r\n   * @property {number} ONEMINUTE Common refresh delay of 1 minute.\r\n   * @property {number} ONEHOUR Common refresh delay of 1 hour.\r\n   */\r\n  ContextPlugin.prototype.refreshInterval = ContextPlugin.refreshInterval = {};\r\n  ContextPlugin.prototype.refreshInterval.ONETIME = ContextPlugin.refreshInterval.ONETIME = -42;\r\n  ContextPlugin.prototype.refreshInterval.THIRTYSECONDS = ContextPlugin.refreshInterval.THIRTYSECONDS = 1000*30;\r\n  ContextPlugin.prototype.refreshInterval.ONEMINUTE = ContextPlugin.refreshInterval.ONEMINUTE = 1000*60*1;\r\n  ContextPlugin.prototype.refreshInterval.ONEHOUR = ContextPlugin.refreshInterval.ONEHOUR = 1000*60*60;\r\n  ContextPlugin.prototype.refreshInterval.ONEDAY = ContextPlugin.refreshInterval.ONEDAY = 1000*60*60*24;\r\n\r\n  /**\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @member {string} TYPEID String descriptor to uniquely identify context data type on the Flybits context gateway.\r\n   */\r\n  ContextPlugin.prototype.TYPEID = ContextPlugin.TYPEID = 'ctx.sdk.generic';\r\n\r\n  /**\r\n   * Starts a scheduled service that continuously retrieves context data for this plugin.\r\n   * @instance\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function startService\r\n   * @return {Flybits.context.ContextPlugin} Reference to this context plugin to allow for method chaining.\r\n   */\r\n  ContextPlugin.prototype.startService = function () {\r\n    this.stopService();\r\n\r\n    var interval;\r\n    interval = function (contextPlugin) {\r\n      contextPlugin.collectState().catch(function () { }).then(function () {\r\n        if (contextPlugin.isServiceRunning) {\r\n          contextPlugin._refreshTimeout = setTimeout(function () {\r\n            interval(contextPlugin);\r\n          }, contextPlugin.refreshDelay);\r\n        }\r\n      });\r\n\r\n      contextPlugin.isServiceRunning = true;\r\n    };\r\n    interval(this);\r\n\r\n    return this;\r\n  };\r\n    \r\n  /**\r\n   * Stops the scheduled service that continuously retrieves context data for this plugin.\r\n   * @instance\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function stopService\r\n   * @return {Flybits.context.ContextPlugin} Reference to this context plugin to allow for method chaining.\r\n   */\r\n  ContextPlugin.prototype.stopService = function(){\r\n    this.isServiceRunning = false;\r\n    clearTimeout(this._refreshTimeout);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n   * @abstract\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function getState\r\n   * @see Flybits.interface.ContextPlugin.getState\r\n   */\r\n  /**\r\n   * @abstract\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function isSupported\r\n   * @see Flybits.interface.ContextPlugin.isSupported\r\n   */\r\n\r\n  /**\r\n   * Force the immediate retrieval of context state from this `ContextPlugin` once and place store it into the local storage for later reporting.\r\n   * @instance\r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function collectState\r\n   * @return {external:Promise<undefined,undefined>} Promise that resolves when this `ContextPlugin` has retrieved and stored its current state.\r\n   */\r\n  ContextPlugin.prototype.collectState = function(){\r\n    var def = new Deferred();\r\n    var plugin = this;\r\n    var store = this._store;\r\n    var storeLength = 0;\r\n\r\n    store.ready.then(function(){\r\n      return store.keys();\r\n    }).then(function(keys){\r\n      storeLength = keys.length;\r\n      return plugin.getState();\r\n    }).then(function(e){\r\n      if(!e){\r\n        throw new Validation().addError('Empty context state collected','',{\r\n          code: Validation.type.NOTFOUND\r\n        });\r\n      }\r\n      return plugin._saveState(e);\r\n    }).then(function(){\r\n      plugin.lastCollected = new Date().getTime();\r\n      if(storeLength >= plugin.maxStoreSize){\r\n        plugin._validateStoreState();\r\n      }\r\n      def.resolve();\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /**\r\n   * Allows for explicit injection of context values irrespective of automated collection.\r\n   * @instance \r\n   * @memberof Flybits.context.ContextPlugin\r\n   * @function setState\r\n   * @param {Object} contextValue Context plugin specific data structure representing new value of context plugin.\r\n   * @return {external:Promise<undefined,undefined>} Promise that resolves when this `ContextPlugin` stored provided state.\r\n   */\r\n  ContextPlugin.prototype.setState = function(contextValue){\r\n    var def = new Deferred();\r\n    var plugin = this;\r\n    var store = this._store;\r\n    var storeLength = 0;\r\n\r\n    store.ready.then(function(){\r\n      return store.keys();\r\n    }).then(function(keys){\r\n      storeLength = keys.length;\r\n      return plugin._saveState(contextValue);\r\n    }).then(function(){\r\n      plugin.lastCollected = new Date().getTime();\r\n      if(storeLength >= plugin.maxStoreSize){\r\n        plugin._validateStoreState();\r\n      }\r\n      def.resolve();\r\n    }).catch(function(e){\r\n      console.error('>',plugin,e);\r\n      def.reject();\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  ContextPlugin.prototype._validateStoreState = function(){\r\n    var plugin = this;\r\n    var def = new Deferred();\r\n    var promises = [];\r\n    var store = this._store;\r\n    store.keys().then(function(result){\r\n      var keys = result;\r\n      var now = new Date().getTime();\r\n      var accessCount = keys.length - plugin.maxStoreSize;\r\n\r\n      keys.sort(function(a,b){\r\n        return (+(a.split('-')[1]))-(+(b.split('-')[1]));\r\n      });\r\n\r\n      if(accessCount > 0){\r\n        for(var i = 0; i < accessCount; i++){\r\n          promises.push(store.remove(keys.shift()));\r\n        }\r\n      }\r\n\r\n      while(keys.length > 0 && (now - keys[0]) >= plugin.refreshInterval.ONEDAY){\r\n        promises.push(store.remove(keys.shift()));\r\n      }\r\n\r\n      Flybits.Deferred.settlePromises(promises).then(function(){\r\n        def.resolve();\r\n      });\r\n    }).catch(function(){\r\n      def.reject();\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n  ContextPlugin.prototype._fetchCollected = function(){\r\n    var plugin = this;\r\n    var def = new Deferred();\r\n    var data = [];\r\n    var keysToDelete = [];\r\n    var store = this._store;\r\n    \r\n    store.ready.then(function(){\r\n      return store.keys();\r\n    }).then(function(keys){\r\n      var assembleData;\r\n      assembleData = function(){\r\n        if(keys.length <= 0){\r\n          def.resolve({\r\n            data: data,\r\n            keys: keysToDelete\r\n          });\r\n          return;\r\n        }\r\n        var curKey = keys.pop();\r\n        keysToDelete.push(curKey);\r\n\r\n        store.get(curKey).then(function(item){\r\n          var timestamp = +(curKey.split('-')[1]);\r\n          data.push({\r\n            timestamp: Math.round(timestamp/1000),\r\n            dataTypeID: plugin.TYPEID,\r\n            value: plugin._toServerFormat(item)\r\n          });\r\n        }).catch(function(){}).then(function(){\r\n          assembleData();\r\n        });\r\n      };\r\n      assembleData();\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n  /**\r\n   * \r\n   * @param {string} pluginID \r\n   * @param {string} attrName \r\n   * @param {Object} paramCounts \r\n   * @param {number} paramCounts.expected\r\n   * @param {number} paramCounts.actual\r\n   * @returns {external:Promise<undefined,undefined>}\r\n   */\r\n  ContextPlugin.prototype._cleanInvalidData = function(pluginID, attrName, paramCounts){\r\n    var def = new Deferred();\r\n    const store = this._store;\r\n    store.ready.then(() => {\r\n      return store.keys();\r\n    }).then((keys) => {\r\n      const promiseArr = keys.map((key) => {\r\n        return new Promise((resolve) => {\r\n          (async function(curKey){\r\n            if(pluginID && !attrName){\r\n              await store.remove(curKey);\r\n            } else if(pluginID && attrName && !paramCounts){\r\n              let val = await store.get(curKey);\r\n              let localAttrName = attrName.replace('query.','');\r\n              if(val && typeof val === 'object' && Object.keys(val).includes(localAttrName)){\r\n                delete val[localAttrName];\r\n                if(Object.keys(val).length){\r\n                  await store.set(curKey, val);\r\n                } else{\r\n                  await store.remove(curKey);\r\n                }\r\n              }\r\n            } else if(pluginID && attrName && paramCounts){\r\n              let val = await store.get(curKey);\r\n              let localAttrKey = Object.keys(val).find((key) => {\r\n                let attrCompArr = key.split('.');\r\n                return attrCompArr[0] === attrName && (attrCompArr.length -1) === paramCounts.actual\r\n              });\r\n\r\n              if(localAttrKey){\r\n                delete val[localAttrKey];\r\n                if(Object.keys(val).length){\r\n                  await store.set(curKey, val);\r\n                } else{\r\n                  await store.remove(curKey);\r\n                }\r\n              }\r\n            }\r\n            resolve();\r\n          })(key)\r\n        })\r\n      })\r\n      Promise.allSettled(promiseArr).then(() => {\r\n        def.resolve();\r\n      })\r\n    }).catch((e) => {\r\n      def.reject(e);\r\n    })\r\n\r\n    return def.promise;\r\n  }; \r\n  ContextPlugin.prototype._deleteCollected = function(keys){\r\n    var store = this._store;\r\n    var def = new Deferred();\r\n    var deleteData;\r\n    deleteData = function(){\r\n      if(keys.length <= 0){\r\n        def.resolve();\r\n        return;\r\n      }\r\n      var curKey = keys.pop();\r\n      store.remove(curKey).catch(function(){}).then(function(){\r\n        deleteData();\r\n      });\r\n    };\r\n    deleteData();\r\n\r\n    return def.promise;\r\n  };\r\n  ContextPlugin.prototype._flushCollected = function(){\r\n    return this._store.clear();\r\n  };\r\n  ContextPlugin.prototype._generateKey = ContextPlugin._generateKey = function(){\r\n    var time = new Date().getTime();\r\n    var guid = Flybits.util.Obj.guid(1);\r\n    return guid+'-'+time;\r\n  };\r\n  ContextPlugin.prototype._cleanHistorical = function(value){\r\n    if(this.lastLocalKey && JSON.stringify(this.lastLocalValue) === JSON.stringify(value)){\r\n      this._store.remove(this.lastLocalKey);\r\n    }\r\n  };\r\n  ContextPlugin.prototype._saveState = function(value){\r\n    var plugin = this;\r\n    var storeKey = this._generateKey();\r\n    \r\n    if(!this.collectHistorical){\r\n      this._cleanHistorical(value);\r\n    }\r\n\r\n    var storeSetPromise = this._store.set(storeKey,value);\r\n    storeSetPromise.then(function(){\r\n      plugin.lastLocalKey = storeKey;\r\n      plugin.lastLocalValue = value;\r\n      Flybits.context.Manager.warmReporting();\r\n    });\r\n    return storeSetPromise;\r\n  };\r\n  ContextPlugin.prototype._toServerFormat = function(item){\r\n    if(item){\r\n      item = Flybits.util.Obj.extend({},item);\r\n      var keys = Object.keys(item);\r\n      for(var i = 0; i < keys.length; i++){\r\n        var key = keys[i];\r\n        if(key.indexOf('.') > -1){\r\n          item['query.'+key] = item[key];\r\n          delete item[key];\r\n        }\r\n      }\r\n    }\r\n    return item;\r\n  };\r\n\r\n  return ContextPlugin;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @class Connectivity\r\n * @classdesc Utility class to retrieve state of browser connectivity.\r\n * @deprecated\r\n * @extends Flybits.context.ContextPlugin\r\n * @memberof Flybits.context\r\n * @param {Flybits.context.Connectivity.Options} opts Configuration object to override default configuration\r\n */\r\nFlybits.context.Connectivity = (function(){\r\n  /**\r\n   * @typedef ConnectionState\r\n   * @memberof Flybits.context.Connectivity\r\n   * @type Object\r\n   * @property {number} state Numerical state of connectivity. 0 for disconnected and 1 for connected.\r\n   */\r\n  /**\r\n    * @typedef Options\r\n    * @memberof Flybits.context.Connectivity\r\n    * @type Object\r\n    * @property {boolean} hardCheck=false Flag to indicate whether or not a HTTP network request is to be used to determine network connectivity as opposed to using browser's `navigator.onLine` property. If the browser does not support `navigator.onLine` a network request based connectivity check will be performed regardless of the state of this flag.\r\n    * @property {number} refreshDelay {@link Flybits.context.ContextPlugin#refreshDelay}\r\n    */\r\n  var Deferred = Flybits.Deferred;\r\n  var ObjUtil = Flybits.util.Obj;\r\n\r\n  function Connectivity(opts){\r\n    Flybits.context.ContextPlugin.call(this,opts);\r\n    if(opts){\r\n      this.opts = ObjUtil.extend({},this.opts,opts);\r\n    }\r\n  }\r\n\r\n  Connectivity.prototype = Object.create(Flybits.context.ContextPlugin.prototype);\r\n  Connectivity.prototype.constructor = Connectivity;\r\n\r\n  /**\r\n   * @memberof Flybits.context.Connectivity\r\n   * @member {string} TYPEID String descriptor to uniquely identify context data type on the Flybits context gateway.\r\n   */\r\n  Connectivity.prototype.TYPEID = Connectivity.TYPEID = 'ctx.sdk.network';\r\n\r\n  /**\r\n   * Check to see if Connectivity retrieval is available on the current browser.\r\n   * @memberof Flybits.context.Connectivity\r\n   * @function isSupported\r\n   * @override\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value.  Promise rejects with a {@link Flybits.Validation} object with errors.\r\n   */\r\n  Connectivity.isSupported = Connectivity.prototype.isSupported = function(){\r\n    var def = new Deferred();\r\n    def.resolve();\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /**\r\n   * Retrieve browser's current connectivity status.\r\n   * @memberof Flybits.context.Connectivity\r\n   * @function getState\r\n   * @override\r\n   * @returns {external:Promise<Flybits.context.Connectivity.ConnectionState,Flybits.Validation>} Promise that resolves with {@link Flybits.context.Connectivity.ConnectionState|ConnectionState} object.  Promise rejects with a {@link Flybits.Validation} object with errors.\r\n   */\r\n  Connectivity.getState = Connectivity.prototype.getState = function(){\r\n    var def = new Deferred();\r\n    var plugin = this;\r\n    if(typeof navigator === 'object' && 'onLine' in navigator && !this.opts.hardCheck){\r\n      def.resolve({\r\n        state: navigator.onLine?plugin.state.CONNECTED:plugin.state.DISCONNECTED\r\n      });\r\n    } else{\r\n      fetch(Flybits.cfg.HOST+'/ping').then(function(){\r\n        def.resolve({\r\n          state: plugin.state.CONNECTED\r\n        });\r\n      }).catch(function(){\r\n        def.resolve({\r\n          state: plugin.state.DISCONNECTED\r\n        });\r\n      });\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /**\r\n   * Converts context value object into the server expected format.\r\n   * @function\r\n   * @memberof Flybits.context.Connectivity\r\n   * @function _toServerFormat\r\n   * @param {Object} contextValue\r\n   * @return {Object} Expected server format of context value.\r\n   */\r\n  Connectivity._toServerFormat = Connectivity.prototype._toServerFormat = function(contextValue){\r\n    return {\r\n      connectionType: contextValue.state\r\n    };\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.context.Connectivity\r\n   * @member {Object} state Connection state constants.\r\n   * @constant\r\n   * @property {number} DISCONNECTED Indicates the state of being disconnected.\r\n   * @property {number} CONNECTED Indicates the state of being connected.\r\n   */\r\n  Connectivity.state = Connectivity.prototype.state = {};\r\n  Connectivity.state.DISCONNECTED = Connectivity.prototype.state.DISCONNECTED = -1;\r\n  Connectivity.state.CONNECTED = Connectivity.prototype.state.CONNECTED = -99;\r\n\r\n  /**\r\n   * @memberof Flybits.context.Connectivity\r\n   * @member opts\r\n   * @type {Flybits.context.Connectivity.Options}\r\n   */\r\n  Connectivity.opts = Connectivity.prototype.opts = {\r\n    hardCheck: false\r\n  };\r\n\r\n  return Connectivity;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @class ContentAnalytics\r\n * @classdesc\r\n * @extends Flybits.context.ContextPlugin\r\n * @memberof Flybits.context\r\n */\r\nFlybits.context.ContentAnalytics = (function(){\r\n  function ContentAnalytics(opts){\r\n    Flybits.context.ContextPlugin.call(this, opts);\r\n  }\r\n\r\n  ContentAnalytics.prototype = Object.create(Flybits.context.ContextPlugin.prototype);\r\n  ContentAnalytics.prototype.constructor = ContentAnalytics;\r\n\r\n  /**\r\n   * @memberof Flybits.context.ContentAnalytics\r\n   * @member {string} TYPEID String descriptor to uniquely identify context data type on the Flybits context gateway.\r\n   */\r\n  ContentAnalytics.prototype.TYPEID = ContentAnalytics.TYPEID = 'ctx.flybits.contentAnalytics';\r\n\r\n  /**\r\n   * This support check will always succeed as analytics plugins are Flybits reserved plugins and available in every Flybits tenant\r\n   * @memberof Flybits.context.ContentAnalytics\r\n   * @function isSupported\r\n   * @override\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value.  Promise rejects with a {@link Flybits.Validation} object with errors.\r\n   */\r\n  ContentAnalytics.isSupported = ContentAnalytics.prototype.isSupported = function(){\r\n    return Promise.resolve();\r\n  };\r\n\r\n  /**\r\n   * Will not return value as this plugin requires explicit proactive context reporting and not passive collection.\r\n   * @memberof Flybits.context.ContentAnalytics\r\n   * @function getState\r\n   * @override\r\n   * @returns {external:Promise<null,null>} Promise rejects without response object.\r\n   */\r\n  ContentAnalytics.getState = ContentAnalytics.prototype.getState = function(){\r\n    return Promise.reject();\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.context.ContentAnalytics\r\n   * @member {Object} attributes\r\n   * @type {Flybits.context.ContentAnalytics.attributes}\r\n   */\r\n  ContentAnalytics.attributes = ContentAnalytics.prototype.attributes = {\r\n    VIEWED: 'viewed', // .<content instance ID>\r\n    ENGAGED: 'engaged', // .<content instance ID>\r\n    COMPONENTENGAGED: 'componentEngaged', // .<content instance ID>.<component ID>.<component name>.<component type>\r\n    COMPONENTFULFILLED: 'componentFulfilled' // .<content instance ID>.<component ID>.<component name>.<component type>\r\n  };\r\n\r\n  return ContentAnalytics;\r\n})();\n/*global Flybits*/\r\nFlybits.context.GenericPlugin = (function(){\r\n  const PLUGINKEY = '_dataTypeID';\r\n\r\n  function GenericPlugin(opts){\r\n    Flybits.context.ContextPlugin.call(this, opts);\r\n  }\r\n\r\n  GenericPlugin.prototype = Object.create(Flybits.context.ContextPlugin.prototype);\r\n  GenericPlugin.TYPEID = Flybits.context.ContextPlugin.TYPEID;\r\n  GenericPlugin.prototype.constructor = GenericPlugin;\r\n\r\n  GenericPlugin.isSupported = GenericPlugin.prototype.isSupported = function(){\r\n    return Promise.resolve();\r\n  };\r\n\r\n  GenericPlugin.getState = GenericPlugin.prototype.getState = function(){\r\n    return Promise.reject();\r\n  };\r\n\r\n  GenericPlugin.prototype.setGenericState = function(pluginID, contextValue){\r\n    contextValue[PLUGINKEY] = pluginID;\r\n    return this.setState(contextValue);\r\n  };\r\n  \r\n  GenericPlugin.prototype._cleanInvalidData = function(pluginID, attrName, paramCounts){\r\n    var def = new Flybits.Deferred();\r\n    const store = this._store;\r\n    store.ready.then(async () => {\r\n      return store.keys();\r\n    }).then((keys) => {\r\n      const promiseArr = keys.map((key) => {\r\n        return new Promise((resolve) => {\r\n          (async function(curKey){\r\n            let val = await store.get(curKey);\r\n            if(pluginID && !attrName){\r\n              if(val && typeof val === 'object' && val._dataTypeID === pluginID){\r\n                await store.remove(curKey);\r\n              }\r\n            } else if(pluginID && attrName && !paramCounts){\r\n              let localAttrName = attrName.replace('query.','');\r\n              if(val && typeof val === 'object' && val._dataTypeID === pluginID && Object.keys(val).includes(localAttrName)){\r\n                delete val[localAttrName];\r\n                if(Object.keys(val).length){\r\n                  await store.set(curKey, val);\r\n                } else{\r\n                  await store.remove(curKey);\r\n                }\r\n              }\r\n            } else if(pluginID && attrName && paramCounts){\r\n              if(val && typeof val === 'object' && val._dataTypeID   === pluginID){\r\n                let localAttrKey = Object.keys(val).find((key) => {\r\n                  let attrCompArr = key.split('.');\r\n                  return attrCompArr[0] === attrName && (attrCompArr.length -1) === paramCounts.actual\r\n                });\r\n                if(localAttrKey){\r\n                  delete val[localAttrKey];\r\n                  if(Object.keys(val).length > 1){\r\n                    await store.set(curKey, val);\r\n                  } else{\r\n                    await store.remove(curKey);\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            resolve();\r\n          })(key);\r\n        })\r\n      })\r\n      Promise.allSettled(promiseArr).then(() => {\r\n        def.resolve();\r\n      })\r\n    }).catch((e) => {\r\n      def.reject(e);\r\n    })\r\n\r\n    return def.promise;\r\n  }; \r\n\r\n  GenericPlugin.prototype._fetchCollected = function(){\r\n    var plugin = this;\r\n    var def = new Flybits.Deferred();\r\n    var data = [];\r\n    var keysToDelete = [];\r\n    var store = this._store;\r\n    \r\n    store.ready.then(function(){\r\n      return store.keys();\r\n    }).then(function(keys){\r\n      var assembleData;\r\n      assembleData = function(){\r\n        if(keys.length <= 0){\r\n          def.resolve({\r\n            data: data,\r\n            keys: keysToDelete\r\n          });\r\n          return;\r\n        }\r\n        var curKey = keys.pop();\r\n        keysToDelete.push(curKey);\r\n\r\n        store.get(curKey).then(function(item){\r\n          var timestamp = +(curKey.split('-')[1]);\r\n          var dataTypeID = item[PLUGINKEY];\r\n          delete item[PLUGINKEY];\r\n          data.push({\r\n            timestamp: Math.round(timestamp/1000),\r\n            dataTypeID: dataTypeID,\r\n            value: plugin._toServerFormat(item)\r\n          });\r\n        }).catch(function(){}).then(function(){\r\n          assembleData();\r\n        });\r\n      };\r\n      assembleData();\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  return GenericPlugin;\r\n})()\r\n\n/*global Flybits*/\r\n/**\r\n * @class Location\r\n * @classdesc Utility class to retrieve browser location.\r\n * @extends Flybits.context.ContextPlugin\r\n * @memberof Flybits.context\r\n * @param {Flybits.context.Location.Options} opts Configuration object to override default configuration\r\n */\r\nFlybits.context.Location = (function(){\r\n  /**\r\n   * @typedef Geoposition\r\n   * @memberof Flybits.context.Location\r\n   * @type Object\r\n   * @property {Object} coords\r\n   * @property {number} coords.latitude\r\n   * @property {number} coords.longitude\r\n   * @property {number} timestamp\r\n   */\r\n  /**\r\n    * @typedef Options\r\n    * @memberof Flybits.context.Location\r\n    * @type Object\r\n    * @property {number} maximumAge=1000*60*20\r\n    * @property {number} refreshDelay {@link Flybits.context.ContextPlugin#refreshDelay}\r\n    */\r\n  var Deferred = Flybits.Deferred;\r\n  var ObjUtil = Flybits.util.Obj;\r\n\r\n  function Location(opts){\r\n    Flybits.context.ContextPlugin.call(this,opts);\r\n    if(opts){\r\n      this.opts = ObjUtil.extend({},this.opts,opts);\r\n    }\r\n  }\r\n\r\n  Location.prototype = Object.create(Flybits.context.ContextPlugin.prototype);\r\n  Location.prototype.constructor = Location;\r\n\r\n  /**\r\n   * @memberof Flybits.context.Location\r\n   * @member {string} TYPEID String descriptor to uniquely identify context data type on the Flybits context gateway.\r\n   */\r\n  Location.prototype.TYPEID = Location.TYPEID = 'ctx.sdk.location';\r\n\r\n  /**\r\n   * Check to see if Location retrieval is available on the current browser.\r\n   * @memberof Flybits.context.Location\r\n   * @function isSupported\r\n   * @override\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value.  Promise rejects with a {@link Flybits.Validation} object with errors.  Possible errors can include the lack of support on webview/browser or the User explicitly denying Location retrieval.\r\n   */\r\n  Location.isSupported = Location.prototype.isSupported = function(){\r\n    var def = new Deferred();\r\n\r\n    if(typeof navigator === 'object' && navigator.geolocation){\r\n      navigator.geolocation.getCurrentPosition(function(){\r\n        def.resolve();\r\n      },function(err){\r\n        console.error('>',err);\r\n        def.reject(new Flybits.Validation().addError('Location Sensing Not Supported',err.message?err.message:'User denied'));\r\n      });\r\n    } else{\r\n      def.reject(new Flybits.Validation().addError('Location Sensing Not Supported','Device GeoLocation API not found.'));\r\n    }\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /**\r\n   * Retrieve browser's current location.\r\n   * @memberof Flybits.context.Location\r\n   * @function getState\r\n   * @override\r\n   * @returns {external:Promise<Flybits.context.Location.Geoposition,Flybits.Validation>} Promise that resolves with browser's {@link Flybits.context.Location.Geoposition|Geoposition} object.  Promise rejects with a {@link Flybits.Validation} object with errors.  Possible errors can include the lack of support on webview/browser or the User explicitly denying Location retrieval.\r\n   */\r\n  Location.getState = Location.prototype.getState = function(){\r\n    var def = new Deferred();\r\n\r\n    navigator.geolocation.getCurrentPosition(function(pos){\r\n      def.resolve({\r\n        coords:{\r\n          latitude: pos.coords.latitude,\r\n          longitude: pos.coords.longitude,\r\n          accuracy: pos.coords.accuracy\r\n        },\r\n        timestamp: pos.timestamp\r\n      });\r\n    },function(err){\r\n      console.error('>',err);\r\n      def.reject(new Flybits.Validation().addError('Location could not be resolved'));\r\n    },this.opts);\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  /**\r\n   * Converts context value object into the server expected format.\r\n   * @function\r\n   * @memberof Flybits.context.Location\r\n   * @function _toServerFormat\r\n   * @param {Object} contextValue\r\n   * @return {Object} Expected server format of context value.\r\n   */\r\n  Location._toServerFormat = Location.prototype._toServerFormat = function(contextValue){\r\n    return {\r\n      lat: contextValue.coords.latitude,\r\n      lng: contextValue.coords.longitude\r\n    };\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.context.Location\r\n   * @member opts\r\n   * @type {Flybits.context.Location.Options}\r\n   */\r\n  Location.opts = Location.prototype.opts = {\r\n    maximumAge: 1000 * 60 * 20\r\n  };\r\n\r\n  return Location;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * @class PushAnalytics\r\n * @classdesc\r\n * @extends Flybits.context.ContextPlugin\r\n * @memberof Flybits.context\r\n */\r\nFlybits.context.PushAnalytics = (function(){\r\n  function PushAnalytics(opts){\r\n    Flybits.context.ContextPlugin.call(this, opts);\r\n  }\r\n\r\n  PushAnalytics.prototype = Object.create(Flybits.context.ContextPlugin.prototype);\r\n  PushAnalytics.prototype.constructor = PushAnalytics;\r\n\r\n  /**\r\n   * @memberof Flybits.context.PushAnalytics\r\n   * @member {string} TYPEID String descriptor to uniquely identify context data type on the Flybits context gateway.\r\n   */\r\n  PushAnalytics.prototype.TYPEID = PushAnalytics.TYPEID = 'ctx.flybits.pushAnalytics';\r\n\r\n  /**\r\n   * This support check will always succeed as analytics plugins are Flybits reserved plugins and available in every Flybits tenant\r\n   * @memberof Flybits.context.PushAnalytics\r\n   * @function isSupported\r\n   * @override\r\n   * @returns {external:Promise<undefined,Flybits.Validation>} Promise that resolves without value.  Promise rejects with a {@link Flybits.Validation} object with errors.\r\n   */\r\n  PushAnalytics.isSupported = PushAnalytics.prototype.isSupported = function(){\r\n    return Promise.resolve();\r\n  };\r\n\r\n  /**\r\n   * Will not return value as this plugin requires explicit proactive context reporting and not passive collection.\r\n   * @memberof Flybits.context.PushAnalytics\r\n   * @function getState\r\n   * @override\r\n   * @returns {external:Promise<null,null>} Promise rejects without response object.\r\n   */\r\n  PushAnalytics.getState = PushAnalytics.prototype.getState = function(){\r\n    return Promise.reject();\r\n  };\r\n\r\n  /**\r\n   * @memberof Flybits.context.PushAnalytics\r\n   * @member attributes\r\n   * @type {Flybits.context.PushAnalytics.Attributes}\r\n   */\r\n  PushAnalytics.attributes = PushAnalytics.prototype.attributes = {\r\n    VIEWED: 'viewed', // .<content instance ID>\r\n    ENGAGED: 'engaged', // .<content instance ID>\r\n    COMPONENTENGAGED: 'componentEngaged' // .<content instance ID>.<component ID>.<component name>.<component type>\r\n  };\r\n\r\n  return PushAnalytics;\r\n})();\n/*global Flybits,BaseModel*/\r\nFlybits.analytics.Event = (function(){\r\n  var ObjUtil = Flybits.util.Obj;\r\n\r\n  var Event = function(serverObj){\r\n    console.warn('This class is deprecated');\r\n    BaseModel.call(this,serverObj);\r\n    this._tmpID = ObjUtil.guid(1) + '-' + Date.now();\r\n    this.type = this.types.DISCRETE;\r\n    this.name = '';\r\n    this.loggedAt = new Date();\r\n    this.properties = {};\r\n    this._internal = {};\r\n    this._isInternal = false;\r\n\r\n    if(serverObj){\r\n      this.fromJSON(serverObj);\r\n    }\r\n  };\r\n  Event.prototype = Object.create(BaseModel.prototype);\r\n  Event.prototype.constructor = Event;\r\n  Event.prototype.implements('Serializable');\r\n\r\n  Event.prototype.types = Event.types = {};\r\n  Event.prototype.types.DISCRETE = Event.types.DISCRETE = 'event_discrete';\r\n  Event.prototype.types.TIMEDSTART = Event.types.TIMEDSTART = 'event_timestart';\r\n  Event.prototype.types.TIMEDEND = Event.types.TIMEDEND = 'event_timeend';\r\n\r\n  Event.prototype.TIMEDREFID = Event.TIMEDREFID = 'timedRef';\r\n  Event.prototype.OSTYPE = Event.OSTYPE = 'osType';\r\n  Event.prototype.OSVERSION = Event.OSVERSION = 'osVersion';\r\n  Event.prototype.UID = Event.UID = 'uid';\r\n\r\n  Event.prototype._setProp = function(obj, key, value){\r\n    if(typeof value === 'undefined' || value === null){\r\n      delete obj[key];\r\n      return this;\r\n    }\r\n\r\n    obj[key] = value;\r\n    return this;\r\n  };\r\n\r\n  Event.prototype.setProperty = function(key, value){\r\n    return this._setProp(this.properties, key, value);\r\n  };\r\n\r\n  Event.prototype._setInternalProperty = function(key, value){\r\n    return this._setProp(this._internal, key, value);\r\n  };\r\n\r\n  Event.prototype.fromJSON = function(serverObj){\r\n    this.type = serverObj.type || this.types.DISCRETE;\r\n    this.name = serverObj.name;\r\n    this.loggedAt = serverObj.loggedAt?new Date(serverObj.loggedAt):new Date();\r\n    this.properties = serverObj.properties || {};\r\n\r\n    this._internal = serverObj.flbProperties || {};\r\n    this._isInternal = serverObj.isFlybits || false;\r\n  };\r\n\r\n  Event.prototype.toJSON = function(){\r\n    var retObj = {\r\n      type: this.type,\r\n      name: this.name,\r\n      loggedAt: this.loggedAt.getTime(),\r\n      properties: this.properties,\r\n      flbProperties: this._internal,\r\n      isFlybits: this._isInternal\r\n    };\r\n\r\n    return retObj;\r\n  };\r\n\r\n  return Event;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Manager\r\n * @classdesc Main manager to collect and report events for later analysis.\r\n * @memberof Flybits.analytics\r\n */\r\nFlybits.analytics.Manager = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var Session = Flybits.Session;\r\n  var Event = Flybits.analytics.Event;\r\n\r\n  var restoreTimestamps = function(){\r\n    var lastReportedPromise = Flybits.store.Property.get(Flybits.cfg.store.ANALYTICSLASTREPORTED).then(function(epoch){\r\n      if(epoch){\r\n        analyticsManager.lastReported = +epoch;\r\n      }\r\n    });\r\n    var lastReportAttemptedPromise = Flybits.store.Property.get(Flybits.cfg.store.ANALYTICSLASTREPORTATTEMPTED).then(function(epoch){\r\n      if(epoch){\r\n        analyticsManager.lastReportAttempted = +epoch;\r\n      }\r\n    });\r\n\r\n    return Flybits.Deferred.settlePromises([lastReportedPromise,lastReportAttemptedPromise]);\r\n  };\r\n\r\n  var applyDefaultSysProps = function(event){\r\n    if(typeof window === 'object'){\r\n      event._setInternalProperty(Event.OSTYPE,'browser');\r\n      if(Object.prototype.hasOwnProperty.call(window,'navigator')){\r\n        event._setInternalProperty(Event.OSVERSION,navigator.userAgent);\r\n      }\r\n    } else{\r\n      event._setInternalProperty(Event.OSTYPE,'node');\r\n      if(typeof process !== 'undefined'){\r\n        event._setInternalProperty(Event.OSVERSION,process.version);\r\n      }\r\n    }\r\n\r\n    if(Session.user){\r\n      event._setInternalProperty(Event.UID, Session.user.id);\r\n    }\r\n    return event;\r\n  };\r\n\r\n  var timeUnitMultiplier = {\r\n    milliseconds: 1,\r\n    seconds: 1000,\r\n    minutes: 60*1000,\r\n    hours: 60*60*1000,\r\n    days: 24*60*60*1000\r\n  };\r\n  var resolveMilliseconds = function(value,units){\r\n    var multiplier = timeUnitMultiplier[units] || 1;\r\n    return value * multiplier;\r\n  };\r\n\r\n  var deferredReady = new Deferred();\r\n  var analyticsManager = {\r\n    ready: deferredReady.promise,\r\n    maxStoreSize: 100,\r\n    reportDelay: 3600000,\r\n    reportDelayUnit: 'milliseconds',\r\n    lastReported: null,\r\n    lastReportAttempted: null,\r\n    _reportTimeout: null,\r\n    _analyticsStore: null,\r\n    _uploadChannel: null,\r\n    _timedEventCache: {},\r\n    isReporting: false,\r\n    initialize: function(){\r\n      console.warn('This function is deprecated');\r\n      var def = new Deferred();\r\n      var manager = this;\r\n\r\n      this._analyticsStore = new Flybits.analytics.RecordsStore({\r\n        maxStoreSize: Flybits.cfg.analytics.MAXSTORESIZE\r\n      });\r\n      this._uploadChannel = new Flybits.analytics.DefaultChannel();\r\n      \r\n      this._analyticsStore._store.ready.then(function(){\r\n        return restoreTimestamps();\r\n      }).then(function(){\r\n        return manager.startReporting();\r\n      }).then(function(){\r\n        deferredReady.resolve();\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    stopReporting: function(){\r\n      console.warn('This function is deprecated');\r\n      this.isReporting = false;\r\n      clearTimeout(this._reportTimeout);\r\n      return this;\r\n    },\r\n    startReporting: function(){\r\n      console.warn('This function is deprecated');\r\n      var def = new Deferred();\r\n      var manager = this;\r\n      manager.stopReporting();\r\n      \r\n      var sessionPromise = Flybits.Session.userToken?Promise.resolve(Flybits.Session.userToken):Flybits.Session.resolveSession();\r\n      sessionPromise.then(function(){\r\n        var interval;\r\n        interval = function(){\r\n          manager.report().catch(function(){}).then(function(){\r\n            if(manager.isReporting){\r\n              manager._reportTimeout = setTimeout(function(){\r\n                interval();\r\n              },resolveMilliseconds(manager.reportDelay,manager.reportDelayUnit));\r\n            }\r\n          });\r\n\r\n          manager.isReporting = true;\r\n        };\r\n        interval();\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    report: function(){\r\n      console.warn('This function is deprecated');\r\n      var def = new Deferred();\r\n      var manager = this;\r\n      var eventTmpIDs;\r\n      this._analyticsStore.getAllEvents().then(function(events){\r\n        eventTmpIDs = events.map(function(evt){\r\n          return evt._tmpID;\r\n        });\r\n        if(eventTmpIDs.length < 1){\r\n          throw new Validation().addError('No analytics to upload.','',{\r\n            code: Validation.type.NOTFOUND\r\n          });\r\n        }\r\n        return manager._uploadChannel.uploadEvents(events);\r\n      }).then(function(){\r\n        manager.lastReported = Date.now();\r\n        Flybits.store.Property.set(Flybits.cfg.store.ANALYTICSLASTREPORTED,manager.lastReported);\r\n        return manager._analyticsStore.clearEvents(eventTmpIDs);\r\n      }).then(function(){\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        if(e instanceof Validation && e.firstError().code !== Validation.type.NOTFOUND){\r\n          console.error('> analytics report error',e);\r\n        }\r\n        def.reject(e);\r\n      }).then(function(){\r\n        manager.lastReportAttempted = Date.now();\r\n        Flybits.store.Property.set(Flybits.cfg.store.ANALYTICSLASTREPORTATTEMPTED,manager.lastReportAttempted);\r\n      });\r\n      \r\n      return def.promise;\r\n    },\r\n    logEvent: function(eventName, properties){\r\n      console.warn('This function is deprecated');\r\n      var evt = new Event({\r\n        name: eventName,\r\n        type: Event.types.DISCRETE,\r\n        properties: properties\r\n      });\r\n\r\n      applyDefaultSysProps(evt);\r\n\r\n      return this._analyticsStore.addEvent(evt);\r\n    },\r\n    _logInt: function(eventName, properties, internalProperties){\r\n      console.warn('This function is deprecated');\r\n      var evt = new Event({\r\n        name: eventName,\r\n        type: Event.types.DISCRETE,\r\n        properties: properties,\r\n        isFlybits: true,\r\n        flbProperties: internalProperties\r\n      });\r\n\r\n      applyDefaultSysProps(evt);\r\n\r\n      return this._analyticsStore.addEvent(evt);\r\n    },\r\n    startTimedEvent: function(eventName, properties){\r\n      console.warn('This function is deprecated');\r\n      console.warn('This function is deprecated');\r\n      var manager = this;\r\n      var def = new Deferred();\r\n      var evt = new Event({\r\n        name: eventName,\r\n        type: Event.types.TIMEDSTART,\r\n        properties: properties\r\n      });\r\n      applyDefaultSysProps(evt);\r\n      evt._setInternalProperty(Event.TIMEDREFID, evt._tmpID);\r\n\r\n      this._analyticsStore.addEvent(evt).then(function(){\r\n        manager._timedEventCache[evt._tmpID] = evt;\r\n        def.resolve(evt._tmpID);\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    _logStartInt: function(eventName, properties, internalProperties){\r\n      console.warn('This function is deprecated');\r\n      var manager = this;\r\n      var def = new Deferred();\r\n      var evt = new Event({\r\n        name: eventName,\r\n        type: Event.types.TIMEDSTART,\r\n        properties: properties,\r\n        isFlybits: true,\r\n        flbProperties: internalProperties\r\n      });\r\n      applyDefaultSysProps(evt);\r\n      evt._setInternalProperty(Event.TIMEDREFID, evt._tmpID);\r\n\r\n      this._analyticsStore.addEvent(evt).then(function(){\r\n        manager._timedEventCache[evt._tmpID] = evt;\r\n        def.resolve(evt._tmpID);\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    endTimedEvent: function(refID){\r\n      console.warn('This function is deprecated');\r\n      var manager = this;\r\n      var def = new Deferred();\r\n      var startedEvt = manager._timedEventCache[refID];\r\n      if(!refID || !startedEvt){\r\n        def.reject(new Validation().addError('No Timed Event Found','No corresponding start event was found for provided reference.',{\r\n          code: Validation.type.NOTFOUND,\r\n          context: refID\r\n        }));\r\n        return def.promise;\r\n      }\r\n\r\n      var endEvt = new Event({\r\n        name: startedEvt.name,\r\n        type: Event.types.TIMEDEND,\r\n        properties: startedEvt.properties\r\n      });\r\n      endEvt._internal = startedEvt._internal;\r\n      endEvt._isInternal = startedEvt._isInternal;\r\n\r\n      this._analyticsStore.addEvent(endEvt).then(function(){\r\n        delete manager._timedEventCache[refID];\r\n        def.resolve();\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    _logEndInt: function(refID){\r\n      console.warn('This function is deprecated');\r\n      return this.endTimedEvent(refID);\r\n    },\r\n    /**\r\n     * @memberof Flybits.analytics.Manager\r\n     * @member {Object} actions Common analytics metrics or actions performed on Flybits entities.\r\n     * @constant\r\n     * @property {String} VIEWED=viewed Action of viewing a Flybits entity.\r\n     * @property {String} ENGAGED=engaged Action of engaging (clicking) with a Flybits entity.\r\n     * @property {String} COMPONENTENGAGED=componentEngaged Action of engaging (clicking) with a specific part of a Flybits entity.  For instance, this is useful for capturing specific button or UI component clicks that relate to a Content instance.\r\n     */\r\n    actions: {\r\n      VIEWED: 'viewed',\r\n      ENGAGED: 'engaged',\r\n      COMPONENTENGAGED: 'componentEngaged'\r\n    },\r\n\r\n    /**\r\n     * Component details object used for reporting component engagement.\r\n     * @typedef ComponentDetails\r\n     * @memberof Flybits.analytics.Manager\r\n     * @type Object\r\n     * @property {String} name Name or label of the Component for human readable correlation.\r\n     * @property {String} compID An identifier used for non human readable correlation.  Do not confuse this with the Content Instance ID.\r\n     * @property {String} type A string to indicate what type of component it is (eg. Button, Image,...).\r\n     */\r\n\r\n    /**\r\n     * Used to report content related analytics metrics.\r\n     * @memberof Flybits.analytics.Manager\r\n     * @function reportContent\r\n     * @param {Flybits.Content} content Instance of a Flybits Content.\r\n     * @param {String} [action=engaged] Analytics metric action string (refer to {@link Flybits.analytics.Manager.actions}). By default the action will be \"engaged\".\r\n     * @param {Flybits.analytics.Manager.ComponentDetails} [details] Required component details when reporting {@link Flybits.analytics.Manager.actions.COMPONENTENGAGED} analytics metric.\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without a return value and rejects with a common Flybits Validation model instance.\r\n     */\r\n    reportContent: function(content, action, details){\r\n      var validation = new Flybits.Validation();\r\n\r\n      if(!content){\r\n        validation.addError('Missing Content', '',{\r\n          code: Flybits.Validation.type.MISSINGARG,\r\n          context: 'content'\r\n        });\r\n      } else if(!content.id){\r\n        validation.addError('Invalid Content', 'No ID',{\r\n          code: Flybits.Validation.type.INVALIDARG,\r\n          context: 'content.id'\r\n        });\r\n      }\r\n      \r\n      if(!validation.state){\r\n        return Promise.reject(validation);\r\n      }\r\n\r\n      return this.reportContentID(content.id, action, details);\r\n    },\r\n    /**\r\n     * Used to report content related analytics metrics by Flybits Content ID.\r\n     * @memberof Flybits.analytics.Manager\r\n     * @function reportContentID\r\n     * @param {String} contentID ID string of a Flybits Content instance.\r\n     * @param {String} [action=engaged] Analytics metric action string (refer to {@link Flybits.analytics.Manager.actions}). By default the action will be \"engaged\".\r\n     * @param {Flybits.analytics.Manager.ComponentDetails} [details] Required component details when reporting {@link Flybits.analytics.Manager.actions.COMPONENTENGAGED} analytics metric.\r\n     * @return {external:Promise<undefined,Flybits.Validation>} Promise that resolves without a return value and rejects with a common Flybits Validation model instance.\r\n     */\r\n    reportContentID: function(contentID, action, details){\r\n      action = action || this.actions.ENGAGED;\r\n      var validation = new Flybits.Validation();\r\n\r\n      if(!contentID){\r\n        validation.addError('Missing Content', '',{\r\n          code: Flybits.Validation.type.MISSINGARG,\r\n          context: 'content'\r\n        });\r\n      }\r\n      if(action === this.actions.COMPONENTENGAGED && !details){\r\n        validation.addError('Missing Component Details', '',{\r\n          code: Flybits.Validation.type.MISSINGARG,\r\n          context: 'details'\r\n        });\r\n      } else if(action === this.actions.COMPONENTENGAGED && (!details.name || !details.compID || !details.type)){\r\n        validation.addError('Invalid Component Details', '',{\r\n          code: Flybits.Validation.type.INVALIDARG,\r\n          context: 'name,compID,type'\r\n        });\r\n      }\r\n      if(!Flybits.context.Manager._defaultServices.contentAnalytics){\r\n        validation.addError('Context Manager not initialized', '',{\r\n          code: Flybits.Validation.type.NOTFOUND,\r\n          context: 'context.Manager'\r\n        });\r\n      }\r\n\r\n      if(!validation.state){\r\n        return Promise.reject(validation);\r\n      }\r\n\r\n      var report = {};\r\n      var keyStr = action+'.'+contentID;\r\n      if(action === this.actions.COMPONENTENGAGED && details){\r\n        keyStr += '.'+ details.compID+'.' + details.name + '.' + details.type\r\n      }\r\n\r\n      report[keyStr] = true;\r\n\r\n      return Flybits.context.Manager._defaultServices.contentAnalytics.setState(report);\r\n    }\r\n  };\r\n\r\n  return analyticsManager;\r\n\r\n})();\n/*global Flybits*/\r\nFlybits.analytics.UploadChannel = (function(){\r\n  var UploadChannel = function(){\r\n    console.warn('This abstract class is deprecated');\r\n    if(this.constructor === Object){\r\n      throw new Error('Abstract classes cannot be instantiated');\r\n    }\r\n  };\r\n  UploadChannel.prototype = {\r\n    implements: function(interfaceName){\r\n      if(!this._interfaces){\r\n        this._interfaces = [];\r\n      }\r\n      this._interfaces.push(interfaceName);\r\n    },\r\n  };\r\n\r\n  return UploadChannel;\r\n})();\r\n\n/*global Flybits*/\r\nFlybits.analytics.DefaultChannel = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var ApiUtil = Flybits.util.Api;\r\n  var Session = Flybits.Session;\r\n\r\n  var DefaultChannel = function(opts){\r\n    console.warn('This class is deprecated');\r\n    Flybits.analytics.UploadChannel.call(this,opts);\r\n\r\n    this.sessionKey = null;\r\n    this.HOST = Flybits.cfg.analytics.CHANNELHOST;\r\n    this.channelKey = Flybits.cfg.analytics.CHANNELKEY;\r\n    this.appID = Flybits.cfg.analytics.APPID;\r\n  };\r\n\r\n  DefaultChannel.prototype = Object.create(Flybits.analytics.UploadChannel.prototype);\r\n  DefaultChannel.prototype.constructor = DefaultChannel;\r\n\r\n  DefaultChannel.prototype.initSession = function(){\r\n    var def = new Deferred();\r\n    var channel = this;\r\n    var url = this.HOST + '/session?key=' + this.channelKey;\r\n    ApiUtil.fetch(url,{\r\n      method: 'GET',\r\n      respType: 'json'\r\n    }).then(function(resp){\r\n      channel.sessionKey = resp.body.key;\r\n      def.resolve();\r\n    }).catch(function(resp){\r\n      def.reject(resp);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  DefaultChannel.prototype._preparePayload = function(events){\r\n    return {\r\n      deviceID: Session.deviceID,\r\n      data: events.map(function(obj){\r\n        var rawObj = obj.toJSON();\r\n        rawObj.properties['_uid'] = Session.user.id;\r\n        return rawObj;\r\n      })\r\n    };\r\n  };\r\n\r\n  DefaultChannel.prototype._upload = function(payload){\r\n    var def = new Deferred();\r\n    var url = this.HOST + '/events';\r\n    ApiUtil.fetch(url,{\r\n      method: 'POST',\r\n      headers: {\r\n        key: this.sessionKey,\r\n        appid: this.appID,\r\n        'Content-Type': 'application/json'\r\n      },\r\n      body: JSON.stringify(payload),\r\n      respType: 'empty'\r\n    }).then(function(){\r\n      def.resolve();\r\n    }).catch(function(resp){\r\n      def.reject(resp);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  DefaultChannel.prototype.uploadEvents = function(events){\r\n    var channel = this;\r\n    var payload = this._preparePayload(events);\r\n    var sessionPromise = Promise.resolve();\r\n    if(!this.sessionKey){\r\n      sessionPromise = this.initSession();\r\n    }\r\n\r\n    return sessionPromise.then(function(){\r\n      return channel._upload(payload);\r\n    });\r\n  };\r\n\r\n  return DefaultChannel;\r\n})();\r\n\n/*global Flybits*/\r\nFlybits.analytics.AnalyticsStore = (function(){\r\n  var AnalyticsStore = function(opts){\r\n    console.warn('This class is deprecated');\r\n    if(this.constructor === Object){\r\n      throw new Error('Abstract classes cannot be instantiated');\r\n    }\r\n\r\n    this.maxStoreSize = opts && opts.maxStoreSize?opts.maxStoreSize:100;\r\n  };\r\n  AnalyticsStore.prototype = {\r\n    implements: function(interfaceName){\r\n      if(!this._interfaces){\r\n        this._interfaces = [];\r\n      }\r\n      this._interfaces.push(interfaceName);\r\n    },\r\n  };\r\n\r\n  return AnalyticsStore;\r\n})();\r\n\n/*global Flybits*/\r\nFlybits.analytics.RecordsStore = (function(){\r\n  var Deferred = Flybits.Deferred;\r\n  var Validation = Flybits.Validation;\r\n  var ObjUtil = Flybits.util.Obj;\r\n  var Event = Flybits.analytics.Event;\r\n\r\n  function RecordsStore(opts){\r\n    console.warn('This class is deprecated');\r\n    Flybits.analytics.AnalyticsStore.call(this,opts);\r\n    if(opts){\r\n      this.opts = ObjUtil.extend({},opts);\r\n    }\r\n\r\n    this._store = new Flybits.store.Record(this.STOREID);\r\n  }\r\n\r\n  RecordsStore.prototype = Object.create(Flybits.analytics.AnalyticsStore.prototype);\r\n  RecordsStore.prototype.constructor = RecordsStore;\r\n\r\n  RecordsStore.prototype.STOREID = RecordsStore.STOREID = 'flb.analytics';\r\n\r\n  RecordsStore.prototype.addEvent = function(event){\r\n    var def = new Deferred();\r\n    var bStore = this;\r\n    var store = this._store;\r\n    var storeLength = 0;\r\n\r\n    if(!(event instanceof Event)){\r\n      def.reject(new Validation().addError('Invalid Argument','Must be an instance of an analytics Event',{\r\n        code: Validation.type.INVALIDARG\r\n      }));\r\n      return def.promise;\r\n    }\r\n\r\n    store.keys().then(function(keys){\r\n      storeLength = keys.length;\r\n      return bStore._saveState(event);\r\n    }).then(function(){\r\n      if (storeLength >= bStore.maxStoreSize){\r\n        bStore._validateStoreState().then(function(){\r\n          def.resolve();\r\n        });\r\n      } else{\r\n        def.resolve();\r\n      }\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  RecordsStore.prototype.getEvent = function(tmpID){\r\n    var def = new Deferred();\r\n    this._store.get(tmpID).then(function(res){\r\n      if(res){\r\n        var rehydratedEvt = new Event(res);\r\n        rehydratedEvt._tmpID = tmpID;\r\n        def.resolve(rehydratedEvt);\r\n      } else{\r\n        def.resolve();\r\n      }\r\n    }).catch(function(e){\r\n      def.reject(e);\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  RecordsStore.prototype.clearEvents = function(tmpIDs){\r\n    var store = this._store;\r\n    var def = new Deferred();\r\n    var deleteData;\r\n    deleteData = function(){\r\n      if(tmpIDs.length <= 0){\r\n        def.resolve();\r\n        return;\r\n      }\r\n      var curKey = tmpIDs.pop();\r\n      store.remove(curKey).catch(function(){}).then(function(){\r\n        deleteData();\r\n      });\r\n    };\r\n    deleteData();\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  RecordsStore.prototype.clearAllEvents = function(){\r\n    return this._store.clear();\r\n  };\r\n\r\n  RecordsStore.prototype.getAllEvents = function(){\r\n    var def = new Deferred();\r\n    var data = [];\r\n    var store = this._store;\r\n\r\n    store.keys().then(function(keys){\r\n      var mapData = function(){\r\n        if(!keys.length){\r\n          def.resolve(data);\r\n          return;\r\n        }\r\n        var curKey = keys.pop();\r\n        store.get(curKey).then(function(item){\r\n          var rehydratedEvt = new Event(item);\r\n          rehydratedEvt._tmpID = curKey;\r\n          data.push(rehydratedEvt);\r\n        }).catch(function(){}).then(function(){\r\n          mapData();\r\n        });\r\n      };\r\n      mapData();\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n  RecordsStore.prototype._saveState = function(event){\r\n    return this._store.set(event._tmpID,event.toJSON());\r\n  };\r\n\r\n  RecordsStore.prototype._validateStoreState = function(){\r\n    var bStore = this;\r\n    var def = new Deferred();\r\n    var promises = [];\r\n    var store = this._store;\r\n    store.keys().then(function(result){\r\n      var keys = result;\r\n      var accessCount = keys.length - bStore.maxStoreSize;\r\n\r\n      keys.sort(function(a,b){\r\n        return (+(a.split('-')[1]))-(+(b.split('-')[1]));\r\n      });\r\n\r\n      if(accessCount > 0){\r\n        for(var i = 0; i < accessCount; i++){\r\n          promises.push(store.remove(keys.shift()));\r\n        }\r\n      }\r\n\r\n      Flybits.Deferred.settlePromises(promises).then(function(){\r\n        def.resolve();\r\n      });\r\n    }).catch(function(){\r\n      def.reject();\r\n    });\r\n\r\n    return def.promise;\r\n  };\r\n\r\n\r\n  return RecordsStore;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Content\r\n * @classdesc API wrapper class for the retrieval of {@link Flybits.Content} models from the Flybits core.\r\n * @memberof Flybits.api\r\n */\r\nFlybits.api.Content = (function(){\r\n  /**\r\n   * Available request parameters to filter {@link Flybits.Content} in the Flybits core.\r\n   * @typedef RequestParams\r\n   * @memberof Flybits.api.Content\r\n   * @type Object\r\n   * @property {string} [id] ID of a {@link Flybits.Content}.\r\n   * @property {string[]} [ids] List of {@link Flybits.Content} IDs.\r\n   * @property {Flybits.api.Paging} [paging] Details to dictate which page, or subset, of results should be returned from the total records that match the query parameters.\r\n   * @property {Object} [sortBy] Specification of server sorting of models requested.\r\n   * @property {string} sortBy.key String pertaining to a sorting parameter by which to order server model response by.  Current implementation allows sorting by `createdAt,modifiedAt,evaluatedAt`.  If `managed=true` than only the follow sorting keys are supported `name,createdAt,modifiedAt`.\r\n   * @property {string} [sortBy.direction=\"descending\"] Direction of ordering based on specified `key`.  Possible values are `descending` or `ascending`\r\n   * @property {string} [templateType] Flybits Content Template type string to filter by.\r\n   * @property {string} [templateID] ID of Flybits Content Template to filter by.  Note it is recommended to use `templateType` as `templateID` is different per Flybits tenant.\r\n   * @property {string[]} labels An array of string labels to filter Content by.  Note that these labels are joined with a logical OR.  Eg: `['event', 'park']`\r\n   * @property {string} [labelsFormula] An advanced label formula string that supports a boolean statement of label specification with brackets, logical ORs, and logical ANDs.  If a `labelsFormula` is provided, it will take precedence over a `labels` array. @see {@link Flybits.api.Content.LabelsFormula}\r\n   * @property {boolean} [managed] Flag to indicate the return of relevant `Content` instances or `Content` instances that are manageable by the requesting user based on permission levels.  This is reserved for Experience Studio admins.\r\n   * @property {boolean} [disableContextEmbed] Flag to indicate the return of `Content` instances with context embedding placeholders still in present. This flag is available only to management admin purposes.\r\n   * @property {boolean} [richText] Flag to indicate the return of rich text.\r\n   * @property {boolean} [getJourneyUsages] Flag to indicate whether to include journey usage information in the returned Content instances.\r\n   * @property {Object} [location]  Specification of location attributes required for querying Content instances.\r\n   * @property {string} location.key Key name of the location object within the Content data.\r\n   * @property {number} location.lat Latitiude by which to perform the query.\r\n   * @property {number} location.lng Longitude by which to perform the query.\r\n   * @property {number} [location.radius=10000] Radius of location search surrounding provided latitude and longitude.\r\n   * @property {boolean} [data=true] Flag indicating whether or not to include Content Instance JSON data objects embedded within the Content Instance in the server response.  By default this is set to `true`.\r\n   * @property {string} [search] Search string to filter Content by name.  Note: this is only supported when `managed=true`\r\n   * @property {string} [name] Name string to filter Content by exact name.  Note: this is only supported when `managed=true`\r\n   * @property {string} [renderType=default] Indicates the class of content to retrieve.  By default only non-html based content is returned. View all available {@link Flybits.Content.renderTypes | render types here}.\r\n   */\r\n\r\n  /**\r\n   * @typedef LabelsFormula\r\n   * @memberof Flybits.api.Content\r\n   * @example \r\n   * Supported Operators:\r\n   * NOT - !\r\n   * AND - ,\r\n   * OR - ;\r\n   * \r\n    (english)\r\n    ((english))\r\n    (!(english))\r\n    (english;french)\r\n    (english,french)\r\n    (english,!french)\r\n    (english;french;spanish)\r\n    (english,french,spanish)\r\n    (english,!french,!spanish)\r\n    (english,(french;spanish),german)\r\n    ((english,french);(spanish,german))\r\n   */\r\n  var ObjUtil = Flybits.util.Obj;\r\n  var ApiUtil = Flybits.util.Api;\r\n  var Validation = Flybits.Validation;\r\n  var Deferred = Flybits.Deferred;\r\n  var Content = Flybits.Content;\r\n\r\n  var lastPaging = null;\r\n\r\n  const MANAGEDSORTKEYS = ['name', 'createdAt', 'modifiedAt'];\r\n  const RELAVANTSORTKEYS = ['createdAt','modifiedAt','evaluatedAt'];\r\n\r\n  function parseParams( reqParams ){\r\n    var validation = new Validation();\r\n    var req = {};\r\n    if( !reqParams ){\r\n      return req;\r\n    }\r\n\r\n    if(reqParams.id || reqParams.ids){\r\n      var retArr = reqParams.ids?reqParams.ids:[];\r\n\r\n      if(reqParams.id && retArr.indexOf(reqParams.id) < 0){\r\n        retArr.push(reqParams.id)\r\n      }\r\n\r\n      if(retArr.length){\r\n        req.contentIds = retArr.join(',');\r\n      }\r\n    }\r\n\r\n    if(reqParams.managed){\r\n      req.managementMode = true;\r\n    }\r\n\r\n    if( reqParams.paging ){\r\n      if( !reqParams.paging.limit && !reqParams.paging.offset ){\r\n        validation.addError('Missing Argument','paging request parameter object must contain at least a limit or offset property.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'paging.limit, paging.offset'\r\n        });\r\n      } else{\r\n        if( reqParams.paging.limit > 0 ){\r\n          req.limit = reqParams.paging.limit;\r\n        }\r\n        if( reqParams.paging.offset >= 0 ){\r\n          req.offset = reqParams.paging.offset;\r\n        }\r\n      }\r\n    }\r\n\r\n    if( reqParams.sortBy ){\r\n      var key = reqParams.sortBy.key;\r\n      var order = reqParams.sortBy.order;\r\n\r\n      if( !key ){\r\n        validation.addError('Missing Argument','sortBy requires a key to sort by.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'sortBy.key'\r\n        });\r\n      }\r\n\r\n      if( order && !(order === 'asc' || order === 'ascending' || order === 'desc' || order === 'descending') ){\r\n        validation.addError('Invalid Argument','Content sort direction invalid.  Supported values are: asc or ascending or desc or descending',{\r\n          code: Validation.type.INVALIDARG,\r\n          context: 'sortBy.order'\r\n        });\r\n      } else if(key && !order){\r\n        order = 'desc'\r\n      }\r\n\r\n      if(order === 'ascending'){\r\n        order = 'asc';\r\n      } else if(order === 'descending'){\r\n        order = 'desc';\r\n      }\r\n      \r\n      if(reqParams.managed){\r\n        if(!MANAGEDSORTKEYS.includes(key)){\r\n          validation.addError('Invalid Argument','Content cannot be sorted by this property:'+key,{\r\n            code: Validation.type.INVALIDARG,\r\n            context: 'sortBy.key'\r\n          });\r\n        } else{\r\n          req.sortby = key;\r\n          req.sortorder = order;\r\n        }\r\n      } else{\r\n        if(!RELAVANTSORTKEYS.includes(key) ){\r\n          validation.addError('Invalid Argument','Content cannot be sorted by this property:'+key,{\r\n            code: Validation.type.INVALIDARG,\r\n            context: 'sortBy.key'\r\n          });\r\n        } else{\r\n          req.orderby = key;\r\n          req.sortorder = order;\r\n        }\r\n      }\r\n    }\r\n\r\n    if(reqParams.templateType){\r\n      req.templateType = reqParams.templateType\r\n    }\r\n\r\n    if( reqParams.templateID ){\r\n      req.templateId = reqParams.templateID;\r\n    }\r\n\r\n    if(reqParams.labelsFormula){\r\n      req.labelsFormula = reqParams.labelsFormula;\r\n    } else if(reqParams.labels){\r\n      if(reqParams.labels.constructor !== Array){\r\n        validation.addError('Invalid Argument','Labels must be an array of strings',{\r\n          code: Validation.type.INVALIDARG,\r\n          context: 'labels'\r\n        });\r\n      } else if(reqParams.labels.length > 0){\r\n        req.labelsFormula = '('+reqParams.labels.join(';')+')';\r\n      }\r\n    }\r\n\r\n    /** Boolean params **/\r\n    if(Object.prototype.hasOwnProperty.call(reqParams,'data')){\r\n      req.data = reqParams.data;\r\n    }\r\n\r\n    if(Object.prototype.hasOwnProperty.call(reqParams,'disableContextEmbed')){\r\n      req.disableContextEmbed = reqParams.disableContextEmbed;\r\n    }\r\n\r\n    if(Object.prototype.hasOwnProperty.call(reqParams,'richText')){\r\n      req.returnRichText = reqParams.richText;\r\n    }\r\n\r\n    if(Object.prototype.hasOwnProperty.call(reqParams,'getJourneyUsages')){\r\n      req.getJourneyUsages = reqParams.getJourneyUsages;\r\n    }\r\n    /** End of boolean params **/\r\n\r\n    if(reqParams.location){\r\n      if(!reqParams.location.key){\r\n        validation.addError('Missing Argument','location query requires a key to sort by.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'location.key'\r\n        });\r\n      } else{\r\n        req.loc = reqParams.location.key;\r\n      }\r\n      if(!reqParams.location.lat){\r\n        validation.addError('Missing Argument','location query requires a latitude.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'location.lat'\r\n        });\r\n      } else{\r\n        req.lat = reqParams.location.lat;\r\n      }\r\n      if(!reqParams.location.lng){\r\n        validation.addError('Missing Argument','location query requires a longitude.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'location.lng'\r\n        });\r\n      } else{\r\n        req.lng = reqParams.location.lng;\r\n      }\r\n      if(reqParams.location.radius){\r\n        req.radius = reqParams.location.radius;\r\n      } else{\r\n        req.radius = 1000;\r\n      }\r\n    }\r\n\r\n    if(reqParams.managed){\r\n      if (reqParams.name && typeof reqParams.name === 'string'){\r\n        req.name = reqParams.name\r\n      } else if (reqParams.search && typeof reqParams.search === 'string'){\r\n        req.search = reqParams.search.toLowerCase();\r\n      }\r\n    } else {\r\n      if(reqParams.name || reqParams.search){\r\n        validation.addError('Invalid Argument', 'Name/Search is only supported for admins and if `managed` flag is true.',{\r\n          code: Validation.type.INVALIDARG,\r\n          context: reqParams.name ? 'name': 'search'\r\n        });\r\n      }\r\n    }\r\n\r\n    if(reqParams.renderType){\r\n      switch(reqParams.renderType){\r\n      case Flybits.Content.renderTypes.DEFAULT:\r\n      case Flybits.Content.renderTypes.ALL:\r\n      case Flybits.Content.renderTypes.HTML:\r\n        req.renderType = reqParams.renderType;\r\n        break;\r\n      default:\r\n        validation.addError('Invalid Argument', 'Render type can only be `html`, `all`, or `default`.',{\r\n          code: Validation.type.INVALIDARG,\r\n          context: 'renderType'\r\n        });\r\n      }\r\n    }\r\n\r\n    if(!validation.state){\r\n      throw validation;\r\n    }\r\n\r\n    return req;\r\n  }\r\n\r\n  var content = {\r\n\r\n    /**\r\n     * Helper to retrieve cached paging property.  After every API request for {@link Flybits.Content} models, the static paging cache is replaced by the paging properties of the latest request.\r\n     * @memberof Flybits.api.Content\r\n     * @function getPaging\r\n     * @returns {Flybits.api.Paging} The last pagination object received from retrieving {@link Flybits.Content|Contents}.\r\n     */\r\n    getPaging: function(){\r\n      return lastPaging;\r\n    },\r\n    \r\n    /**\r\n     * Retrieves {@link Flybits.Content} model with specified ID.\r\n     * @memberof Flybits.api.Content\r\n     * @function get\r\n     * @param {string} id - ID of the {@link Flybits.Content} model.\r\n     * @returns {external:Promise<Flybits.Content,Flybits.Validation>} Promise that resolves with {@link Flybits.Content} with specified ID.  Promise rejects with a {@link Flybits.Validation} object containing {@link Flybits.Validation.ValidationError|error} objects if request has failed or if a {@link Flybits.Content} was not found with supplied ID.\r\n     */\r\n    get: function( id, opts ){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.CONTENTS;\r\n      var data = {\r\n        data: true,\r\n      };\r\n      var localization = opts && opts.localization?opts.localization : 'all';\r\n\r\n      if( !id || id === '' ){\r\n        throw new Validation().addError('Missing Argument','No Content ID specified',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'id'\r\n        });\r\n      }\r\n\r\n      if(opts && Object.prototype.hasOwnProperty.call(opts, 'getJourneyUsages')){\r\n        data.getJourneyUsages = opts.getJourneyUsages;\r\n      }\r\n \r\n      url = url + '/' + id + '?' + ApiUtil.toURLParams(data);\r\n\r\n      ApiUtil.flbFetch( url, {\r\n        method: 'GET',\r\n        headers: {\r\n          'accept-language': localization\r\n        }\r\n      }).then( function( resp ){\r\n        if( resp && resp.body ){\r\n          var content; \r\n          try{\r\n            content = Content.getInstance( resp.body );\r\n          } catch(e){\r\n            console.error(e);\r\n            def.reject( new Validation().addError('Server model Parsing Failed','Failed to parse single content server model.',{\r\n              code: Validation.type.MALFORMED,\r\n              context: resp\r\n            }));\r\n          }\r\n\r\n          def.resolve({\r\n            result: content\r\n          });\r\n        } else {\r\n          def.reject( new Validation().addError('Server Request Failed','Failed to retrieve single content from server',{\r\n            code: Validation.type.MALFORMED\r\n          }));\r\n        }\r\n      }).catch( function( resp ){\r\n        def.reject( resp );\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n\r\n    /**\r\n     * Retrieves {@link Flybits.Content} models by specified request parameters.\r\n     * @memberof Flybits.api.Content\r\n     * @function getAll\r\n     * @param {Flybits.api.Content.RequestParams} requestParams Request parameter object to filter {@link Flybits.Content} models in the core.\r\n     * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves with a {@link Flybits.api.Result} object with a list of {@link Flybits.Content} models that meet the request parameters.  Promise rejects with a {@link Flybits.Validation} object containing {@link Flybits.Validation.ValidationError|error} objects if request has failed.\r\n     */\r\n    getAll: function( requestParams ){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST;\r\n      var data = {\r\n        data: true\r\n      };\r\n      var reqParamCopy = requestParams? ObjUtil.extend({}, requestParams): undefined;\r\n      \r\n      if(requestParams && requestParams.managed){\r\n        url += Flybits.cfg.res.CONTENTS;\r\n      } else if(requestParams && requestParams.location){\r\n        url += Flybits.cfg.res.CONTENTS;\r\n      } else{\r\n        url += Flybits.cfg.res.RELEVANTCONTENTS;\r\n      }\r\n      var localization = 'all';\r\n      \r\n      if(requestParams){\r\n        localization = requestParams.localization?requestParams.localization:'all';\r\n        delete requestParams.localization;\r\n        requestParams = ObjUtil.extend(data,requestParams);\r\n        data = parseParams(requestParams);\r\n      }\r\n      \r\n      data = ApiUtil.toURLParams( data );\r\n      if( data !== '' ){\r\n        url += '?' + data;\r\n      }\r\n\r\n      ApiUtil.flbFetch( url, {\r\n        method: 'GET',\r\n        headers: {\r\n          'accept-language': localization\r\n        }\r\n      }).then( function( resp ){\r\n        if( resp && resp.body && resp.body.data && resp.body.data.length >= 0 ){\r\n          var paging = ApiUtil.parsePaging( resp.body );\r\n          lastPaging = paging;\r\n\r\n          var contents = resp.body.data.map( function(obj){\r\n            try{\r\n              var contentInstance = Content.getInstance( obj );\r\n              return contentInstance;\r\n            } catch(e){\r\n              console.error(e);\r\n              def.reject( new Validation().addError('Request Failed','Failed to parse server model.',{\r\n                code: Validation.type.MALFORMED,\r\n                context: obj\r\n              }));\r\n            }\r\n          });\r\n\r\n          def.resolve({\r\n            result: contents,\r\n            nextPageFn: ApiUtil.createNextPageCall( Flybits.api.Content.getAll, reqParamCopy, paging ),\r\n            paging: paging\r\n          });\r\n        } else {\r\n          def.reject( new Validation().addError('Server Request Failed','Failed to retrieve contents from server',{\r\n            code: Validation.type.MALFORMED\r\n          }));\r\n        }\r\n      }).catch( function( resp ){\r\n        def.reject( resp );\r\n      });\r\n\r\n      return def.promise;\r\n    }\r\n  };\r\n\r\n  return content;\r\n})();\n/*global Flybits,Path*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class ContentData\r\n * @classdesc API wrapper class for the retrieval of {@link Flybits.ContentData} and {@link Flybits.PagedData} models from Flybits core.\r\n * @memberof Flybits.api\r\n */\r\nFlybits.api.ContentData = (function(){\r\n  var ObjUtil = Flybits.util.Obj;\r\n  var ApiUtil = Flybits.util.Api;\r\n  var Validation = Flybits.Validation;\r\n  var Deferred = Flybits.Deferred;\r\n  var Content = Flybits.Content;\r\n  var ContentData = Flybits.ContentData;\r\n  var PagedData = Flybits.PagedData;\r\n\r\n  var lastPaging = null;\r\n\r\n  function parseParams( reqParams ){\r\n    var req = {};\r\n    if( !reqParams ){\r\n      return req;\r\n    }\r\n\r\n    if( reqParams.paging ){\r\n      var pagingFieldKeys = Object.keys( reqParams.paging );\r\n      pagingFieldKeys.forEach( function( key ){\r\n        var pagingKeyValue = reqParams.paging[key];\r\n        if( pagingKeyValue.constructor === Object ){\r\n          var pagingLimit = pagingKeyValue.limit;\r\n          var pagingOffset = pagingKeyValue.offset;\r\n\r\n          if( !pagingLimit && !pagingOffset ){\r\n            throw new Validation().addError('Missing Argument','paging request parameter object must contain at least a limit or offset property.',{\r\n              code: Validation.type.MISSINGARG,\r\n              context: 'pagingLimit, pagingOffset'\r\n            });\r\n          }\r\n\r\n          if( pagingLimit > 0 ){\r\n            var pagingLimitKey = key+'.limit';\r\n            req[pagingLimitKey] = pagingLimit;\r\n          }\r\n          if( reqParams.paging[key].offset >= 0 ){\r\n            var pagingOffsetKey = key+'.offset';\r\n            req[pagingOffsetKey] = pagingOffset;\r\n          }\r\n        } else {\r\n          if( key === 'limit' && pagingKeyValue > 0 ){\r\n            req.limit = pagingKeyValue;\r\n          }\r\n          if( key === 'offset' && pagingKeyValue >= 0 ){\r\n            req.offset = pagingKeyValue;\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    if( reqParams.sortBy ){\r\n      var sortingFieldKeys = Object.keys( reqParams.sortBy );\r\n      sortingFieldKeys.forEach( function( key ){\r\n        var sortKeyValue = reqParams.sortBy[key];\r\n        \r\n        if( sortKeyValue.constructor === Object ){\r\n          var sortKey = sortKeyValue.key;\r\n          var sortOrder = sortKeyValue.order;\r\n\r\n          if( !sortKey ){\r\n            throw new Validation().addError('Missing Argument','orderBy requires a ContentData model property key to order by.',{\r\n              code: Validation.type.MISSINGARG,\r\n              context: 'orderBy.key'\r\n            });\r\n          }\r\n          // @TODO: IMPLEMENT VALIDATION TO CHECK IF SORTING CAN BE DONE BY KEY SPECIFIED BY USER\r\n          var sortFilterKey = key+'.sortBy';\r\n          req[sortFilterKey] = sortKey;\r\n\r\n          if( sortOrder && !(sortOrder === 'asc' || sortOrder === 'desc') ){\r\n            throw new Validation().addError('Invalid Argument','Content cannot be ordered by in such way(MUST BE asc or desc)',{\r\n              code: Validation.type.INVALIDARG,\r\n              context: 'orderBy.order'\r\n            });\r\n          }\r\n          var sortFilterOrder = key+'.order';\r\n          req[sortFilterOrder] = sortOrder;\r\n        } else {\r\n          if( key === 'key' ){\r\n            req.key = sortKeyValue;\r\n          }\r\n          if( key === 'order' ){\r\n            req.key = sortKeyValue;\r\n          }\r\n        }\r\n      });\r\n\r\n      if(Object.prototype.hasOwnProperty.call(reqParams,'data')){\r\n        req.data = reqParams.data;\r\n      }\r\n    }\r\n\r\n    return req;\r\n  }\r\n\r\n  var content = {\r\n\r\n    /**\r\n     * Helper to retrieve cached paging property.  After every API request for {@link Flybits.ContentData} models, the static paging cache is replaced by the paging properties of the latest request.\r\n     * @memberof Flybits.api.ContentData\r\n     * @function getPaging\r\n     * @returns {Flybits.api.Paging} The last pagination object received from retrieving {@link Flybits.ContentData}.\r\n     */\r\n    getPaging: function(){\r\n      return lastPaging;\r\n    },\r\n    \r\n    /**\r\n     * Retrieves {@link Flybits.ContentData} model with specified ID.\r\n     * @memberof Flybits.api.ContentData\r\n     * @function get\r\n     * @param {Object} requestParams Request parameters.\r\n     * @param {string} requestParams.contentID Content ID to which the requested {@link Flybits.ContentData|ContentData} belongs to.\r\n     * @param {string} requestParams.contentDataID Specific ID of the requested {@link Flybits.ContentData|ContentData}.\r\n     * @param {Flybits.api.Paging} [requestParams.paging] Details to dictate which page, or subset, of results should be returned from the total records that match the query parameters.\r\n     * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves with result object containing specific {@link Flybits.ContentData}.\r\n     */\r\n    get: function( requestParams ){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.CONTENTS;\r\n      var contentID = requestParams?requestParams.contentID:undefined;\r\n      var contentDataID = requestParams?requestParams.contentDataID:undefined;\r\n      var localization = requestParams && requestParams.localization?requestParams.localization:'all';\r\n\r\n      if( !contentID || contentID === '' ){\r\n        throw new Validation().addError('Missing Argument','No Content ID specified to find Data',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: contentID\r\n        });\r\n      }\r\n\r\n      if( !contentDataID || contentDataID === '' ){\r\n        throw new Validation().addError('Missing Argument','No Content Data ID specified to find Data',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'contentDataID'\r\n        });\r\n      }\r\n\r\n      if(requestParams){\r\n        delete requestParams.contentID;\r\n        delete requestParams.localization;\r\n        delete requestParams.contentDataID;\r\n        requestParams = parseParams( requestParams );\r\n      }\r\n\r\n      url = url + '/' + contentID + '/data/' + contentDataID;\r\n      requestParams = ApiUtil.toURLParams( requestParams );\r\n      if( requestParams !== '' ){\r\n        url += '?' + requestParams;\r\n      }\r\n\r\n      ApiUtil.flbFetch( url, {\r\n        method: 'GET',\r\n        headers: {\r\n          'accept-language': localization\r\n        }\r\n      }).then( function( resp ){\r\n        if( resp && resp.body ){\r\n          var contentData; \r\n          var routePath = new Path();\r\n          routePath.append(new Content({id:contentID}));\r\n          try{\r\n            contentData = new ContentData( resp.body, routePath );\r\n          } catch(e){\r\n            console.error(e);\r\n            def.reject( new Validation().addError('Server model Parsing Failed','Failed to parse single content server model.',{\r\n              code: Validation.type.MALFORMED,\r\n              context: resp\r\n            }));\r\n          }\r\n\r\n          def.resolve({\r\n            result: contentData\r\n          });\r\n        } else {\r\n          def.reject( new Validation().addError('Server Request Failed','Failed to retrieve single content from server',{\r\n            code: Validation.type.MALFORMED\r\n          }));\r\n        }\r\n      }).catch( function( resp ){\r\n        def.reject( resp );\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n\r\n    /**\r\n     * Retrieves all {@link Flybits.ContentData} models from a {@link Flybits.Content}.\r\n     * @memberof Flybits.api.ContentData\r\n     * @function getAll\r\n     * @param {Object} requestParams Request parameters.\r\n     * @param {string} requestParams.contentID Content ID to which the requested {@link Flybits.ContentData|ContentData} models belongs to.\r\n     * @param {Flybits.api.Paging} [requestParams.paging] Details to dictate which page, or subset, of results should be returned from the total records that match the query parameters.\r\n     * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves with result object containing array of {@link Flybits.ContentData}.\r\n     */\r\n    getAll: function( requestParams ){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.CONTENTS;\r\n      var contentID = requestParams?requestParams.contentID:undefined;\r\n      var localization = requestParams && requestParams.localization?requestParams.localization:'all';\r\n\r\n      if( !contentID || contentID === '' ){\r\n        throw new Validation().addError('Missing Argument','No Content ID specified to find Data',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'contentID'\r\n        });\r\n      }\r\n\r\n      if(requestParams){\r\n        var reqParamCopy = ObjUtil.extend({},requestParams);\r\n        delete requestParams.contentID;\r\n        delete requestParams.localization;\r\n        var data = parseParams( requestParams );\r\n      }\r\n\r\n      url = url + '/' + contentID + '/data';\r\n\r\n      data = ApiUtil.toURLParams( data );\r\n      if( data !== '' ){\r\n        url += '?' + data;\r\n      }\r\n\r\n      ApiUtil.flbFetch( url, {\r\n        method: 'GET',\r\n        headers: {\r\n          'accept-language': localization\r\n        }\r\n      }).then( function( resp ){\r\n        \r\n        if( resp && resp.body && resp.body.data && resp.body.data.length >= 0 ){\r\n          var paging = ApiUtil.parsePaging( resp.body );\r\n          lastPaging = paging;\r\n\r\n          var allContentData = resp.body.data.map( function(obj){\r\n            var routePath = new Path();\r\n            routePath.append(new Content({id:contentID}));\r\n            try{\r\n              return new ContentData( obj, routePath );\r\n            } catch(e){\r\n              console.error(e);\r\n              def.reject( new Validation().addError('Request Failed','Failed to parse server model.',{\r\n                code: Validation.type.MALFORMED,\r\n                context: obj\r\n              }));\r\n            }\r\n          });\r\n\r\n          def.resolve({\r\n            result: allContentData,\r\n            contentID: contentID,\r\n            nextPageFn: ApiUtil.createNextPageCall( Flybits.api.ContentData.getAll, reqParamCopy, paging )\r\n          });\r\n        } else {\r\n          def.reject( new Validation().addError('Server Request Failed','Failed to retrieve contents from server',{\r\n            code: Validation.type.MALFORMED\r\n          }));\r\n        }\r\n      }).catch( function( resp ){\r\n        def.reject( resp );\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * The actual JSON payload that lies within {@link Flybits.ContentData}, that is specified in the Experience Studio, can contain pageable arrays in the form of {@link Flybits.PagedData}.  Thus this function is used to retrieve further pages within.\r\n     * @memberof Flybits.api.ContentData\r\n     * @function getPagedData\r\n     * @param {Object} requestParams Request parameters.\r\n     * @param {string} requestParams.key JSON key of the {@link Flybits.PagedData}.\r\n     * @param {Flybits.Path} requestParams.path Path object that represents the nested depth of the pageable data.\r\n     * @param {Flybits.api.Paging} [requestParams.paging] Details to dictate which page, or subset, of results should be returned from the total records that match the query parameters.\r\n     * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves with result object containing raw JSON objects of the requests nested page.\r\n     */\r\n    getPagedData: function(requestParams){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + '/kernel';\r\n      var localization = requestParams && requestParams.localization?requestParams.localization:'all';\r\n      var validation = new Validation();\r\n      \r\n      if(!requestParams || !requestParams.path){\r\n        validation.addError('Missing Argument','No Path provided for nested data',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'path'\r\n        });\r\n      }\r\n\r\n      if(!requestParams || !requestParams.key){\r\n        validation.addError('Missing Argument','No field key provided for nested data array.',{\r\n          code: Validation.type.MISSINGARG,\r\n          context: 'key'\r\n        });\r\n      }\r\n\r\n      if(!validation.state){\r\n        throw validation.setStackTrace();\r\n      }\r\n\r\n      url += requestParams.path.serialize() + '?field=' + requestParams.key;\r\n      var reqParamCopy = ObjUtil.extend({},requestParams);\r\n      delete requestParams.localization;\r\n      delete requestParams.path;\r\n      delete requestParams.key;\r\n      if(requestParams.paging){\r\n        var reqParam = requestParams.paging;\r\n        requestParams.paging = {};\r\n        requestParams.paging[reqParamCopy.key] = reqParam;\r\n      }\r\n\r\n\r\n      var dataParams = parseParams(requestParams);\r\n      dataParams = ApiUtil.toURLParams( dataParams );\r\n      if( dataParams !== '' ){\r\n        url += '&' + dataParams;\r\n      }\r\n\r\n      ApiUtil.flbFetch( url, {\r\n        method: 'GET',\r\n        headers: {\r\n          'accept-language': localization\r\n        }\r\n      }).then( function(resp){\r\n        var list = resp.body[reqParamCopy.key];\r\n        var listPaging = ApiUtil.parsePaging( resp.body, reqParamCopy.key+'.pagination');\r\n        var tmpPagedData = new PagedData();\r\n        tmpPagedData.fromJSON(list);\r\n\r\n        def.resolve({\r\n          result: tmpPagedData.data,\r\n          nextPageFn: ApiUtil.createNextPageCall(Flybits.api.ContentData.getPagedData,reqParamCopy,listPaging)\r\n        });\r\n      }).catch(function(resp){\r\n        def.reject(resp);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Submits JSON data to a content instance.\r\n     * @memberof Flybits.api.ContentData\r\n     * @function submitData\r\n     * @param {Object} conatentData JSON body of data.  This body must match the template structure of the Content template \r\n     * @returns {external:Promise<Flybits.api.Result,Flybits.Validation>} Promise that resolves if successful and rejects with a `Validation` instance if it is not successful.\r\n     */\r\n    submitData: function(contentData){\r\n      var def = new Deferred();\r\n      var url = Flybits.cfg.HOST + '/kernel';\r\n      url += contentData.path.serialize();\r\n      var method = contentData.id? 'PUT' : 'POST';\r\n\r\n      if(!(contentData instanceof Flybits.ContentData)){\r\n        def.reject(new Validation().addError('Invalid argument','Can only submit ContentData types.',{\r\n          code: Validation.type.INVALIDARG,\r\n          context: contentData\r\n        }));\r\n      } else{\r\n        ApiUtil.flbFetch(url, {\r\n          method: method,\r\n          body: JSON.stringify(contentData.toJSON())\r\n        }).then(function(resp){\r\n          def.resolve(resp);\r\n        }).catch(function(e){\r\n          def.reject(e);\r\n        });\r\n      }\r\n\r\n\r\n      return def.promise;\r\n    }\r\n  };\r\n\r\n  return content;\r\n})();\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class User\r\n * @classdesc API wrapper class for the retrieval of {@link Flybits.User} models from Flybits core.\r\n * @memberof Flybits.api\r\n */\r\nFlybits.api.User = (function(){\r\n  var User = Flybits.User;\r\n  var Session = Flybits.Session;\r\n\r\n  var user = {\r\n    /**\r\n     * Fetches from the Flybits core the currently authenticated {@link Flybits.User}.\r\n     * @memberof Flybits.api.User\r\n     * @function getSignedInUser\r\n     * @returns {external:Promise<Flybits.User,Flybits.Validation>} Promise that resolves with the {@link Flybits.User} model of the currently authenticated user. Promise rejects with a {@link Flybits.Validation} model if request fails to complete successfully.  This may occur if the user session has expired.\r\n     */\r\n    getSignedInUser: function(){\r\n      var def = new Flybits.Deferred();\r\n      var url = Flybits.cfg.HOST + Flybits.cfg.res.AUTHUSER;\r\n      var authToken = Session.userToken;\r\n      var headerObj = {};\r\n      headerObj[Session.AUTHHEADER] = authToken;\r\n\r\n      Flybits.util.Api.flbFetch(url,{\r\n        method: 'GET',\r\n        headers: headerObj,\r\n      }).then(function(respObj){\r\n        var signedInUser = new User(respObj.body);\r\n        Session.user = signedInUser;\r\n        def.resolve(signedInUser);\r\n      }).catch(function(resp){\r\n        def.reject(resp);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * User scoped settings utilities\r\n     * @memberof Flybits.api.User\r\n     * @namespace settings\r\n     */\r\n    settings: {\r\n      _cache: null,\r\n      _create: function(dataObj, namespace){\r\n        var api = this;\r\n        dataObj = dataObj || {};\r\n        var def = new Flybits.Deferred();\r\n        var url = Flybits.cfg.HOST + Flybits.cfg.res.USERSETTINGS;\r\n\r\n        if(namespace){\r\n          url += '/' + namespace;\r\n        }\r\n\r\n        Flybits.util.Api.flbFetch(url, {\r\n          method: 'POST',\r\n          body: JSON.stringify(dataObj)\r\n        }).then(function(resp){\r\n          api._cache = resp.body.data;\r\n          def.resolve(resp.body.data);\r\n        }).catch(function(e){\r\n          def.reject(e);\r\n        });\r\n\r\n        return def.promise;\r\n      },\r\n      _createBase: function(dataObj){\r\n        dataObj = dataObj || {};\r\n        dataObj = {\r\n          data: dataObj\r\n        };\r\n\r\n        return this._create(dataObj);\r\n      },\r\n      /**\r\n       * Fetches user scoped settings.\r\n       * @memberof Flybits.api.User.settings\r\n       * @function get\r\n       * @param {string} [namespace] Namespace of user settings group to retrieve.  If no namespace is provided, the root user settings `Object` will be returned\r\n       * @returns {external:Promise<Object,Flybits.Validation>} Promise that resolves with the user scoped settings `Object`.  If a `namespace` is specified then the corresponding user scoped settings group `Object` will be returned.  Promise rejects with a {@link Flybits.Validation} model if request fails to complete successfully.\r\n       */\r\n      get: function(namespace){\r\n        var api = this;\r\n        var def = new Flybits.Deferred();\r\n        var url = Flybits.cfg.HOST + Flybits.cfg.res.USERSETTINGS;\r\n        if(namespace){\r\n          url += '/' + namespace;\r\n        }\r\n\r\n        Flybits.util.Api.flbFetch(url).then(function(resp){\r\n          if(namespace){\r\n            def.resolve(resp.body);\r\n          } else{\r\n            def.resolve(resp.body.data);\r\n          }\r\n        }).catch(function(e){\r\n          if(e.firstError().serverCode === 404){\r\n            if(namespace){\r\n              api._create({}, namespace).then(function(){\r\n                def.resolve({});\r\n              }).catch(function(e){\r\n                if(e.firstError().serverCode === 404){\r\n                  var baseObj = {};\r\n                  baseObj[namespace] = {};\r\n                  api._createBase(baseObj).then(function(){\r\n                    def.resolve({});\r\n                  }).catch(function(e){\r\n                    def.reject(e);\r\n                  });\r\n                } else{\r\n                  def.reject(e);\r\n                }\r\n              });\r\n            } else{\r\n              api._createBase().then(function(){\r\n                def.resolve({})\r\n              }).catch(function(e){\r\n                def.reject(e);\r\n              });\r\n            }\r\n          } else{\r\n            def.reject(e);\r\n          }\r\n        });\r\n\r\n        return def.promise;\r\n      },\r\n      /**\r\n       * Sets user scoped settings. \r\n       * <br/><br/><b>Note:</b> Setting a root settings `Object` will overwrite previously specified namespaced user settings as namespaces are placed as children of the root settings `Object`.\r\n       * @memberof Flybits.api.User.settings\r\n       * @function set\r\n       * @param {Object} dataObj Settings `Object` to set.  If a `namespace` is specified then the settings `Object` will be set using the `namespace` as a settings group.  If no `namespace` is provided, the `dataObj` will be set on the root.\r\n       * @param {string} [namespace] Namespace of user settings group to set `dataObj`.  If no namespace is provided, the root will be used.\r\n       * @returns {external:Promise<Object,Flybits.Validation>} Promise that resolves with the user scoped settings `Object`.  Promise rejects with a {@link Flybits.Validation} model if request fails to complete successfully.\r\n       */\r\n      set: function(dataObj, namespace){\r\n        dataObj = dataObj || {};\r\n        var api = this;\r\n        var def = new Flybits.Deferred();\r\n        var url = Flybits.cfg.HOST + Flybits.cfg.res.USERSETTINGS;\r\n        if(namespace){\r\n          url += '/' + namespace;\r\n        } else{\r\n          dataObj = {\r\n            data: dataObj\r\n          };\r\n        }\r\n\r\n        Flybits.util.Api.flbFetch(url,{\r\n          method: 'PUT',\r\n          body: JSON.stringify(dataObj)\r\n        }).then(function(resp){\r\n          api._cache = resp.body.data;\r\n          if(namespace){\r\n            def.resolve(dataObj);\r\n          } else{\r\n            def.resolve(api._cache);\r\n          }\r\n        }).catch(function(e){\r\n          if(e.firstError().serverCode === 404){\r\n            api._create(dataObj,namespace).then(function(resp){\r\n              api._cache = resp;\r\n              if(namespace){\r\n                def.resolve(dataObj);\r\n              } else{\r\n                def.resolve(api._cache);\r\n              }\r\n            }).catch(function(e){\r\n              if(e.firstError().serverCode === 404){\r\n                var baseObj = {};\r\n                baseObj[namespace] = dataObj;\r\n                api._createBase(baseObj).then(function(resp){\r\n                  api._cache = resp;\r\n                  def.resolve(dataObj);\r\n                }).catch(function(e){\r\n                  def.reject(e);\r\n                });\r\n              } else{\r\n                def.reject(e);\r\n              }\r\n            });\r\n          } else{\r\n            def.reject(e);\r\n          }\r\n        });\r\n\r\n        return def.promise;\r\n      }\r\n    },\r\n  };\r\n\r\n  return user;\r\n})();\r\n\n/*global Flybits*/\r\n/**\r\n * This is a utility class, do not use constructor.\r\n * @class Zones\r\n * @hideconstructor\r\n * @classdesc API wrapper class for the retrieval of {@link Flybits.ZonesMetadata} and {@link Flybits.Zone} data.\r\n * @memberof Flybits.api\r\n */\r\nFlybits.api.Zones = (function () {\r\n  var ZonesMetadata = Flybits.ZonesMetadata;\r\n  var Zone = Flybits.Zone\r\n  var Module = Flybits.Module\r\n  var Content = Flybits.Content\r\n  var ApiUtil = Flybits.util.Api;\r\n  var Validation = Flybits.Validation;\r\n  var Deferred = Flybits.Deferred;\r\n\r\n  var fetchZoneContent = function(url) {\r\n    var def = new Deferred()\r\n\r\n    ApiUtil.flbFetch(url, {\r\n      method: 'GET',\r\n      headers: {\r\n        'accept-language': 'all'\r\n      }\r\n    }).then(function (resp) {\r\n      const body = resp.body\r\n      const modulesMap = {};\r\n      const contentMap = {};\r\n      \r\n      if(body.data && Array.isArray(body.data)){\r\n        body.data.forEach(function(c){\r\n          contentMap[c.id] = new Content(c);\r\n        });\r\n      }\r\n\r\n      if(body.modules && Array.isArray(body.modules)){\r\n        body.modules.forEach(function(m){\r\n          modulesMap[m.id] = new Module(m, contentMap);\r\n        });\r\n      }\r\n\r\n      const zones = body.zones != null ? body.zones?.map((e) => new Zone(e, modulesMap)) : []\r\n      def.resolve({\r\n        zones: zones,\r\n        scriptURLs: body?.scriptURLs || []\r\n      });\r\n    }).catch(function (e) {\r\n      var serverCode = null;\r\n      if(e instanceof Validation){\r\n        serverCode = e.firstError()?.serverCode;\r\n      }\r\n    \r\n      def.reject(\r\n        new Validation().addError('Failed to fetch relevant content', '', {\r\n          code: Validation.type.NOTFOUND,\r\n          serverCode: serverCode,\r\n          context: new URL(url).searchParams,})\r\n      );\r\n    });\r\n\r\n    return def.promise\r\n  }\r\n\r\n  var zones = {\r\n    /**\r\n     * Retrieves Zones metadata for a specified Flybits project.  Zone metadata will contain simple non-sensitive data such as height and reference IDs of available {@link Flybits.Zone} instances.\r\n     * \r\n     * >**Note:** This is an unauthenticated API that can assist in early application lifecycle rendering.  It can be invoked at any time while authenticated or not.\r\n     * @memberof Flybits.api.Zones\r\n     * @function getMetadata\r\n     * @param {string} projectId Flybits Project ID specific to each Flybits tenant.\r\n     * @returns {external:Promise<Flybits.ZonesMetadata,Flybits.Validation>} a Promise that fulfills with a {@link Flybits.ZonesMetadata}.\r\n     */\r\n    getMetadata: function (projectId) {\r\n      var def = new Deferred();\r\n\r\n      // Make sure a valid projectId has been provided\r\n      if (!projectId) {\r\n        const newValidation = new Validation();\r\n        newValidation.addError(\r\n          'Missing Parameter',\r\n          'Your projectId undefined, length 0, or not a string which are needed to fetch zone metadata',\r\n          {\r\n            code: Validation.type.MISSINGARG,\r\n          }\r\n        );\r\n\r\n        return Promise.reject(newValidation);\r\n      }\r\n\r\n      var url =\r\n        Flybits.cfg.HOST +\r\n        Flybits.cfg.res.ZONESCONFIGURATION +\r\n        '?tenantId=' +\r\n        projectId;\r\n\r\n      ApiUtil.flbFetch(url, {\r\n        method: 'GET',\r\n      })\r\n        .then(function (resp) {\r\n          def.resolve(new ZonesMetadata(resp.body));\r\n        })\r\n        .catch(function (e) {\r\n          var serverCode = null;\r\n          if(e instanceof Validation){\r\n            serverCode = e.firstError()?.serverCode;\r\n          }\r\n          \r\n          def.reject(\r\n            new Validation().addError('No Zones Configuration found', '', {\r\n              code: Validation.type.NOTFOUND,\r\n              serverCode: serverCode,\r\n              context: projectId,\r\n            })\r\n          );\r\n        });\r\n\r\n      return def.promise;\r\n    },\r\n    /**\r\n     * Retrieves a single Zone's metadata for a specified Flybits project and Zone Reference ID.\r\n     * \r\n     * >**Note:** This is an unauthenticated API that can assist in early application lifecycle rendering.  It can be invoked at any time while authenticated or not.\r\n     * @memberof Flybits.api.Zones\r\n     * @function getZoneMetadata\r\n     * @param {string} projectID Flybits Project ID specific to each Flybits tenant.\r\n     * @param {string} zoneReferenceID Zone Reference ID specific to each Zone.\r\n     * @returns {external:Promise<Flybits.ZonesMetadata.ZoneMetadata,Flybits.Validation>} a Promise that fulfills with a {@link Flybits.ZonesMetadata.ZoneMetadata}.\r\n     */\r\n    getZoneMetadata: function(projectID, zoneReferenceID){\r\n      const def = new Deferred();\r\n\r\n      this.getMetadata(projectID).then(function(zonesMetadata){\r\n        if(zonesMetadata && zonesMetadata.getZones([zoneReferenceID])?.length){\r\n          def.resolve(zonesMetadata.getZones([zoneReferenceID])[0]);\r\n        } else{\r\n          def.reject(new Validation().addError('Not found', 'No metadata found for specified Project and Zone',{\r\n            code: Validation.type.NOTFOUND,\r\n            context: {\r\n              projectID: projectID,\r\n              zoneReferenceID: zoneReferenceID\r\n            }\r\n          }));\r\n        }\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      });\r\n\r\n      return def.promise;\r\n    },\r\n\r\n    /**\r\n     * @typedef ZonesConfig\r\n     * @memberof Flybits.api.Zones\r\n     * @type Object\r\n     * @property {string[]} scriptURLs List of URLs for JavaScript resources specific to the Flybits project.  These can be used to expand upon available web components and even specific tracking and support libraries.\r\n     * @property {Flybits.Zone[]} zones List of {@link Flybits.Zone} objects\r\n     */\r\n    /**\r\n     * Retrieves Flybits Zones containing their respective Modules and relevant curated Content based on specified Zone lables.\r\n     * @memberof Flybits.api.Zones\r\n     * @function getAllByLabels\r\n     * @param {string[]} labels An array of Zone labels that will be used to filter available Zone in the Flybits Project.  The labels are treated as a logical AND thus each Zone matching the specified filter must have all specified labels. \r\n     * @returns {Flybits.api.Zones.ZonesConfig} An object that contains a list of Zones matching the specified labels and additional resources.\r\n     */\r\n    getAllByLabels: function(labels) {\r\n      if (!labels) {\r\n        const newValidation = new Validation();\r\n        newValidation.addError(\r\n          'Missing Parameter',\r\n          'Your labels undefined',\r\n          {\r\n            code: Validation.type.MISSINGARG,\r\n          }\r\n        );\r\n\r\n        return Promise.reject(newValidation);\r\n      }\r\n\r\n      var url =\r\n      Flybits.cfg.HOST +\r\n      Flybits.cfg.res.ZONESRELEVANTCONTENTS +\r\n      '?labelsFormula=(' + labels +')';\r\n\r\n      return fetchZoneContent(url)\r\n\r\n    },\r\n\r\n    /**\r\n     * @typedef ZoneConfig\r\n     * @memberof Flybits.api.Zones\r\n     * @type Object\r\n     * @property {string[]} scriptURLs List of URLs for JavaScript resources specific to the Flybits project.  These can be used to expand upon available web components and even specific tracking and support libraries.\r\n     * @property {Flybits.Zone} zone A single {@link Flybits.Zone} object.\r\n     */\r\n    /**\r\n     * Retrieves a Flybits Zone containing its respective Modules and relevant curated Content based on specified Zone Reference ID.\r\n     * @memberof Flybits.api.Zones\r\n     * @function getByReferenceId\r\n     * @param {string} referenceId \r\n     * @returns {Flybits.api.Zones.ZoneConfig} An object that contains the Zone matching the specified Zone Reference ID and additional resources.\r\n     */\r\n    getByReferenceId: function(referenceId) {\r\n      const def = new Deferred();\r\n\r\n      if(!referenceId) {\r\n        const newValidation = new Validation();\r\n        newValidation.addError(\r\n          'Missing Parameter',\r\n          'Your referenceId undefined',\r\n          {\r\n            code: Validation.type.MISSINGARG,\r\n          }\r\n        );\r\n\r\n        return Promise.reject(newValidation);\r\n      }\r\n\r\n      var url =\r\n      Flybits.cfg.HOST +\r\n      Flybits.cfg.res.ZONESRELEVANTCONTENTS +\r\n      '?zoneReferenceID=' + referenceId;\r\n\r\n      fetchZoneContent(url).then(function(resultObj){\r\n        def.resolve({\r\n          scriptURLs: resultObj.scriptURLs,\r\n          zone: resultObj.zones? resultObj.zones[0]: null\r\n        })\r\n      }).catch(function(e){\r\n        def.reject(e);\r\n      })\r\n\r\n      return def.promise;\r\n    }\r\n  };\r\n\r\n  return zones;\r\n})();\r\n\n/***** Export ******/\r\n\r\nif(typeof window === 'object'){\r\n  window.Flybits = Flybits;\r\n  Flybits.initFile = Flybits.initFile.browser;\r\n} else if(typeof process !== 'undefined' && \r\n          process.versions !== null &&\r\n          process.versions.node !== null){\r\n  // eslint-disable-next-line no-unused-vars\r\n  var fs,Persistence,__dirname;\r\n  (async function(){\r\n    fs = await import('fs');\r\n    Persistence = (await import('node-persist')).default;\r\n    let path = await import('path');\r\n    let { fileURLToPath } = await import('url');\r\n    let __filename = fileURLToPath(import.meta.url);\r\n    __dirname = path.dirname(__filename);\r\n  })()\r\n\r\n  global.atob = function(str){\r\n    return Buffer.from(str, 'base64').toString();\r\n  };\r\n  global.btoa = function(str){\r\n    return Buffer.from(str).toString('base64');\r\n  };\r\n  Flybits.initFile = Flybits.initFile.server;\r\n} \r\n\r\nif(typeof __dirname === 'string'){\r\n  Flybits.cfg.store.RESOURCEPATH = __dirname+\"/res\";\r\n}\r\nFlybits.store.Property.init();\r\nvar deferredReady = new Flybits.Deferred();\r\nFlybits.ready = deferredReady.promise;\r\n\r\nexport default Flybits;"],"names":["fs","Persistence","__dirname","Flybits","ready","store","Property","Record","_storageEngines","analytics","context","api","initFile","util","interface","idp","evt","type","SESSIONSTART","SESSIONEND","CTXREPORT","handlerMap","cfg","HOST","CTXREPORTDELAY","REPORTDELAY","REPORTDELAYUNIT","MAXSTORESIZE","SDKPROPS","RESOURCEPATH","DEVICEID","USERTOKEN","USER","USERTOKENEXP","PROJECTID","IDPTYPE","ANALYTICSLASTREPORTED","ANALYTICSLASTREPORTATTEMPTED","CONTEXTLASTREPORTED","CONTEXTLASTREPORTATTEMPTED","res","CONTEXT","UNAUTHENTICATE","AUTHENTICATE","ANONYMOUSAUTH","OAUTH","OIDC","SIGNEDLOGIN","JWTSIGNEDLOGIN","REFRESHAUTH","AUTHUSER","AUTHPROJECT","REQRESETEMAIL","REQCONFIRMEMAIL","CONTENTS","RELEVANTCONTENTS","USERSETTINGS","ZONESCONFIGURATION","ZONESRELEVANTCONTENTS","VERSION","initBrowserFileConfig","on","evtName","handler","availableEvtNames","Object","keys","map","evtKey","mainEvtName","split","Validation","addError","code","MISSINGARG","indexOf","INVALIDARG","push","console","warn","off","evtModifier","Obj","removeObject","evtKeys","filter","key","length","forEach","emit","payload","callbackFn","url","def","Deferred","fetch","then","resp","status","json","extend","resolve","catch","ex","reject","MALFORMED","promise","initServerFileConfig","filePath","log","data","readFileSync","e","error","Error","JSON","parse","restoreSessionDetails","Session","_restoreState","_deviceID","Promise","resolveDeviceID","_persistState","agent","window","navigator","userAgent","Browser","getName","guid","setUserAgent","retObj","physicalDeviceId","sdkVersion","make","deviceType","osVersion","process","version","setStaticDefaults","Manager","reportDelay","reportDelayUnit","maxStoreSize","BaseObj","server","configFileURL","deferredReady","browser","init","configObj","this","bind","settlePromises","prototype","promisesArr","reflectedArr","successResult","result","errorResult","all","s4","Math","floor","random","toString","substring","obj","createGUID","tuples","str","i","toUpperCase","arr","findCallback","index","objs","splice","debounce","func","wait","immediate","timeout","args","callNow","clearTimeout","setTimeout","apply","functionName","exec","isNull","toLocaleValueMap","root","propKey","valueObj","localeObj","locales","localizations","localeKeys","keyIndex","localeKey","value","isMergeableObject","val","call","cloneIfNecessary","optionsArgument","clone","deepmerge","Array","isArray","defaultArrayMerge","target","source","destination","slice","array","arrayMerge","mutate","reduce","prev","next","Api","ObjUtil","defaultAjaxOpts","method","credentials","flbFetch","opts","headers","Content-Type","x-user-agent","stringify","x-authorization","userToken","respType","ajaxOpts","isJSON","checkResult","getResultBody","respObj","body","parseResponse","resultObj","validation","parsedError","parseErrorMsg","errObj","serverCode","raw","undefined","msg","respHeaders","text","toURLParams","keyLength","encodeURIComponent","htmlEncode","htmlDecode","replace","match","dec","chars","isNaN","quot","amp","lt","gt","nbsp","copy","reg","deg","frasl","trade","euro","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","permil","lsaquo","rsaquo","spades","clubs","hearts","diams","oline","larr","uarr","rarr","darr","hellip","ndash","mdash","iexcl","cent","pound","curren","yen","brvbar","brkbar","sect","uml","die","ordf","laquo","not","shy","macr","hibar","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Alpha","alpha","Beta","beta","Gamma","gamma","Delta","delta","Epsilon","epsilon","Zeta","zeta","Eta","eta","Theta","theta","Iota","iota","Kappa","kappa","Lambda","lambda","Mu","mu","Nu","nu","Xi","xi","Omicron","omicron","Pi","pi","Rho","rho","Sigma","sigma","Tau","tau","Upsilon","upsilon","Phi","phi","Chi","chi","Psi","psi","Omega","omega","String","fromCharCode","base64Decode","decodeURIComponent","atob","c","charCodeAt","join","base64Encode","btoa","rawResponse","GENERIC","errors","exceptionMessage","message","messageJSON","detail","parsePaging","jsonResp","paginationKey","pagingObj","offset","limit","total","totalRecords","createNextPageCall","requestFunction","reqParams","paging","getCookie","parts","document","cookie","pop","shift","setCookie","expiryDateObj","expires","toGMTString","userAgentString","name","hasChrome","toLowerCase","hasChromium","hasFirefox","hasSafari","hasIE","hasOpera","isMobile","Content","flattenLocales","preferredLocale","allLocales","attrList","preferredLocaleObj","enLocaleObj","firstLocaleObj","primaryLocaleObj","Set","item","add","from","en","attrKey","o","Geo","_toDeg","rad","PI","_toRad","getBoundingBox","latLngArr","latMin","lat","latMax","lngMin","lng","lngMax","pt","min","max","getCenter","bounds","getBearing","pt1","pt2","dLng","y","sin","cos","x","atan2","ContextPlugin","isSupported","getState","_toServerFormat","contextValue","IDP","getURL","getPayload","KeyDataStore","getSize","set","id","get","getKeys","clear","Localizable","_fromLocaleJSON","serverObj","_toLocaleJSON","appObj","PropertyStore","getItem","setItem","removeItem","Serializable","fromJSON","toJSON","implements","interfaceName","_interfaces","Path","nodes","getNode","className","constructor","append","serialize","pathStr","_pathName","BaseModel","create","reqKeys","SurveyAnswer","ApiUtil","types","DEFAULT","SURVEY","description","createdDate","lastModifiedDate","renderTypes","ALL","HTML","parseContents","contentObj","routePath","ContentData","nextPageFn","getAll","contentID","getDataObj","locale","preferredLanguage","getData","tenantID","tenantId","templateID","templateId","experienceIDs","experienceIds","experienceId","templateType","iconURL","iconUrl","createdAt","Date","modifiedAt","linkedFields","labels","content","renderType","accessType","defaultUI","defaultUIConfig","layout","layoutHTML","styleCSS","styleCSSURL","detailsUI","detailsUIConfig","usedByJourneys","usedBy","metadata","round","getTime","pagination","getInstance","surveyMetadata","Survey","path","_id","getRecursiveParseValue","recursiveObjParse","parentObj","pageKey","hasOwnProperty","PagedData","getRecursiveSerializationValue","recursiveObjSerialization","serialized","serverPayload","Module","module","contentMap","query","viewAll","options","allowDeprioritization","model","contentIDs","cID","toConciergeModuleContainer","let","sanitizedLocale","style","styleStr","layoutStr","asJson","contentInfo","uiTemplate","inputObj","getPagedData","hasNext","getNext","pagedData","fetchAll","recursiveFetch","dataArr","questions","surveyMeta","resultID","surveyResultInstanceID","answerID","surveyAnswersInstanceID","parseQuestions","dataObj","dataRoot","q","SurveyQuestion","getQuestions","survey","createNextPageWrapperFn","fn","fetchPromises","SurveyResponse","promises","getResponses","validate","accumalator","question","merge","submit","answer","surveyID","parseAnswer","submitData","qAnswers","surveyId","answers","questionNumber","SurveyValidation","SurveyChoice","title","isRequired","choices","meta","number","SHORTANSWER","LONGANSWER","NUMBER","MULTIPLECHOICE","CHECKBOXES","DROPDOWN","DATE","TIME","LOCATION","FILEUPLOAD","uiType","choice","setAnswer","validator","getValidator","instance","allAnswers","answerObj","BaseValidator","emptyAnswers","a","NumberValidator","questionMeta","numMeta","increment","MultipleChoiceValidator","isEmpty","validatorMap","shortAnswer","longAnswer","multipleChoice","checkboxes","dropdown","surveyQuestion","CookieStore","User","email","firstName","lastName","isConfirmed","permissionLevel","level","state","stacktrace","setStackTrace","header","detailsObj","firstError","flyError","stack","parseObj","TypeError","NOTFOUND","CONNECTIONERROR","UNAUTHENTICATED","RETRIEVALERROR","NOTSUPPORTED","UNEXPECTED","NOOP","Zone","zone","modulesMap","modules","height","referenceID","modulesIDs","mID","toConciergeContainer","textDir","textDirection","containers","ZonesMetadata","zones","getZones","referenceIDs","includes","resolveStorageEngine","checkStorageEngine","availableStorage","CurEngine","ForageStore","IDBStore","LocalStorageStore","FileStore","MemoryStore","_ready","property","engineInit","engine","storageEngine","remove","storeName","RecordStore","now","clearAll","BrowserUtil","cache","promiseQueue","storage","dir","writeQueue","initSync","queueObj","foundPromise","async","await","cachedKeys","localforage","createInstance","IDB","promisifyRequest","request","onsuccess","onerror","promisifyRequestCall","p","proxyProperties","ProxyClass","targetProp","properties","prop","defineProperty","proxyRequestMethods","Constructor","arguments","proxyMethods","proxyCursorRequestMethods","Cursor","Index","_index","cursor","_cursor","_request","ObjectStore","_store","Transaction","idbTransaction","_tx","complete","oncomplete","onabort","UpgradeDB","db","oldVersion","transaction","_db","DB","IDBIndex","IDBCursor","methodName","createIndex","IDBObjectStore","objectStore","IDBTransaction","createObjectStore","IDBDatabase","funcName","callback","nativeObject","count","items","iterateCursor","continue","open","upgradeCallback","indexedDB","onupgradeneeded","event","delete","internalStoreName","test","vendor","appVersion","tx","put","iterateKeyCursor","localStorage","providerName","projectID","getHeaders","OAuthIDP","token","provider","FACEBOOK","GOOGLE","projectId","idToken","accessToken","AnonymousIDP","ApiKeyIDP","apiKey","createToken","APIKEY","tokenPayload","apikey","FlybitsIDP","password","requestCurrentPasswordReset","user","_idpType","requestPasswordReset","requestConfirmationEmail","noProject","_projectID","JWTSignedIDP","jwt","Authorization","SignedIDP","signature","AUTHHEADER","_userTokenRetrievedAt","_userTokenExpiry","connect","session","authPayload","authHeaders","requestOptions","setUserToken","resolveIDPTypeName","disconnect","reqHeaders","clearSession","notifyReady","resetReady","resolveSession","doNotCheckServer","refreshSession","bindSession","jwtData","exp","setLocale","cleansed","_translateLocale","resultArr","language","availableIDPs","debouncedReportingRestart","CTXPLUGINREGEX","paramCtxRegex","ATTRKEY","NUMBERS","contextManager","services","_defaultServices","contentAnalytics","pushAnalytics","_reportTimeout","isReporting","isReportSending","isRestarting","lastReported","lastReportAttempted","initialize","lastReportedPromise","lastReportAttemptedPromise","manager","startReporting","epoch","_registerDefaults","register","contextPlugin","refreshDelay","refreshInterval","ONETIME","collectState","startService","unregister","stopService","unregisterTypeID","typeID","plugin","pluginService","TYPEID","unregisterAll","stopAllServices","startAllServices","stopReporting","interval","report","flushCollected","promiseArr","s","_flushCollected","allSettled","results","r","reason","ContentAnalytics","PushAnalytics","GenericPlugin","genericPlugin","_gatherAllData","serviceDeletions","service","retrievalPromise","_fetchCollected","values","serviceRef","_sendReport","attribute","err","errMsg","pluginIDMatch","attrStr","pluginID","dataTypeReport","find","dtReport","dataTypeID","matchAll","numbers","paramCounts","expected","actual","_cleanupServices","serviceKeyArr","serviceKeyMap","_deleteCollected","_cleanInvalidServiceData","pluginServiceObjs","serviceKeyObj","pso","_cleanInvalidData","serviceCleanup","sentData","genericErr","warmReporting","diff","reportCtx","setGenericState","_refreshTimeout","ONEMINUTE","maxStoreAge","isServiceRunning","collectHistorical","lastCollected","lastLocalValue","lastLocalKey","THIRTYSECONDS","ONEHOUR","ONEDAY","storeLength","_saveState","_validateStoreState","setState","accessCount","sort","b","keysToDelete","assembleData","curKey","timestamp","attrName","localAttrKey","localAttrName","attrCompArr","deleteData","_generateKey","time","_cleanHistorical","storeKey","storeSetPromise","Connectivity","hardCheck","onLine","CONNECTED","DISCONNECTED","connectionType","attributes","VIEWED","ENGAGED","COMPONENTENGAGED","COMPONENTFULFILLED","PLUGINKEY","_dataTypeID","Location","geolocation","getCurrentPosition","pos","coords","latitude","longitude","accuracy","maximumAge","Event","_tmpID","DISCRETE","loggedAt","_internal","_isInternal","TIMEDSTART","TIMEDEND","TIMEDREFID","OSTYPE","OSVERSION","UID","_setProp","setProperty","_setInternalProperty","flbProperties","isFlybits","applyDefaultSysProps","timeUnitMultiplier","milliseconds","seconds","minutes","hours","days","analyticsManager","_analyticsStore","_uploadChannel","_timedEventCache","RecordsStore","DefaultChannel","units","eventTmpIDs","getAllEvents","events","uploadEvents","clearEvents","logEvent","eventName","addEvent","_logInt","internalProperties","startTimedEvent","_logStartInt","endTimedEvent","refID","endEvt","startedEvt","_logEndInt","actions","reportContent","action","details","reportContentID","compID","keyStr","UploadChannel","sessionKey","CHANNELHOST","channelKey","CHANNELKEY","appID","APPID","initSession","channel","_preparePayload","deviceID","rawObj","_upload","appid","sessionPromise","AnalyticsStore","STOREID","bStore","getEvent","tmpID","rehydratedEvt","tmpIDs","clearAllEvents","mapData","lastPaging","MANAGEDSORTKEYS","RELAVANTSORTKEYS","getPaging","localization","getJourneyUsages","accept-language","requestParams","reqParamCopy","managed","location","order","req","ids","retArr","contentIds","managementMode","sortBy","sortby","sortorder","orderby","labelsFormula","disableContextEmbed","returnRichText","richText","loc","radius","search","contents","parseParams","pagingKeyValue","pagingLimit","pagingOffset","sortKeyValue","sortKey","sortOrder","contentDataID","contentData","allContentData","dataParams","reqParam","list","listPaging","tmpPagedData","getSignedInUser","authToken","headerObj","signedInUser","settings","_cache","_create","namespace","_createBase","baseObj","Zones","fetchZoneContent","m","scriptURLs","URL","searchParams","getMetadata","newValidation","getZoneMetadata","zoneReferenceID","zonesMetadata","getAllByLabels","getByReferenceId","referenceId","versions","node","import","default","fileURLToPath","__filename","dirname","global","Buffer"],"mappings":"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,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,MAAO,KAAMC,MAAO,KAAMC,MAAO,KAAMC,MAAO,KAAMC,MAAO,KAAMC,MAAO,KAAMC,OAAQ,KAAMC,OAAQ,KAAMC,OAAQ,KAAMC,OAAQ,KAAMC,OAAQ,KAAMC,OAAQ,KAAMC,MAAO,KAAMC,OAAQ,KAAMC,MAAO,KAAMC,MAAO,KAAMC,KAAM,KAAMC,KAAM,KAAMC,KAAM,KAAMC,KAAM,KAAMC,OAAQ,IAAKC,MAAO,IAAKC,MAAO,IAAKC,MAAO,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,IAAK,IAAKC,IAAK,IAAKC,KAAM,IAAKC,MAAO,IAAKC,IAAK,IAAKC,IAAK,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,MAAO,IAAKC,KAAM,IAAKC,KAAM,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"}