{"version":3,"sources":["webpack:////build/source/node_modules/lodash/zip.js","webpack:////build/source/node_modules/lodash/_baseClone.js","webpack:////build/source/node_modules/lodash/unzip.js","webpack:////build/source/node_modules/lodash/isSet.js","webpack:////build/source/node_modules/lodash/_initCloneByTag.js","webpack:////build/source/node_modules/lodash/_baseIsSet.js","webpack:////build/source/node_modules/lodash/_arrayIncludesWith.js","webpack:///./analytics/shared/constants.js","webpack:////build/source/node_modules/lodash/_baseAssign.js","webpack:////build/source/node_modules/lodash/_createSet.js","webpack:////build/source/node_modules/lodash/_cloneSymbol.js","webpack:///./vue_shared/components/filtered_search_bar/constants.js","webpack:////build/source/node_modules/lodash/_initCloneArray.js","webpack:////build/source/node_modules/lodash/_baseUniq.js","webpack:////build/source/node_modules/lodash/isMap.js","webpack:////build/source/node_modules/lodash/_copySymbols.js","webpack:////build/source/ee/app/assets/javascripts/analytics/shared/utils.js","webpack:///./analytics/shared/utils.js","webpack:////build/source/node_modules/lodash/cloneDeep.js","webpack:////build/source/node_modules/lodash/_copySymbolsIn.js","webpack:////build/source/node_modules/lodash/_cloneDataView.js","webpack:////build/source/node_modules/lodash/_baseAssignIn.js","webpack:////build/source/node_modules/lodash/uniqWith.js","webpack:////build/source/node_modules/lodash/_baseIsMap.js","webpack:////build/source/ee/app/assets/javascripts/analytics/shared/constants.js","webpack:////build/source/node_modules/lodash/_cloneRegExp.js"],"names":["zip","baseRest","module","exports","Stack","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isArray","isBuffer","isMap","isObject","isSet","keys","keysIn","cloneableTags","baseClone","value","bitmask","customizer","key","object","stack","result","isDeep","isFlat","isFull","undefined","isArr","tag","isFunc","stacked","get","set","forEach","subValue","add","props","arrayFilter","arrayMap","baseProperty","baseTimes","isArrayLikeObject","nativeMax","Math","max","array","length","group","index","baseIsSet","baseUnary","nodeUtil","nodeIsSet","cloneArrayBuffer","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","Ctor","constructor","isObjectLike","comparator","DATE_RANGE_LIMIT","PROJECTS_PER_PAGE","isoDate","masks","dateFormats","defaultDate","defaultDateTime","month","TODAY","getCurrentUtcDate","startOfToday","getStartOfDay","Date","utc","LAST_30_DAYS","nDaysBefore","lastXDays","__","lastWeek","nWeeksBefore","last90Days","last180Days","mrThroughputStartDate","formatDateParam","d","dateFormat","DATE_RANGE_CUSTOM_VALUE","DATE_RANGE_LAST_30_DAYS_VALUE","DEFAULT_DROPDOWN_DATE_RANGES","text","startDate","endDate","sprintf","days","MAX_DATE_RANGE_TEXT","maxDateRange","MAX_METRIC_PRECISION","UNITS","COUNT","DAYS","PER_DAY","PERCENT","NUMBER_OF_DAYS_SELECTED","numDays","n__","METRIC_POPOVER_LABEL","s__","ALL_METRICS_QUERY_TYPE","DORA_METRICS_QUERY_TYPE","FLOW_METRICS_QUERY_TYPE","FLOW_METRICS","LEAD_TIME","CYCLE_TIME","ISSUES","ISSUES_COMPLETED","COMMITS","DEPLOYS","MEDIAN_TIME_TO_MERGE","DORA_METRICS","DEPLOYMENT_FREQUENCY","LEAD_TIME_FOR_CHANGES","TIME_TO_RESTORE_SERVICE","CHANGE_FAILURE_RATE","VSA_METRICS_GROUPS","title","VULNERABILITY_METRICS","CRITICAL","HIGH","MERGE_REQUEST_METRICS","THROUGHPUT","CONTRIBUTOR_METRICS","AI_METRICS","CODE_SUGGESTIONS_USAGE_RATE","CODE_SUGGESTIONS_ACCEPTANCE_RATE","DUO_CHAT_USAGE_RATE","DUO_USAGE_RATE","VALUE_STREAM_METRIC_DISPLAY_UNITS","VALUE_STREAM_METRIC_TILE_METADATA","label","unit","description","groupLink","projectLink","docsLink","helpPagePath","anchor","VALUE_STREAM_METRIC_METADATA","USAGE_OVERVIEW_NO_DATA_ERROR","USAGE_OVERVIEW_DEFAULT_DATE_RANGE","nYearsBefore","USAGE_OVERVIEW_IDENTIFIER_GROUPS","USAGE_OVERVIEW_IDENTIFIER_PROJECTS","USAGE_OVERVIEW_IDENTIFIER_USERS","USAGE_OVERVIEW_IDENTIFIER_ISSUES","USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS","USAGE_OVERVIEW_IDENTIFIER_PIPELINES","USAGE_OVERVIEW_METADATA","options","titleIcon","USAGE_OVERVIEW_QUERY_INCLUDE_KEYS","copyObject","source","Set","noop","setToArray","createSet","values","Symbol","symbolProto","prototype","symbolValueOf","valueOf","symbol","Object","call","DEBOUNCE_DELAY","MAX_RECENT_TOKENS_SIZE","FILTER_NONE","FILTER_ANY","FILTER_CURRENT","FILTER_UPCOMING","FILTER_STARTED","FILTERS_NONE_ANY","OPERATOR_IS","OPERATOR_IS_TEXT","OPERATOR_NOT","OPERATOR_NOT_TEXT","OPERATOR_OR","OPERATOR_OR_TEXT","OPERATOR_AFTER","OPERATOR_AFTER_TEXT","OPERATOR_BEFORE","OPERATOR_BEFORE_TEXT","OPERATORS_IS","OPERATORS_NOT","OPERATORS_OR","OPERATORS_AFTER","OPERATORS_BEFORE","OPERATORS_IS_NOT","OPERATORS_IS_NOT_OR","OPERATORS_AFTER_BEFORE","OPERATORS_TO_GROUP","OPTION_NONE","OPTION_ANY","OPTION_CURRENT","OPTION_STARTED","OPTION_UPCOMING","OPTIONS_NONE_ANY","DEFAULT_MILESTONES","concat","SORT_DIRECTION","descending","ascending","FILTERED_SEARCH_TERM","TOKEN_EMPTY_SEARCH_TERM","type","data","TOKEN_TITLE_APPROVED_BY","TOKEN_TITLE_MERGE_USER","TOKEN_TITLE_APPROVER","TOKEN_TITLE_ASSIGNEE","TOKEN_TITLE_AUTHOR","TOKEN_TITLE_CONFIDENTIAL","TOKEN_TITLE_CONTACT","TOKEN_TITLE_DRAFT","TOKEN_TITLE_GROUP","TOKEN_TITLE_LABEL","TOKEN_TITLE_PROJECT","TOKEN_TITLE_MILESTONE","TOKEN_TITLE_MY_REACTION","TOKEN_TITLE_ORGANIZATION","TOKEN_TITLE_RELEASE","TOKEN_TITLE_REVIEWER","TOKEN_TITLE_SOURCE_BRANCH","TOKEN_TITLE_STATUS","TOKEN_TITLE_JOBS_RUNNER_TYPE","TOKEN_TITLE_TARGET_BRANCH","TOKEN_TITLE_TYPE","TOKEN_TITLE_VERSION","TOKEN_TITLE_SEARCH_WITHIN","TOKEN_TITLE_CREATED","TOKEN_TITLE_CLOSED","TOKEN_TITLE_DEPLOYED_BEFORE","TOKEN_TITLE_DEPLOYED_AFTER","TOKEN_TITLE_ASSIGNED_SEAT","TOKEN_TITLE_ENVIRONMENT","TOKEN_TYPE_APPROVER","TOKEN_TYPE_APPROVED_BY","TOKEN_TYPE_MERGE_USER","TOKEN_TYPE_ASSIGNEE","TOKEN_TYPE_AUTHOR","TOKEN_TYPE_CONFIDENTIAL","TOKEN_TYPE_CONTACT","TOKEN_TYPE_DRAFT","TOKEN_TYPE_GROUP","TOKEN_TYPE_GROUP_INVITE","TOKEN_TYPE_EPIC","TOKEN_TYPE_ASSIGNED_SEAT","TOKEN_TYPE_PROJECT","TOKEN_TYPE_HEALTH","TOKEN_TYPE_ITERATION","TOKEN_TYPE_LABEL","TOKEN_TYPE_MILESTONE","TOKEN_TYPE_MY_REACTION","TOKEN_TYPE_ORGANIZATION","TOKEN_TYPE_RELEASE","TOKEN_TYPE_REVIEWER","TOKEN_TYPE_SOURCE_BRANCH","TOKEN_TYPE_STATUS","TOKEN_TYPE_JOBS_RUNNER_TYPE","TOKEN_TYPE_TARGET_BRANCH","TOKEN_TYPE_TYPE","TOKEN_TYPE_VERSION","TOKEN_TYPE_WEIGHT","TOKEN_TYPE_SEARCH_WITHIN","TOKEN_TYPE_CREATED","TOKEN_TYPE_CLOSED","TOKEN_TYPE_DEPLOYED_BEFORE","TOKEN_TYPE_DEPLOYED_AFTER","TOKEN_TYPE_ENVIRONMENT","ENTITY_TYPES","USER","AUTHOR","GROUP","PROJECT","hasOwnProperty","input","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","iteratee","includes","isCommon","seen","outer","computed","seenIndex","push","baseIsMap","nodeIsMap","getSymbols","formattedDate","buildValueStreamFromJson","valueStream","id","name","is_custom","isCustom","JSON","parse","buildDefaultStagesFromJSON","stages","buildGroupFromDataset","dataset","groupId","groupName","groupFullPath","groupAvatarUrl","groupParentId","Number","full_path","avatar_url","parent_id","buildProjectFromDataset","projectGid","projectName","projectPathWithNamespace","projectAvatarUrl","path_with_namespace","buildProjectsFromJSON","projects","map","fullPath","rest","buildCycleAnalyticsInitialData","projectId","createdBefore","createdAfter","groupPath","labelsPath","milestonesPath","defaultStages","stage","aggregationEnabled","aggregationLastRunAt","aggregationNextRunAt","namespaceName","namespaceRestApiRequestPath","namespaceType","namespacePath","canEdit","enableVsdLink","enableCustomizableStages","enableProjectsFilter","canReadCycleAnalytics","selectedValueStream","convertObjectPropsToCamelCase","newDate","selectedProjects","proj","defaultStageConfig","capitalizeFirstCharacter","aggregation","enabled","parseBoolean","lastRunAt","nextRunAt","features","extractVSAFeaturesFromGON","namespace","restApiRequestPath","path","parseInt","lerp","valueAtT0","valueAtT1","t","buildNullSeries","seriesData","nullSeriesTitle","seriesDataOptions","DEFAULT_SERIES_DATA_OPTIONS","nullSeriesOptions","DEFAULT_NULL_SERIES_OPTIONS","nonNullSeries","_cloneDeep","seriesGaps","currentGap","startIndex","previousValue","startValue","endIndex","endValue","nullSeriesData","date","gap","_gap$startIndex","_ref","_gap$startValue","_gap$endIndex","_ref2","_gap$endValue","i","_merge","pairDataAndLabels","datasetNames","datasets","axisLabels","datasetIndex","_zip","calculateRegression","slope","intercept","timeInMilliseconds","rounding","roundOffFloat","linearRegression","timeSeriesData","forecastAmount","x","element","getTime","y","avgX","reduce","prev","curr","xDifferencesToAverage","SSxx","avgY","yDifferencesToAverage","calculateSlopeAndInterceptFromDataset","lastDate","maxDays","futureDates","getDateInFuture","generateFutureDateRange","futureDate","filterBySearchTerm","searchTerm","filterByKey","filter","item","toLowerCase","toYmd","extractFilterQueryParameters","url","source_branch_name","selectedSourceBranch","target_branch_name","selectedTargetBranch","author_username","selectedAuthor","milestone_title","selectedMilestone","assignee_username","selectedAssigneeList","label_name","selectedLabelList","urlQueryToFilter","extractPaginationQueryParameters","sort","direction","page","getDataZoomOption","totalItems","maxItemsPerPage","dataZoom","bottom","start","intervalEnd","ceil","end","removeFlash","_document$querySelect","document","querySelector","click","formatAsPercentageWithoutSymbol","decimalValue","precision","isNaN","toFixed","secondsToDays","seconds","SECONDS_IN_DAY","scaledValueForDisplay","units","prepareMetricValue","identifier","rawMetricToMetricTile","metric","metricRest","metadataRest","generateValueStreamsDashboardLink","isProjectNamespace","formattedNamespacePath","segments","gon","relative_url_root","joinPaths","_gon","_gon2","_gon3","cycleAnalyticsForGroups","Boolean","licensed_features","cycleAnalyticsForProjects","groupLevelAnalyticsDashboard","extractQueryResponseFromNamespace","resultKey","project","CLONE_DEEP_FLAG","getSymbolsIn","dataView","buffer","byteOffset","byteLength","baseUniq","scatterChartLineProps","default","showSymbol","zlevel","DATA_REFETCH_DELAY","DEFAULT_DEBOUNCE_AND_THROTTLE_MS","BASE_SERIES_DATA_OPTIONS","showAllSymbol","symbolSize","lineStyle","color","DATA_VIZ_BLUE_500","itemStyle","areaStyle","opacity","BASE_NULL_SERIES_OPTIONS","GRAY_300","BASE_FORECAST_SERIES_OPTIONS","defaultAreaOpacity","GRAY_50","STACKED_AREA_CHART_SERIES_OPTIONS","STACKED_AREA_CHART_NULL_SERIES_OPTIONS","reFlags","regexp","exec","lastIndex"],"mappings":"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","file":"40.5860894a.chunk.js","sourcesContent":["var baseRest = require('./_baseRest'),\n    unzip = require('./unzip');\n\n/**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\nvar zip = baseRest(unzip);\n\nmodule.exports = zip;\n","var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n","var arrayFilter = require('./_arrayFilter'),\n    arrayMap = require('./_arrayMap'),\n    baseProperty = require('./_baseProperty'),\n    baseTimes = require('./_baseTimes'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\nfunction unzip(array) {\n  if (!(array && array.length)) {\n    return [];\n  }\n  var length = 0;\n  array = arrayFilter(array, function(group) {\n    if (isArrayLikeObject(group)) {\n      length = nativeMax(group.length, length);\n      return true;\n    }\n  });\n  return baseTimes(length, function(index) {\n    return arrayMap(array, baseProperty(index));\n  });\n}\n\nmodule.exports = unzip;\n","var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","import dateFormat, { masks } from '~/lib/dateformat';\nimport {\n  nDaysBefore,\n  getStartOfDay,\n  getCurrentUtcDate,\n  nWeeksBefore,\n  nYearsBefore,\n} from '~/lib/utils/datetime_utility';\nimport { s__, __, sprintf, n__ } from '~/locale';\nimport { helpPagePath } from '~/helpers/help_page_helper';\n\nexport const DATE_RANGE_LIMIT = 180;\nexport const PROJECTS_PER_PAGE = 50;\n\nconst { isoDate } = masks;\nexport const dateFormats = {\n  isoDate,\n  defaultDate: 'mmm dd, yyyy',\n  defaultDateTime: 'mmm dd, yyyy h:MMtt',\n  month: 'mmmm',\n};\n\nconst TODAY = getCurrentUtcDate();\nconst SAME_DAY_OFFSET = 1;\n\nconst startOfToday = getStartOfDay(new Date(), { utc: true });\n\nexport const LAST_30_DAYS = nDaysBefore(TODAY, 30 - SAME_DAY_OFFSET, { utc: true });\n\nconst lastXDays = __('Last %{days} days');\nconst lastWeek = nWeeksBefore(TODAY, 1, { utc: true });\nconst last90Days = nDaysBefore(TODAY, 90 - SAME_DAY_OFFSET, { utc: true });\nconst last180Days = nDaysBefore(TODAY, 180 - SAME_DAY_OFFSET, { utc: true });\nconst mrThroughputStartDate = nDaysBefore(startOfToday, DATE_RANGE_LIMIT, { utc: true });\nconst formatDateParam = (d) => dateFormat(d, dateFormats.isoDate, true);\n\nexport const DATE_RANGE_CUSTOM_VALUE = 'custom';\nexport const DATE_RANGE_LAST_30_DAYS_VALUE = 'last_30_days';\n\nexport const DEFAULT_DROPDOWN_DATE_RANGES = [\n  {\n    text: __('Last week'),\n    value: 'last_week',\n    startDate: lastWeek,\n    endDate: TODAY,\n  },\n  {\n    text: sprintf(lastXDays, { days: 30 }),\n    value: DATE_RANGE_LAST_30_DAYS_VALUE,\n    startDate: LAST_30_DAYS,\n    endDate: TODAY,\n  },\n  {\n    text: sprintf(lastXDays, { days: 90 }),\n    value: 'last_90_days',\n    startDate: last90Days,\n    endDate: TODAY,\n  },\n  {\n    text: sprintf(lastXDays, { days: 180 }),\n    value: 'last_180_days',\n    startDate: last180Days,\n    endDate: TODAY,\n  },\n];\n\nexport const MAX_DATE_RANGE_TEXT = (maxDateRange) => {\n  return sprintf(\n    __(\n      'Showing data for workflow items completed in this date range. Date range limited to %{maxDateRange} days.',\n    ),\n    {\n      maxDateRange,\n    },\n  );\n};\n\n// Limits the number of decimals we round values to\nexport const MAX_METRIC_PRECISION = 4;\n\nexport const UNITS = {\n  COUNT: 'COUNT',\n  DAYS: 'DAYS',\n  PER_DAY: 'PER_DAY',\n  PERCENT: 'PERCENT',\n};\n\nexport const NUMBER_OF_DAYS_SELECTED = (numDays) => {\n  return n__('1 day selected', '%d days selected', numDays);\n};\n\nexport const METRIC_POPOVER_LABEL = s__('ValueStreamAnalytics|View details');\n\nexport const ISSUES_COMPLETED_TYPE = 'issues_completed';\n\nexport const ALL_METRICS_QUERY_TYPE = 'ALL_METRICS_QUERY_TYPE';\nexport const DORA_METRICS_QUERY_TYPE = 'DORA_METRICS_QUERY_TYPE';\nexport const FLOW_METRICS_QUERY_TYPE = 'FLOW_METRICS_QUERY_TYPE';\n\nexport const FLOW_METRICS = {\n  LEAD_TIME: 'lead_time',\n  CYCLE_TIME: 'cycle_time',\n  ISSUES: 'issues',\n  ISSUES_COMPLETED: ISSUES_COMPLETED_TYPE,\n  COMMITS: 'commits',\n  DEPLOYS: 'deploys',\n  MEDIAN_TIME_TO_MERGE: 'median_time_to_merge',\n};\n\nexport const DORA_METRICS = {\n  DEPLOYMENT_FREQUENCY: 'deployment_frequency',\n  LEAD_TIME_FOR_CHANGES: 'lead_time_for_changes',\n  TIME_TO_RESTORE_SERVICE: 'time_to_restore_service',\n  CHANGE_FAILURE_RATE: 'change_failure_rate',\n};\n\nexport const VSA_METRICS_GROUPS = [\n  {\n    key: 'lifecycle_metrics',\n    title: s__('ValueStreamAnalytics|Lifecycle metrics'),\n    keys: [\n      FLOW_METRICS.LEAD_TIME,\n      FLOW_METRICS.CYCLE_TIME,\n      FLOW_METRICS.ISSUES,\n      FLOW_METRICS.COMMITS,\n      FLOW_METRICS.DEPLOYS,\n    ],\n  },\n];\n\nexport const VULNERABILITY_CRITICAL_TYPE = 'vulnerability_critical';\nexport const VULNERABILITY_HIGH_TYPE = 'vulnerability_high';\n\nexport const VULNERABILITY_METRICS = {\n  CRITICAL: VULNERABILITY_CRITICAL_TYPE,\n  HIGH: VULNERABILITY_HIGH_TYPE,\n};\n\nexport const MERGE_REQUEST_THROUGHPUT_TYPE = 'merge_request_throughput';\n\nexport const MERGE_REQUEST_METRICS = {\n  THROUGHPUT: MERGE_REQUEST_THROUGHPUT_TYPE,\n};\n\nexport const CONTRIBUTOR_COUNT_TYPE = 'contributor_count';\n\nexport const CONTRIBUTOR_METRICS = {\n  COUNT: CONTRIBUTOR_COUNT_TYPE,\n};\n\nexport const AI_METRICS = {\n  CODE_SUGGESTIONS_USAGE_RATE: 'code_suggestions_usage_rate',\n  CODE_SUGGESTIONS_ACCEPTANCE_RATE: 'code_suggestions_acceptance_rate',\n  DUO_CHAT_USAGE_RATE: 'duo_chat_usage_rate',\n  DUO_USAGE_RATE: 'duo_usage_rate',\n};\n\nexport const VALUE_STREAM_METRIC_DISPLAY_UNITS = {\n  [UNITS.COUNT]: '',\n  [UNITS.DAYS]: __('days'),\n  [UNITS.PER_DAY]: __('/day'),\n  [UNITS.PERCENT]: '%',\n};\n\n// NOTE: ideally we would return these fields in the metrics queries\n//       the flow metrics query returns some but not all fields we need\n//        while the DORA query do not return any.\nexport const VALUE_STREAM_METRIC_TILE_METADATA = {\n  [DORA_METRICS.DEPLOYMENT_FREQUENCY]: {\n    label: s__('DORA4Metrics|Deployment frequency'),\n    unit: UNITS.PER_DAY,\n    description: s__(\n      'ValueStreamAnalytics|Average number of deployments to production per day. This metric measures how often value is delivered to end users.',\n    ),\n    groupLink: '-/analytics/ci_cd?tab=deployment-frequency',\n    projectLink: '-/pipelines/charts?chart=deployment-frequency',\n    docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'deployment-frequency' }),\n  },\n  [DORA_METRICS.LEAD_TIME_FOR_CHANGES]: {\n    label: s__('DORA4Metrics|Lead time for changes'),\n    unit: UNITS.DAYS,\n    description: s__(\n      'ValueStreamAnalytics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines.',\n    ),\n    groupLink: '-/analytics/ci_cd?tab=lead-time',\n    projectLink: '-/pipelines/charts?chart=lead-time',\n    docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'lead-time-for-changes' }),\n  },\n  [DORA_METRICS.TIME_TO_RESTORE_SERVICE]: {\n    label: s__('DORA4Metrics|Time to restore service'),\n    unit: UNITS.DAYS,\n    description: s__(\n      'ValueStreamAnalytics|The time it takes an organization to recover from a failure in production.',\n    ),\n    groupLink: '-/analytics/ci_cd?tab=time-to-restore-service',\n    projectLink: '-/pipelines/charts?chart=time-to-restore-service',\n    docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'time-to-restore-service' }),\n  },\n  [DORA_METRICS.CHANGE_FAILURE_RATE]: {\n    label: s__('DORA4Metrics|Change failure rate'),\n    description: s__(\n      'ValueStreamAnalytics|Percentage of deployments that cause an incident in production.',\n    ),\n    groupLink: '-/analytics/ci_cd?tab=change-failure-rate',\n    projectLink: '-/pipelines/charts?chart=change-failure-rate',\n    docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'change-failure-rate' }),\n    unit: UNITS.PERCENT,\n  },\n  [FLOW_METRICS.LEAD_TIME]: {\n    label: s__('DORA4Metrics|Lead time'),\n    description: s__('ValueStreamAnalytics|Median time from issue created to issue closed.'),\n    groupLink: '-/analytics/value_stream_analytics',\n    projectLink: '-/value_stream_analytics',\n    docsLink: helpPagePath('user/group/value_stream_analytics/index', {\n      anchor: 'lifecycle-metrics',\n    }),\n    unit: UNITS.DAYS,\n  },\n  [FLOW_METRICS.CYCLE_TIME]: {\n    label: s__('DORA4Metrics|Cycle time'),\n    description: s__(\n      \"ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed.\",\n    ),\n    groupLink: '-/analytics/value_stream_analytics',\n    projectLink: '-/value_stream_analytics',\n    docsLink: helpPagePath('user/group/value_stream_analytics/index', {\n      anchor: 'lifecycle-metrics',\n    }),\n    unit: UNITS.DAYS,\n  },\n  [FLOW_METRICS.ISSUES]: {\n    label: s__('DORA4Metrics|New issues'),\n    unit: UNITS.COUNT,\n    description: s__('ValueStreamAnalytics|Number of new issues created.'),\n    groupLink: '-/issues_analytics',\n    projectLink: '-/analytics/issues_analytics',\n    docsLink: helpPagePath('user/group/issues_analytics/index'),\n  },\n  [FLOW_METRICS.COMMITS]: {\n    label: s__('DORA4Metrics|Commits'),\n    unit: UNITS.COUNT,\n    description: s__('ValueStreamAnalytics|Number of commits pushed to the default branch'),\n  },\n  [FLOW_METRICS.DEPLOYS]: {\n    label: s__('DORA4Metrics|Deploys'),\n    unit: UNITS.COUNT,\n    description: s__('ValueStreamAnalytics|Total number of deploys to production.'),\n    groupLink: '-/analytics/productivity_analytics',\n    projectLink: '-/analytics/merge_request_analytics',\n    docsLink: helpPagePath('user/analytics/merge_request_analytics'),\n  },\n};\n\nexport const VALUE_STREAM_METRIC_METADATA = {\n  ...VALUE_STREAM_METRIC_TILE_METADATA,\n  [FLOW_METRICS.ISSUES_COMPLETED]: {\n    description: s__('ValueStreamAnalytics|Number of issues closed by month.'),\n    groupLink: '-/issues_analytics',\n    projectLink: '-/analytics/issues_analytics',\n    docsLink: helpPagePath('user/group/issues_analytics/index'),\n  },\n  [CONTRIBUTOR_METRICS.COUNT]: {\n    description: s__(\n      'ValueStreamAnalytics|Number of monthly unique users with contributions in the group.',\n    ),\n    groupLink: '-/contribution_analytics',\n    docsLink: helpPagePath('user/profile/contributions_calendar.html', {\n      anchor: 'user-contribution-events',\n    }),\n  },\n  [VULNERABILITY_METRICS.CRITICAL]: {\n    description: s__(\n      'ValueStreamAnalytics|Number of critical vulnerabilities identified per month.',\n    ),\n    groupLink: '-/security/vulnerabilities?severity=CRITICAL',\n    projectLink: '-/security/vulnerability_report?severity=CRITICAL',\n    docsLink: helpPagePath('user/application_security/vulnerabilities/severities.html'),\n  },\n  [VULNERABILITY_METRICS.HIGH]: {\n    description: s__('ValueStreamAnalytics|High vulnerabilities over time.'),\n    groupLink: '-/security/vulnerabilities?severity=HIGH',\n    projectLink: '-/security/vulnerability_report?severity=HIGH',\n    docsLink: helpPagePath('user/application_security/vulnerabilities/severities.html'),\n  },\n  [MERGE_REQUEST_METRICS.THROUGHPUT]: {\n    description: s__('ValueStreamAnalytics|Number of merge requests merged by month.'),\n    groupLink: '-/analytics/productivity_analytics',\n    projectLink: `-/analytics/merge_request_analytics?start_date=${formatDateParam(\n      mrThroughputStartDate,\n    )}&end_date=${formatDateParam(startOfToday)}`,\n    docsLink: helpPagePath('user/analytics/merge_request_analytics', {\n      anchor: 'view-the-number-of-merge-requests-in-a-date-range',\n    }),\n  },\n  [FLOW_METRICS.MEDIAN_TIME_TO_MERGE]: {\n    description: s__(\n      'ValueStreamAnalytics|Median time between merge request created and merge request merged.',\n    ),\n    groupLink: '-/analytics/productivity_analytics',\n    projectLink: '-/analytics/merge_request_analytics',\n    docsLink: helpPagePath('user/analytics/merge_request_analytics'),\n  },\n  [AI_METRICS.CODE_SUGGESTIONS_USAGE_RATE]: {\n    description: s__(\n      'AiImpactAnalytics|Monthly user engagement with AI Code Suggestions. Percentage ratio calculated as monthly unique Code Suggestions users / total monthly unique code contributors.',\n    ),\n    groupLink: '',\n    projectLink: '',\n    docsLink: helpPagePath('user/project/repository/code_suggestions/index'),\n  },\n};\n\nexport const USAGE_OVERVIEW_NO_DATA_ERROR = s__(\n  'ValueStreamAnalytics|Failed to load usage overview data',\n);\n\nexport const USAGE_OVERVIEW_DEFAULT_DATE_RANGE = {\n  endDate: TODAY,\n  startDate: nYearsBefore(TODAY, 1),\n};\n\nexport const USAGE_OVERVIEW_IDENTIFIER_GROUPS = 'groups';\nexport const USAGE_OVERVIEW_IDENTIFIER_PROJECTS = 'projects';\nexport const USAGE_OVERVIEW_IDENTIFIER_USERS = 'users';\nexport const USAGE_OVERVIEW_IDENTIFIER_ISSUES = 'issues';\nexport const USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS = 'merge_requests';\nexport const USAGE_OVERVIEW_IDENTIFIER_PIPELINES = 'pipelines';\n\n// Defines the constants used for querying the API as well as the order they appear\nexport const USAGE_OVERVIEW_METADATA = {\n  [USAGE_OVERVIEW_IDENTIFIER_GROUPS]: { options: { title: __('Groups'), titleIcon: 'group' } },\n  [USAGE_OVERVIEW_IDENTIFIER_PROJECTS]: {\n    options: { title: __('Projects'), titleIcon: 'project' },\n  },\n  [USAGE_OVERVIEW_IDENTIFIER_USERS]: {\n    options: { title: __('Users'), titleIcon: 'user' },\n  },\n  [USAGE_OVERVIEW_IDENTIFIER_ISSUES]: {\n    options: { title: __('Issues'), titleIcon: 'issues' },\n  },\n  [USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS]: {\n    options: { title: __('Merge requests'), titleIcon: 'merge-request' },\n  },\n  [USAGE_OVERVIEW_IDENTIFIER_PIPELINES]: {\n    options: { title: __('Pipelines'), titleIcon: 'pipeline' },\n  },\n};\n\nexport const USAGE_OVERVIEW_QUERY_INCLUDE_KEYS = {\n  [USAGE_OVERVIEW_IDENTIFIER_GROUPS]: 'includeGroups',\n  [USAGE_OVERVIEW_IDENTIFIER_PROJECTS]: 'includeProjects',\n  [USAGE_OVERVIEW_IDENTIFIER_USERS]: 'includeUsers',\n  [USAGE_OVERVIEW_IDENTIFIER_ISSUES]: 'includeIssues',\n  [USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS]: 'includeMergeRequests',\n  [USAGE_OVERVIEW_IDENTIFIER_PIPELINES]: 'includePipelines',\n};\n","var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","import { __, s__ } from '~/locale';\n\nexport const DEBOUNCE_DELAY = 500;\nexport const MAX_RECENT_TOKENS_SIZE = 3;\n\nexport const FILTER_NONE = 'None';\nexport const FILTER_ANY = 'Any';\nexport const FILTER_CURRENT = 'Current';\nexport const FILTER_UPCOMING = 'Upcoming';\nexport const FILTER_STARTED = 'Started';\n\nexport const FILTERS_NONE_ANY = [FILTER_NONE, FILTER_ANY];\n\nexport const OPERATOR_IS = '=';\nexport const OPERATOR_IS_TEXT = __('is');\nexport const OPERATOR_NOT = '!=';\nexport const OPERATOR_NOT_TEXT = __('is not one of');\nexport const OPERATOR_OR = '||';\nexport const OPERATOR_OR_TEXT = __('is one of');\nexport const OPERATOR_AFTER = '≥';\nexport const OPERATOR_AFTER_TEXT = __('on or after');\nexport const OPERATOR_BEFORE = '<';\nexport const OPERATOR_BEFORE_TEXT = __('before');\n\nexport const OPERATORS_IS = [{ value: OPERATOR_IS, description: OPERATOR_IS_TEXT }];\nexport const OPERATORS_NOT = [{ value: OPERATOR_NOT, description: OPERATOR_NOT_TEXT }];\nexport const OPERATORS_OR = [{ value: OPERATOR_OR, description: OPERATOR_OR_TEXT }];\nexport const OPERATORS_AFTER = [{ value: OPERATOR_AFTER, description: OPERATOR_AFTER_TEXT }];\nexport const OPERATORS_BEFORE = [{ value: OPERATOR_BEFORE, description: OPERATOR_BEFORE_TEXT }];\nexport const OPERATORS_IS_NOT = [...OPERATORS_IS, ...OPERATORS_NOT];\nexport const OPERATORS_IS_NOT_OR = [...OPERATORS_IS, ...OPERATORS_NOT, ...OPERATORS_OR];\nexport const OPERATORS_AFTER_BEFORE = [...OPERATORS_AFTER, ...OPERATORS_BEFORE];\n\nexport const OPERATORS_TO_GROUP = [OPERATOR_OR, OPERATOR_NOT];\n\nexport const OPTION_NONE = { value: FILTER_NONE, text: __('None'), title: __('None') };\nexport const OPTION_ANY = { value: FILTER_ANY, text: __('Any'), title: __('Any') };\nexport const OPTION_CURRENT = { value: FILTER_CURRENT, text: __('Current') };\nexport const OPTION_STARTED = { value: FILTER_STARTED, text: __('Started'), title: __('Started') };\nexport const OPTION_UPCOMING = {\n  value: FILTER_UPCOMING,\n  text: __('Upcoming'),\n  title: __('Upcoming'),\n};\n\nexport const OPTIONS_NONE_ANY = [OPTION_NONE, OPTION_ANY];\n\nexport const DEFAULT_MILESTONES = OPTIONS_NONE_ANY.concat([OPTION_UPCOMING, OPTION_STARTED]);\n\nexport const SORT_DIRECTION = {\n  descending: 'descending',\n  ascending: 'ascending',\n};\n\nexport const FILTERED_SEARCH_TERM = 'filtered-search-term';\n\nexport const TOKEN_EMPTY_SEARCH_TERM = {\n  type: FILTERED_SEARCH_TERM,\n  value: {\n    data: '',\n  },\n};\n\nexport const TOKEN_TITLE_APPROVED_BY = __('Approved-By');\nexport const TOKEN_TITLE_MERGE_USER = __('Merged-By');\nexport const TOKEN_TITLE_APPROVER = __('Approver');\nexport const TOKEN_TITLE_ASSIGNEE = s__('SearchToken|Assignee');\nexport const TOKEN_TITLE_AUTHOR = __('Author');\nexport const TOKEN_TITLE_CONFIDENTIAL = __('Confidential');\nexport const TOKEN_TITLE_CONTACT = s__('Crm|Contact');\nexport const TOKEN_TITLE_DRAFT = s__('MergeRequests|Draft');\nexport const TOKEN_TITLE_GROUP = __('Group');\nexport const TOKEN_TITLE_GROUP_INVITE = __('Group invite');\nexport const TOKEN_TITLE_LABEL = __('Label');\nexport const TOKEN_TITLE_PROJECT = __('Project');\nexport const TOKEN_TITLE_MILESTONE = __('Milestone');\nexport const TOKEN_TITLE_MY_REACTION = __('My-Reaction');\nexport const TOKEN_TITLE_ORGANIZATION = s__('Crm|Organization');\nexport const TOKEN_TITLE_RELEASE = __('Release');\nexport const TOKEN_TITLE_REVIEWER = s__('SearchToken|Reviewer');\nexport const TOKEN_TITLE_SOURCE_BRANCH = __('Source Branch');\nexport const TOKEN_TITLE_STATUS = __('Status');\nexport const TOKEN_TITLE_JOBS_RUNNER_TYPE = s__('Job|Runner type');\nexport const TOKEN_TITLE_TARGET_BRANCH = __('Target Branch');\nexport const TOKEN_TITLE_TYPE = __('Type');\nexport const TOKEN_TITLE_VERSION = __('Version');\nexport const TOKEN_TITLE_SEARCH_WITHIN = __('Search Within');\nexport const TOKEN_TITLE_CREATED = __('Created date');\nexport const TOKEN_TITLE_CLOSED = __('Closed date');\nexport const TOKEN_TITLE_DEPLOYED_BEFORE = __('Deployed-before');\nexport const TOKEN_TITLE_DEPLOYED_AFTER = __('Deployed-after');\nexport const TOKEN_TITLE_ASSIGNED_SEAT = __('Assigned seat');\nexport const TOKEN_TITLE_ENVIRONMENT = __('Environment');\n\nexport const TOKEN_TYPE_APPROVER = 'approver';\nexport const TOKEN_TYPE_APPROVED_BY = 'approved-by';\nexport const TOKEN_TYPE_MERGE_USER = 'merge-user';\nexport const TOKEN_TYPE_ASSIGNEE = 'assignee';\nexport const TOKEN_TYPE_AUTHOR = 'author';\nexport const TOKEN_TYPE_CONFIDENTIAL = 'confidential';\nexport const TOKEN_TYPE_CONTACT = 'contact';\nexport const TOKEN_TYPE_DRAFT = 'draft';\nexport const TOKEN_TYPE_GROUP = 'group';\nexport const TOKEN_TYPE_GROUP_INVITE = 'group-invite';\nexport const TOKEN_TYPE_EPIC = 'epic';\nexport const TOKEN_TYPE_ASSIGNED_SEAT = 'assigned-seat';\n// As health status gets reused between issue lists and boards\n// this is in the shared constants. Until we have not decoupled the EE filtered search bar\n// from the CE component, we need to keep this in the CE code.\n// https://gitlab.com/gitlab-org/gitlab/-/issues/377838\nexport const TOKEN_TYPE_PROJECT = 'project';\nexport const TOKEN_TYPE_HEALTH = 'health';\nexport const TOKEN_TYPE_ITERATION = 'iteration';\nexport const TOKEN_TYPE_LABEL = 'label';\nexport const TOKEN_TYPE_MILESTONE = 'milestone';\nexport const TOKEN_TYPE_MY_REACTION = 'my-reaction';\nexport const TOKEN_TYPE_ORGANIZATION = 'organization';\nexport const TOKEN_TYPE_RELEASE = 'release';\nexport const TOKEN_TYPE_REVIEWER = 'reviewer';\nexport const TOKEN_TYPE_SOURCE_BRANCH = 'source-branch';\nexport const TOKEN_TYPE_STATUS = 'status';\nexport const TOKEN_TYPE_JOBS_RUNNER_TYPE = 'jobs-runner-type';\nexport const TOKEN_TYPE_TARGET_BRANCH = 'target-branch';\nexport const TOKEN_TYPE_TYPE = 'type';\nexport const TOKEN_TYPE_VERSION = 'version';\nexport const TOKEN_TYPE_WEIGHT = 'weight';\nexport const TOKEN_TYPE_SEARCH_WITHIN = 'in';\nexport const TOKEN_TYPE_CREATED = 'created';\nexport const TOKEN_TYPE_CLOSED = 'closed';\nexport const TOKEN_TYPE_DEPLOYED_BEFORE = 'deployed-before';\nexport const TOKEN_TYPE_DEPLOYED_AFTER = 'deployed-after';\nexport const TOKEN_TYPE_ENVIRONMENT = 'environment';\n\n// Due to the i18n eslint rule we can't have a capitalized string even if it is a case-aware URL param\n/* eslint-disable @gitlab/require-i18n-strings */\nexport const ENTITY_TYPES = {\n  USER: 'User',\n  AUTHOR: 'Author',\n  GROUP: 'Group',\n  PROJECT: 'Project',\n};\n/* eslint-enable @gitlab/require-i18n-strings */\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n","var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","import { merge, cloneDeep, zip } from 'lodash';\nimport { dateFormats } from '~/analytics/shared/constants';\nimport { extractVSAFeaturesFromGON } from '~/analytics/shared/utils';\nimport dateFormat from '~/lib/dateformat';\nimport {\n  convertObjectPropsToCamelCase,\n  parseBoolean,\n  roundOffFloat,\n} from '~/lib/utils/common_utils';\nimport { getDateInFuture, newDate } from '~/lib/utils/datetime/date_calculation_utility';\nimport { capitalizeFirstCharacter } from '~/lib/utils/text_utility';\nimport { DEFAULT_NULL_SERIES_OPTIONS, DEFAULT_SERIES_DATA_OPTIONS } from './constants';\n\nexport const formattedDate = (d) => dateFormat(d, dateFormats.defaultDate);\n\n/**\n * Creates a value stream object from a dataset. Returns null if no valueStreamId is present.\n *\n * @param {Object} dataset - The raw value stream object\n * @returns {Object} - A value stream object\n */\nexport const buildValueStreamFromJson = (valueStream) => {\n  const { id, name, is_custom: isCustom } = valueStream ? JSON.parse(valueStream) : {};\n  return id ? { id, name, isCustom } : null;\n};\n\n/**\n * Creates an array of stage objects from a json string. Returns an empty array if no stages are present.\n *\n * @param {String} stages - JSON encoded array of stages\n * @returns {Array} - An array of stage objects\n */\nconst buildDefaultStagesFromJSON = (stages = '') => {\n  if (!stages.length) return [];\n  return JSON.parse(stages);\n};\n\n/**\n * Creates a group object from a dataset. Returns null if no groupId is present.\n *\n * @param {Object} dataset - The container's dataset\n * @returns {Object} - A group object\n */\nexport const buildGroupFromDataset = (dataset) => {\n  const { groupId, groupName, groupFullPath, groupAvatarUrl, groupParentId } = dataset;\n\n  if (groupId) {\n    return {\n      id: Number(groupId),\n      name: groupName,\n      full_path: groupFullPath,\n      avatar_url: groupAvatarUrl,\n      parent_id: groupParentId,\n    };\n  }\n\n  return null;\n};\n\n/**\n * Creates a project object from a dataset. Returns null if no projectId is present.\n *\n * @param {Object} dataset - The container's dataset\n * @returns {Object} - A project object\n */\nexport const buildProjectFromDataset = (dataset) => {\n  const { projectGid, projectName, projectPathWithNamespace, projectAvatarUrl } = dataset;\n\n  if (projectGid) {\n    return {\n      id: projectGid,\n      name: projectName,\n      path_with_namespace: projectPathWithNamespace,\n      avatar_url: projectAvatarUrl,\n    };\n  }\n\n  return null;\n};\n\n/**\n * Creates an array of project objects from a json string. Returns null if no projects are present.\n *\n * @param {String} data - JSON encoded array of projects\n * @returns {Array} - An array of project objects\n */\nconst buildProjectsFromJSON = (projects = '') => {\n  if (!projects.length) return [];\n  return JSON.parse(projects).map(({ path_with_namespace: fullPath, ...rest }) => ({\n    ...rest,\n    full_path: fullPath,\n  }));\n};\n\n/**\n * Builds the initial data object for Value Stream Analytics with data loaded from the backend\n *\n * @param {Object} dataset - dataset object paseed to the frontend via data-* properties\n * @returns {Object} - The initial data to load the app with\n */\nexport const buildCycleAnalyticsInitialData = ({\n  valueStream = null,\n  projectId = null,\n  groupId = null,\n  createdBefore = null,\n  createdAfter = null,\n  projects = null,\n  groupName = null,\n  groupPath = null,\n  groupFullPath = null,\n  groupParentId = null,\n  groupAvatarUrl = null,\n  labelsPath = '',\n  milestonesPath = '',\n  defaultStages = null,\n  stage = null,\n  aggregationEnabled = false,\n  aggregationLastRunAt = null,\n  aggregationNextRunAt = null,\n  namespaceName = null,\n  namespaceRestApiRequestPath = null,\n  namespaceType = null,\n  namespacePath = null,\n  canEdit = false,\n  enableVsdLink = false,\n  enableCustomizableStages = false,\n  enableProjectsFilter = false,\n  canReadCycleAnalytics = false,\n} = {}) => ({\n  selectedValueStream: buildValueStreamFromJson(valueStream),\n  group: groupId\n    ? convertObjectPropsToCamelCase(\n        buildGroupFromDataset({\n          groupId,\n          groupName,\n          groupFullPath,\n          groupPath,\n          groupAvatarUrl,\n          groupParentId,\n        }),\n      )\n    : null,\n  groupPath: groupPath || groupFullPath,\n  createdBefore: createdBefore ? newDate(createdBefore) : null,\n  createdAfter: createdAfter ? newDate(createdAfter) : null,\n  selectedProjects: projects\n    ? buildProjectsFromJSON(projects).map((proj) => ({\n        ...convertObjectPropsToCamelCase(proj),\n        fullPath: proj.path_with_namespace,\n      }))\n    : null,\n  labelsPath,\n  milestonesPath,\n  defaultStageConfig: defaultStages\n    ? buildDefaultStagesFromJSON(defaultStages).map(({ name, ...rest }) => ({\n        ...convertObjectPropsToCamelCase(rest),\n        name: capitalizeFirstCharacter(name),\n      }))\n    : [],\n  stage: JSON.parse(stage),\n  aggregation: {\n    enabled: parseBoolean(aggregationEnabled),\n    lastRunAt: aggregationLastRunAt,\n    nextRunAt: aggregationNextRunAt,\n  },\n  features: extractVSAFeaturesFromGON(),\n  namespace: {\n    name: namespaceName,\n    restApiRequestPath: namespaceRestApiRequestPath,\n    type: namespaceType,\n    path: namespacePath,\n  },\n  canEdit: parseBoolean(canEdit),\n  enableVsdLink: parseBoolean(enableVsdLink),\n  enableCustomizableStages: parseBoolean(enableCustomizableStages),\n  enableProjectsFilter: parseBoolean(enableProjectsFilter),\n  projectId: parseInt(projectId, 10),\n  canReadCycleAnalytics: parseBoolean(canReadCycleAnalytics),\n});\n\n/**\n * Linearly interpolates between two values\n *\n * @param {Number} valueAtT0 The value at t = 0\n * @param {Number} valueAtT1 The value at t = 1\n * @param {Number} t The current value of t\n *\n * @returns {Number} The result of the linear interpolation.\n */\nconst lerp = (valueAtT0, valueAtT1, t) => {\n  return valueAtT0 * (1 - t) + valueAtT1 * t;\n};\n\n/**\n * Builds a second series that visually represents the \"no data\" (i.e. \"null\")\n * data points, and returns a new series Array that includes both the \"null\"\n * and \"non-null\" data sets.\n * This function returns new series data and does not modify the original instance.\n *\n * @param {object} params - function arguments\n * @param {Array} params.seriesData The time series data that has already been processed\n * by the `apiDataToChartSeries` function.\n * @param {string} params.nullSeriesTitle Sets the title name for the null series\n * @param {object} params.seriesDataOptions Adds additional options for the series data\n * @param {object} params.nullSeriesOptions Adds additional options for the null data\n * @returns {Array} A new series Array\n */\nexport const buildNullSeries = ({\n  seriesData,\n  nullSeriesTitle,\n  seriesDataOptions = DEFAULT_SERIES_DATA_OPTIONS,\n  nullSeriesOptions = DEFAULT_NULL_SERIES_OPTIONS,\n}) => {\n  const nonNullSeries = cloneDeep(seriesData[0]);\n  // Loop through the series data and build a list of all the \"gaps\". A \"gap\" is\n  // a section of the data set that only include `null` values. Each gap object\n  // includes the start and end indices and the start and end values of the gap.\n  const seriesGaps = [];\n  let currentGap = null;\n  nonNullSeries.data.forEach(([, value], index) => {\n    if (value == null && currentGap == null) {\n      currentGap = {};\n\n      if (index > 0) {\n        currentGap.startIndex = index - 1;\n        const [, previousValue] = nonNullSeries.data[index - 1];\n        currentGap.startValue = previousValue;\n      }\n\n      seriesGaps.push(currentGap);\n    } else if (value != null && currentGap != null) {\n      currentGap.endIndex = index;\n      currentGap.endValue = value;\n      currentGap = null;\n    }\n  });\n\n  // Create a copy of the non-null series, but with all the data point values set to `null`\n  const nullSeriesData = nonNullSeries.data.map(([date]) => [date, null]);\n\n  // Render each of the gaps to the \"null\" series. Values are determined by linearly\n  // interpolating between the start and end values.\n  seriesGaps.forEach((gap) => {\n    const startIndex = gap.startIndex ?? 0;\n    const startValue = gap.startValue ?? gap.endValue ?? 0;\n    const endIndex = gap.endIndex ?? nonNullSeries.data.length - 1;\n    const endValue = gap.endValue ?? gap.startValue ?? 0;\n\n    for (let i = startIndex; i <= endIndex; i += 1) {\n      const t = (i - startIndex) / (endIndex - startIndex);\n      nullSeriesData[i][1] = lerp(startValue, endValue, t);\n    }\n  });\n\n  merge(nonNullSeries, seriesDataOptions);\n\n  const nullSeries = {\n    ...nullSeriesOptions,\n    name: nullSeriesTitle,\n    data: nullSeriesData,\n  };\n\n  return [nullSeries, nonNullSeries];\n};\n\n/**\n * Takes an ordered array of axisLabels and 1 or more datasets and creates\n * pairs, each pair consists of the axisLabel and the value from one or more datasets at\n * the current index.\n *\n * datasetName: 'Cool dataset'\n * axisLabels: ['label 1', 'label 2']\n * dataset: [10, 20]\n * returns [{ name: 'Cool dataset', data: [['label 1', 10], ['label 2', 20]]}]\n *\n * @param {object} params - function arguments\n * @param {Array} params.datasetNames - Name parameter for each dataset\n * @param {Array} params.datasets - Array of datasets\n * @param {Array} params.axisLabels - Array of axis labels to be applied to each point in each dataset\n * @returns {Array} Array of objects with the name and paired dataset\n */\nexport const pairDataAndLabels = ({ datasetNames, datasets = [], axisLabels }) => [\n  ...datasets.map((dataset, datasetIndex) => ({\n    name: datasetNames[datasetIndex],\n    data: zip(axisLabels, dataset.data),\n  })),\n];\n\n/**\n * This function takes a time series of data and computes a\n * slope and intercept to be used for linear regression over the dataset\n *\n * @param {Array} timeSeriesData - The historic time series data which will be used for the linear regression\n * @returns {Object} an object containing the `slope` and `intercept` values\n */\nexport const calculateSlopeAndInterceptFromDataset = (timeSeriesData) => {\n  const x = timeSeriesData.map((element) => new Date(element.date).getTime());\n  const y = timeSeriesData.map((element) => element.value);\n  const sumX = x.reduce((prev, curr) => prev + curr, 0);\n  const avgX = sumX / x.length;\n  const xDifferencesToAverage = x.map((value) => avgX - value);\n  const xDifferencesToAverageSquared = xDifferencesToAverage.map((value) => value ** 2);\n  const SSxx = xDifferencesToAverageSquared.reduce((prev, curr) => prev + curr, 0);\n  const sumY = y.reduce((prev, curr) => prev + curr, 0);\n  const avgY = sumY / y.length;\n  const yDifferencesToAverage = y.map((value) => avgY - value);\n  const xAndYDifferencesMultiplied = xDifferencesToAverage.map(\n    (curr, index) => curr * yDifferencesToAverage[index],\n  );\n  const SSxy = xAndYDifferencesMultiplied.reduce((prev, curr) => prev + curr, 0);\n  const slope = SSxy / SSxx;\n  const intercept = avgY - slope * avgX;\n\n  return {\n    slope,\n    intercept,\n  };\n};\n\n/**\n * This function generates a sequential array of dates in the future\n *\n * @param {Date} startDate - the date to start generating from\n * @param {Number} maxDays - the maximum number of days to calculate in the future\n * @returns {Array} an array of dates\n */\nexport const generateFutureDateRange = (startDate, maxDays) => {\n  const futureDates = [];\n  for (let i = 1; i <= maxDays; i += 1) {\n    futureDates.push(getDateInFuture(startDate, i));\n  }\n  return futureDates;\n};\n\nconst calculateRegression = ({ slope, intercept, timeInMilliseconds, rounding }) => {\n  return roundOffFloat(intercept + slope * timeInMilliseconds, rounding);\n};\n\n/**\n * This function accepts time series data and provides forecasted time series data\n * by applying a least squares linear regression\n *\n * Example input times series data format:\n *\n * [\n *   {\"date\":\"2023-01-12\",\"value\":160},\n *   {\"date\":\"2023-01-13\",\"value\":52},\n *   {\"date\":\"2023-01-14\",\"value\":47},\n *   {\"date\":\"2023-01-15\",\"value\":37},\n *   {\"date\":\"2023-01-16\",\"value\":106},\n * ]\n *\n *\n * @param {Array} timeSeriesData - The historic time series data which will be used for the linear regression\n * @param {Number} forecastAmount - The number of days which should be forecasted\n * @param {Number} rounding - The number of decimal places to round to\n * @returns {Array} Array of objects with the same time series format, but future dates equal to the forecastAmount value\n */\nexport const linearRegression = (timeSeriesData, forecastAmount = 30, rounding = 0) => {\n  if (!timeSeriesData.length) return [];\n\n  const { slope, intercept } = calculateSlopeAndInterceptFromDataset(timeSeriesData);\n\n  const { date: lastDate } = timeSeriesData[timeSeriesData.length - 1];\n  const nextDate = new Date(lastDate);\n  const futureDates = generateFutureDateRange(nextDate, forecastAmount);\n\n  return futureDates.map((futureDate) => ({\n    date: dateFormat(futureDate, dateFormats.isoDate),\n    value: calculateRegression({\n      timeInMilliseconds: futureDate.getTime(),\n      intercept,\n      slope,\n      rounding,\n    }),\n  }));\n};\n","import { flatten } from 'lodash';\nimport dateFormat from '~/lib/dateformat';\nimport { SECONDS_IN_DAY } from '~/lib/utils/datetime_utility';\nimport { slugify } from '~/lib/utils/text_utility';\nimport { joinPaths } from '~/lib/utils/url_utility';\nimport { urlQueryToFilter } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';\nimport {\n  dateFormats,\n  FLOW_METRICS,\n  MAX_METRIC_PRECISION,\n  UNITS,\n  VALUE_STREAM_METRIC_DISPLAY_UNITS,\n  VALUE_STREAM_METRIC_TILE_METADATA,\n} from './constants';\n\nexport const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'name') => {\n  if (!searchTerm?.length) return data;\n  return data.filter((item) => item[filterByKey].toLowerCase().includes(searchTerm.toLowerCase()));\n};\n\nexport const toYmd = (date) => dateFormat(date, dateFormats.isoDate);\n\n/**\n * Takes a url and extracts query parameters used for the shared\n * filter bar\n *\n * @param {string} url The URL to extract query parameters from\n * @returns {Object}\n */\nexport const extractFilterQueryParameters = (url = '') => {\n  const {\n    source_branch_name: selectedSourceBranch = null,\n    target_branch_name: selectedTargetBranch = null,\n    author_username: selectedAuthor = null,\n    milestone_title: selectedMilestone = null,\n    assignee_username: selectedAssigneeList = [],\n    label_name: selectedLabelList = [],\n  } = urlQueryToFilter(url);\n\n  return {\n    selectedSourceBranch,\n    selectedTargetBranch,\n    selectedAuthor,\n    selectedMilestone,\n    selectedAssigneeList,\n    selectedLabelList,\n  };\n};\n\n/**\n * Takes a url and extracts sorting and pagination query parameters into an object\n *\n * @param {string} url The URL to extract query parameters from\n * @returns {Object}\n */\nexport const extractPaginationQueryParameters = (url = '') => {\n  const { sort, direction, page } = urlQueryToFilter(url);\n  return {\n    sort: sort?.value || null,\n    direction: direction?.value || null,\n    page: page?.value || null,\n  };\n};\n\nexport const getDataZoomOption = ({\n  totalItems = 0,\n  maxItemsPerPage = 40,\n  dataZoom = [{ type: 'slider', bottom: 10, start: 0 }],\n}) => {\n  if (totalItems <= maxItemsPerPage) {\n    return {};\n  }\n\n  const intervalEnd = Math.ceil((maxItemsPerPage / totalItems) * 100);\n\n  return dataZoom.map((item) => {\n    return {\n      ...item,\n      end: intervalEnd,\n    };\n  });\n};\n\nexport const removeFlash = (type = 'alert') => {\n  // flash-warning don't have dismiss button.\n  document.querySelector(`.flash-${type} .js-close`)?.click();\n};\n\n/**\n * Prepares metric data to be rendered in the metric_card component\n *\n * @param {MetricData[]} data - The metric data to be rendered\n * @param {Object} popoverContent - Key value pair of data to display in the popover\n * @returns {TransformedMetricData[]} An array of metrics ready to render in the metric_card\n */\nexport const prepareTimeMetricsData = (data = [], popoverContent = {}) =>\n  data.map(({ title: label, identifier, ...rest }) => {\n    const metricIdentifier = identifier || slugify(label);\n    return {\n      ...rest,\n      label,\n      identifier: metricIdentifier,\n      description: popoverContent[metricIdentifier]?.description || '',\n    };\n  });\n\nconst requestData = ({ request, endpoint, requestPath, params, name }) => {\n  return request({ endpoint, params, requestPath })\n    .then(({ data }) => data)\n    .catch(() => {\n      throw new Error(name);\n    });\n};\n\n/**\n * Takes a configuration array of metrics requests (key metrics and DORA) and returns\n * a flat array of all the responses. Different metrics are retrieved from different endpoints\n * additionally we only support certain metrics for FOSS users.\n *\n * @param {Array} requests - array of metric api requests to be made\n * @param {String} requestPath - path for the group / project we are requesting\n * @param {Object} params - optional parameters to filter, including `created_after` and `created_before` dates\n * @returns a flat array of metrics\n */\nexport const fetchMetricsData = (requests = [], requestPath, params) => {\n  const promises = requests.map((r) => requestData({ ...r, requestPath, params }));\n  return Promise.all(promises).then((responses) =>\n    prepareTimeMetricsData(flatten(responses), VALUE_STREAM_METRIC_TILE_METADATA),\n  );\n};\n\n/**\n * Formats any valid number as percentage\n *\n * @param {number|string} decimalValue Decimal value between 0 and 1 to be converted to a percentage\n * @param {number} precision The number of decimal places to round to\n *\n * @returns {string} Returns a formatted string multiplied by 100\n */\nexport const formatAsPercentageWithoutSymbol = (decimalValue = 0, precision = 1) => {\n  const parsed = Number.isNaN(Number(decimalValue)) ? 0 : decimalValue;\n  return (parsed * 100).toFixed(precision);\n};\n\n/**\n * Converts a time in seconds to number of days, with variable precision\n *\n * @param {Number} seconds Time in seconds\n * @param {Number} precision Specifies the number of digits after the decimal\n *\n * @returns {Float} The number of days\n */\nexport const secondsToDays = (seconds, precision = 1) =>\n  (seconds / SECONDS_IN_DAY).toFixed(precision);\n\nexport const scaledValueForDisplay = (value, units, precision = MAX_METRIC_PRECISION) => {\n  switch (units) {\n    case UNITS.PERCENT:\n      return formatAsPercentageWithoutSymbol(value);\n    case UNITS.DAYS:\n      return secondsToDays(value, precision);\n    default:\n      return value;\n  }\n};\n\nconst prepareMetricValue = ({ identifier, value, unit }) => {\n  // NOTE: the flow metrics graphql endpoint returns values already scaled for display\n  if (!value) {\n    // ensures we return `-` for 0/null etc\n    return '-';\n  }\n  return Object.values(FLOW_METRICS).includes(identifier)\n    ? value\n    : scaledValueForDisplay(value, unit);\n};\n\n/**\n * Prepares metric data to be rendered in the metric_tile component\n *\n * @param {MetricData[]} data - The metric data to be rendered\n * @returns {TransformedMetricData[]} An array of metrics ready to render in the metric_tile\n */\nexport const rawMetricToMetricTile = (metric) => {\n  const { identifier, value, ...metricRest } = metric;\n  const { unit, label, ...metadataRest } = VALUE_STREAM_METRIC_TILE_METADATA[identifier];\n  return {\n    ...metadataRest,\n    ...metricRest,\n    title: label,\n    identifier,\n    label,\n    unit: VALUE_STREAM_METRIC_DISPLAY_UNITS[unit],\n    value: prepareMetricValue({ value, unit, identifier }),\n  };\n};\n\n/**\n * Generates a URL link to the VSD dashboard based on the\n * namespace path passed into the method.\n *\n * @param {String} namespacePath - Path of the specified namespace\n * @param {Boolean} isProjectNamespace\n * @returns a URL or blank string if there is no namespacePath set\n */\nexport const generateValueStreamsDashboardLink = (\n  namespacePath = null,\n  isProjectNamespace = false,\n) => {\n  if (!namespacePath) return '';\n\n  const dashboardsSlug = '/-/analytics/dashboards/value_streams_dashboard';\n  const formattedNamespacePath = isProjectNamespace ? namespacePath : `groups/${namespacePath}`;\n  const segments = [gon.relative_url_root || '', '/', formattedNamespacePath, dashboardsSlug];\n\n  return joinPaths(...segments);\n};\n\n/**\n * Extracts the relevant feature and license flags needed for VSA\n *\n * @param {Object} gon the global `window.gon` object populated when the page loads\n * @returns an object containing the extracted feature flags and their boolean status\n */\nexport const extractVSAFeaturesFromGON = () => ({\n  // licensed feature toggles\n  cycleAnalyticsForGroups: Boolean(gon?.licensed_features?.cycleAnalyticsForGroups),\n  cycleAnalyticsForProjects: Boolean(gon?.licensed_features?.cycleAnalyticsForProjects),\n  groupLevelAnalyticsDashboard: Boolean(gon?.licensed_features?.groupLevelAnalyticsDashboard),\n});\n\n/**\n * Takes a raw GraphQL response which could contain data for a group or project namespace,\n * and returns the data for the namespace which is present in the response.\n *\n * @param {Object} params\n * @param {string} params.resultKey - The data to be extracted from the namespace.\n * @param {Object} params.result\n * @param {Object} params.result.data\n * @param {Object} params.result.data.group - The group GraphQL response.\n * @param {Object} params.result.data.project - The project GraphQL response.\n * @returns {Object} The data extracted from either group[resultKey] or project[resultKey].\n */\nexport const extractQueryResponseFromNamespace = ({ result, resultKey }) => {\n  const { group = null, project = null } = result.data;\n  if (group || project) {\n    const namespace = group ?? project;\n    return namespace[resultKey] || {};\n  }\n  return {};\n};\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\nfunction uniqWith(array, comparator) {\n  comparator = typeof comparator == 'function' ? comparator : undefined;\n  return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n}\n\nmodule.exports = uniqWith;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","import { DATA_VIZ_BLUE_500, GRAY_300, GRAY_50 } from '@gitlab/ui/src/tokens/build/js/tokens';\nimport { defaultAreaOpacity } from '@gitlab/ui/dist/utils/charts/config';\nimport { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\n\nexport const scatterChartLineProps = {\n  default: {\n    type: 'line',\n    showSymbol: false,\n    // By default zlevel is 2 for all series types.\n    // By increasing the zlevel to 3 we make sure that the trendline gets drawn in front of the dots in the chart.\n    zlevel: 3,\n  },\n};\n\nexport const DATA_REFETCH_DELAY = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;\n\nexport const BASE_SERIES_DATA_OPTIONS = {\n  showSymbol: true,\n  showAllSymbol: true,\n  symbolSize: 8,\n  lineStyle: {\n    color: DATA_VIZ_BLUE_500,\n  },\n  itemStyle: {\n    color: DATA_VIZ_BLUE_500,\n  },\n};\n\nexport const DEFAULT_SERIES_DATA_OPTIONS = {\n  ...BASE_SERIES_DATA_OPTIONS,\n  areaStyle: {\n    opacity: 0,\n  },\n};\n\nexport const BASE_NULL_SERIES_OPTIONS = {\n  showSymbol: false,\n  lineStyle: {\n    type: 'dashed',\n    color: GRAY_300,\n  },\n  itemStyle: {\n    color: GRAY_300,\n  },\n};\n\nexport const DEFAULT_NULL_SERIES_OPTIONS = {\n  ...BASE_NULL_SERIES_OPTIONS,\n  areaStyle: {\n    color: 'none',\n  },\n};\n\nexport const BASE_FORECAST_SERIES_OPTIONS = {\n  lineStyle: { type: 'dashed', color: DATA_VIZ_BLUE_500 },\n  areaStyle: { opacity: defaultAreaOpacity, color: GRAY_50 },\n};\n\nexport const STACKED_AREA_CHART_SERIES_OPTIONS = {\n  stack: 'chart',\n};\n\nexport const STACKED_AREA_CHART_NULL_SERIES_OPTIONS = {\n  stack: 'null',\n};\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n"],"sourceRoot":""}