UNPKG

@optimizely/optimizely-sdk

Version:
15 lines (13 loc) 62.5 kB
import{ConsoleLogHandler as e,getLogger as t,setLogHandler as r,setLogLevel as i,LogLevel as n,setErrorHandler as a,getErrorHandler as o}from"@optimizely/js-sdk-logging";export{setLogLevel,setLogHandler as setLogger}from"@optimizely/js-sdk-logging";import{LocalStoragePendingEventsDispatcher as s,LogTierV1EventProcessor as u}from"@optimizely/js-sdk-event-processor";import{NOTIFICATION_TYPES as l,sprintf as E,generateUUID as _,keyBy as I,objectValues as g}from"@optimizely/js-sdk-utils";import{HttpPollingDatafileManager as c}from"@optimizely/js-sdk-datafile-manager";import f from"murmurhash"; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */var d=function(){return(d=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)};function p(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var i=Array(e),n=0;for(t=0;t<r;t++)for(var a=arguments[t],o=0,s=a.length;o<s;o++,n++)i[n]=a[o];return i}var N={NOTSET:0,DEBUG:1,INFO:2,WARNING:3,ERROR:4},R={CONDITION_EVALUATOR_ERROR:"%s: Error evaluating audience condition of type %s: %s",DATAFILE_AND_SDK_KEY_MISSING:"%s: You must provide at least one of sdkKey or datafile. Cannot start Optimizely",EXPERIMENT_KEY_NOT_IN_DATAFILE:"%s: Experiment key %s is not in datafile.",FEATURE_NOT_IN_DATAFILE:"%s: Feature key %s is not in datafile.",IMPROPERLY_FORMATTED_EXPERIMENT:"%s: Experiment key %s is improperly formatted.",INVALID_ATTRIBUTES:"%s: Provided attributes are in an invalid format.",INVALID_BUCKETING_ID:"%s: Unable to generate hash for bucketing ID %s: %s",INVALID_DATAFILE:"%s: Datafile is invalid - property %s: %s",INVALID_DATAFILE_MALFORMED:"%s: Datafile is invalid because it is malformed.",INVALID_CONFIG:"%s: Provided Optimizely config is in an invalid format.",INVALID_JSON:"%s: JSON object is not valid.",INVALID_ERROR_HANDLER:'%s: Provided "errorHandler" is in an invalid format.',INVALID_EVENT_DISPATCHER:'%s: Provided "eventDispatcher" is in an invalid format.',INVALID_EVENT_TAGS:"%s: Provided event tags are in an invalid format.",INVALID_EXPERIMENT_KEY:"%s: Experiment key %s is not in datafile. It is either invalid, paused, or archived.",INVALID_EXPERIMENT_ID:"%s: Experiment ID %s is not in datafile.",INVALID_GROUP_ID:"%s: Group ID %s is not in datafile.",INVALID_LOGGER:'%s: Provided "logger" is in an invalid format.',INVALID_ROLLOUT_ID:"%s: Invalid rollout ID %s attached to feature %s",INVALID_USER_ID:"%s: Provided user ID is in an invalid format.",INVALID_USER_PROFILE_SERVICE:"%s: Provided user profile service instance is in an invalid format: %s.",NO_DATAFILE_SPECIFIED:"%s: No datafile specified. Cannot start optimizely.",NO_JSON_PROVIDED:"%s: No JSON object to validate against schema.",NO_VARIATION_FOR_EXPERIMENT_KEY:"%s: No variation key %s defined in datafile for experiment %s.",UNDEFINED_ATTRIBUTE:"%s: Provided attribute: %s has an undefined value.",UNRECOGNIZED_ATTRIBUTE:"%s: Unrecognized attribute %s provided. Pruning before sending event to Optimizely.",UNABLE_TO_CAST_VALUE:"%s: Unable to cast value %s to type %s, returning null.",USER_NOT_IN_FORCED_VARIATION:"%s: User %s is not in the forced variation map. Cannot remove their forced variation.",USER_PROFILE_LOOKUP_ERROR:'%s: Error while looking up user profile for user ID "%s": %s.',USER_PROFILE_SAVE_ERROR:'%s: Error while saving user profile for user ID "%s": %s.',VARIABLE_KEY_NOT_IN_DATAFILE:'%s: Variable with key "%s" associated with feature with key "%s" is not in datafile.',VARIATION_ID_NOT_IN_DATAFILE:"%s: No variation ID %s defined in datafile for experiment %s.",VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT:"%s: Variation ID %s is not in the datafile.",INVALID_INPUT_FORMAT:"%s: Provided %s is in an invalid format.",INVALID_DATAFILE_VERSION:"%s: This version of the JavaScript SDK does not support the given datafile version: %s",INVALID_VARIATION_KEY:"%s: Provided variation key is in an invalid format."},O={ACTIVATE_USER:"%s: Activating user %s in experiment %s.",DISPATCH_CONVERSION_EVENT:"%s: Dispatching conversion event to URL %s with params %s.",DISPATCH_IMPRESSION_EVENT:"%s: Dispatching impression event to URL %s with params %s.",DEPRECATED_EVENT_VALUE:"%s: Event value is deprecated in %s call.",EVENT_KEY_NOT_FOUND:"%s: Event key %s is not in datafile.",EXPERIMENT_NOT_RUNNING:"%s: Experiment %s is not running.",FEATURE_ENABLED_FOR_USER:"%s: Feature %s is enabled for user %s.",FEATURE_NOT_ENABLED_FOR_USER:"%s: Feature %s is not enabled for user %s.",FEATURE_HAS_NO_EXPERIMENTS:"%s: Feature %s is not attached to any experiments.",FAILED_TO_PARSE_VALUE:'%s: Failed to parse event value "%s" from event tags.',FAILED_TO_PARSE_REVENUE:'%s: Failed to parse revenue value "%s" from event tags.',FORCED_BUCKETING_FAILED:"%s: Variation key %s is not in datafile. Not activating user %s.",INVALID_OBJECT:"%s: Optimizely object is not valid. Failing %s.",INVALID_CLIENT_ENGINE:"%s: Invalid client engine passed: %s. Defaulting to node-sdk.",INVALID_VARIATION_ID:"%s: Bucketed into an invalid variation ID. Returning null.",NOTIFICATION_LISTENER_EXCEPTION:"%s: Notification listener for (%s) threw exception: %s",NO_ROLLOUT_EXISTS:"%s: There is no rollout of feature %s.",NOT_ACTIVATING_USER:"%s: Not activating user %s for experiment %s.",NOT_TRACKING_USER:"%s: Not tracking user %s.",PARSED_REVENUE_VALUE:'%s: Parsed revenue value "%s" from event tags.',PARSED_NUMERIC_VALUE:'%s: Parsed event value "%s" from event tags.',RETURNING_STORED_VARIATION:'%s: Returning previously activated variation "%s" of experiment "%s" for user "%s" from user profile.',ROLLOUT_HAS_NO_EXPERIMENTS:"%s: Rollout of feature %s has no experiments",SAVED_VARIATION:'%s: Saved variation "%s" of experiment "%s" for user "%s".',SAVED_VARIATION_NOT_FOUND:"%s: User %s was previously bucketed into variation with ID %s for experiment %s, but no matching variation was found.",SHOULD_NOT_DISPATCH_ACTIVATE:'%s: Experiment %s is not in "Running" state. Not activating user.',SKIPPING_JSON_VALIDATION:"%s: Skipping JSON schema validation.",TRACK_EVENT:"%s: Tracking event %s for user %s.",USER_ASSIGNED_TO_EXPERIMENT_BUCKET:"%s: Assigned bucket %s to user with bucketing ID %s.",USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is in experiment %s of group %s.",USER_BUCKETED_INTO_TARGETING_RULE:"%s: User %s bucketed into targeting rule %s.",USER_IN_FEATURE_EXPERIMENT:"%s: User %s is in variation %s of experiment %s on the feature %s.",USER_IN_ROLLOUT:"%s: User %s is in rollout of feature %s.",USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s bucketed into everyone targeting rule.",USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s not bucketed into everyone targeting rule due to traffic allocation.",USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is not in experiment %s of group %s.",USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP:"%s: User %s is not in any experiment of group %s.",USER_NOT_BUCKETED_INTO_TARGETING_RULE:"%s User %s not bucketed into targeting rule %s due to traffic allocation. Trying everyone rule.",USER_NOT_IN_FEATURE_EXPERIMENT:"%s: User %s is not in any experiment on the feature %s.",USER_NOT_IN_ROLLOUT:"%s: User %s is not in rollout of feature %s.",USER_FORCED_IN_VARIATION:"%s: User %s is forced in variation %s.",USER_MAPPED_TO_FORCED_VARIATION:"%s: Set variation %s for experiment %s and user %s in the forced variation map.",USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s does not meet conditions for targeting rule %s.",USER_MEETS_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s meets conditions for targeting rule %s.",USER_HAS_VARIATION:"%s: User %s is in variation %s of experiment %s.",USER_HAS_FORCED_VARIATION:"%s: Variation %s is mapped to experiment %s and user %s in the forced variation map.",USER_HAS_NO_VARIATION:"%s: User %s is in no variation of experiment %s.",USER_HAS_NO_FORCED_VARIATION:"%s: User %s is not in the forced variation map.",USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT:"%s: No experiment %s mapped to user %s in the forced variation map.",USER_NOT_IN_ANY_EXPERIMENT:"%s: User %s is not in any experiment of group %s.",USER_NOT_IN_EXPERIMENT:"%s: User %s does not meet conditions to be in experiment %s.",USER_RECEIVED_DEFAULT_VARIABLE_VALUE:'%s: User "%s" is not in any variation or rollout rule. Returning default value for variable "%s" of feature flag "%s".',FEATURE_NOT_ENABLED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Feature "%s" is not enabled for user %s. Returning the default variable value "%s".',VARIABLE_NOT_USED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Variable "%s" is not used in variation "%s". Returning default value.',USER_RECEIVED_VARIABLE_VALUE:'%s: Got variable value "%s" for variable "%s" of feature flag "%s"',VALID_DATAFILE:"%s: Datafile is valid.",VALID_USER_PROFILE_SERVICE:"%s: Valid user profile service provided.",VARIATION_REMOVED_FOR_USER:"%s: Variation mapped to experiment %s has been removed for user %s.",VARIABLE_REQUESTED_WITH_WRONG_TYPE:'%s: Requested variable type "%s", but variable is of type "%s". Use correct API to retrieve value. Returning None.',VALID_BUCKETING_ID:'%s: BucketingId is valid: "%s"',BUCKETING_ID_NOT_STRING:"%s: BucketingID attribute is not a string. Defaulted to userId",EVALUATING_AUDIENCE:'%s: Starting to evaluate audience "%s" with conditions: %s.',EVALUATING_AUDIENCES_COMBINED:'%s: Evaluating audiences for %s "%s": %s.',AUDIENCE_EVALUATION_RESULT:'%s: Audience "%s" evaluated to %s.',AUDIENCE_EVALUATION_RESULT_COMBINED:"%s: Audiences for %s %s collectively evaluated to %s.",MISSING_ATTRIBUTE_VALUE:'%s: Audience condition %s evaluated to UNKNOWN because no value was passed for user attribute "%s".',UNEXPECTED_CONDITION_VALUE:"%s: Audience condition %s evaluated to UNKNOWN because the condition value is not supported.",UNEXPECTED_TYPE:'%s: Audience condition %s evaluated to UNKNOWN because a value of type "%s" was passed for user attribute "%s".',UNEXPECTED_TYPE_NULL:'%s: Audience condition %s evaluated to UNKNOWN because a null value was passed for user attribute "%s".',UNKNOWN_CONDITION_TYPE:"%s: Audience condition %s has an unknown condition type. You may need to upgrade to a newer release of the Optimizely SDK.",UNKNOWN_MATCH_TYPE:"%s: Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.",UPDATED_OPTIMIZELY_CONFIG:"%s: Updated Optimizely config to revision %s (project id %s)",OUT_OF_BOUNDS:'%s: Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].',UNABLE_TO_ATTACH_UNLOAD:'%s: unable to bind optimizely.close() to page unload event: "%s"'},T={REVENUE:"revenue",VALUE:"value"},h={BOT_FILTERING:"$opt_bot_filtering",BUCKETING_ID:"$opt_bucketing_id",STICKY_BUCKETING_KEY:"$opt_experiment_bucket_map",USER_AGENT:"$opt_user_agent"},v=["node-sdk","react-sdk","javascript-sdk"],A=l,y={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables"},U={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment"},m={RULE:"rule",EXPERIMENT:"experiment"},L={BOOLEAN:"boolean",DOUBLE:"double",INTEGER:"integer",STRING:"string",JSON:"json"},S={V2:"2",V3:"3",V4:"4"},V=Object.freeze({__proto__:null,LOG_LEVEL:N,ERROR_MESSAGES:R,LOG_MESSAGES:O,RESERVED_EVENT_KEYWORDS:T,CONTROL_ATTRIBUTES:h,JAVASCRIPT_CLIENT_ENGINE:"javascript-sdk",NODE_CLIENT_ENGINE:"node-sdk",REACT_CLIENT_ENGINE:"react-sdk",NODE_CLIENT_VERSION:"4.4.0",VALID_CLIENT_ENGINES:v,NOTIFICATION_TYPES:A,DECISION_NOTIFICATION_TYPES:y,DECISION_SOURCES:U,AUDIENCE_EVALUATION_TYPES:m,FEATURE_VARIABLE_TYPES:L,DATAFILE_VERSIONS:S}),D="CONFIG_VALIDATOR",C=[S.V2,S.V3,S.V4],P=function(e){if("object"==typeof e&&null!==e){if(e.errorHandler&&"function"!=typeof e.errorHandler.handleError)throw new Error(E(R.INVALID_ERROR_HANDLER,D));if(e.eventDispatcher&&"function"!=typeof e.eventDispatcher.dispatchEvent)throw new Error(E(R.INVALID_EVENT_DISPATCHER,D));if(e.logger&&"function"!=typeof e.logger.log)throw new Error(E(R.INVALID_LOGGER,D));return!0}throw new Error(E(R.INVALID_CONFIG,D))},F=function(e){if(!e)throw new Error(E(R.NO_DATAFILE_SPECIFIED,D));if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new Error(E(R.INVALID_DATAFILE_MALFORMED,D))}if("object"==typeof e&&!Array.isArray(e)&&null!==e&&-1===C.indexOf(e.version))throw new Error(E(R.INVALID_DATAFILE_VERSION,D,e.version));return e},b={handleError:function(){}},M=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")},k={dispatchEvent:function(e,t){var r,i=e.url,n=e.params;"POST"===e.httpVerb?((r=new XMLHttpRequest).open("POST",i,!0),r.setRequestHeader("Content-Type","application/json"),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t({statusCode:r.status})}catch(e){}},r.send(JSON.stringify(n))):(i+="?wxhr=true",n&&(i+="&"+M(n)),(r=new XMLHttpRequest).open("GET",i,!0),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t()}catch(e){}},r.send())}};function B(){}B.prototype.log=function(){};var x={createLogger:function(t){return new e(t)},createNoOpLogger:function(){return new B}},K=Math.pow(2,53);var G={assign:function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return{};if("function"==typeof Object.assign)return Object.assign.apply(Object,p([e],t));for(var i=Object(e),n=0;n<t.length;n++){var a=t[n];if(null!=a)for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(i[o]=a[o])}return i},currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:function(e){return"number"==typeof e&&Math.abs(e)<=K},keyBy:function(e,t){return e?I(e,(function(e){return e[t]})):{}},uuid:_,isNumber:function(e){return"number"==typeof e}},w="PROJECT_CONFIG";var j=function(e,t){void 0===t&&(t=null);var r,i,n=(r=e,(i=G.assign({},r)).audiences=(r.audiences||[]).map((function(e){return G.assign({},e)})),i.experiments=(r.experiments||[]).map((function(e){return G.assign({},e)})),i.featureFlags=(r.featureFlags||[]).map((function(e){return G.assign({},e)})),i.groups=(r.groups||[]).map((function(e){var t=G.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return G.assign({},e)})),t})),i.rollouts=(r.rollouts||[]).map((function(e){var t=G.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return G.assign({},e)})),t})),i);return n.__datafileStr=null===t?JSON.stringify(e):t,(n.audiences||[]).forEach((function(e){e.conditions=JSON.parse(e.conditions)})),n.audiencesById=G.keyBy(n.audiences,"id"),G.assign(n.audiencesById,G.keyBy(n.typedAudiences,"id")),n.attributeKeyMap=G.keyBy(n.attributes,"key"),n.eventKeyMap=G.keyBy(n.events,"key"),n.groupIdMap=G.keyBy(n.groups,"id"),Object.keys(n.groupIdMap||{}).forEach((function(e){(n.groupIdMap[e].experiments||[]).forEach((function(t){n.experiments.push(G.assign(t,{groupId:e}))}))})),n.rolloutIdMap=G.keyBy(n.rollouts||[],"id"),g(n.rolloutIdMap||{}).forEach((function(e){(e.experiments||[]).forEach((function(e){n.experiments.push(e),e.variationKeyMap=G.keyBy(e.variations,"key")}))})),n.experimentKeyMap=G.keyBy(n.experiments,"key"),n.experimentIdMap=G.keyBy(n.experiments,"id"),n.variationIdMap={},n.variationVariableUsageMap={},(n.experiments||[]).forEach((function(e){e.variationKeyMap=G.keyBy(e.variations,"key"),G.assign(n.variationIdMap,G.keyBy(e.variations,"id")),g(e.variationKeyMap||{}).forEach((function(e){e.variables&&(n.variationVariableUsageMap[e.id]=G.keyBy(e.variables,"id"))}))})),n.experimentFeatureMap={},n.featureKeyMap=G.keyBy(n.featureFlags||[],"key"),g(n.featureKeyMap||{}).forEach((function(e){e.variables.forEach((function(e){e.type===L.STRING&&e.subType===L.JSON&&(e.type=L.JSON,delete e.subType)})),e.variableKeyMap=G.keyBy(e.variables,"key"),(e.experimentIds||[]).forEach((function(t){n.experimentFeatureMap[t]?n.experimentFeatureMap[t].push(e.id):n.experimentFeatureMap[t]=[e.id];var r=n.experimentIdMap[t];r.groupId&&!e.groupId&&(e.groupId=r.groupId)}))})),n},Y=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(E(R.INVALID_EXPERIMENT_KEY,w,t));return r.id},H=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(E(R.INVALID_EXPERIMENT_KEY,w,t));return r.status},X=function(e,t){return"Running"===H(e,t)},J=function(e,t,r){var i=e.experimentKeyMap[t];return i.variationKeyMap.hasOwnProperty(r)?i.variationKeyMap[r].id:null},z=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){var r=e.experimentKeyMap[t];if(r)return r}throw new Error(E(R.EXPERIMENT_KEY_NOT_IN_DATAFILE,w,t))},Z=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){var i=e.featureKeyMap[t];if(i)return i}return r.log(N.ERROR,E(R.FEATURE_NOT_IN_DATAFILE,w,t)),null},W=function(e,t,r,i){var n=e.featureKeyMap[t];if(!n)return i.log(N.ERROR,E(R.FEATURE_NOT_IN_DATAFILE,w,t)),null;var a=n.variableKeyMap[r];return a||(i.log(N.ERROR,E(R.VARIABLE_KEY_NOT_IN_DATAFILE,w,r,t)),null)},$=function(e,t,r,i){if(!t||!r)return null;if(!e.variationVariableUsageMap.hasOwnProperty(r.id))return i.log(N.ERROR,E(R.VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT,w,r.id)),null;var n=e.variationVariableUsageMap[r.id][t.id];return n?n.value:null},q=function(e,t,r){var i;switch(t){case L.BOOLEAN:"true"!==e&&"false"!==e?(r.log(N.ERROR,E(R.UNABLE_TO_CAST_VALUE,w,e,t)),i=null):i="true"===e;break;case L.INTEGER:i=parseInt(e,10),isNaN(i)&&(r.log(N.ERROR,E(R.UNABLE_TO_CAST_VALUE,w,e,t)),i=null);break;case L.DOUBLE:i=parseFloat(e),isNaN(i)&&(r.log(N.ERROR,E(R.UNABLE_TO_CAST_VALUE,w,e,t)),i=null);break;case L.JSON:try{i=JSON.parse(e)}catch(n){r.log(N.ERROR,E(R.UNABLE_TO_CAST_VALUE,w,e,t)),i=null}break;default:i=e}return i},Q=function(e,t){return e.eventKeyMap.hasOwnProperty(t)},ee=function(e,t){return e.experimentFeatureMap.hasOwnProperty(t)},te=function(e){return!!e.sendFlagDecisions},re=Y,ie=function(e,t){var r=e.experimentIdMap[t];if(!r)throw new Error(E(R.INVALID_EXPERIMENT_ID,w,t));return r.layerId},ne=function(e,t,r){var i=e.attributeKeyMap[t],n=0===t.indexOf("$opt_");return i?(n&&r.log(N.WARN,E("Attribute %s unexpectedly has reserved prefix %s; using attribute ID instead of reserved attribute name.",t,"$opt_")),i.id):n?t:(r.log(N.DEBUG,E(R.UNRECOGNIZED_ATTRIBUTE,w,t)),null)},ae=function(e,t){var r=e.eventKeyMap[t];return r?r.id:null},oe=function(e,t){return"Running"===H(e,t)},se=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(E(R.INVALID_EXPERIMENT_KEY,w,t));return r.audienceConditions||r.audienceIds},ue=function(e,t){return e.variationIdMap.hasOwnProperty(t)?e.variationIdMap[t].key:null},le=J,Ee=z,_e=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(E(R.INVALID_EXPERIMENT_KEY,w,t));return r.trafficAllocation},Ie=function(e,t,r){if(e.experimentIdMap.hasOwnProperty(t)){var i=e.experimentIdMap[t];if(i)return i}return r.log(N.ERROR,E(R.INVALID_EXPERIMENT_ID,w,t)),null},ge=function(e){return e.audiencesById},ce=function(e){return e.__datafileStr},fe=function(e){var t;try{t=F(e.datafile)}catch(e){return{configObj:null,error:e}}if(e.jsonSchemaValidator)try{e.jsonSchemaValidator.validate(t),e.logger.log(N.INFO,E(O.VALID_DATAFILE,w))}catch(e){return{configObj:null,error:e}}else e.logger.log(N.INFO,E(O.SKIPPING_JSON_VALIDATION,w));var r=[t];return"string"==typeof e.datafile&&r.push(e.datafile),{configObj:j.apply(void 0,r),error:null}};function de(e,t,r,i){var n=e.experimentFeatureMap[r],a={};if(n){var o=i[n],s=(t.variables||[]).reduce((function(e,t){return e[t.id]={id:t.id,value:t.value},e}),{});a=(o||[]).reduce((function(e,r){var i=s[r.id],n=t.featureEnabled&&i?i.value:r.defaultValue;return e[r.key]={id:r.id,key:r.key,type:r.type,value:n},e}),{})}return a}function pe(e,t){this.experimentsMap=function(e){var t=(e.rollouts||[]).reduce((function(e,t){return t.experiments.forEach((function(t){e[t.id]=!0})),e}),{}),r=(e.featureFlags||[]).reduce((function(e,t){return e[t.id]=t.variables,e}),{});return(e.experiments||[]).reduce((function(i,n){return t[n.id]||(i[n.key]={id:n.id,key:n.key,variationsMap:(n.variations||[]).reduce((function(t,i){return t[i.key]={id:i.id,key:i.key,variablesMap:de(e,i,n.id,r)},ee(e,n.id)&&(t[i.key].featureEnabled=i.featureEnabled),t}),{})}),i}),{})}(e),this.featuresMap=function(e,t){return(e.featureFlags||[]).reduce((function(r,i){return r[i.key]={id:i.id,key:i.key,experimentsMap:(i.experimentIds||[]).reduce((function(r,i){var n=e.experimentIdMap[i].key;return r[n]=t[n],r}),{}),variablesMap:(i.variables||[]).reduce((function(e,t){return e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e}),{})},r}),{})}(e,this.experimentsMap),this.revision=e.revision,this.__datafile=t}pe.prototype.getDatafile=function(){return this.__datafile};var Ne={OptimizelyConfig:pe},Re=t();function Oe(e,t){return e instanceof Error?e.message:t||"Unknown error"}function Te(e){try{this.__initialize(e)}catch(e){Re.error(e),this.__updateListeners=[],this.__configObj=null,this.__optimizelyConfigObj=null,this.__readyPromise=Promise.resolve({success:!1,reason:Oe(e,"Error in initialize")})}}Te.prototype.__initialize=function(e){if(this.__updateListeners=[],this.jsonSchemaValidator=e.jsonSchemaValidator,!e.datafile&&!e.sdkKey){this.__configObj=null;var t=new Error(E(R.DATAFILE_AND_SDK_KEY_MISSING,"PROJECT_CONFIG_MANAGER"));return this.__readyPromise=Promise.resolve({success:!1,reason:Oe(t)}),void Re.error(t)}var r;if(e.datafile?(r=this.__handleNewDatafile(e.datafile))&&(this.__configObj=null):this.__configObj=null,e.sdkKey){var i={sdkKey:e.sdkKey};this.__validateDatafileOptions(e.datafileOptions)&&G.assign(i,e.datafileOptions),this.__configObj&&(i.datafile=ce(this.__configObj)),this.datafileManager=new c(i),this.datafileManager.start(),this.__readyPromise=this.datafileManager.onReady().then(this.__onDatafileManagerReadyFulfill.bind(this),this.__onDatafileManagerReadyReject.bind(this)),this.datafileManager.on("update",this.__onDatafileManagerUpdate.bind(this))}else this.__configObj?this.__readyPromise=Promise.resolve({success:!0}):this.__readyPromise=Promise.resolve({success:!1,reason:Oe(r,"Invalid datafile")})},Te.prototype.__onDatafileManagerReadyFulfill=function(){var e=this.__handleNewDatafile(this.datafileManager.get());return e?{success:!1,reason:Oe(e)}:{success:!0}},Te.prototype.__onDatafileManagerReadyReject=function(e){return{success:!1,reason:Oe(e,"Failed to become ready")}},Te.prototype.__onDatafileManagerUpdate=function(){this.__handleNewDatafile(this.datafileManager.get())},Te.prototype.__validateDatafileOptions=function(e){return void 0===e||"object"==typeof e&&null!==e},Te.prototype.__handleNewDatafile=function(e){var t=fe({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:Re}),r=t.configObj,i=t.error;i?Re.error(i):(this.__configObj?this.__configObj.revision:"null")!==r.revision&&(this.__configObj=r,this.__optimizelyConfigObj=new Ne.OptimizelyConfig(this.__configObj,ce(this.__configObj)),this.__updateListeners.forEach((function(e){e(r)})));return i},Te.prototype.getConfig=function(){return this.__configObj},Te.prototype.getOptimizelyConfig=function(){return this.__optimizelyConfigObj},Te.prototype.onReady=function(){return this.__readyPromise},Te.prototype.onUpdate=function(e){return this.__updateListeners.push(e),function(){var t=this.__updateListeners.indexOf(e);t>-1&&this.__updateListeners.splice(t,1)}.bind(this)},Te.prototype.stop=function(){this.datafileManager&&this.datafileManager.stop(),this.__updateListeners=[]};function he(e){this.logger=e.logger,this.errorHandler=e.errorHandler,this.__notificationListeners={},g(A).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this)),this.__listenerId=1}he.prototype.addNotificationListener=function(e,t){try{if(!(g(A).indexOf(e)>-1))return-1;this.__notificationListeners[e]||(this.__notificationListeners[e]=[]);var r=!1;if((this.__notificationListeners[e]||[]).forEach((function(e){if(e.callback===t)return r=!0,!1})),r)return-1;this.__notificationListeners[e].push({id:this.__listenerId,callback:t});var i=this.__listenerId;return this.__listenerId+=1,i}catch(e){return this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e),-1}},he.prototype.removeNotificationListener=function(e){try{var t,r;if(Object.keys(this.__notificationListeners).some(function(i){if((this.__notificationListeners[i]||[]).every((function(n,a){return n.id!==e||(t=a,r=i,!1)})),void 0!==t&&void 0!==r)return!0}.bind(this)),void 0!==t&&void 0!==r)return this.__notificationListeners[r].splice(t,1),!0}catch(e){this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e)}return!1},he.prototype.clearAllNotificationListeners=function(){try{g(A).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this))}catch(e){this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e)}},he.prototype.clearNotificationListeners=function(e){try{this.__notificationListeners[e]=[]}catch(e){this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e)}},he.prototype.sendNotifications=function(e,t){try{(this.__notificationListeners[e]||[]).forEach(function(r){var i=r.callback;try{i(t)}catch(t){this.logger.log(N.ERROR,E(O.NOTIFICATION_LISTENER_EXCEPTION,"NOTIFICATION_CENTER",e,t.message))}}.bind(this))}catch(e){this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e)}};var ve=Math.pow(2,32),Ae={bucket:function(e){var t=e.experimentKeyMap[e.experimentKey].groupId;if(t){var r=e.groupIdMap[t];if(!r)throw new Error(E(R.INVALID_GROUP_ID,"BUCKETER",t));if("random"===r.policy){var i=this.bucketUserIntoExperiment(r,e.bucketingId,e.userId,e.logger);if(null===i){var n=E(O.USER_NOT_IN_ANY_EXPERIMENT,"BUCKETER",e.userId,t);return e.logger.log(N.INFO,n),null}if(i!==e.experimentId){var a=E(O.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);return e.logger.log(N.INFO,a),null}var o=E(O.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);e.logger.log(N.INFO,o)}}var s=E("%s%s",e.bucketingId,e.experimentId),u=this._generateBucketValue(s),l=E(O.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",u,e.userId);e.logger.log(N.DEBUG,l);var _=this._findBucket(u,e.trafficAllocationConfig);if(!e.variationIdMap.hasOwnProperty(_)){if(_){var I=E(O.INVALID_VARIATION_ID,"BUCKETER");e.logger.log(N.WARNING,I)}return null}return _},bucketUserIntoExperiment:function(e,t,r,i){var n=E("%s%s",t,e.id),a=this._generateBucketValue(n);i.log(N.DEBUG,E(O.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",a,r));var o=e.trafficAllocation;return this._findBucket(a,o)},_findBucket:function(e,t){for(var r=0;r<t.length;r++)if(e<t[r].endOfRange)return t[r].entityId;return null},_generateBucketValue:function(e){try{var t=f.v3(e,1);return parseInt(1e4*(t/ve),10)}catch(t){throw new Error(E(R.INVALID_BUCKETING_ID,"BUCKETER",e,t.message))}}},ye=["and","or","not"];function Ue(e,t){if(Array.isArray(e)){var r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===ye.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ue(e[i],t);if(!1===n)return!1;null===n&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){var r=Ue(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ue(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}var me=t();function Le(e){return/^\d+$/.test(e)}function Se(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(t<0)&&(r<0||t<r)}function Ve(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(r<0)&&(t<0||r<t)}function De(e){var t=e,r="";if(function(e){return/\s/.test(e)}(e))return me.warn(O.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;if(Se(e)?(t=e.substring(0,e.indexOf("-")),r=e.substring(e.indexOf("-")+1)):Ve(e)&&(t=e.substring(0,e.indexOf("+")),r=e.substring(e.indexOf("+")+1)),"string"!=typeof t||"string"!=typeof r)return null;var i=t.split(".").length-1;if(i>2)return me.warn(O.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;var n=t.split(".");if(n.length!=i+1)return me.warn(O.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;for(var a=0,o=n;a<o.length;a++){if(!Le(o[a]))return me.warn(O.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null}return r&&n.push(r),n}var Ce="CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR",Pe=t(),Fe=["exact","exists","gt","ge","lt","le","substring","semver_eq","semver_lt","semver_le","semver_gt","semver_ge"],be={};function Me(e){return"string"==typeof e||"boolean"==typeof e||G.isNumber(e)}function ke(e,t){var r=e.value,i=typeof r,n=e.name,a=t[n],o=typeof a;return!Me(r)||G.isNumber(r)&&!G.isSafeInteger(r)?(Pe.warn(O.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null):null===a?(Pe.debug(O.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),n),null):Me(a)&&i===o?G.isNumber(a)&&!G.isSafeInteger(a)?(Pe.warn(O.OUT_OF_BOUNDS,Ce,JSON.stringify(e),n),null):r===a:(Pe.warn(O.UNEXPECTED_TYPE,Ce,JSON.stringify(e),o,n),null)}function Be(e,t){var r=e.name,i=t[r],n=typeof i,a=e.value;return null!==a&&G.isSafeInteger(a)?null===i?(Pe.debug(O.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),!1):G.isNumber(i)?!!G.isSafeInteger(i)||(Pe.warn(O.OUT_OF_BOUNDS,Ce,JSON.stringify(e),r),!1):(Pe.warn(O.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),!1):(Pe.warn(O.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),!1)}function xe(e,t){var r=e.name,i=t[r],n=typeof i,a=e.value;return"string"!=typeof a?(Pe.warn(O.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null):null===i?(Pe.debug(O.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),null):"string"!=typeof i?(Pe.warn(O.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),null):function(e,t){var r=De(t),i=De(e);if(!r||!i)return null;for(var n=r.length,a=0;a<i.length;a++){if(n<=a)return Se(e)||Ve(e)?1:-1;if(Le(r[a])){var o=parseInt(r[a]),s=parseInt(i[a]);if(o>s)return 1;if(o<s)return-1}else{if(r[a]<i[a])return Se(e)&&!Se(t)?1:-1;if(r[a]>i[a])return!Se(e)&&Se(t)?-1:1}}return Se(t)&&!Se(e)?-1:0}(a,i)}be.exact=ke,be.exists=function(e,t){var r=t[e.name];return null!=r},be.gt=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r>i},be.ge=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r>=i},be.lt=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r<i},be.le=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r<=i},be.substring=function(e,t){var r=e.name,i=t[e.name],n=typeof i,a=e.value;if("string"!=typeof a)return Pe.warn(O.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null;if(null===i)return Pe.debug(O.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),null;if("string"!=typeof i)return Pe.warn(O.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),null;return-1!==i.indexOf(a)},be.semver_eq=function(e,t){var r=xe(e,t);if(null===r)return null;return 0===r},be.semver_gt=function(e,t){var r=xe(e,t);if(null===r)return null;return r>0},be.semver_ge=function(e,t){var r=xe(e,t);if(null===r)return null;return r>=0},be.semver_lt=function(e,t){var r=xe(e,t);if(null===r)return null;return r<0},be.semver_le=function(e,t){var r=xe(e,t);if(null===r)return null;return r<=0};var Ke=Object.freeze({__proto__:null,evaluate:function(e,t){var r=e.match;if(void 0!==r&&-1===Fe.indexOf(r))return Pe.warn(O.UNKNOWN_MATCH_TYPE,Ce,JSON.stringify(e)),null;var i=e.name;return t.hasOwnProperty(i)||"exists"==r?(r&&be[r]||ke)(e,t):(Pe.debug(O.MISSING_ATTRIBUTE_VALUE,Ce,JSON.stringify(e),i),null)}}),Ge=t();function we(e){this.typeToEvaluatorMap=G.assign({},e,{custom_attribute:Ke})}function je(e){return"string"==typeof e&&""!==e}we.prototype.evaluate=function(e,t,r){if(!e||0===e.length)return!0;r||(r={});var i=function(e){var i=t[e];if(i){Ge.log(N.DEBUG,E(O.EVALUATING_AUDIENCE,"AUDIENCE_EVALUATOR",e,JSON.stringify(i.conditions)));var n=Ue(i.conditions,this.evaluateConditionWithUserAttributes.bind(this,r)),a=null===n?"UNKNOWN":n.toString().toUpperCase();return Ge.log(N.DEBUG,E(O.AUDIENCE_EVALUATION_RESULT,"AUDIENCE_EVALUATOR",e,a)),n}return null}.bind(this);return Ue(e,i)||!1},we.prototype.evaluateConditionWithUserAttributes=function(e,t){var r=this.typeToEvaluatorMap[t.type];if(!r)return Ge.log(N.WARNING,E(O.UNKNOWN_CONDITION_TYPE,"AUDIENCE_EVALUATOR",JSON.stringify(t))),null;try{return r.evaluate(t,e,Ge)}catch(e){Ge.log(N.ERROR,E(R.CONDITION_EVALUATOR_ERROR,"AUDIENCE_EVALUATOR",t.type,e.message))}return null};var Ye="DECISION_SERVICE",He=R,Xe=N,Je=O,ze=U,Ze=m;function We(e){this.audienceEvaluator=new we(e.UNSTABLE_conditionEvaluators),this.forcedVariationMap={},this.logger=e.logger,this.userProfileService=e.userProfileService||null}We.prototype.getVariation=function(e,t,r,i){var n=this._getBucketingId(r,i);if(!this.__checkIfExperimentIsActive(e,t))return null;var a=e.experimentKeyMap[t],o=this.getForcedVariation(e,t,r);if(o)return o;var s=this.__getWhitelistedVariation(a,r);if(s)return s.key;var u=this.__resolveExperimentBucketMap(r,i);if(s=this.__getStoredVariation(e,a,r,u))return this.logger.log(Xe.INFO,E(Je.RETURNING_STORED_VARIATION,Ye,s.key,t,r)),s.key;if(!this.__checkIfUserIsInAudience(e,t,Ze.EXPERIMENT,r,i,"")){var l=E(Je.USER_NOT_IN_EXPERIMENT,Ye,r,t);return this.logger.log(Xe.INFO,l),null}var _=this.__buildBucketerParams(e,t,n,r),I=Ae.bucket(_);if(!(s=e.variationIdMap[I])){var g=E(Je.USER_HAS_NO_VARIATION,Ye,r,t);return this.logger.log(Xe.DEBUG,g),null}var c=E(Je.USER_HAS_VARIATION,Ye,r,s.key,t);return this.logger.log(Xe.INFO,c),this.__saveUserProfile(a,s,r,u),s.key},We.prototype.__resolveExperimentBucketMap=function(e,t){t=t||{};var r=this.__getUserProfile(e)||{},i=t[h.STICKY_BUCKETING_KEY];return G.assign({},r.experiment_bucket_map,i)},We.prototype.__checkIfExperimentIsActive=function(e,t){if(!oe(e,t)){var r=E(Je.EXPERIMENT_NOT_RUNNING,Ye,t);return this.logger.log(Xe.INFO,r),!1}return!0},We.prototype.__getWhitelistedVariation=function(e,t){if(e.forcedVariations&&e.forcedVariations.hasOwnProperty(t)){var r=e.forcedVariations[t];if(e.variationKeyMap.hasOwnProperty(r)){var i=E(Je.USER_FORCED_IN_VARIATION,Ye,t,r);return this.logger.log(Xe.INFO,i),e.variationKeyMap[r]}var n=E(Je.FORCED_BUCKETING_FAILED,Ye,r,t);return this.logger.log(Xe.ERROR,n),null}return null},We.prototype.__checkIfUserIsInAudience=function(e,t,r,i,n,a){var o=se(e,t),s=ge(e);this.logger.log(Xe.DEBUG,E(Je.EVALUATING_AUDIENCES_COMBINED,Ye,r,a||t,JSON.stringify(o)));var u=this.audienceEvaluator.evaluate(o,s,n);return this.logger.log(Xe.INFO,E(Je.AUDIENCE_EVALUATION_RESULT_COMBINED,Ye,r,a||t,u.toString().toUpperCase())),u},We.prototype.__buildBucketerParams=function(e,t,r,i){var n={};return n.experimentKey=t,n.experimentId=re(e,t),n.userId=i,n.trafficAllocationConfig=_e(e,t),n.experimentKeyMap=e.experimentKeyMap,n.groupIdMap=e.groupIdMap,n.variationIdMap=e.variationIdMap,n.logger=this.logger,n.bucketingId=r,n},We.prototype.__getStoredVariation=function(e,t,r,i){if(i.hasOwnProperty(t.id)){var n=i[t.id],a=n.variation_id;if(e.variationIdMap.hasOwnProperty(a))return e.variationIdMap[n.variation_id];this.logger.log(Xe.INFO,E(Je.SAVED_VARIATION_NOT_FOUND,Ye,r,a,t.key))}return null},We.prototype.__getUserProfile=function(e){var t={user_id:e,experiment_bucket_map:{}};if(!this.userProfileService)return t;try{return this.userProfileService.lookup(e)}catch(t){this.logger.log(Xe.ERROR,E(He.USER_PROFILE_LOOKUP_ERROR,Ye,e,t.message))}},We.prototype.__saveUserProfile=function(e,t,r,i){if(this.userProfileService)try{i[e.id]={variation_id:t.id},this.userProfileService.save({user_id:r,experiment_bucket_map:i}),this.logger.log(Xe.INFO,E(Je.SAVED_VARIATION,Ye,t.key,e.key,r))}catch(e){this.logger.log(Xe.ERROR,E(He.USER_PROFILE_SAVE_ERROR,Ye,r,e.message))}},We.prototype.getVariationForFeature=function(e,t,r,i){var n=this._getVariationForFeatureExperiment(e,t,r,i);if(null!==n.variation)return n;var a=this._getVariationForRollout(e,t,r,i);return null!==a.variation?(this.logger.log(Xe.DEBUG,E(Je.USER_IN_ROLLOUT,Ye,r,t.key)),a):(this.logger.log(Xe.DEBUG,E(Je.USER_NOT_IN_ROLLOUT,Ye,r,t.key)),a)},We.prototype._getVariationForFeatureExperiment=function(e,t,r,i){var n=null,a=null;if(t.hasOwnProperty("groupId")){var o=e.groupIdMap[t.groupId];o&&(n=this._getExperimentInGroup(e,o,r))&&-1!==t.experimentIds.indexOf(n.id)&&(a=this.getVariation(e,n.key,r,i))}else t.experimentIds.length>0?(n=Ie(e,t.experimentIds[0],this.logger))&&(a=this.getVariation(e,n.key,r,i)):this.logger.log(Xe.DEBUG,E(Je.FEATURE_HAS_NO_EXPERIMENTS,Ye,t.key));var s=null;return null!==a&&null!==n&&(s=n.variationKeyMap[a]),{experiment:n,variation:s,decisionSource:ze.FEATURE_TEST}},We.prototype._getExperimentInGroup=function(e,t,r){var i=Ae.bucketUserIntoExperiment(t,r,r,this.logger);if(i){this.logger.log(Xe.INFO,E(Je.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,Ye,r,i,t.id));var n=Ie(e,i,this.logger);if(n)return n}return this.logger.log(Xe.INFO,E(Je.USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP,Ye,r,t.id)),null},We.prototype._getVariationForRollout=function(e,t,r,i){if(!t.rolloutId)return this.logger.log(Xe.DEBUG,E(Je.NO_ROLLOUT_EXISTS,Ye,t.key)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};var n=e.rolloutIdMap[t.rolloutId];if(!n)return this.logger.log(Xe.ERROR,E(He.INVALID_ROLLOUT_ID,Ye,t.rolloutId,t.key)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};if(0===n.experiments.length)return this.logger.log(Xe.ERROR,E(Je.ROLLOUT_HAS_NO_EXPERIMENTS,Ye,t.rolloutId)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};var a,o,s,u,l,_,I=this._getBucketingId(r,i),g=n.experiments.length-1;for(a=0;a<g;a++){if(o=e.experimentKeyMap[n.experiments[a].key],_=a+1,this.__checkIfUserIsInAudience(e,o.key,Ze.RULE,r,i,_)){if(this.logger.log(Xe.DEBUG,E(Je.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Ye,r,_)),s=this.__buildBucketerParams(e,o.key,I,r),u=Ae.bucket(s),l=e.variationIdMap[u])return this.logger.log(Xe.DEBUG,E(Je.USER_BUCKETED_INTO_TARGETING_RULE,Ye,r,_)),{experiment:o,variation:l,decisionSource:ze.ROLLOUT};this.logger.log(Xe.DEBUG,E(Je.USER_NOT_BUCKETED_INTO_TARGETING_RULE,Ye,r,_));break}this.logger.log(Xe.DEBUG,E(Je.USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE,Ye,r,_))}var c=e.experimentKeyMap[n.experiments[g].key];if(this.__checkIfUserIsInAudience(e,c.key,Ze.RULE,r,i,"Everyone Else")){if(this.logger.log(Xe.DEBUG,E(Je.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Ye,r,"Everyone Else")),s=this.__buildBucketerParams(e,c.key,I,r),u=Ae.bucket(s),l=e.variationIdMap[u])return this.logger.log(Xe.DEBUG,E(Je.USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Ye,r)),{experiment:c,variation:l,decisionSource:ze.ROLLOUT};this.logger.log(Xe.DEBUG,E(Je.USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Ye,r))}return{experiment:null,variation:null,decisionSource:ze.ROLLOUT}},We.prototype._getBucketingId=function(e,t){var r=e;return null!=t&&"object"==typeof t&&t.hasOwnProperty(h.BUCKETING_ID)&&("string"==typeof t[h.BUCKETING_ID]?(r=t[h.BUCKETING_ID],this.logger.log(Xe.DEBUG,E(Je.VALID_BUCKETING_ID,Ye,r))):this.logger.log(Xe.WARNING,E(Je.BUCKETING_ID_NOT_STRING,Ye))),r},We.prototype.removeForcedVariation=function(e,t,r){if(!e)throw new Error(E(He.INVALID_USER_ID,Ye));if(!this.forcedVariationMap.hasOwnProperty(e))throw new Error(E(He.USER_NOT_IN_FORCED_VARIATION,Ye,e));delete this.forcedVariationMap[e][t],this.logger.log(Xe.DEBUG,E(Je.VARIATION_REMOVED_FOR_USER,Ye,r,e))},We.prototype.__setInForcedVariationMap=function(e,t,r){this.forcedVariationMap.hasOwnProperty(e)||(this.forcedVariationMap[e]={}),this.forcedVariationMap[e][t]=r,this.logger.log(Xe.DEBUG,E(Je.USER_MAPPED_TO_FORCED_VARIATION,Ye,r,t,e))},We.prototype.getForcedVariation=function(e,t,r){var i,n=this.forcedVariationMap[r];if(!n)return this.logger.log(Xe.DEBUG,E(Je.USER_HAS_NO_FORCED_VARIATION,Ye,r)),null;try{var a=Ee(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(Xe.ERROR,E(He.IMPROPERLY_FORMATTED_EXPERIMENT,Ye,t)),null;i=a.id}catch(e){return this.logger.log(Xe.ERROR,e.message),null}var o=n[i];if(!o)return this.logger.log(Xe.DEBUG,E(Je.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Ye,t,r)),null;var s=ue(e,o);return s?this.logger.log(Xe.DEBUG,E(Je.USER_HAS_FORCED_VARIATION,Ye,s,t,r)):this.logger.log(Xe.DEBUG,E(Je.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Ye,t,r)),s},We.prototype.setForcedVariation=function(e,t,r,i){if(null!=i&&!je(i))return this.logger.log(Xe.ERROR,E(He.INVALID_VARIATION_KEY,Ye)),!1;var n;try{var a=Ee(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(Xe.ERROR,E(He.IMPROPERLY_FORMATTED_EXPERIMENT,Ye,t)),!1;n=a.id}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}if(null==i)try{return this.removeForcedVariation(r,n,t,this.logger),!0}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}var o=le(e,t,i);if(!o)return this.logger.log(Xe.ERROR,E(He.NO_VARIATION_FOR_EXPERIMENT_KEY,Ye,i,t)),!1;try{return this.__setInForcedVariationMap(r,n,o),!0}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}};var $e=T.REVENUE,qe=T.VALUE;function Qe(e,t){if(e.hasOwnProperty($e)){var r=e[$e],i=void 0;return"string"==typeof r?(i=parseInt(r),isNaN(i)?(t.log(N.INFO,E(O.FAILED_TO_PARSE_REVENUE,"EVENT_TAG_UTILS",r)),null):(t.log(N.INFO,E(O.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",i)),i)):"number"==typeof r?(i=r,t.log(N.INFO,E(O.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",i)),i):null}return null}function et(e,t){if(e.hasOwnProperty(qe)){var r=e[qe],i=void 0;return"string"==typeof r?(i=parseFloat(r),isNaN(i)?(t.log(N.INFO,E(O.FAILED_TO_PARSE_VALUE,"EVENT_TAG_UTILS",r)),null):(t.log(N.INFO,E(O.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",i)),i)):"number"==typeof r?(i=r,t.log(N.INFO,E(O.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",i)),i):null}return null}function tt(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||G.isNumber(t)&&G.isSafeInteger(t))}var rt="https://logx.optimizely.com/v1/events";function it(e){var t=e.attributes,r=e.configObj,i=r.anonymizeIP,n=r.botFiltering;null==i&&(i=!1);var a={snapshots:[],visitor_id:e.userId,attributes:[]},o={account_id:r.accountId,project_id:r.projectId,visitors:[a],revision:r.revision,client_name:e.clientEngine,client_version:e.clientVersion,anonymize_ip:i,enrich_decisions:!0};return Object.keys(t||{}).forEach((function(r){if(tt(r,t[r])){var i=ne(e.configObj,r,e.logger);i&&o.visitors[0].attributes.push({entity_id:i,key:r,type:"custom",value:t[r]})}})),"boolean"==typeof n&&o.visitors[0].attributes.push({entity_id:h.BOT_FILTERING,key:h.BOT_FILTERING,type:"custom",value:n}),o}var nt=function(e){var t={httpVerb:"POST"},r=it(e);t.url=rt;var i=function(e,t,r,i,n,a){var o=null;null!==t&&(o=ie(e,t));var s=ue(e,r);return null===s&&(s=""),{decisions:[{campaign_id:o,experiment_id:t,variation_id:r,metadata:{flag_key:a,rule_key:i,rule_type:n,variation_key:s}}],events:[{entity_id:o,timestamp:G.currentTimestamp(),key:"campaign_activated",uuid:G.uuid()}]}}(e.configObj,e.experimentId,e.variationId,e.ruleKey,e.ruleType,e.flagKey);return r.visitors[0].snapshots.push(i),t.params=r,t},at=function(e){var t={httpVerb:"POST"},r=it(e);t.url=rt;var i=function(e,t,r,i){var n={events:[]},a={entity_id:ae(e,t),timestamp:G.currentTimestamp(),uuid:G.uuid(),key:t};if(r){var o=Qe(r,i);null!==o&&(a[T.REVENUE]=o);var s=et(r,i);null!==s&&(a[T.VALUE]=s),a.tags=r}return n.events.push(a),n}(e.configObj,e.eventKey,e.eventTags,e.logger);return r.visitors[0].snapshots=[i],t.params=r,t};function ot(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function st(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function ut(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}var lt=t("EVENT_BUILDER");function Et(e,t){var r=[];return Object.keys(t||{}).forEach((function(i){if(tt(i,t[i])){var n=ne(e,i,lt);n&&r.push({entityId:n,key:i,value:t[i]})}})),r}var _t={createEventProcessor:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return new(u.bind.apply(u,p([void 0],e)))},LocalStoragePendingEventsDispatcher:s};var It="USER_PROFILE_SERVICE_VALIDATOR";var gt=function(){function e(e){var t=this,r=e.clientEngine;-1===v.indexOf(r)&&(e.logger.log(N.INFO,E(O.INVALID_CLIENT_ENGINE,"OPTIMIZELY",r)),r="node-sdk"),this.clientEngine=r,this.clientVersion=e.clientVersion||"4.4.0",this.errorHandler=e.errorHandler,this.eventDispatcher=e.eventDispatcher,this.isOptimizelyConfigValid=e.isValidInstance,this.logger=e.logger,this.projectConfigManager=function(e){return new Te(e)}({datafile:e.datafile,datafileOptions:e.datafileOptions,jsonSchemaValidator:e.jsonSchemaValidator,sdkKey:e.sdkKey}),this.disposeOnUpdate=this.projectConfigManager.onUpdate((function(e){t.logger.log(N.INFO,E(O.UPDATED_OPTIMIZELY_CONFIG,"OPTIMIZELY",e.revision,e.projectId)),t.notificationCenter.sendNotifications(A.OPTIMIZELY_CONFIG_UPDATE)}));var i=this.projectConfigManager.onReady(),n=null;if(e.userProfileService)try{(function(e){if("object"==typeof e&&null!==e){if("function"!=typeof e.lookup)throw new Error(E(R.INVALID_USER_PROFILE_SERVICE,It,"Missing function 'lookup'"));if("function"!=typeof e.save)throw new Error(E(R.INVALID_USER_PROFILE_SERVICE,It,"Missing function 'save'"));return!0}throw new Error(E(R.INVALID_USER_PROFILE_SERVICE,It))})(e.userProfileService)&&(n=e.userProfileService,this.logger.log(N.INFO,E(O.VALID_USER_PROFILE_SERVICE,"OPTIMIZELY")))}catch(e){this.logger.log(N.WARNING,e.message)}this.decisionService=new We({userProfileService:n,logger:this.logger,UNSTABLE_conditionEvaluators:e.UNSTABLE_conditionEvaluators}),this.notificationCenter=function(e){return new he(e)}({logger:this.logger,errorHandler:this.errorHandler});var a={dispatcher:this.eventDispatcher,flushInterval:e.eventFlushInterval,batchSize:e.eventBatchSize,maxQueueSize:e.eventMaxQueueSize,notificationCenter:this.notificationCenter};this.eventProcessor=_t.createEventProcessor(a);var o=this.eventProcessor.start();this.readyPromise=Promise.all([i,o]).then((function(e){return e[0]})),this.readyTimeouts={},this.nextReadyTimeoutId=0}return e.prototype.isValidInstance=function(){return this.isOptimizelyConfigValid&&!!this.projectConfigManager.getConfig()},e.prototype.activate=function(e,t,r){try{if(!this.isValidInstance())return this.logger.log(N.ERROR,E(O.INVALID_OBJECT,"OPTIMIZELY","activate")),null;if(!this.validateInputs({experiment_key:e,user_id:t},r))return this.notActivatingExperiment(e,t);var i=this.projectConfigManager.getConfig();if(!i)return null;try{var n=this.getVariation(e,t,r);if(null===n)return this.notActivatingExperiment(e,t);if(!X(i,e)){var a=E(O.SHOULD_NOT_DISPATCH_ACTIVATE,"OPTIMIZELY",e);return this.logger.log(N.DEBUG,a),n}var o=z(i,e),s={experiment:o,variation:o.variationKeyMap[n],decisionSource:U.EXPERIMENT};return this.sendImpressionEvent(s,"",t,r),n}catch(r){this.logger.log(N.ERROR,r.message);var u=E(O.NOT_ACTIVATING_USER,"OPTIMIZELY",t,e);return this.logger.log(N.INFO,u),this.errorHandler.handleError(r),null}}catch(e){return this.logger.log(N.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.sendImpressionEvent=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var a=function(e){var t=e.configObj,r=e.decisionObj,i=e.userId,n=e.flagKey,a=e.userAttributes,o=e.clientEngine,s=e.clientVersion,u=r.decisionSource,l=ot(r),E=st(r),_=null,I=null;""!==l&&""!==E&&(I=le(t,l,E)),""!==l&&(_=re(t,l));var g=null;return null!==_&&(g=ie(t,_)),{type:"impression",timestamp:G.currentTimestamp(),uuid:G.uuid(),user:{id:i,attributes:Et(t,a)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:o,clientVersion:s,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},layer:{id:g},experiment:{id:_,key:l},variation:{id:I,key:E},ruleKey:l,flagKey:n,ruleType:u}}({decisionObj:e,flagKey:t,userId:r,userAttributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n});this.eventProcessor.process(a),this.emitNotificationCenterActivate(e,t,r,i)}},e.prototype.emitNotificationCenterActivate=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var a=e.decisionSource,o=ot(e),s=st(e),u=null,l=null;""!==o&&""!==s&&(l=J(n,o,s),u=Y(n,o));var E,_={attributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n,experimentId:u,ruleKey:o,flagKey:t,ruleType:a,userId:r,variationId:l,logger:this.logger},I=nt(_),g=n.experimentKeyMap[o];g&&g.variationKeyMap&&""!==s&&(E=g.variationKeyMap[s]),this.notificationCenter.sendNotifications(A.ACTIVATE,{experiment:g,userId:r,attributes:i,variation:E,logEvent:I})}},e.prototype.track=function(e,t,r,i){try{if(!this.isValidInstance())return void this.logger.log(N.ERROR,E(O.INVALID_OBJECT,"OPTIMIZELY","track"));if(!this.validateInputs({user_id:t,event_key:e},r,i))return;var n=this.projectConfigManager.getConfig();if(!n)return;if(!Q(n,e))return this.logger.log(N.WARNING,E(O.EVENT_KEY_NOT_FOUND,"OPTIMIZELY",e)),void this.logger.log(N.WARNING,E(O.NOT_TRACKING_USER,"OPTIMIZELY",t));var a=function(e){var t=e.configObj,r=e.userId,i=e.userAttributes,n=e.clientEngine,a=e.clientVersion,o=e.eventKey,s=e.eventTags,u=ae(t,o),l=null,E=null;return s&&(l=Qe(s,lt),E=et(s,lt)),{type:"conversion",timestamp:G.currentTimestamp(),uuid:G.uuid(),user:{id:r,attributes:Et(t,i)},context:{accountId:t.