@pendo/agent 2.274.0 → 2.275.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dom.esm.js +4 -1
- package/dist/pendo.module.js +625 -295
- package/dist/pendo.module.min.js +1 -1
- package/package.json +1 -1
- package/setup.js +3 -0
package/dist/pendo.module.js
CHANGED
|
@@ -3002,6 +3002,7 @@ var ConfigReader = (function () {
|
|
|
3002
3002
|
*/
|
|
3003
3003
|
addOption('observeShadowRoots', [SNIPPET_SRC, PENDO_CONFIG_SRC], false);
|
|
3004
3004
|
addOption('pendoCore', [PENDO_CONFIG_SRC], true);
|
|
3005
|
+
addOption('pendoGlobalKey', [PENDO_CONFIG_SRC]);
|
|
3005
3006
|
/**
|
|
3006
3007
|
* By default, if there are multiple frames on the page that have the Agent installed, they will communicate
|
|
3007
3008
|
* using `window.postMessage`. If set to `true` the Agent will instead use the browser's Broadcast Channel
|
|
@@ -3514,6 +3515,8 @@ var ConfigReader = (function () {
|
|
|
3514
3515
|
addOption('forceParentDesigner', [SNIPPET_SRC]); // Only works in non-prod environments for automated testing
|
|
3515
3516
|
// Embedded Guides
|
|
3516
3517
|
addOption('enableAllEmbeddedGuideEvents', [PENDO_CONFIG_SRC], false);
|
|
3518
|
+
// Form Validation
|
|
3519
|
+
addOption('formValidation', [PENDO_CONFIG_SRC], false);
|
|
3517
3520
|
}
|
|
3518
3521
|
initializeOptions();
|
|
3519
3522
|
var sourceGetters = {};
|
|
@@ -3888,8 +3891,8 @@ var SERVER = '';
|
|
|
3888
3891
|
var ASSET_HOST = '';
|
|
3889
3892
|
var ASSET_PATH = '';
|
|
3890
3893
|
var DESIGNER_ENV = '';
|
|
3891
|
-
var VERSION = '2.
|
|
3892
|
-
var PACKAGE_VERSION = '2.
|
|
3894
|
+
var VERSION = '2.275.1_';
|
|
3895
|
+
var PACKAGE_VERSION = '2.275.1';
|
|
3893
3896
|
var LOADER = 'xhr';
|
|
3894
3897
|
/* eslint-enable agent-eslint-rules/no-gulp-env-references */
|
|
3895
3898
|
/**
|
|
@@ -13492,6 +13495,9 @@ var isWalkthrough = function (guide) {
|
|
|
13492
13495
|
guide.isMultiStep &&
|
|
13493
13496
|
!(guide.attributes && guide.attributes.type === 'group');
|
|
13494
13497
|
};
|
|
13498
|
+
var isForm = function (guide) {
|
|
13499
|
+
return !!(_.get(guide, 'attributes.form'));
|
|
13500
|
+
};
|
|
13495
13501
|
function isPreviewing() {
|
|
13496
13502
|
/* global selmo */
|
|
13497
13503
|
return (typeof selmo !== 'undefined' && !!selmo.isPreviewing);
|
|
@@ -13700,10 +13706,10 @@ var PublicEvents = (function () {
|
|
|
13700
13706
|
return events;
|
|
13701
13707
|
})();
|
|
13702
13708
|
|
|
13703
|
-
function postLoadGuideJs(url, payload, callback) {
|
|
13704
|
-
return ajax.postJSON(url.replace(/\/guides\.js\//, '/guides.json/'), payload)
|
|
13709
|
+
function postLoadGuideJs(url, payload, pendo, callback) {
|
|
13710
|
+
return pendo.ajax.postJSON(url.replace(/\/guides\.js\//, '/guides.json/'), payload)
|
|
13705
13711
|
.then(function (response) {
|
|
13706
|
-
pendo
|
|
13712
|
+
pendo.guidesPayload(response.data);
|
|
13707
13713
|
callback();
|
|
13708
13714
|
});
|
|
13709
13715
|
}
|
|
@@ -13716,10 +13722,10 @@ var XHRGuideLoader = {
|
|
|
13716
13722
|
* @param {Function} done called with no arguments
|
|
13717
13723
|
* @returns {ayepromise.Promise<undefined>}
|
|
13718
13724
|
*/
|
|
13719
|
-
'load': function (url, done) {
|
|
13720
|
-
return ajax.get(url)
|
|
13725
|
+
'load': function (url, pendo, done) {
|
|
13726
|
+
return pendo.ajax.get(url)
|
|
13721
13727
|
.then(function (response) {
|
|
13722
|
-
pendo
|
|
13728
|
+
pendo.guidesPayload(response.data);
|
|
13723
13729
|
done();
|
|
13724
13730
|
});
|
|
13725
13731
|
},
|
|
@@ -21354,7 +21360,7 @@ function setPreviewState(state) {
|
|
|
21354
21360
|
function createPreviewBar() {
|
|
21355
21361
|
var frame = document.createElement('iframe');
|
|
21356
21362
|
frame.id = pendoPreview$1;
|
|
21357
|
-
var previewModeStartingHeight = '70px';
|
|
21363
|
+
var previewModeStartingHeight = '70px !important';
|
|
21358
21364
|
setStyles(frame, {
|
|
21359
21365
|
'border': 'none',
|
|
21360
21366
|
'display': 'block !important',
|
|
@@ -21365,7 +21371,7 @@ function createPreviewBar() {
|
|
|
21365
21371
|
'right': 0,
|
|
21366
21372
|
'top': 0,
|
|
21367
21373
|
'visibility': 'visible !important',
|
|
21368
|
-
'width': '100%',
|
|
21374
|
+
'width': '100% !important',
|
|
21369
21375
|
'z-index': 400000
|
|
21370
21376
|
});
|
|
21371
21377
|
frame.onload = function () {
|
|
@@ -21856,7 +21862,7 @@ function previewGuideRequest(config, id) {
|
|
|
21856
21862
|
}
|
|
21857
21863
|
return guide;
|
|
21858
21864
|
}).then(function (guide) {
|
|
21859
|
-
if (guide.attributes && guide.attributes.isWatermark) {
|
|
21865
|
+
if (guide && guide.attributes && guide.attributes.isWatermark) {
|
|
21860
21866
|
guidesArray.push(guide);
|
|
21861
21867
|
}
|
|
21862
21868
|
// set pendo.guides at the very end to avoid mutation
|
|
@@ -22199,6 +22205,9 @@ var DesignerV2 = (function () {
|
|
|
22199
22205
|
if (options.selectionOnly) {
|
|
22200
22206
|
scriptTagAttributes['selection-only'] = true;
|
|
22201
22207
|
}
|
|
22208
|
+
if (ConfigReader.get('pendoGlobalKey')) {
|
|
22209
|
+
scriptTagAttributes['data-pendo-global-key'] = ConfigReader.get('pendoGlobalKey');
|
|
22210
|
+
}
|
|
22202
22211
|
var designerAgentPluginsLoader = ConfigReader.get('designerAgentPluginsLoader');
|
|
22203
22212
|
var forceNativeDesignerInDoubleAgentScenarios = window.__pendoExtensions && options.forceNativeDesigner;
|
|
22204
22213
|
var nativeAgentOnly = !window.__pendoExtensions && !_.isFunction(designerAgentPluginsLoader);
|
|
@@ -24660,10 +24669,10 @@ var loadGuideJs = function (apiKey, params) {
|
|
|
24660
24669
|
delete queryString.jzb;
|
|
24661
24670
|
url = buildBaseDataUrl('guide.json', apiKey, queryString);
|
|
24662
24671
|
var payload = _.extend({ 'events': jzb }, jwtOptions);
|
|
24663
|
-
loadingPromise = guideLoaderImpl.post(url, payload, _.noop);
|
|
24672
|
+
loadingPromise = guideLoaderImpl.post(url, payload, pendo$1, _.noop);
|
|
24664
24673
|
}
|
|
24665
24674
|
else {
|
|
24666
|
-
loadingPromise = guideLoaderImpl.load(url, _.noop);
|
|
24675
|
+
loadingPromise = guideLoaderImpl.load(url, pendo$1, _.noop);
|
|
24667
24676
|
}
|
|
24668
24677
|
return q.all([
|
|
24669
24678
|
// eslint-disable-next-line dot-notation
|
|
@@ -25020,6 +25029,8 @@ function hasLegacyGuides(guides, pendo) {
|
|
|
25020
25029
|
if (pendo && pendo.designer)
|
|
25021
25030
|
return true;
|
|
25022
25031
|
return _.any(guides, function (guide) {
|
|
25032
|
+
if (isForm(guide))
|
|
25033
|
+
return false;
|
|
25023
25034
|
return _.any(guide.steps, function (step) {
|
|
25024
25035
|
return !(step.domUrl || step.domJsonpUrl || step.domJson);
|
|
25025
25036
|
});
|
|
@@ -26716,12 +26727,17 @@ var initialize = makeSafe(function (options) {
|
|
|
26716
26727
|
function announceFrameToDesignerPlugin() {
|
|
26717
26728
|
if (!window.parent || !window.parent.postMessage || typeof window.parent.postMessage != 'function')
|
|
26718
26729
|
return;
|
|
26730
|
+
var targetOrigin = SingletonMessageHandler.targetOrigin();
|
|
26731
|
+
if (!targetOrigin) {
|
|
26732
|
+
log.warn('Unable to announce frame to designer plugin, targetOrigin is not set. Check if broadcastChannel is enabled and cross origin frames are allowed.');
|
|
26733
|
+
return;
|
|
26734
|
+
}
|
|
26719
26735
|
window.parent.postMessage({
|
|
26720
26736
|
'type': 'announce-frame-initialized',
|
|
26721
26737
|
'destination': 'pendo-designer-agent',
|
|
26722
26738
|
'source': 'pendo-designer-agent',
|
|
26723
26739
|
'localStorageRouter': true
|
|
26724
|
-
},
|
|
26740
|
+
}, targetOrigin);
|
|
26725
26741
|
}
|
|
26726
26742
|
function isCallQueueEmpty(callQueue) {
|
|
26727
26743
|
return (!_.isArray(callQueue) || _.isEmpty(callQueue));
|
|
@@ -30557,7 +30573,6 @@ var CloneDetection = /** @class */ (function () {
|
|
|
30557
30573
|
this.name = 'CloneDetection';
|
|
30558
30574
|
}
|
|
30559
30575
|
CloneDetection.prototype.initialize = function () {
|
|
30560
|
-
var _this = this;
|
|
30561
30576
|
if (!_.isFunction(window.BroadcastChannel))
|
|
30562
30577
|
return;
|
|
30563
30578
|
/**
|
|
@@ -30573,32 +30588,39 @@ var CloneDetection = /** @class */ (function () {
|
|
|
30573
30588
|
this.tabId = EventTracer.getTabId();
|
|
30574
30589
|
this.id = randomString(16);
|
|
30575
30590
|
this.channel = new BroadcastChannel("pendo-clone-detection-".concat(pendo$1.apiKey));
|
|
30576
|
-
this.channel.onmessage
|
|
30577
|
-
var type = _.get(msg, 'data.type');
|
|
30578
|
-
var tabId = _.get(msg, 'data.tabId');
|
|
30579
|
-
var id = _.get(msg, 'data.id');
|
|
30580
|
-
if (tabId !== _this.tabId)
|
|
30581
|
-
return;
|
|
30582
|
-
switch (type) {
|
|
30583
|
-
case 'pendo-clone-test':
|
|
30584
|
-
if (id === _this.id)
|
|
30585
|
-
return;
|
|
30586
|
-
if (_this.isClonedSession(id)) {
|
|
30587
|
-
_this.sendMessage('pendo-change-tab-id', {
|
|
30588
|
-
tabId: tabId,
|
|
30589
|
-
id: id
|
|
30590
|
-
});
|
|
30591
|
-
}
|
|
30592
|
-
break;
|
|
30593
|
-
case 'pendo-change-tab-id':
|
|
30594
|
-
if (id !== _this.id)
|
|
30595
|
-
return;
|
|
30596
|
-
_this.clearClonedStorage();
|
|
30597
|
-
break;
|
|
30598
|
-
}
|
|
30599
|
-
};
|
|
30591
|
+
this.channel.addEventListener('message', _.bind(this.onmessage, this));
|
|
30600
30592
|
this.detectClonedSession(this.id);
|
|
30601
|
-
return this.teardown;
|
|
30593
|
+
return _.bind(this.teardown, this);
|
|
30594
|
+
};
|
|
30595
|
+
CloneDetection.prototype.teardown = function () {
|
|
30596
|
+
this.stopCloneDetectionTimer();
|
|
30597
|
+
this.channel.removeEventListener('message', this.onmessage);
|
|
30598
|
+
this.channel.close();
|
|
30599
|
+
this.channel = null;
|
|
30600
|
+
};
|
|
30601
|
+
CloneDetection.prototype.onmessage = function (msg) {
|
|
30602
|
+
var type = _.get(msg, 'data.type');
|
|
30603
|
+
var tabId = _.get(msg, 'data.tabId');
|
|
30604
|
+
var id = _.get(msg, 'data.id');
|
|
30605
|
+
if (tabId !== this.tabId)
|
|
30606
|
+
return;
|
|
30607
|
+
switch (type) {
|
|
30608
|
+
case 'pendo-clone-test':
|
|
30609
|
+
if (id === this.id)
|
|
30610
|
+
return;
|
|
30611
|
+
if (this.isClonedSession(id)) {
|
|
30612
|
+
this.sendMessage('pendo-change-tab-id', {
|
|
30613
|
+
tabId: tabId,
|
|
30614
|
+
id: id
|
|
30615
|
+
});
|
|
30616
|
+
}
|
|
30617
|
+
break;
|
|
30618
|
+
case 'pendo-change-tab-id':
|
|
30619
|
+
if (id !== this.id)
|
|
30620
|
+
return;
|
|
30621
|
+
this.clearClonedStorage();
|
|
30622
|
+
break;
|
|
30623
|
+
}
|
|
30602
30624
|
};
|
|
30603
30625
|
CloneDetection.prototype.detectClonedSession = function (cd) {
|
|
30604
30626
|
var cdToStore = pendoSessionStorage.getItem(SESSION_CLONE_DETECTION) || '';
|
|
@@ -31411,7 +31433,8 @@ var FramesModule = (function () {
|
|
|
31411
31433
|
'isFollower': function (state) {
|
|
31412
31434
|
return !!state.leaderId && state.leaderId !== state.frameId;
|
|
31413
31435
|
},
|
|
31414
|
-
'isTop': function (state) {
|
|
31436
|
+
'isTop': function (state, getters) {
|
|
31437
|
+
var window = getters.window();
|
|
31415
31438
|
return state.topId === state.frameId || window == window.top;
|
|
31416
31439
|
},
|
|
31417
31440
|
'frameVisibility': function (state) {
|
|
@@ -31529,6 +31552,9 @@ var FramesModule = (function () {
|
|
|
31529
31552
|
},
|
|
31530
31553
|
'getMyFrame': function (state) {
|
|
31531
31554
|
return state.frames[state.frameId];
|
|
31555
|
+
},
|
|
31556
|
+
'window': function () {
|
|
31557
|
+
return window;
|
|
31532
31558
|
}
|
|
31533
31559
|
};
|
|
31534
31560
|
return {
|
|
@@ -32927,6 +32953,9 @@ var DesignerConnect = (function () {
|
|
|
32927
32953
|
pluginAPI.Events.appUnloaded.off(unloadListener);
|
|
32928
32954
|
unloadListener = undefined;
|
|
32929
32955
|
}
|
|
32956
|
+
if (tempLaunchToken) {
|
|
32957
|
+
tempLaunchToken = undefined;
|
|
32958
|
+
}
|
|
32930
32959
|
}
|
|
32931
32960
|
function onConnectMessage(data, msg) {
|
|
32932
32961
|
if (globalPendo.isSendingEvents()) {
|
|
@@ -35080,7 +35109,7 @@ var P1GuidePlugin = (function () {
|
|
|
35080
35109
|
// Adds pendo credits to the guide unless disabled
|
|
35081
35110
|
function Credits() {
|
|
35082
35111
|
var step = this;
|
|
35083
|
-
if (!step.hideCredits && !step.domJson && !step.domJsonpUrl) {
|
|
35112
|
+
if (!step.hideCredits && !step.domJson && !step.domJsonpUrl && !isForm(step.guide)) {
|
|
35084
35113
|
step.after('render', function () {
|
|
35085
35114
|
_addCredits(step.guideElement[0]);
|
|
35086
35115
|
});
|
|
@@ -35128,7 +35157,7 @@ var Branding = (function () {
|
|
|
35128
35157
|
link.href = 'https://www.pendo.io/pendo-free/nps?utm_source=pendo_app&utm_medium=branded-nps&utm_campaign=free-branded-nps';
|
|
35129
35158
|
link.target = '_blank';
|
|
35130
35159
|
var img = document.createElement('img');
|
|
35131
|
-
img.setAttribute('src',
|
|
35160
|
+
img.setAttribute('src', pluginApi.getAssetUrl('img/nps-branding.png'));
|
|
35132
35161
|
link.appendChild(img);
|
|
35133
35162
|
link.style.display = 'inline-block';
|
|
35134
35163
|
var div = document.createElement('div');
|
|
@@ -36900,7 +36929,10 @@ var WebAnalytics = /** @class */ (function () {
|
|
|
36900
36929
|
var referrerValue = calculateReferrerValue({ referrer: referrer, currentHost: currentHost });
|
|
36901
36930
|
// Check if this is a self-referral.
|
|
36902
36931
|
if (referrerValue !== 'self') {
|
|
36903
|
-
var
|
|
36932
|
+
var parsedUrl = this.api.util.parseUrl(url);
|
|
36933
|
+
if (!parsedUrl)
|
|
36934
|
+
return {};
|
|
36935
|
+
var query = parsedUrl.query;
|
|
36904
36936
|
// It is not a self referral, therefore we should calculate the channel and track the visit
|
|
36905
36937
|
var source = query.utm_source;
|
|
36906
36938
|
var medium = query.utm_medium;
|
|
@@ -36985,6 +37017,527 @@ var WebAnalytics = /** @class */ (function () {
|
|
|
36985
37017
|
}());
|
|
36986
37018
|
var WebAnalytics$1 = new WebAnalytics();
|
|
36987
37019
|
|
|
37020
|
+
var buildFormStepBehaviors = function () {
|
|
37021
|
+
if (!this.attributes) {
|
|
37022
|
+
log.info('buildFormStepBehaviors called with invalid context');
|
|
37023
|
+
return {};
|
|
37024
|
+
}
|
|
37025
|
+
var step = this;
|
|
37026
|
+
var originalShow = step.show;
|
|
37027
|
+
var originalHide = step.hide;
|
|
37028
|
+
// Override the show method to respect validation state
|
|
37029
|
+
var show = function (reason) {
|
|
37030
|
+
if (step.attributes.validationHidden) {
|
|
37031
|
+
return false;
|
|
37032
|
+
}
|
|
37033
|
+
return originalShow.call(step, reason);
|
|
37034
|
+
};
|
|
37035
|
+
// Override the hide method to track validation state
|
|
37036
|
+
var hide = function (options) {
|
|
37037
|
+
if (options && options.validationHidden) {
|
|
37038
|
+
step.attributes.validationHidden = true;
|
|
37039
|
+
}
|
|
37040
|
+
return originalHide.call(step, options);
|
|
37041
|
+
};
|
|
37042
|
+
return { show: show, hide: hide };
|
|
37043
|
+
};
|
|
37044
|
+
|
|
37045
|
+
var domJsonBase = {
|
|
37046
|
+
'children': [],
|
|
37047
|
+
'props': {
|
|
37048
|
+
'class': '_pendo-step-container',
|
|
37049
|
+
'data-layout': 'tooltipBlank',
|
|
37050
|
+
'id': 'pendo-base'
|
|
37051
|
+
},
|
|
37052
|
+
'type': 'div'
|
|
37053
|
+
};
|
|
37054
|
+
var domJsonCss = {
|
|
37055
|
+
'css': [],
|
|
37056
|
+
'props': {
|
|
37057
|
+
'scoped': 'scoped',
|
|
37058
|
+
'type': 'text/css'
|
|
37059
|
+
},
|
|
37060
|
+
'type': 'style'
|
|
37061
|
+
};
|
|
37062
|
+
var layoutContainer = {
|
|
37063
|
+
'children': [],
|
|
37064
|
+
'props': {
|
|
37065
|
+
'class': '_pendo-step-container-size',
|
|
37066
|
+
'data-relative-alignment': true,
|
|
37067
|
+
'data-vertical-alignment': 'Relative to Element',
|
|
37068
|
+
'id': 'pendo-g-validation-tooltip-container',
|
|
37069
|
+
'style': {
|
|
37070
|
+
'display': 'block',
|
|
37071
|
+
'width': '300px',
|
|
37072
|
+
'z-index': 300000
|
|
37073
|
+
}
|
|
37074
|
+
},
|
|
37075
|
+
'type': 'div'
|
|
37076
|
+
};
|
|
37077
|
+
var guideStepContainer = {
|
|
37078
|
+
'children': [],
|
|
37079
|
+
'props': {
|
|
37080
|
+
'class': '_pendo-step-container-styles',
|
|
37081
|
+
'id': 'pendo-guide-container',
|
|
37082
|
+
'role': 'dialog',
|
|
37083
|
+
'data-caret-enabled': true,
|
|
37084
|
+
'data-caret-height': '15px',
|
|
37085
|
+
'data-caret-width': '15px',
|
|
37086
|
+
'style': {
|
|
37087
|
+
'background-color': 'rgba(255, 255, 255, 1)',
|
|
37088
|
+
'border': '1px solid #BBBBBB',
|
|
37089
|
+
'border-radius': '5px',
|
|
37090
|
+
'padding': '8px 12px',
|
|
37091
|
+
'box-shadow': '0px 0px 10px 0px rgba(190, 190, 190, 0.5)'
|
|
37092
|
+
},
|
|
37093
|
+
'tabindex': -1
|
|
37094
|
+
},
|
|
37095
|
+
'type': 'div'
|
|
37096
|
+
};
|
|
37097
|
+
var textContainer = {
|
|
37098
|
+
'children': [],
|
|
37099
|
+
'props': {
|
|
37100
|
+
'class': '_pendo-text-paragraph',
|
|
37101
|
+
'style': {}
|
|
37102
|
+
},
|
|
37103
|
+
'type': 'div'
|
|
37104
|
+
};
|
|
37105
|
+
function createRuleBlock(id, text) {
|
|
37106
|
+
var textChild = createTextBlock(id, text);
|
|
37107
|
+
return {
|
|
37108
|
+
'props': {
|
|
37109
|
+
'id': "rule-".concat(id),
|
|
37110
|
+
'class': 'text-row',
|
|
37111
|
+
'style': { 'display': 'flex', 'align-items': 'center' }
|
|
37112
|
+
},
|
|
37113
|
+
'children': [textChild],
|
|
37114
|
+
'type': 'div'
|
|
37115
|
+
};
|
|
37116
|
+
}
|
|
37117
|
+
function createTextBlock(id, content) {
|
|
37118
|
+
return {
|
|
37119
|
+
'content': content,
|
|
37120
|
+
'props': {
|
|
37121
|
+
'id': "text-".concat(id),
|
|
37122
|
+
'class': '_pendo-text-plain',
|
|
37123
|
+
'style': { 'color': 'gray', 'margin': 0 }
|
|
37124
|
+
},
|
|
37125
|
+
'type': 'p'
|
|
37126
|
+
};
|
|
37127
|
+
}
|
|
37128
|
+
function createIcon(svgString) {
|
|
37129
|
+
var parser = new DOMParser();
|
|
37130
|
+
var svgDoc = parser.parseFromString(svgString, 'image/svg+xml');
|
|
37131
|
+
var svgElement = svgDoc.documentElement;
|
|
37132
|
+
// Create a wrapper div with a margin right of 5px
|
|
37133
|
+
var wrapperDiv = document.createElement('div');
|
|
37134
|
+
wrapperDiv.style.marginRight = '5px';
|
|
37135
|
+
wrapperDiv.appendChild(svgElement);
|
|
37136
|
+
return wrapperDiv;
|
|
37137
|
+
}
|
|
37138
|
+
var defaultIcon = "\n<svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"10\" height=\"10\" fill=\"none\"\n stroke=\"gray\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \n stroke-width=\"2\" viewBox=\"0 0 10 10\">\n <line x1=\"2\" y1=\"5\" x2=\"8\" y2=\"5\"/>\n</svg>\n";
|
|
37139
|
+
var validIcon = "\n<svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" \n fill=\"none\" stroke=\"green\" stroke-width=\"2\" \n stroke-linecap=\"round\" stroke-linejoin=\"round\" \n class=\"feather feather-check\">\n <polyline points=\"2 5 4 7 8 2\"></polyline>\n</svg>\n";
|
|
37140
|
+
var invalidIcon = "\n<svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" \n fill=\"none\" stroke=\"red\" stroke-width=\"2\" \n stroke-linecap=\"round\" stroke-linejoin=\"round\" \n class=\"feather feather-x\">\n <line x1=\"2\" y1=\"2\" x2=\"8\" y2=\"8\"/>\n <line x1=\"8\" y1=\"2\" x2=\"2\" y2=\"8\"/>\n</svg>\n";
|
|
37141
|
+
|
|
37142
|
+
var regexPatterns = {
|
|
37143
|
+
'emailRegex': /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
|
|
37144
|
+
'phoneRegex': /^(\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/,
|
|
37145
|
+
'urlRegex': /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/
|
|
37146
|
+
};
|
|
37147
|
+
var dateFormats = {
|
|
37148
|
+
'MM-DD-YYYY': /^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])-(19|20)\d\d$/,
|
|
37149
|
+
'DD-MM-YYYY': /^(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])-(19|20)\d\d$/,
|
|
37150
|
+
'MM/DD/YYYY': /^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/(19|20)\d\d$/,
|
|
37151
|
+
'DD/MM/YYYY': /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d\d$/,
|
|
37152
|
+
'YYYY-MM-DD': /^(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/
|
|
37153
|
+
};
|
|
37154
|
+
var validators = {
|
|
37155
|
+
'email': function (value) {
|
|
37156
|
+
return regexPatterns.emailRegex.test(value);
|
|
37157
|
+
},
|
|
37158
|
+
'phone': function (value) {
|
|
37159
|
+
return regexPatterns.phoneRegex.test(value);
|
|
37160
|
+
},
|
|
37161
|
+
'date': function (value, options) {
|
|
37162
|
+
if (options === void 0) { options = {}; }
|
|
37163
|
+
var regex = dateFormats[options.format] || dateFormats['MM/DD/YYYY'];
|
|
37164
|
+
return regex.test(value);
|
|
37165
|
+
},
|
|
37166
|
+
'url': function (value) {
|
|
37167
|
+
return regexPatterns.urlRegex.test(value);
|
|
37168
|
+
},
|
|
37169
|
+
'number': function (value, options) {
|
|
37170
|
+
if (options === void 0) { options = {}; }
|
|
37171
|
+
if (value === '')
|
|
37172
|
+
return false;
|
|
37173
|
+
var min = options.min, max = options.max, allowDecimal = options.allowDecimal;
|
|
37174
|
+
var hasMin = hasValue(min);
|
|
37175
|
+
var hasMax = hasValue(max);
|
|
37176
|
+
if (hasMin)
|
|
37177
|
+
min = Number(min);
|
|
37178
|
+
if (hasMax)
|
|
37179
|
+
max = Number(max);
|
|
37180
|
+
var num = Number(value);
|
|
37181
|
+
if (isNaN(num))
|
|
37182
|
+
return false;
|
|
37183
|
+
if (hasMin && num < min)
|
|
37184
|
+
return false;
|
|
37185
|
+
if (hasMax && num > max)
|
|
37186
|
+
return false;
|
|
37187
|
+
if (!allowDecimal && num % 1 !== 0)
|
|
37188
|
+
return false; // eslint-disable-line
|
|
37189
|
+
return true;
|
|
37190
|
+
},
|
|
37191
|
+
'characterLength': function (value, options) {
|
|
37192
|
+
if (options === void 0) { options = {}; }
|
|
37193
|
+
var min = options.min, max = options.max;
|
|
37194
|
+
var hasMin = hasValue(min);
|
|
37195
|
+
var hasMax = hasValue(max);
|
|
37196
|
+
if (hasMin)
|
|
37197
|
+
min = Number(min);
|
|
37198
|
+
if (hasMax)
|
|
37199
|
+
max = Number(max);
|
|
37200
|
+
if (hasMin && value.length < min)
|
|
37201
|
+
return false;
|
|
37202
|
+
if (hasMax && value.length > max)
|
|
37203
|
+
return false; // eslint-disable-line
|
|
37204
|
+
return true;
|
|
37205
|
+
}
|
|
37206
|
+
};
|
|
37207
|
+
function hasValue(value) {
|
|
37208
|
+
return value !== undefined && value !== null && value !== '';
|
|
37209
|
+
}
|
|
37210
|
+
|
|
37211
|
+
var FormValidation = (function () {
|
|
37212
|
+
var globalPendo;
|
|
37213
|
+
var pluginApi;
|
|
37214
|
+
var validationGuides = [];
|
|
37215
|
+
var debouncedValidate;
|
|
37216
|
+
var activeStep;
|
|
37217
|
+
var activeField;
|
|
37218
|
+
var activeFieldIsValid = null;
|
|
37219
|
+
var designerModeCheckInterval;
|
|
37220
|
+
return {
|
|
37221
|
+
'name': 'FormValidation',
|
|
37222
|
+
validationGuides: validationGuides,
|
|
37223
|
+
debouncedValidate: debouncedValidate,
|
|
37224
|
+
initialize: initialize,
|
|
37225
|
+
teardown: teardown,
|
|
37226
|
+
appendValidationStyles: appendValidationStyles,
|
|
37227
|
+
getActiveStep: getActiveStep,
|
|
37228
|
+
setActiveStep: setActiveStep,
|
|
37229
|
+
setActiveField: setActiveField,
|
|
37230
|
+
getActiveField: getActiveField,
|
|
37231
|
+
getActiveFieldIsValid: getActiveFieldIsValid,
|
|
37232
|
+
setActiveFieldIsValid: setActiveFieldIsValid,
|
|
37233
|
+
getValidationGuides: getValidationGuides,
|
|
37234
|
+
setValidationGuides: setValidationGuides,
|
|
37235
|
+
initializeFormValidation: initializeFormValidation,
|
|
37236
|
+
clearAllValidationGuides: clearAllValidationGuides,
|
|
37237
|
+
extractValidationGuides: extractValidationGuides,
|
|
37238
|
+
applyFormBehaviors: applyFormBehaviors,
|
|
37239
|
+
checkValidationFieldVisibility: checkValidationFieldVisibility,
|
|
37240
|
+
hideValidationTooltip: hideValidationTooltip,
|
|
37241
|
+
focusField: focusField,
|
|
37242
|
+
blurField: blurField,
|
|
37243
|
+
findFieldByElement: findFieldByElement,
|
|
37244
|
+
validateInput: validateInput,
|
|
37245
|
+
validateField: validateField,
|
|
37246
|
+
getRuleText: getRuleText,
|
|
37247
|
+
setValidationStyle: setValidationStyle
|
|
37248
|
+
};
|
|
37249
|
+
function initialize(pendo, PluginAPI) {
|
|
37250
|
+
var hasFormValidation = PluginAPI.ConfigReader.get('formValidation');
|
|
37251
|
+
if (!hasFormValidation) {
|
|
37252
|
+
return;
|
|
37253
|
+
}
|
|
37254
|
+
globalPendo = pendo;
|
|
37255
|
+
pluginApi = PluginAPI;
|
|
37256
|
+
debouncedValidate = _.debounce(validateInput, 100);
|
|
37257
|
+
pluginApi.Events.on('deliverablesLoaded', clearAllValidationGuides);
|
|
37258
|
+
pluginApi.Events.on('guideLoopStopped', hideValidationTooltip);
|
|
37259
|
+
pluginApi.Events.on('guideListChanged', initializeFormValidation);
|
|
37260
|
+
pluginApi.GuideLoop.addUpdatePhase(checkValidationFieldVisibility);
|
|
37261
|
+
pluginApi.guides.addProcessor(extractValidationGuides);
|
|
37262
|
+
var isInDesignerMode = !!(globalPendo === null || globalPendo === void 0 ? void 0 : globalPendo.designer);
|
|
37263
|
+
// Set up an interval to check for designer mode
|
|
37264
|
+
designerModeCheckInterval = setInterval(function () {
|
|
37265
|
+
if (isInDesignerMode) {
|
|
37266
|
+
teardown();
|
|
37267
|
+
clearInterval(designerModeCheckInterval);
|
|
37268
|
+
designerModeCheckInterval = null;
|
|
37269
|
+
return;
|
|
37270
|
+
}
|
|
37271
|
+
}, 1000);
|
|
37272
|
+
pendo.attachEvent(document, 'focusin', focusField);
|
|
37273
|
+
pendo.attachEvent(document, 'focusout', blurField);
|
|
37274
|
+
pendo.attachEvent(document, 'input', debouncedValidate);
|
|
37275
|
+
}
|
|
37276
|
+
function teardown() {
|
|
37277
|
+
if (!pluginApi) {
|
|
37278
|
+
return;
|
|
37279
|
+
}
|
|
37280
|
+
if (designerModeCheckInterval) {
|
|
37281
|
+
clearInterval(designerModeCheckInterval);
|
|
37282
|
+
designerModeCheckInterval = null;
|
|
37283
|
+
}
|
|
37284
|
+
pluginApi.Events.off('deliverablesLoaded', clearAllValidationGuides);
|
|
37285
|
+
pluginApi.Events.off('guideLoopStopped', hideValidationTooltip);
|
|
37286
|
+
pluginApi.Events.off('guideListChanged', initializeFormValidation);
|
|
37287
|
+
pluginApi.GuideLoop.removeUpdatePhase(checkValidationFieldVisibility);
|
|
37288
|
+
pluginApi.guides.removeProcessor(extractValidationGuides);
|
|
37289
|
+
globalPendo.detachEvent(document, 'focusin', focusField);
|
|
37290
|
+
globalPendo.detachEvent(document, 'focusout', blurField);
|
|
37291
|
+
globalPendo.detachEvent(document, 'input', debouncedValidate);
|
|
37292
|
+
debouncedValidate.cancel();
|
|
37293
|
+
validationGuides = [];
|
|
37294
|
+
activeStep = null;
|
|
37295
|
+
activeField = null;
|
|
37296
|
+
activeFieldIsValid = null;
|
|
37297
|
+
}
|
|
37298
|
+
function clearAllValidationGuides() {
|
|
37299
|
+
pluginApi.guides.removeDisplayableGuides('validationGuides');
|
|
37300
|
+
validationGuides = [];
|
|
37301
|
+
}
|
|
37302
|
+
function hideValidationTooltip() {
|
|
37303
|
+
globalPendo.detachEvent(document, 'focusin', focusField);
|
|
37304
|
+
if (activeField) {
|
|
37305
|
+
activeField = null;
|
|
37306
|
+
activeFieldIsValid = null;
|
|
37307
|
+
}
|
|
37308
|
+
if (activeStep) {
|
|
37309
|
+
activeStep.hide({ 'validationHidden': true });
|
|
37310
|
+
activeStep = null;
|
|
37311
|
+
}
|
|
37312
|
+
}
|
|
37313
|
+
function initializeFormValidation() {
|
|
37314
|
+
appendValidationStyles();
|
|
37315
|
+
pluginApi.guides.registerDisplayableGuides('validationGuides', validationGuides);
|
|
37316
|
+
applyFormBehaviors();
|
|
37317
|
+
}
|
|
37318
|
+
function applyFormBehaviors() {
|
|
37319
|
+
_.map(validationGuides, function (guide) {
|
|
37320
|
+
_.map(guide.steps, function (step) {
|
|
37321
|
+
var stepBehaviors = buildFormStepBehaviors.call(step);
|
|
37322
|
+
Object.assign(step, stepBehaviors);
|
|
37323
|
+
});
|
|
37324
|
+
});
|
|
37325
|
+
}
|
|
37326
|
+
function checkValidationFieldVisibility() {
|
|
37327
|
+
var _a;
|
|
37328
|
+
// If there is an active field/step, check if the associated element still exists
|
|
37329
|
+
if (activeField) {
|
|
37330
|
+
var element = globalPendo.Sizzle(activeStep.elementPathRule)[0];
|
|
37331
|
+
// If element doesn't exist, dismiss the validation
|
|
37332
|
+
if (!element || !globalPendo.isElementVisible(element)) {
|
|
37333
|
+
activeField = null;
|
|
37334
|
+
activeFieldIsValid = null;
|
|
37335
|
+
activeStep.hide({ 'validationHidden': true });
|
|
37336
|
+
activeStep = null;
|
|
37337
|
+
}
|
|
37338
|
+
}
|
|
37339
|
+
// If focusin event listener was detached when guide loop stopped, attach it again
|
|
37340
|
+
var docData = DomData$1.get(document);
|
|
37341
|
+
var bubbleFocusEvents = ((_a = docData.bubbleEvents) === null || _a === void 0 ? void 0 : _a.focusin) || [];
|
|
37342
|
+
var isFocusFieldAttached = bubbleFocusEvents.some(function (e) { return e.handler === focusField; });
|
|
37343
|
+
if (!isFocusFieldAttached) {
|
|
37344
|
+
globalPendo.attachEvent(document, 'focusin', focusField);
|
|
37345
|
+
}
|
|
37346
|
+
}
|
|
37347
|
+
function extractValidationGuides(guide) {
|
|
37348
|
+
if (guide.launchMethod === 'form') {
|
|
37349
|
+
if (!_.some(validationGuides, function (_a) {
|
|
37350
|
+
var id = _a.id;
|
|
37351
|
+
return id === guide.id;
|
|
37352
|
+
})) {
|
|
37353
|
+
validationGuides.push(guide);
|
|
37354
|
+
}
|
|
37355
|
+
}
|
|
37356
|
+
return true;
|
|
37357
|
+
}
|
|
37358
|
+
function appendValidationStyles() {
|
|
37359
|
+
var style = document.createElement('style');
|
|
37360
|
+
style.innerHTML = "\n input[data-pendo-field-valid=\"false\"] {\n border-color: red !important;\n outline-color: red !important;\n }\n ";
|
|
37361
|
+
document.head.appendChild(style);
|
|
37362
|
+
}
|
|
37363
|
+
function focusField(event) {
|
|
37364
|
+
var _a, _b;
|
|
37365
|
+
var target = event.target;
|
|
37366
|
+
if (target.tagName === 'INPUT') {
|
|
37367
|
+
var matchingField = findFieldByElement(target);
|
|
37368
|
+
if (matchingField && activeStep) {
|
|
37369
|
+
activeStep.attributes.validationHidden = false;
|
|
37370
|
+
// if there is no domJson on the step,
|
|
37371
|
+
// this is the first time the user is focusing on the field
|
|
37372
|
+
// so add the text and icon
|
|
37373
|
+
if (!activeStep.domJson) {
|
|
37374
|
+
appendDomJson();
|
|
37375
|
+
}
|
|
37376
|
+
activeStep.show('api');
|
|
37377
|
+
var ruleElement = document.getElementById("rule-".concat((_a = activeField === null || activeField === void 0 ? void 0 : activeField.rules[0]) === null || _a === void 0 ? void 0 : _a.id));
|
|
37378
|
+
if (ruleElement && ((_b = activeField === null || activeField === void 0 ? void 0 : activeField.rules[0]) === null || _b === void 0 ? void 0 : _b.type)) {
|
|
37379
|
+
// add the icon for the rule
|
|
37380
|
+
var icon = activeField.isValid === null ? createIcon(defaultIcon)
|
|
37381
|
+
: activeFieldIsValid ? createIcon(validIcon)
|
|
37382
|
+
: createIcon(invalidIcon);
|
|
37383
|
+
ruleElement.insertBefore(icon, ruleElement.firstChild);
|
|
37384
|
+
}
|
|
37385
|
+
if (matchingField.value !== '') {
|
|
37386
|
+
validateField(target);
|
|
37387
|
+
}
|
|
37388
|
+
}
|
|
37389
|
+
}
|
|
37390
|
+
}
|
|
37391
|
+
function blurField(event) {
|
|
37392
|
+
var target = event.target;
|
|
37393
|
+
if (activeField && activeStep) {
|
|
37394
|
+
var targetMatchesActiveField = globalPendo.Sizzle.matchesSelector(target, activeStep === null || activeStep === void 0 ? void 0 : activeStep.elementPathRule);
|
|
37395
|
+
if (targetMatchesActiveField) {
|
|
37396
|
+
setValidationStyle(target, activeFieldIsValid);
|
|
37397
|
+
}
|
|
37398
|
+
activeStep.hide({ 'validationHidden': true });
|
|
37399
|
+
if (activeField.isValid === null && activeFieldIsValid === false) {
|
|
37400
|
+
var ruleTextBlock = getRuleText();
|
|
37401
|
+
ruleTextBlock.props.style.color = 'red';
|
|
37402
|
+
}
|
|
37403
|
+
activeField.isValid = activeFieldIsValid;
|
|
37404
|
+
activeField = null;
|
|
37405
|
+
activeStep = null;
|
|
37406
|
+
activeFieldIsValid = null;
|
|
37407
|
+
}
|
|
37408
|
+
}
|
|
37409
|
+
function findFieldByElement(element) {
|
|
37410
|
+
var _a;
|
|
37411
|
+
if (activeStep) {
|
|
37412
|
+
activeStep.hide({ 'validationHidden': true });
|
|
37413
|
+
}
|
|
37414
|
+
activeStep = null;
|
|
37415
|
+
activeField = null;
|
|
37416
|
+
activeFieldIsValid = null;
|
|
37417
|
+
// loop through fields to find a field that matches the event target
|
|
37418
|
+
// to determine if there is a validation for that target
|
|
37419
|
+
for (var _i = 0, validationGuides_1 = validationGuides; _i < validationGuides_1.length; _i++) {
|
|
37420
|
+
var guide = validationGuides_1[_i];
|
|
37421
|
+
var matchingStep = _.find(guide.steps, function (step) {
|
|
37422
|
+
return globalPendo.Sizzle.matchesSelector(element, step.elementPathRule);
|
|
37423
|
+
});
|
|
37424
|
+
if (matchingStep) {
|
|
37425
|
+
activeStep = matchingStep;
|
|
37426
|
+
activeField = (_a = matchingStep.attributes) === null || _a === void 0 ? void 0 : _a.field;
|
|
37427
|
+
activeFieldIsValid = activeField.isValid;
|
|
37428
|
+
return activeField;
|
|
37429
|
+
}
|
|
37430
|
+
}
|
|
37431
|
+
return null;
|
|
37432
|
+
}
|
|
37433
|
+
function appendDomJson() {
|
|
37434
|
+
var rule = activeField.rules[0];
|
|
37435
|
+
// Create text blocks
|
|
37436
|
+
var helperContent = createTextBlock("context-".concat(activeField.id), activeField.context);
|
|
37437
|
+
var ruleContent = (rule === null || rule === void 0 ? void 0 : rule.type) ? createRuleBlock(rule.id, rule.ruleText) : null;
|
|
37438
|
+
// Filter out null values and check if we have any content
|
|
37439
|
+
var textBlocks = [helperContent, ruleContent].filter(Boolean);
|
|
37440
|
+
if (textBlocks.length === 0) {
|
|
37441
|
+
return;
|
|
37442
|
+
}
|
|
37443
|
+
// compile the basic json building blocks
|
|
37444
|
+
var stepBase = deepCopy(domJsonBase);
|
|
37445
|
+
var stepCss = deepCopy(domJsonCss);
|
|
37446
|
+
var stepLayoutContainer = deepCopy(layoutContainer);
|
|
37447
|
+
var stepContainer = deepCopy(guideStepContainer);
|
|
37448
|
+
var stepTextContainer = deepCopy(textContainer);
|
|
37449
|
+
stepBase.children.push(stepCss, stepLayoutContainer);
|
|
37450
|
+
stepLayoutContainer.children.push(stepContainer);
|
|
37451
|
+
stepContainer.children.push(stepTextContainer);
|
|
37452
|
+
stepTextContainer.children = textBlocks;
|
|
37453
|
+
activeStep.domJson = stepBase;
|
|
37454
|
+
}
|
|
37455
|
+
function validateInput(event) {
|
|
37456
|
+
var target = event.target;
|
|
37457
|
+
// check if the user is typing in current active field
|
|
37458
|
+
var targetMatchesActiveField = globalPendo.Sizzle.matchesSelector(target, activeStep === null || activeStep === void 0 ? void 0 : activeStep.elementPathRule);
|
|
37459
|
+
if (targetMatchesActiveField) {
|
|
37460
|
+
validateField(target);
|
|
37461
|
+
}
|
|
37462
|
+
else {
|
|
37463
|
+
// if not, find the field that matches the event target
|
|
37464
|
+
var matchingField = findFieldByElement(target);
|
|
37465
|
+
if (matchingField) {
|
|
37466
|
+
activeFieldIsValid = matchingField.isValid;
|
|
37467
|
+
validateField(target);
|
|
37468
|
+
}
|
|
37469
|
+
}
|
|
37470
|
+
}
|
|
37471
|
+
function validateField(target) {
|
|
37472
|
+
var rule = activeField === null || activeField === void 0 ? void 0 : activeField.rules[0];
|
|
37473
|
+
if (!rule) {
|
|
37474
|
+
return;
|
|
37475
|
+
}
|
|
37476
|
+
var validator = validators[rule.type];
|
|
37477
|
+
if (!validator) {
|
|
37478
|
+
return;
|
|
37479
|
+
}
|
|
37480
|
+
var isValid = validator(target.value, rule.options);
|
|
37481
|
+
activeFieldIsValid = !!isValid;
|
|
37482
|
+
var ruleTextBlock = getRuleText();
|
|
37483
|
+
// don't show invalid if the user hasn't finished typing
|
|
37484
|
+
var newIcon;
|
|
37485
|
+
if (activeField.isValid === null) {
|
|
37486
|
+
ruleTextBlock.props.style.color = isValid ? 'green' : 'gray';
|
|
37487
|
+
newIcon = isValid ? createIcon(validIcon) : createIcon(defaultIcon);
|
|
37488
|
+
}
|
|
37489
|
+
else {
|
|
37490
|
+
ruleTextBlock.props.style.color = isValid ? 'green' : 'red';
|
|
37491
|
+
newIcon = isValid ? createIcon(validIcon) : createIcon(invalidIcon);
|
|
37492
|
+
setValidationStyle(target, isValid);
|
|
37493
|
+
}
|
|
37494
|
+
activeStep.hide({ 'stepHidden': true });
|
|
37495
|
+
activeStep.show('api');
|
|
37496
|
+
var ruleElement = document.getElementById("rule-".concat(activeField.rules[0].id));
|
|
37497
|
+
if (ruleElement) {
|
|
37498
|
+
ruleElement.insertBefore(newIcon, ruleElement.firstChild);
|
|
37499
|
+
}
|
|
37500
|
+
}
|
|
37501
|
+
function getRuleText() {
|
|
37502
|
+
var ruleId = activeField.rules[0].id;
|
|
37503
|
+
var ruleTextId = "text-".concat(ruleId);
|
|
37504
|
+
var ruleTextBlock = findBlockById(ruleTextId, activeStep.domJson);
|
|
37505
|
+
return ruleTextBlock;
|
|
37506
|
+
}
|
|
37507
|
+
function setValidationStyle(target, isValid) {
|
|
37508
|
+
if (isValid === false) {
|
|
37509
|
+
target.setAttribute('data-pendo-field-valid', false);
|
|
37510
|
+
}
|
|
37511
|
+
else {
|
|
37512
|
+
target.removeAttribute('data-pendo-field-valid');
|
|
37513
|
+
}
|
|
37514
|
+
}
|
|
37515
|
+
function getActiveStep() {
|
|
37516
|
+
return activeStep;
|
|
37517
|
+
}
|
|
37518
|
+
function setActiveStep(step) {
|
|
37519
|
+
activeStep = step;
|
|
37520
|
+
}
|
|
37521
|
+
function getActiveField() {
|
|
37522
|
+
return activeField;
|
|
37523
|
+
}
|
|
37524
|
+
function setActiveField(field) {
|
|
37525
|
+
activeField = field;
|
|
37526
|
+
}
|
|
37527
|
+
function getActiveFieldIsValid() {
|
|
37528
|
+
return activeFieldIsValid;
|
|
37529
|
+
}
|
|
37530
|
+
function setActiveFieldIsValid(isValid) {
|
|
37531
|
+
activeFieldIsValid = isValid;
|
|
37532
|
+
}
|
|
37533
|
+
function getValidationGuides() {
|
|
37534
|
+
return validationGuides;
|
|
37535
|
+
}
|
|
37536
|
+
function setValidationGuides(guides) {
|
|
37537
|
+
validationGuides = guides;
|
|
37538
|
+
}
|
|
37539
|
+
})();
|
|
37540
|
+
|
|
36988
37541
|
function registerBuiltInPlugins() {
|
|
36989
37542
|
registerPlugin(IFrameMonitor);
|
|
36990
37543
|
registerPlugin(DOMActivation);
|
|
@@ -37001,6 +37554,7 @@ function registerBuiltInPlugins() {
|
|
|
37001
37554
|
registerPlugin(SessionManager$1);
|
|
37002
37555
|
registerPlugin(SegmentFlags$1);
|
|
37003
37556
|
registerPlugin(WebAnalytics$1);
|
|
37557
|
+
registerPlugin(FormValidation);
|
|
37004
37558
|
}
|
|
37005
37559
|
|
|
37006
37560
|
/*
|
|
@@ -43579,6 +44133,7 @@ var Feedback = (function () {
|
|
|
43579
44133
|
var iframeContainer = globalPendo.dom(document.createElement('iframe'));
|
|
43580
44134
|
iframeContainer.css(iframeContainerStyles);
|
|
43581
44135
|
iframeContainer.attr('id', elemIds.feedbackIframe);
|
|
44136
|
+
iframeContainer.attr('title', 'Feedback');
|
|
43582
44137
|
iframeContainer.attr('src', getWidgetInitialSource());
|
|
43583
44138
|
return iframeContainer;
|
|
43584
44139
|
}
|
|
@@ -48124,8 +48679,8 @@ function initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector) {
|
|
|
48124
48679
|
};
|
|
48125
48680
|
}
|
|
48126
48681
|
const encodedJs = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIHdvcmtlci5vbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihlKSB7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zIH0gPSBlLmRhdGE7CiAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBkYXRhVVJMT3B0aW9ucwogICAgICApOwogICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgICBiaXRtYXAuY2xvc2UoKTsKICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG9mZnNjcmVlbi5jb252ZXJ0VG9CbG9iKGRhdGFVUkxPcHRpb25zKTsKICAgICAgY29uc3QgdHlwZSA9IGJsb2IudHlwZTsKICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7CiAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7CiAgICAgIGlmICghbGFzdEJsb2JNYXAuaGFzKGlkKSAmJiBhd2FpdCB0cmFuc3BhcmVudEJhc2U2NCA9PT0gYmFzZTY0KSB7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsKICAgICAgfQogICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KSByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7CiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH0pOwogICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsKICAgIH0KICB9Owp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1pbWFnZS1iaXRtYXAtZGF0YS11cmwtd29ya2VyLUlKcEM3Z19iLmpzLm1hcAo=";
|
|
48127
|
-
const decodeBase64 = (base64) => Uint8Array.from(atob(base64), (c2) => c2.charCodeAt(0));
|
|
48128
|
-
const blob = typeof window !== "undefined" && window.Blob && new Blob([decodeBase64(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
48682
|
+
const decodeBase64$1 = (base64) => Uint8Array.from(atob(base64), (c2) => c2.charCodeAt(0));
|
|
48683
|
+
const blob = typeof window !== "undefined" && window.Blob && new Blob([decodeBase64$1(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
48129
48684
|
function WorkerWrapper(options) {
|
|
48130
48685
|
let objURL;
|
|
48131
48686
|
try {
|
|
@@ -49466,16 +50021,18 @@ SessionRecorder.prototype.initialize = function (pendo, PluginAPI) {
|
|
|
49466
50021
|
// but ONLY for replay being enabled - all other values should be taken from the backend
|
|
49467
50022
|
if (pendo._.isBoolean(snippetOverrideValue)) {
|
|
49468
50023
|
isSessionReplayEnabled = snippetOverrideValue;
|
|
50024
|
+
if (!isSessionReplayEnabled) {
|
|
50025
|
+
this.api.log.info('Session Replay disabled via the snippet config');
|
|
50026
|
+
}
|
|
49469
50027
|
}
|
|
49470
50028
|
else {
|
|
49471
50029
|
isSessionReplayEnabled = this.config.enabled;
|
|
49472
50030
|
}
|
|
49473
50031
|
if (!isSessionReplayEnabled) {
|
|
49474
|
-
this.logStopReason('RECORDING_DISABLED');
|
|
49475
50032
|
return;
|
|
49476
50033
|
}
|
|
49477
50034
|
if (configReader.get('excludeNonGuideAnalytics')) {
|
|
49478
|
-
this.
|
|
50035
|
+
this.api.log.info('Session Replay is disabled because excludeNonGuideAnalytics is enabled');
|
|
49479
50036
|
return;
|
|
49480
50037
|
}
|
|
49481
50038
|
var sessionIdKey = this.sessionIdKey = "".concat(SESSION_RECORDING_ID, ".").concat(pendo.apiKey);
|
|
@@ -50130,265 +50687,38 @@ function errorLogger(recorder) {
|
|
|
50130
50687
|
return recorder;
|
|
50131
50688
|
}
|
|
50132
50689
|
|
|
50133
|
-
function
|
|
50134
|
-
var
|
|
50135
|
-
|
|
50136
|
-
|
|
50137
|
-
|
|
50138
|
-
|
|
50139
|
-
|
|
50140
|
-
|
|
50141
|
-
|
|
50142
|
-
lines.push('(' + source + ')()');
|
|
50143
|
-
if (sourcemap) {
|
|
50144
|
-
lines.push('\/\/# sourceMappingURL=' + sourcemap + '\n');
|
|
50690
|
+
function decodeBase64(base64, enableUnicode) {
|
|
50691
|
+
var binaryString = atob(base64);
|
|
50692
|
+
if (enableUnicode) {
|
|
50693
|
+
var binaryView = new Uint8Array(binaryString.length);
|
|
50694
|
+
for (var i = 0, n = binaryString.length; i < n; ++i) {
|
|
50695
|
+
binaryView[i] = binaryString.charCodeAt(i);
|
|
50696
|
+
}
|
|
50697
|
+
const decoder = new TextDecoder("utf-16le");
|
|
50698
|
+
return decoder.decode(new Uint16Array(binaryView.buffer));
|
|
50145
50699
|
}
|
|
50146
|
-
return
|
|
50700
|
+
return binaryString;
|
|
50147
50701
|
}
|
|
50148
50702
|
|
|
50149
|
-
function createURL(
|
|
50150
|
-
var
|
|
50151
|
-
var
|
|
50703
|
+
function createURL(base64, sourcemapArg, enableUnicodeArg) {
|
|
50704
|
+
var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
|
|
50705
|
+
var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
|
|
50706
|
+
var source = decodeBase64(base64, enableUnicode);
|
|
50707
|
+
var start = source.indexOf('\n', 10) + 1;
|
|
50708
|
+
var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
|
|
50709
|
+
var blob = new Blob([body], { type: 'application/javascript' });
|
|
50152
50710
|
return URL.createObjectURL(blob);
|
|
50153
50711
|
}
|
|
50154
50712
|
|
|
50155
|
-
function
|
|
50713
|
+
function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
50156
50714
|
var url;
|
|
50157
50715
|
return function WorkerFactory(options) {
|
|
50158
|
-
url = url || createURL(
|
|
50716
|
+
url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
|
|
50159
50717
|
return new Worker(url, options);
|
|
50160
50718
|
};
|
|
50161
50719
|
}
|
|
50162
50720
|
|
|
50163
|
-
var WorkerFactory = /*#__PURE__*/createInlineWorkerFactory(/* rollup-plugin-web-worker-loader */function () {
|
|
50164
|
-
((function (exports) {
|
|
50165
|
-
'__worker_loader_strict__';
|
|
50166
|
-
|
|
50167
|
-
var b64 = (function() {
|
|
50168
|
-
|
|
50169
|
-
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'.split('');
|
|
50170
|
-
|
|
50171
|
-
return {
|
|
50172
|
-
'uint8ToBase64': uint8ToBase64
|
|
50173
|
-
};
|
|
50174
|
-
|
|
50175
|
-
function uint8ToBase64(uint8) {
|
|
50176
|
-
var i,
|
|
50177
|
-
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
|
|
50178
|
-
output = '',
|
|
50179
|
-
temp, length;
|
|
50180
|
-
|
|
50181
|
-
function tripletToBase64(num) {
|
|
50182
|
-
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
|
|
50183
|
-
}
|
|
50184
|
-
|
|
50185
|
-
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
50186
|
-
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
|
|
50187
|
-
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
|
|
50188
|
-
output += tripletToBase64(temp);
|
|
50189
|
-
}
|
|
50190
|
-
|
|
50191
|
-
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
50192
|
-
//eslint-disable-next-line default-case
|
|
50193
|
-
switch (extraBytes) {
|
|
50194
|
-
case 1:
|
|
50195
|
-
temp = uint8[uint8.length - 1];
|
|
50196
|
-
output += lookup[temp >> 2];
|
|
50197
|
-
output += lookup[(temp << 4) & 0x3F];
|
|
50198
|
-
break;
|
|
50199
|
-
case 2:
|
|
50200
|
-
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]);
|
|
50201
|
-
output += lookup[temp >> 10];
|
|
50202
|
-
output += lookup[(temp >> 4) & 0x3F];
|
|
50203
|
-
output += lookup[(temp << 2) & 0x3F];
|
|
50204
|
-
break;
|
|
50205
|
-
}
|
|
50206
|
-
|
|
50207
|
-
return output;
|
|
50208
|
-
}
|
|
50209
|
-
})();
|
|
50210
|
-
|
|
50211
|
-
function getDefaultExportFromCjs (x) {
|
|
50212
|
-
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
50213
|
-
}
|
|
50214
|
-
|
|
50215
|
-
var deflate_min = {exports: {}};
|
|
50216
|
-
|
|
50217
|
-
/*
|
|
50218
|
-
* @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License
|
|
50219
|
-
*/
|
|
50220
|
-
|
|
50221
|
-
(function (module) {
|
|
50222
|
-
(function() {var n=void 0,w=!0,aa=this;function ba(f,d){var c=f.split("."),e=aa;!(c[0]in e)&&e.execScript&&e.execScript("var "+c[0]);for(var b;c.length&&(b=c.shift());)!c.length&&d!==n?e[b]=d:e=e[b]?e[b]:e[b]={};}var C="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function K(f,d){this.index="number"===typeof d?d:0;this.e=0;this.buffer=f instanceof(C?Uint8Array:Array)?f:new (C?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this);}function ca(f){var d=f.buffer,c,e=d.length,b=new (C?Uint8Array:Array)(e<<1);if(C)b.set(d);else for(c=0;c<e;++c)b[c]=d[c];return f.buffer=b}
|
|
50223
|
-
K.prototype.b=function(f,d,c){var e=this.buffer,b=this.index,a=this.e,g=e[b],m;c&&1<d&&(f=8<d?(L[f&255]<<24|L[f>>>8&255]<<16|L[f>>>16&255]<<8|L[f>>>24&255])>>32-d:L[f]>>8-d);if(8>d+a)g=g<<d|f,a+=d;else for(m=0;m<d;++m)g=g<<1|f>>d-m-1&1,8===++a&&(a=0,e[b++]=L[g],g=0,b===e.length&&(e=ca(this)));e[b]=g;this.buffer=e;this.e=a;this.index=b;};K.prototype.finish=function(){var f=this.buffer,d=this.index,c;0<this.e&&(f[d]<<=8-this.e,f[d]=L[f[d]],d++);C?c=f.subarray(0,d):(f.length=d,c=f);return c};
|
|
50224
|
-
var da=new (C?Uint8Array:Array)(256),M;for(M=0;256>M;++M){for(var N=M,S=N,ea=7,N=N>>>1;N;N>>>=1)S<<=1,S|=N&1,--ea;da[M]=(S<<ea&255)>>>0;}var L=da;function ia(f){this.buffer=new (C?Uint16Array:Array)(2*f);this.length=0;}ia.prototype.getParent=function(f){return 2*((f-2)/4|0)};ia.prototype.push=function(f,d){var c,e,b=this.buffer,a;c=this.length;b[this.length++]=d;for(b[this.length++]=f;0<c;)if(e=this.getParent(c),b[c]>b[e])a=b[c],b[c]=b[e],b[e]=a,a=b[c+1],b[c+1]=b[e+1],b[e+1]=a,c=e;else break;return this.length};
|
|
50225
|
-
ia.prototype.pop=function(){var f,d,c=this.buffer,e,b,a;d=c[0];f=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(a=0;;){b=2*a+2;if(b>=this.length)break;b+2<this.length&&c[b+2]>c[b]&&(b+=2);if(c[b]>c[a])e=c[a],c[a]=c[b],c[b]=e,e=c[a+1],c[a+1]=c[b+1],c[b+1]=e;else break;a=b;}return {index:f,value:d,length:this.length}};function ka(f,d){this.d=la;this.i=0;this.input=C&&f instanceof Array?new Uint8Array(f):f;this.c=0;d&&(d.lazy&&(this.i=d.lazy),"number"===typeof d.compressionType&&(this.d=d.compressionType),d.outputBuffer&&(this.a=C&&d.outputBuffer instanceof Array?new Uint8Array(d.outputBuffer):d.outputBuffer),"number"===typeof d.outputIndex&&(this.c=d.outputIndex));this.a||(this.a=new (C?Uint8Array:Array)(32768));}var la=2,na={NONE:0,h:1,g:la,n:3},T=[],U;
|
|
50226
|
-
for(U=0;288>U;U++)switch(w){case 143>=U:T.push([U+48,8]);break;case 255>=U:T.push([U-144+400,9]);break;case 279>=U:T.push([U-256+0,7]);break;case 287>=U:T.push([U-280+192,8]);break;default:throw "invalid literal: "+U;}
|
|
50227
|
-
ka.prototype.f=function(){var f,d,c,e,b=this.input;switch(this.d){case 0:c=0;for(e=b.length;c<e;){d=C?b.subarray(c,c+65535):b.slice(c,c+65535);c+=d.length;var a=d,g=c===e,m=n,k=n,p=n,t=n,u=n,l=this.a,h=this.c;if(C){for(l=new Uint8Array(this.a.buffer);l.length<=h+a.length+5;)l=new Uint8Array(l.length<<1);l.set(this.a);}m=g?1:0;l[h++]=m|0;k=a.length;p=~k+65536&65535;l[h++]=k&255;l[h++]=k>>>8&255;l[h++]=p&255;l[h++]=p>>>8&255;if(C)l.set(a,h),h+=a.length,l=l.subarray(0,h);else {t=0;for(u=a.length;t<u;++t)l[h++]=
|
|
50228
|
-
a[t];l.length=h;}this.c=h;this.a=l;}break;case 1:var q=new K(C?new Uint8Array(this.a.buffer):this.a,this.c);q.b(1,1,w);q.b(1,2,w);var s=oa(this,b),x,fa,z;x=0;for(fa=s.length;x<fa;x++)if(z=s[x],K.prototype.b.apply(q,T[z]),256<z)q.b(s[++x],s[++x],w),q.b(s[++x],5),q.b(s[++x],s[++x],w);else if(256===z)break;this.a=q.finish();this.c=this.a.length;break;case la:var B=new K(C?new Uint8Array(this.a.buffer):this.a,this.c),ta,J,O,P,Q,La=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],X,ua,Y,va,ga,ja=Array(19),
|
|
50229
|
-
wa,R,ha,y,xa;ta=la;B.b(1,1,w);B.b(ta,2,w);J=oa(this,b);X=pa(this.m,15);ua=qa(X);Y=pa(this.l,7);va=qa(Y);for(O=286;257<O&&0===X[O-1];O--);for(P=30;1<P&&0===Y[P-1];P--);var ya=O,za=P,F=new (C?Uint32Array:Array)(ya+za),r,G,v,Z,E=new (C?Uint32Array:Array)(316),D,A,H=new (C?Uint8Array:Array)(19);for(r=G=0;r<ya;r++)F[G++]=X[r];for(r=0;r<za;r++)F[G++]=Y[r];if(!C){r=0;for(Z=H.length;r<Z;++r)H[r]=0;}r=D=0;for(Z=F.length;r<Z;r+=G){for(G=1;r+G<Z&&F[r+G]===F[r];++G);v=G;if(0===F[r])if(3>v)for(;0<v--;)E[D++]=0,
|
|
50230
|
-
H[0]++;else for(;0<v;)A=138>v?v:138,A>v-3&&A<v&&(A=v-3),10>=A?(E[D++]=17,E[D++]=A-3,H[17]++):(E[D++]=18,E[D++]=A-11,H[18]++),v-=A;else if(E[D++]=F[r],H[F[r]]++,v--,3>v)for(;0<v--;)E[D++]=F[r],H[F[r]]++;else for(;0<v;)A=6>v?v:6,A>v-3&&A<v&&(A=v-3),E[D++]=16,E[D++]=A-3,H[16]++,v-=A;}f=C?E.subarray(0,D):E.slice(0,D);ga=pa(H,7);for(y=0;19>y;y++)ja[y]=ga[La[y]];for(Q=19;4<Q&&0===ja[Q-1];Q--);wa=qa(ga);B.b(O-257,5,w);B.b(P-1,5,w);B.b(Q-4,4,w);for(y=0;y<Q;y++)B.b(ja[y],3,w);y=0;for(xa=f.length;y<xa;y++)if(R=
|
|
50231
|
-
f[y],B.b(wa[R],ga[R],w),16<=R){y++;switch(R){case 16:ha=2;break;case 17:ha=3;break;case 18:ha=7;break;default:throw "invalid code: "+R;}B.b(f[y],ha,w);}var Aa=[ua,X],Ba=[va,Y],I,Ca,$,ma,Da,Ea,Fa,Ga;Da=Aa[0];Ea=Aa[1];Fa=Ba[0];Ga=Ba[1];I=0;for(Ca=J.length;I<Ca;++I)if($=J[I],B.b(Da[$],Ea[$],w),256<$)B.b(J[++I],J[++I],w),ma=J[++I],B.b(Fa[ma],Ga[ma],w),B.b(J[++I],J[++I],w);else if(256===$)break;this.a=B.finish();this.c=this.a.length;break;default:throw "invalid compression type";}return this.a};
|
|
50232
|
-
function ra(f,d){this.length=f;this.k=d;}
|
|
50233
|
-
var sa=function(){function f(b){switch(w){case 3===b:return [257,b-3,0];case 4===b:return [258,b-4,0];case 5===b:return [259,b-5,0];case 6===b:return [260,b-6,0];case 7===b:return [261,b-7,0];case 8===b:return [262,b-8,0];case 9===b:return [263,b-9,0];case 10===b:return [264,b-10,0];case 12>=b:return [265,b-11,1];case 14>=b:return [266,b-13,1];case 16>=b:return [267,b-15,1];case 18>=b:return [268,b-17,1];case 22>=b:return [269,b-19,2];case 26>=b:return [270,b-23,2];case 30>=b:return [271,b-27,2];case 34>=b:return [272,
|
|
50234
|
-
b-31,2];case 42>=b:return [273,b-35,3];case 50>=b:return [274,b-43,3];case 58>=b:return [275,b-51,3];case 66>=b:return [276,b-59,3];case 82>=b:return [277,b-67,4];case 98>=b:return [278,b-83,4];case 114>=b:return [279,b-99,4];case 130>=b:return [280,b-115,4];case 162>=b:return [281,b-131,5];case 194>=b:return [282,b-163,5];case 226>=b:return [283,b-195,5];case 257>=b:return [284,b-227,5];case 258===b:return [285,b-258,0];default:throw "invalid length: "+b;}}var d=[],c,e;for(c=3;258>=c;c++)e=f(c),d[c]=e[2]<<24|
|
|
50235
|
-
e[1]<<16|e[0];return d}(),Ha=C?new Uint32Array(sa):sa;
|
|
50236
|
-
function oa(f,d){function c(b,c){var a=b.k,d=[],e=0,f;f=Ha[b.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(w){case 1===a:g=[0,a-1,0];break;case 2===a:g=[1,a-2,0];break;case 3===a:g=[2,a-3,0];break;case 4===a:g=[3,a-4,0];break;case 6>=a:g=[4,a-5,1];break;case 8>=a:g=[5,a-7,1];break;case 12>=a:g=[6,a-9,2];break;case 16>=a:g=[7,a-13,2];break;case 24>=a:g=[8,a-17,3];break;case 32>=a:g=[9,a-25,3];break;case 48>=a:g=[10,a-33,4];break;case 64>=a:g=[11,a-49,4];break;case 96>=a:g=[12,a-
|
|
50237
|
-
65,5];break;case 128>=a:g=[13,a-97,5];break;case 192>=a:g=[14,a-129,6];break;case 256>=a:g=[15,a-193,6];break;case 384>=a:g=[16,a-257,7];break;case 512>=a:g=[17,a-385,7];break;case 768>=a:g=[18,a-513,8];break;case 1024>=a:g=[19,a-769,8];break;case 1536>=a:g=[20,a-1025,9];break;case 2048>=a:g=[21,a-1537,9];break;case 3072>=a:g=[22,a-2049,10];break;case 4096>=a:g=[23,a-3073,10];break;case 6144>=a:g=[24,a-4097,11];break;case 8192>=a:g=[25,a-6145,11];break;case 12288>=a:g=[26,a-8193,12];break;case 16384>=
|
|
50238
|
-
a:g=[27,a-12289,12];break;case 24576>=a:g=[28,a-16385,13];break;case 32768>=a:g=[29,a-24577,13];break;default:throw "invalid distance";}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var k,m;k=0;for(m=d.length;k<m;++k)l[h++]=d[k];s[d[0]]++;x[d[3]]++;q=b.length+c-1;u=null;}var e,b,a,g,m,k={},p,t,u,l=C?new Uint16Array(2*d.length):[],h=0,q=0,s=new (C?Uint32Array:Array)(286),x=new (C?Uint32Array:Array)(30),fa=f.i,z;if(!C){for(a=0;285>=a;)s[a++]=0;for(a=0;29>=a;)x[a++]=0;}s[256]=1;e=0;for(b=d.length;e<b;++e){a=
|
|
50239
|
-
m=0;for(g=3;a<g&&e+a!==b;++a)m=m<<8|d[e+a];k[m]===n&&(k[m]=[]);p=k[m];if(!(0<q--)){for(;0<p.length&&32768<e-p[0];)p.shift();if(e+3>=b){u&&c(u,-1);a=0;for(g=b-e;a<g;++a)z=d[e+a],l[h++]=z,++s[z];break}0<p.length?(t=Ia(d,e,p),u?u.length<t.length?(z=d[e-1],l[h++]=z,++s[z],c(t,0)):c(u,-1):t.length<fa?u=t:c(t,0)):u?c(u,-1):(z=d[e],l[h++]=z,++s[z]);}p.push(e);}l[h++]=256;s[256]++;f.m=s;f.l=x;return C?l.subarray(0,h):l}
|
|
50240
|
-
function Ia(f,d,c){var e,b,a=0,g,m,k,p,t=f.length;m=0;p=c.length;a:for(;m<p;m++){e=c[p-m-1];g=3;if(3<a){for(k=a;3<k;k--)if(f[e+k-1]!==f[d+k-1])continue a;g=a;}for(;258>g&&d+g<t&&f[e+g]===f[d+g];)++g;g>a&&(b=e,a=g);if(258===g)break}return new ra(a,d-b)}
|
|
50241
|
-
function pa(f,d){var c=f.length,e=new ia(572),b=new (C?Uint8Array:Array)(c),a,g,m,k,p;if(!C)for(k=0;k<c;k++)b[k]=0;for(k=0;k<c;++k)0<f[k]&&e.push(k,f[k]);a=Array(e.length/2);g=new (C?Uint32Array:Array)(e.length/2);if(1===a.length)return b[e.pop().index]=1,b;k=0;for(p=e.length/2;k<p;++k)a[k]=e.pop(),g[k]=a[k].value;m=Ja(g,g.length,d);k=0;for(p=a.length;k<p;++k)b[a[k].index]=m[k];return b}
|
|
50242
|
-
function Ja(f,d,c){function e(a){var b=k[a][p[a]];b===d?(e(a+1),e(a+1)):--g[b];++p[a];}var b=new (C?Uint16Array:Array)(c),a=new (C?Uint8Array:Array)(c),g=new (C?Uint8Array:Array)(d),m=Array(c),k=Array(c),p=Array(c),t=(1<<c)-d,u=1<<c-1,l,h,q,s,x;b[c-1]=d;for(h=0;h<c;++h)t<u?a[h]=0:(a[h]=1,t-=u),t<<=1,b[c-2-h]=(b[c-1-h]/2|0)+d;b[0]=a[0];m[0]=Array(b[0]);k[0]=Array(b[0]);for(h=1;h<c;++h)b[h]>2*b[h-1]+a[h]&&(b[h]=2*b[h-1]+a[h]),m[h]=Array(b[h]),k[h]=Array(b[h]);for(l=0;l<d;++l)g[l]=c;for(q=0;q<b[c-1];++q)m[c-
|
|
50243
|
-
1][q]=f[q],k[c-1][q]=q;for(l=0;l<c;++l)p[l]=0;1===a[c-1]&&(--g[0],++p[c-1]);for(h=c-2;0<=h;--h){s=l=0;x=p[h+1];for(q=0;q<b[h];q++)s=m[h+1][x]+m[h+1][x+1],s>f[l]?(m[h][q]=s,k[h][q]=d,x+=2):(m[h][q]=f[l],k[h][q]=l,++l);p[h]=0;1===a[h]&&e(h);}return g}
|
|
50244
|
-
function qa(f){var d=new (C?Uint16Array:Array)(f.length),c=[],e=[],b=0,a,g,m,k;a=0;for(g=f.length;a<g;a++)c[f[a]]=(c[f[a]]|0)+1;a=1;for(g=16;a<=g;a++)e[a]=b,b+=c[a]|0,b<<=1;a=0;for(g=f.length;a<g;a++){b=e[f[a]];e[f[a]]+=1;m=d[a]=0;for(k=f[a];m<k;m++)d[a]=d[a]<<1|b&1,b>>>=1;}return d}function Ka(f,d){this.input=f;this.a=new (C?Uint8Array:Array)(32768);this.d=V.g;var c={},e;if((d||!(d={}))&&"number"===typeof d.compressionType)this.d=d.compressionType;for(e in d)c[e]=d[e];c.outputBuffer=this.a;this.j=new ka(this.input,c);}var V=na;
|
|
50245
|
-
Ka.prototype.f=function(){var f,d,c,e,b,a,g=0;a=this.a;switch(8){case 8:f=Math.LOG2E*Math.log(32768)-8;break;default:throw Error("invalid compression method");}d=f<<4|8;a[g++]=d;switch(8){case 8:switch(this.d){case V.NONE:e=0;break;case V.h:e=1;break;case V.g:e=2;break;default:throw Error("unsupported compression type");}break;default:throw Error("invalid compression method");}c=e<<6|0;a[g++]=c|31-(256*d+c)%31;var m=this.input;if("string"===typeof m){var k=m.split(""),p,t;p=0;for(t=k.length;p<t;p++)k[p]=
|
|
50246
|
-
(k[p].charCodeAt(0)&255)>>>0;m=k;}for(var u=1,l=0,h=m.length,q,s=0;0<h;){q=1024<h?1024:h;h-=q;do u+=m[s++],l+=u;while(--q);u%=65521;l%=65521;}b=(l<<16|u)>>>0;this.j.c=g;a=this.j.f();g=a.length;C&&(a=new Uint8Array(a.buffer),a.length<=g+4&&(this.a=new Uint8Array(a.length+4),this.a.set(a),a=this.a),a=a.subarray(0,g+4));a[g++]=b>>24&255;a[g++]=b>>16&255;a[g++]=b>>8&255;a[g++]=b&255;return a};ba("Zlib.Deflate",Ka);ba("Zlib.Deflate.compress",function(f,d){return (new Ka(f,d)).f()});ba("Zlib.Deflate.prototype.compress",Ka.prototype.f);var Ma={NONE:V.NONE,FIXED:V.h,DYNAMIC:V.g},Na,Oa,W,Pa;if(Object.keys)Na=Object.keys(Ma);else for(Oa in Na=[],W=0,Ma)Na[W++]=Oa;W=0;for(Pa=Na.length;W<Pa;++W)Oa=Na[W],ba("Zlib.Deflate.CompressionType."+Oa,Ma[Oa]);}).call(module.exports);
|
|
50247
|
-
} (deflate_min));
|
|
50248
|
-
|
|
50249
|
-
var deflate_minExports = deflate_min.exports;
|
|
50250
|
-
var ZLibDeflate = /*@__PURE__*/getDefaultExportFromCjs(deflate_minExports);
|
|
50251
|
-
|
|
50252
|
-
function toUTF8Array(str) {
|
|
50253
|
-
var utf8 = [];
|
|
50254
|
-
for (var i = 0; i < str.length; i++) {
|
|
50255
|
-
var charcode = str.charCodeAt(i);
|
|
50256
|
-
if (charcode < 0x80)
|
|
50257
|
-
utf8.push(charcode);
|
|
50258
|
-
else if (charcode < 0x800) {
|
|
50259
|
-
utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));
|
|
50260
|
-
}
|
|
50261
|
-
else if (charcode < 0xd800 || charcode >= 0xe000) {
|
|
50262
|
-
utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
50263
|
-
}
|
|
50264
|
-
else {
|
|
50265
|
-
// surrogate pair
|
|
50266
|
-
i++;
|
|
50267
|
-
// UTF-16 encodes 0x10000-0x10FFFF by
|
|
50268
|
-
// subtracting 0x10000 and splitting the
|
|
50269
|
-
// 20 bits of 0x0-0xFFFFF into two halves
|
|
50270
|
-
charcode = 0x10000 + (((charcode & 0x3ff) << 10) |
|
|
50271
|
-
(str.charCodeAt(i) & 0x3ff));
|
|
50272
|
-
utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
50273
|
-
}
|
|
50274
|
-
}
|
|
50275
|
-
return utf8;
|
|
50276
|
-
}
|
|
50277
|
-
|
|
50278
|
-
var Zlib = {
|
|
50279
|
-
'Deflate': ZLibDeflate.Zlib.Deflate
|
|
50280
|
-
};
|
|
50281
|
-
var Encoding = {
|
|
50282
|
-
'base64Url': 'base64url',
|
|
50283
|
-
'binary': 'binary'
|
|
50284
|
-
};
|
|
50285
|
-
function compress(json_obj, encoding) {
|
|
50286
|
-
if (!encoding) {
|
|
50287
|
-
encoding = Encoding.base64Url;
|
|
50288
|
-
}
|
|
50289
|
-
/* -- This is ZLIB */
|
|
50290
|
-
var compressData = toUTF8Array(typeof json_obj === 'string' ? json_obj : JSON.stringify(json_obj));
|
|
50291
|
-
var deflate = new Zlib.Deflate(compressData);
|
|
50292
|
-
var compressedBytes = deflate.compress();
|
|
50293
|
-
if (encoding === Encoding.base64Url) {
|
|
50294
|
-
return b64.uint8ToBase64(compressedBytes);
|
|
50295
|
-
}
|
|
50296
|
-
else {
|
|
50297
|
-
return compressedBytes;
|
|
50298
|
-
}
|
|
50299
|
-
}
|
|
50300
|
-
|
|
50301
|
-
var ONE_HUNDRED_MB_IN_BYTES = 100 * 1024 * 1024;
|
|
50302
|
-
function matchHostedResources(recordingEvent, stringifiedRecordingPayload) {
|
|
50303
|
-
var fontURLRegex = /https:\/\/[^\s]+?\.(woff|woff2|ttf|otf|eot)\b/g;
|
|
50304
|
-
var hostedResources = stringifiedRecordingPayload.match(fontURLRegex);
|
|
50305
|
-
return {
|
|
50306
|
-
'type': 'recording',
|
|
50307
|
-
'visitorId': recordingEvent.visitorId,
|
|
50308
|
-
'accountId': recordingEvent.accountId,
|
|
50309
|
-
'keyFrame': false,
|
|
50310
|
-
'lastKeyFrame': recordingEvent.lastKeyFrame,
|
|
50311
|
-
'recordingId': recordingEvent.recordingId,
|
|
50312
|
-
'recordingSessionId': recordingEvent.recordingSessionId,
|
|
50313
|
-
'url': recordingEvent.url,
|
|
50314
|
-
'subType': 'hostedResources',
|
|
50315
|
-
'recordingPayload': [],
|
|
50316
|
-
'recordingPayloadMetadata': [],
|
|
50317
|
-
'sequence': 0,
|
|
50318
|
-
'recordingPayloadCount': 0,
|
|
50319
|
-
'hostedResources': hostedResources || []
|
|
50320
|
-
};
|
|
50321
|
-
}
|
|
50322
|
-
// keep in mind changes here may need addressing in the extension worker proxy as well
|
|
50323
|
-
self.onmessage = function (e) {
|
|
50324
|
-
try {
|
|
50325
|
-
if (e.data.url && e.data.payload) {
|
|
50326
|
-
var _a = e.data, url = _a.url, payload = _a.payload, shouldCacheResources = _a.shouldCacheResources;
|
|
50327
|
-
var sequence_1 = payload.sequence;
|
|
50328
|
-
var stringifiedRecordingPayload = JSON.stringify(payload.recordingPayload);
|
|
50329
|
-
// calculate and post back the recording payload size before the payload is compressed
|
|
50330
|
-
var recordingPayloadSize = new TextEncoder().encode(stringifiedRecordingPayload).length;
|
|
50331
|
-
var exceedsPayloadSizeLimit = recordingPayloadSize >= ONE_HUNDRED_MB_IN_BYTES;
|
|
50332
|
-
postMessage({
|
|
50333
|
-
'type': 'recordingPayloadSize',
|
|
50334
|
-
'recordingPayloadSize': recordingPayloadSize,
|
|
50335
|
-
'exceedsPayloadSizeLimit': exceedsPayloadSizeLimit
|
|
50336
|
-
});
|
|
50337
|
-
// don't attempt to send the payload if it exceeds the allowed limit
|
|
50338
|
-
if (exceedsPayloadSizeLimit)
|
|
50339
|
-
return;
|
|
50340
|
-
if (shouldCacheResources) {
|
|
50341
|
-
var hostedResourcesEvent = matchHostedResources(payload, stringifiedRecordingPayload);
|
|
50342
|
-
if (hostedResourcesEvent.hostedResources.length) {
|
|
50343
|
-
postMessage({
|
|
50344
|
-
'type': 'hostedResources',
|
|
50345
|
-
'hostedResourcesEvent': hostedResourcesEvent
|
|
50346
|
-
});
|
|
50347
|
-
}
|
|
50348
|
-
}
|
|
50349
|
-
payload.recordingSize = recordingPayloadSize;
|
|
50350
|
-
var body = compress(payload, 'binary');
|
|
50351
|
-
// we want to calculate ct (current time) as close as we can to the actual POST request
|
|
50352
|
-
// so that it's as accurate as possible
|
|
50353
|
-
url = "".concat(url, "&ct=").concat(new Date().getTime());
|
|
50354
|
-
fetch(url, {
|
|
50355
|
-
'method': 'POST',
|
|
50356
|
-
'body': body
|
|
50357
|
-
}).then(function (response) {
|
|
50358
|
-
if (response.status < 200 || response.status >= 300) {
|
|
50359
|
-
postMessage({
|
|
50360
|
-
'error': new Error("received status code ".concat(response.status, ": ").concat(response.statusText)),
|
|
50361
|
-
'status': response.status,
|
|
50362
|
-
sequence: sequence_1
|
|
50363
|
-
});
|
|
50364
|
-
}
|
|
50365
|
-
else {
|
|
50366
|
-
postMessage({
|
|
50367
|
-
sequence: sequence_1
|
|
50368
|
-
});
|
|
50369
|
-
}
|
|
50370
|
-
})['catch'](function (e) {
|
|
50371
|
-
postMessage({
|
|
50372
|
-
'error': e,
|
|
50373
|
-
sequence: sequence_1
|
|
50374
|
-
});
|
|
50375
|
-
});
|
|
50376
|
-
}
|
|
50377
|
-
}
|
|
50378
|
-
catch (e) {
|
|
50379
|
-
postMessage({
|
|
50380
|
-
'error': e
|
|
50381
|
-
});
|
|
50382
|
-
}
|
|
50383
|
-
};
|
|
50384
|
-
|
|
50385
|
-
exports.matchHostedResources = matchHostedResources;
|
|
50386
|
-
|
|
50387
|
-
return exports;
|
|
50388
|
-
|
|
50389
|
-
}))({});
|
|
50390
|
-
|
|
50391
|
-
}, null);
|
|
50721
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgYjY0ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nLnNwbGl0KCcnKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3VpbnQ4VG9CYXNlNjQnOiB1aW50OFRvQmFzZTY0CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gdWludDhUb0Jhc2U2NCh1aW50OCkgewogICAgICAgICAgICB2YXIgaSwKICAgICAgICAgICAgICAgIGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlcwogICAgICAgICAgICAgICAgb3V0cHV0ID0gJycsCiAgICAgICAgICAgICAgICB0ZW1wLCBsZW5ndGg7CgogICAgICAgICAgICBmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQobnVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl07CiAgICAgICAgICAgIH0KCiAgICAJCS8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXIKICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdWludDgubGVuZ3RoIC0gZXh0cmFCeXRlczsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICAgICAgICB0ZW1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKTsKICAgICAgICAgICAgICAgIG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcCk7CiAgICAgICAgICAgIH0KCiAgICAJCS8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXMKICAgICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlCiAgICAgICAgICAgIHN3aXRjaCAoZXh0cmFCeXRlcykgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICB0ZW1wID0gdWludDhbdWludDgubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RlbXAgPj4gMl07CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gbG9va3VwWyh0ZW1wIDw8IDQpICYgMHgzRl07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgdGVtcCA9ICh1aW50OFt1aW50OC5sZW5ndGggLSAyXSA8PCA4KSArICh1aW50OFt1aW50OC5sZW5ndGggLSAxXSk7CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RlbXAgPj4gMTBdOwogICAgICAgICAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodGVtcCA+PiA0KSAmIDB4M0ZdOwogICAgICAgICAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodGVtcCA8PCAyKSAmIDB4M0ZdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgfQogICAgfSkoKTsKCiAgICBmdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyAoeCkgewogICAgCXJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7CiAgICB9CgogICAgdmFyIGRlZmxhdGVfbWluID0ge2V4cG9ydHM6IHt9fTsKCiAgICAvKgogICAgICogQGxpY2Vuc2UgemxpYi5qcyAyMDEyIC0gaW1heWEgWyBodHRwczovL2dpdGh1Yi5jb20vaW1heWEvemxpYi5qcyBdIFRoZSBNSVQgTGljZW5zZQogICAgICovCgogICAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAgIAkoZnVuY3Rpb24oKSB7dmFyIG49dm9pZCAwLHc9ITAsYWE9dGhpcztmdW5jdGlvbiBiYShmLGQpe3ZhciBjPWYuc3BsaXQoIi4iKSxlPWFhOyEoY1swXWluIGUpJiZlLmV4ZWNTY3JpcHQmJmUuZXhlY1NjcmlwdCgidmFyICIrY1swXSk7Zm9yKHZhciBiO2MubGVuZ3RoJiYoYj1jLnNoaWZ0KCkpOykhYy5sZW5ndGgmJmQhPT1uP2VbYl09ZDplPWVbYl0/ZVtiXTplW2JdPXt9O312YXIgQz0idW5kZWZpbmVkIiE9PXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9PXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPT10eXBlb2YgVWludDMyQXJyYXk7ZnVuY3Rpb24gSyhmLGQpe3RoaXMuaW5kZXg9Im51bWJlciI9PT10eXBlb2YgZD9kOjA7dGhpcy5lPTA7dGhpcy5idWZmZXI9ZiBpbnN0YW5jZW9mKEM/VWludDhBcnJheTpBcnJheSk/ZjpuZXcgKEM/VWludDhBcnJheTpBcnJheSkoMzI3NjgpO2lmKDIqdGhpcy5idWZmZXIubGVuZ3RoPD10aGlzLmluZGV4KXRocm93IEVycm9yKCJpbnZhbGlkIGluZGV4Iik7dGhpcy5idWZmZXIubGVuZ3RoPD10aGlzLmluZGV4JiZjYSh0aGlzKTt9ZnVuY3Rpb24gY2EoZil7dmFyIGQ9Zi5idWZmZXIsYyxlPWQubGVuZ3RoLGI9bmV3IChDP1VpbnQ4QXJyYXk6QXJyYXkpKGU8PDEpO2lmKEMpYi5zZXQoZCk7ZWxzZSBmb3IoYz0wO2M8ZTsrK2MpYltjXT1kW2NdO3JldHVybiBmLmJ1ZmZlcj1ifQogICAgCUsucHJvdG90eXBlLmI9ZnVuY3Rpb24oZixkLGMpe3ZhciBlPXRoaXMuYnVmZmVyLGI9dGhpcy5pbmRleCxhPXRoaXMuZSxnPWVbYl0sbTtjJiYxPGQmJihmPTg8ZD8oTFtmJjI1NV08PDI0fExbZj4+PjgmMjU1XTw8MTZ8TFtmPj4+MTYmMjU1XTw8OHxMW2Y+Pj4yNCYyNTVdKT4+MzItZDpMW2ZdPj44LWQpO2lmKDg+ZCthKWc9Zzw8ZHxmLGErPWQ7ZWxzZSBmb3IobT0wO208ZDsrK20pZz1nPDwxfGY+PmQtbS0xJjEsOD09PSsrYSYmKGE9MCxlW2IrK109TFtnXSxnPTAsYj09PWUubGVuZ3RoJiYoZT1jYSh0aGlzKSkpO2VbYl09Zzt0aGlzLmJ1ZmZlcj1lO3RoaXMuZT1hO3RoaXMuaW5kZXg9Yjt9O0sucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3ZhciBmPXRoaXMuYnVmZmVyLGQ9dGhpcy5pbmRleCxjOzA8dGhpcy5lJiYoZltkXTw8PTgtdGhpcy5lLGZbZF09TFtmW2RdXSxkKyspO0M/Yz1mLnN1YmFycmF5KDAsZCk6KGYubGVuZ3RoPWQsYz1mKTtyZXR1cm4gY307CiAgICAJdmFyIGRhPW5ldyAoQz9VaW50OEFycmF5OkFycmF5KSgyNTYpLE07Zm9yKE09MDsyNTY+TTsrK00pe2Zvcih2YXIgTj1NLFM9TixlYT03LE49Tj4+PjE7TjtOPj4+PTEpUzw8PTEsU3w9TiYxLC0tZWE7ZGFbTV09KFM8PGVhJjI1NSk+Pj4wO312YXIgTD1kYTtmdW5jdGlvbiBpYShmKXt0aGlzLmJ1ZmZlcj1uZXcgKEM/VWludDE2QXJyYXk6QXJyYXkpKDIqZik7dGhpcy5sZW5ndGg9MDt9aWEucHJvdG90eXBlLmdldFBhcmVudD1mdW5jdGlvbihmKXtyZXR1cm4gMiooKGYtMikvNHwwKX07aWEucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZixkKXt2YXIgYyxlLGI9dGhpcy5idWZmZXIsYTtjPXRoaXMubGVuZ3RoO2JbdGhpcy5sZW5ndGgrK109ZDtmb3IoYlt0aGlzLmxlbmd0aCsrXT1mOzA8YzspaWYoZT10aGlzLmdldFBhcmVudChjKSxiW2NdPmJbZV0pYT1iW2NdLGJbY109YltlXSxiW2VdPWEsYT1iW2MrMV0sYltjKzFdPWJbZSsxXSxiW2UrMV09YSxjPWU7ZWxzZSBicmVhaztyZXR1cm4gdGhpcy5sZW5ndGh9OwogICAgCWlhLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXt2YXIgZixkLGM9dGhpcy5idWZmZXIsZSxiLGE7ZD1jWzBdO2Y9Y1sxXTt0aGlzLmxlbmd0aC09MjtjWzBdPWNbdGhpcy5sZW5ndGhdO2NbMV09Y1t0aGlzLmxlbmd0aCsxXTtmb3IoYT0wOzspe2I9MiphKzI7aWYoYj49dGhpcy5sZW5ndGgpYnJlYWs7YisyPHRoaXMubGVuZ3RoJiZjW2IrMl0+Y1tiXSYmKGIrPTIpO2lmKGNbYl0+Y1thXSllPWNbYV0sY1thXT1jW2JdLGNbYl09ZSxlPWNbYSsxXSxjW2ErMV09Y1tiKzFdLGNbYisxXT1lO2Vsc2UgYnJlYWs7YT1iO31yZXR1cm4ge2luZGV4OmYsdmFsdWU6ZCxsZW5ndGg6dGhpcy5sZW5ndGh9fTtmdW5jdGlvbiBrYShmLGQpe3RoaXMuZD1sYTt0aGlzLmk9MDt0aGlzLmlucHV0PUMmJmYgaW5zdGFuY2VvZiBBcnJheT9uZXcgVWludDhBcnJheShmKTpmO3RoaXMuYz0wO2QmJihkLmxhenkmJih0aGlzLmk9ZC5sYXp5KSwibnVtYmVyIj09PXR5cGVvZiBkLmNvbXByZXNzaW9uVHlwZSYmKHRoaXMuZD1kLmNvbXByZXNzaW9uVHlwZSksZC5vdXRwdXRCdWZmZXImJih0aGlzLmE9QyYmZC5vdXRwdXRCdWZmZXIgaW5zdGFuY2VvZiBBcnJheT9uZXcgVWludDhBcnJheShkLm91dHB1dEJ1ZmZlcik6ZC5vdXRwdXRCdWZmZXIpLCJudW1iZXIiPT09dHlwZW9mIGQub3V0cHV0SW5kZXgmJih0aGlzLmM9ZC5vdXRwdXRJbmRleCkpO3RoaXMuYXx8KHRoaXMuYT1uZXcgKEM/VWludDhBcnJheTpBcnJheSkoMzI3NjgpKTt9dmFyIGxhPTIsbmE9e05PTkU6MCxoOjEsZzpsYSxuOjN9LFQ9W10sVTsKICAgIAlmb3IoVT0wOzI4OD5VO1UrKylzd2l0Y2godyl7Y2FzZSAxNDM+PVU6VC5wdXNoKFtVKzQ4LDhdKTticmVhaztjYXNlIDI1NT49VTpULnB1c2goW1UtMTQ0KzQwMCw5XSk7YnJlYWs7Y2FzZSAyNzk+PVU6VC5wdXNoKFtVLTI1NiswLDddKTticmVhaztjYXNlIDI4Nz49VTpULnB1c2goW1UtMjgwKzE5Miw4XSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyAiaW52YWxpZCBsaXRlcmFsOiAiK1U7fQogICAgCWthLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGYsZCxjLGUsYj10aGlzLmlucHV0O3N3aXRjaCh0aGlzLmQpe2Nhc2UgMDpjPTA7Zm9yKGU9Yi5sZW5ndGg7YzxlOyl7ZD1DP2Iuc3ViYXJyYXkoYyxjKzY1NTM1KTpiLnNsaWNlKGMsYys2NTUzNSk7Yys9ZC5sZW5ndGg7dmFyIGE9ZCxnPWM9PT1lLG09bixrPW4scD1uLHQ9bix1PW4sbD10aGlzLmEsaD10aGlzLmM7aWYoQyl7Zm9yKGw9bmV3IFVpbnQ4QXJyYXkodGhpcy5hLmJ1ZmZlcik7bC5sZW5ndGg8PWgrYS5sZW5ndGgrNTspbD1uZXcgVWludDhBcnJheShsLmxlbmd0aDw8MSk7bC5zZXQodGhpcy5hKTt9bT1nPzE6MDtsW2grK109bXwwO2s9YS5sZW5ndGg7cD1+ays2NTUzNiY2NTUzNTtsW2grK109ayYyNTU7bFtoKytdPWs+Pj44JjI1NTtsW2grK109cCYyNTU7bFtoKytdPXA+Pj44JjI1NTtpZihDKWwuc2V0KGEsaCksaCs9YS5sZW5ndGgsbD1sLnN1YmFycmF5KDAsaCk7ZWxzZSB7dD0wO2Zvcih1PWEubGVuZ3RoO3Q8dTsrK3QpbFtoKytdPQogICAgCWFbdF07bC5sZW5ndGg9aDt9dGhpcy5jPWg7dGhpcy5hPWw7fWJyZWFrO2Nhc2UgMTp2YXIgcT1uZXcgSyhDP25ldyBVaW50OEFycmF5KHRoaXMuYS5idWZmZXIpOnRoaXMuYSx0aGlzLmMpO3EuYigxLDEsdyk7cS5iKDEsMix3KTt2YXIgcz1vYSh0aGlzLGIpLHgsZmEsejt4PTA7Zm9yKGZhPXMubGVuZ3RoO3g8ZmE7eCsrKWlmKHo9c1t4XSxLLnByb3RvdHlwZS5iLmFwcGx5KHEsVFt6XSksMjU2PHopcS5iKHNbKyt4XSxzWysreF0sdykscS5iKHNbKyt4XSw1KSxxLmIoc1srK3hdLHNbKyt4XSx3KTtlbHNlIGlmKDI1Nj09PXopYnJlYWs7dGhpcy5hPXEuZmluaXNoKCk7dGhpcy5jPXRoaXMuYS5sZW5ndGg7YnJlYWs7Y2FzZSBsYTp2YXIgQj1uZXcgSyhDP25ldyBVaW50OEFycmF5KHRoaXMuYS5idWZmZXIpOnRoaXMuYSx0aGlzLmMpLHRhLEosTyxQLFEsTGE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLFgsdWEsWSx2YSxnYSxqYT1BcnJheSgxOSksCiAgICAJd2EsUixoYSx5LHhhO3RhPWxhO0IuYigxLDEsdyk7Qi5iKHRhLDIsdyk7Sj1vYSh0aGlzLGIpO1g9cGEodGhpcy5tLDE1KTt1YT1xYShYKTtZPXBhKHRoaXMubCw3KTt2YT1xYShZKTtmb3IoTz0yODY7MjU3PE8mJjA9PT1YW08tMV07Ty0tKTtmb3IoUD0zMDsxPFAmJjA9PT1ZW1AtMV07UC0tKTt2YXIgeWE9Tyx6YT1QLEY9bmV3IChDP1VpbnQzMkFycmF5OkFycmF5KSh5YSt6YSkscixHLHYsWixFPW5ldyAoQz9VaW50MzJBcnJheTpBcnJheSkoMzE2KSxELEEsSD1uZXcgKEM/VWludDhBcnJheTpBcnJheSkoMTkpO2ZvcihyPUc9MDtyPHlhO3IrKylGW0crK109WFtyXTtmb3Iocj0wO3I8emE7cisrKUZbRysrXT1ZW3JdO2lmKCFDKXtyPTA7Zm9yKFo9SC5sZW5ndGg7cjxaOysrcilIW3JdPTA7fXI9RD0wO2ZvcihaPUYubGVuZ3RoO3I8WjtyKz1HKXtmb3IoRz0xO3IrRzxaJiZGW3IrR109PT1GW3JdOysrRyk7dj1HO2lmKDA9PT1GW3JdKWlmKDM+dilmb3IoOzA8di0tOylFW0QrK109MCwKICAgIAlIWzBdKys7ZWxzZSBmb3IoOzA8djspQT0xMzg+dj92OjEzOCxBPnYtMyYmQTx2JiYoQT12LTMpLDEwPj1BPyhFW0QrK109MTcsRVtEKytdPUEtMyxIWzE3XSsrKTooRVtEKytdPTE4LEVbRCsrXT1BLTExLEhbMThdKyspLHYtPUE7ZWxzZSBpZihFW0QrK109RltyXSxIW0Zbcl1dKyssdi0tLDM+dilmb3IoOzA8di0tOylFW0QrK109RltyXSxIW0Zbcl1dKys7ZWxzZSBmb3IoOzA8djspQT02PnY/djo2LEE+di0zJiZBPHYmJihBPXYtMyksRVtEKytdPTE2LEVbRCsrXT1BLTMsSFsxNl0rKyx2LT1BO31mPUM/RS5zdWJhcnJheSgwLEQpOkUuc2xpY2UoMCxEKTtnYT1wYShILDcpO2Zvcih5PTA7MTk+eTt5KyspamFbeV09Z2FbTGFbeV1dO2ZvcihRPTE5OzQ8USYmMD09PWphW1EtMV07US0tKTt3YT1xYShnYSk7Qi5iKE8tMjU3LDUsdyk7Qi5iKFAtMSw1LHcpO0IuYihRLTQsNCx3KTtmb3IoeT0wO3k8UTt5KyspQi5iKGphW3ldLDMsdyk7eT0wO2Zvcih4YT1mLmxlbmd0aDt5PHhhO3krKylpZihSPQogICAgCWZbeV0sQi5iKHdhW1JdLGdhW1JdLHcpLDE2PD1SKXt5Kys7c3dpdGNoKFIpe2Nhc2UgMTY6aGE9MjticmVhaztjYXNlIDE3OmhhPTM7YnJlYWs7Y2FzZSAxODpoYT03O2JyZWFrO2RlZmF1bHQ6dGhyb3cgImludmFsaWQgY29kZTogIitSO31CLmIoZlt5XSxoYSx3KTt9dmFyIEFhPVt1YSxYXSxCYT1bdmEsWV0sSSxDYSwkLG1hLERhLEVhLEZhLEdhO0RhPUFhWzBdO0VhPUFhWzFdO0ZhPUJhWzBdO0dhPUJhWzFdO0k9MDtmb3IoQ2E9Si5sZW5ndGg7STxDYTsrK0kpaWYoJD1KW0ldLEIuYihEYVskXSxFYVskXSx3KSwyNTY8JClCLmIoSlsrK0ldLEpbKytJXSx3KSxtYT1KWysrSV0sQi5iKEZhW21hXSxHYVttYV0sdyksQi5iKEpbKytJXSxKWysrSV0sdyk7ZWxzZSBpZigyNTY9PT0kKWJyZWFrO3RoaXMuYT1CLmZpbmlzaCgpO3RoaXMuYz10aGlzLmEubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6dGhyb3cgImludmFsaWQgY29tcHJlc3Npb24gdHlwZSI7fXJldHVybiB0aGlzLmF9OwogICAgCWZ1bmN0aW9uIHJhKGYsZCl7dGhpcy5sZW5ndGg9Zjt0aGlzLms9ZDt9CiAgICAJdmFyIHNhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihiKXtzd2l0Y2godyl7Y2FzZSAzPT09YjpyZXR1cm4gWzI1NyxiLTMsMF07Y2FzZSA0PT09YjpyZXR1cm4gWzI1OCxiLTQsMF07Y2FzZSA1PT09YjpyZXR1cm4gWzI1OSxiLTUsMF07Y2FzZSA2PT09YjpyZXR1cm4gWzI2MCxiLTYsMF07Y2FzZSA3PT09YjpyZXR1cm4gWzI2MSxiLTcsMF07Y2FzZSA4PT09YjpyZXR1cm4gWzI2MixiLTgsMF07Y2FzZSA5PT09YjpyZXR1cm4gWzI2MyxiLTksMF07Y2FzZSAxMD09PWI6cmV0dXJuIFsyNjQsYi0xMCwwXTtjYXNlIDEyPj1iOnJldHVybiBbMjY1LGItMTEsMV07Y2FzZSAxND49YjpyZXR1cm4gWzI2NixiLTEzLDFdO2Nhc2UgMTY+PWI6cmV0dXJuIFsyNjcsYi0xNSwxXTtjYXNlIDE4Pj1iOnJldHVybiBbMjY4LGItMTcsMV07Y2FzZSAyMj49YjpyZXR1cm4gWzI2OSxiLTE5LDJdO2Nhc2UgMjY+PWI6cmV0dXJuIFsyNzAsYi0yMywyXTtjYXNlIDMwPj1iOnJldHVybiBbMjcxLGItMjcsMl07Y2FzZSAzND49YjpyZXR1cm4gWzI3MiwKICAgIAliLTMxLDJdO2Nhc2UgNDI+PWI6cmV0dXJuIFsyNzMsYi0zNSwzXTtjYXNlIDUwPj1iOnJldHVybiBbMjc0LGItNDMsM107Y2FzZSA1OD49YjpyZXR1cm4gWzI3NSxiLTUxLDNdO2Nhc2UgNjY+PWI6cmV0dXJuIFsyNzYsYi01OSwzXTtjYXNlIDgyPj1iOnJldHVybiBbMjc3LGItNjcsNF07Y2FzZSA5OD49YjpyZXR1cm4gWzI3OCxiLTgzLDRdO2Nhc2UgMTE0Pj1iOnJldHVybiBbMjc5LGItOTksNF07Y2FzZSAxMzA+PWI6cmV0dXJuIFsyODAsYi0xMTUsNF07Y2FzZSAxNjI+PWI6cmV0dXJuIFsyODEsYi0xMzEsNV07Y2FzZSAxOTQ+PWI6cmV0dXJuIFsyODIsYi0xNjMsNV07Y2FzZSAyMjY+PWI6cmV0dXJuIFsyODMsYi0xOTUsNV07Y2FzZSAyNTc+PWI6cmV0dXJuIFsyODQsYi0yMjcsNV07Y2FzZSAyNTg9PT1iOnJldHVybiBbMjg1LGItMjU4LDBdO2RlZmF1bHQ6dGhyb3cgImludmFsaWQgbGVuZ3RoOiAiK2I7fX12YXIgZD1bXSxjLGU7Zm9yKGM9MzsyNTg+PWM7YysrKWU9ZihjKSxkW2NdPWVbMl08PDI0fAogICAgCWVbMV08PDE2fGVbMF07cmV0dXJuIGR9KCksSGE9Qz9uZXcgVWludDMyQXJyYXkoc2EpOnNhOwogICAgCWZ1bmN0aW9uIG9hKGYsZCl7ZnVuY3Rpb24gYyhiLGMpe3ZhciBhPWIuayxkPVtdLGU9MCxmO2Y9SGFbYi5sZW5ndGhdO2RbZSsrXT1mJjY1NTM1O2RbZSsrXT1mPj4xNiYyNTU7ZFtlKytdPWY+PjI0O3ZhciBnO3N3aXRjaCh3KXtjYXNlIDE9PT1hOmc9WzAsYS0xLDBdO2JyZWFrO2Nhc2UgMj09PWE6Zz1bMSxhLTIsMF07YnJlYWs7Y2FzZSAzPT09YTpnPVsyLGEtMywwXTticmVhaztjYXNlIDQ9PT1hOmc9WzMsYS00LDBdO2JyZWFrO2Nhc2UgNj49YTpnPVs0LGEtNSwxXTticmVhaztjYXNlIDg+PWE6Zz1bNSxhLTcsMV07YnJlYWs7Y2FzZSAxMj49YTpnPVs2LGEtOSwyXTticmVhaztjYXNlIDE2Pj1hOmc9WzcsYS0xMywyXTticmVhaztjYXNlIDI0Pj1hOmc9WzgsYS0xNywzXTticmVhaztjYXNlIDMyPj1hOmc9WzksYS0yNSwzXTticmVhaztjYXNlIDQ4Pj1hOmc9WzEwLGEtMzMsNF07YnJlYWs7Y2FzZSA2ND49YTpnPVsxMSxhLTQ5LDRdO2JyZWFrO2Nhc2UgOTY+PWE6Zz1bMTIsYS0KICAgIAk2NSw1XTticmVhaztjYXNlIDEyOD49YTpnPVsxMyxhLTk3LDVdO2JyZWFrO2Nhc2UgMTkyPj1hOmc9WzE0LGEtMTI5LDZdO2JyZWFrO2Nhc2UgMjU2Pj1hOmc9WzE1LGEtMTkzLDZdO2JyZWFrO2Nhc2UgMzg0Pj1hOmc9WzE2LGEtMjU3LDddO2JyZWFrO2Nhc2UgNTEyPj1hOmc9WzE3LGEtMzg1LDddO2JyZWFrO2Nhc2UgNzY4Pj1hOmc9WzE4LGEtNTEzLDhdO2JyZWFrO2Nhc2UgMTAyND49YTpnPVsxOSxhLTc2OSw4XTticmVhaztjYXNlIDE1MzY+PWE6Zz1bMjAsYS0xMDI1LDldO2JyZWFrO2Nhc2UgMjA0OD49YTpnPVsyMSxhLTE1MzcsOV07YnJlYWs7Y2FzZSAzMDcyPj1hOmc9WzIyLGEtMjA0OSwxMF07YnJlYWs7Y2FzZSA0MDk2Pj1hOmc9WzIzLGEtMzA3MywxMF07YnJlYWs7Y2FzZSA2MTQ0Pj1hOmc9WzI0LGEtNDA5NywxMV07YnJlYWs7Y2FzZSA4MTkyPj1hOmc9WzI1LGEtNjE0NSwxMV07YnJlYWs7Y2FzZSAxMjI4OD49YTpnPVsyNixhLTgxOTMsMTJdO2JyZWFrO2Nhc2UgMTYzODQ+PQogICAgCWE6Zz1bMjcsYS0xMjI4OSwxMl07YnJlYWs7Y2FzZSAyNDU3Nj49YTpnPVsyOCxhLTE2Mzg1LDEzXTticmVhaztjYXNlIDMyNzY4Pj1hOmc9WzI5LGEtMjQ1NzcsMTNdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgImludmFsaWQgZGlzdGFuY2UiO31mPWc7ZFtlKytdPWZbMF07ZFtlKytdPWZbMV07ZFtlKytdPWZbMl07dmFyIGssbTtrPTA7Zm9yKG09ZC5sZW5ndGg7azxtOysraylsW2grK109ZFtrXTtzW2RbMF1dKys7eFtkWzNdXSsrO3E9Yi5sZW5ndGgrYy0xO3U9bnVsbDt9dmFyIGUsYixhLGcsbSxrPXt9LHAsdCx1LGw9Qz9uZXcgVWludDE2QXJyYXkoMipkLmxlbmd0aCk6W10saD0wLHE9MCxzPW5ldyAoQz9VaW50MzJBcnJheTpBcnJheSkoMjg2KSx4PW5ldyAoQz9VaW50MzJBcnJheTpBcnJheSkoMzApLGZhPWYuaSx6O2lmKCFDKXtmb3IoYT0wOzI4NT49YTspc1thKytdPTA7Zm9yKGE9MDsyOT49YTspeFthKytdPTA7fXNbMjU2XT0xO2U9MDtmb3IoYj1kLmxlbmd0aDtlPGI7KytlKXthPQogICAgCW09MDtmb3IoZz0zO2E8ZyYmZSthIT09YjsrK2EpbT1tPDw4fGRbZSthXTtrW21dPT09biYmKGtbbV09W10pO3A9a1ttXTtpZighKDA8cS0tKSl7Zm9yKDswPHAubGVuZ3RoJiYzMjc2ODxlLXBbMF07KXAuc2hpZnQoKTtpZihlKzM+PWIpe3UmJmModSwtMSk7YT0wO2ZvcihnPWItZTthPGc7KythKXo9ZFtlK2FdLGxbaCsrXT16LCsrc1t6XTticmVha30wPHAubGVuZ3RoPyh0PUlhKGQsZSxwKSx1P3UubGVuZ3RoPHQubGVuZ3RoPyh6PWRbZS0xXSxsW2grK109eiwrK3Nbel0sYyh0LDApKTpjKHUsLTEpOnQubGVuZ3RoPGZhP3U9dDpjKHQsMCkpOnU/Yyh1LC0xKTooej1kW2VdLGxbaCsrXT16LCsrc1t6XSk7fXAucHVzaChlKTt9bFtoKytdPTI1NjtzWzI1Nl0rKztmLm09cztmLmw9eDtyZXR1cm4gQz9sLnN1YmFycmF5KDAsaCk6bH0KICAgIAlmdW5jdGlvbiBJYShmLGQsYyl7dmFyIGUsYixhPTAsZyxtLGsscCx0PWYubGVuZ3RoO209MDtwPWMubGVuZ3RoO2E6Zm9yKDttPHA7bSsrKXtlPWNbcC1tLTFdO2c9MztpZigzPGEpe2ZvcihrPWE7MzxrO2stLSlpZihmW2Uray0xXSE9PWZbZCtrLTFdKWNvbnRpbnVlIGE7Zz1hO31mb3IoOzI1OD5nJiZkK2c8dCYmZltlK2ddPT09ZltkK2ddOykrK2c7Zz5hJiYoYj1lLGE9Zyk7aWYoMjU4PT09ZylicmVha31yZXR1cm4gbmV3IHJhKGEsZC1iKX0KICAgIAlmdW5jdGlvbiBwYShmLGQpe3ZhciBjPWYubGVuZ3RoLGU9bmV3IGlhKDU3MiksYj1uZXcgKEM/VWludDhBcnJheTpBcnJheSkoYyksYSxnLG0sayxwO2lmKCFDKWZvcihrPTA7azxjO2srKyliW2tdPTA7Zm9yKGs9MDtrPGM7KytrKTA8ZltrXSYmZS5wdXNoKGssZltrXSk7YT1BcnJheShlLmxlbmd0aC8yKTtnPW5ldyAoQz9VaW50MzJBcnJheTpBcnJheSkoZS5sZW5ndGgvMik7aWYoMT09PWEubGVuZ3RoKXJldHVybiBiW2UucG9wKCkuaW5kZXhdPTEsYjtrPTA7Zm9yKHA9ZS5sZW5ndGgvMjtrPHA7KytrKWFba109ZS5wb3AoKSxnW2tdPWFba10udmFsdWU7bT1KYShnLGcubGVuZ3RoLGQpO2s9MDtmb3IocD1hLmxlbmd0aDtrPHA7KytrKWJbYVtrXS5pbmRleF09bVtrXTtyZXR1cm4gYn0KICAgIAlmdW5jdGlvbiBKYShmLGQsYyl7ZnVuY3Rpb24gZShhKXt2YXIgYj1rW2FdW3BbYV1dO2I9PT1kPyhlKGErMSksZShhKzEpKTotLWdbYl07KytwW2FdO312YXIgYj1uZXcgKEM/VWludDE2QXJyYXk6QXJyYXkpKGMpLGE9bmV3IChDP1VpbnQ4QXJyYXk6QXJyYXkpKGMpLGc9bmV3IChDP1VpbnQ4QXJyYXk6QXJyYXkpKGQpLG09QXJyYXkoYyksaz1BcnJheShjKSxwPUFycmF5KGMpLHQ9KDE8PGMpLWQsdT0xPDxjLTEsbCxoLHEscyx4O2JbYy0xXT1kO2ZvcihoPTA7aDxjOysraCl0PHU/YVtoXT0wOihhW2hdPTEsdC09dSksdDw8PTEsYltjLTItaF09KGJbYy0xLWhdLzJ8MCkrZDtiWzBdPWFbMF07bVswXT1BcnJheShiWzBdKTtrWzBdPUFycmF5KGJbMF0pO2ZvcihoPTE7aDxjOysraCliW2hdPjIqYltoLTFdK2FbaF0mJihiW2hdPTIqYltoLTFdK2FbaF0pLG1baF09QXJyYXkoYltoXSksa1toXT1BcnJheShiW2hdKTtmb3IobD0wO2w8ZDsrK2wpZ1tsXT1jO2ZvcihxPTA7cTxiW2MtMV07KytxKW1bYy0KICAgIAkxXVtxXT1mW3FdLGtbYy0xXVtxXT1xO2ZvcihsPTA7bDxjOysrbClwW2xdPTA7MT09PWFbYy0xXSYmKC0tZ1swXSwrK3BbYy0xXSk7Zm9yKGg9Yy0yOzA8PWg7LS1oKXtzPWw9MDt4PXBbaCsxXTtmb3IocT0wO3E8YltoXTtxKyspcz1tW2grMV1beF0rbVtoKzFdW3grMV0scz5mW2xdPyhtW2hdW3FdPXMsa1toXVtxXT1kLHgrPTIpOihtW2hdW3FdPWZbbF0sa1toXVtxXT1sLCsrbCk7cFtoXT0wOzE9PT1hW2hdJiZlKGgpO31yZXR1cm4gZ30KICAgIAlmdW5jdGlvbiBxYShmKXt2YXIgZD1uZXcgKEM/VWludDE2QXJyYXk6QXJyYXkpKGYubGVuZ3RoKSxjPVtdLGU9W10sYj0wLGEsZyxtLGs7YT0wO2ZvcihnPWYubGVuZ3RoO2E8ZzthKyspY1tmW2FdXT0oY1tmW2FdXXwwKSsxO2E9MTtmb3IoZz0xNjthPD1nO2ErKyllW2FdPWIsYis9Y1thXXwwLGI8PD0xO2E9MDtmb3IoZz1mLmxlbmd0aDthPGc7YSsrKXtiPWVbZlthXV07ZVtmW2FdXSs9MTttPWRbYV09MDtmb3Ioaz1mW2FdO208azttKyspZFthXT1kW2FdPDwxfGImMSxiPj4+PTE7fXJldHVybiBkfWZ1bmN0aW9uIEthKGYsZCl7dGhpcy5pbnB1dD1mO3RoaXMuYT1uZXcgKEM/VWludDhBcnJheTpBcnJheSkoMzI3NjgpO3RoaXMuZD1WLmc7dmFyIGM9e30sZTtpZigoZHx8IShkPXt9KSkmJiJudW1iZXIiPT09dHlwZW9mIGQuY29tcHJlc3Npb25UeXBlKXRoaXMuZD1kLmNvbXByZXNzaW9uVHlwZTtmb3IoZSBpbiBkKWNbZV09ZFtlXTtjLm91dHB1dEJ1ZmZlcj10aGlzLmE7dGhpcy5qPW5ldyBrYSh0aGlzLmlucHV0LGMpO312YXIgVj1uYTsKICAgIAlLYS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBmLGQsYyxlLGIsYSxnPTA7YT10aGlzLmE7c3dpdGNoKDgpe2Nhc2UgODpmPU1hdGguTE9HMkUqTWF0aC5sb2coMzI3NjgpLTg7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCBjb21wcmVzc2lvbiBtZXRob2QiKTt9ZD1mPDw0fDg7YVtnKytdPWQ7c3dpdGNoKDgpe2Nhc2UgODpzd2l0Y2godGhpcy5kKXtjYXNlIFYuTk9ORTplPTA7YnJlYWs7Y2FzZSBWLmg6ZT0xO2JyZWFrO2Nhc2UgVi5nOmU9MjticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlIik7fWJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgY29tcHJlc3Npb24gbWV0aG9kIik7fWM9ZTw8NnwwO2FbZysrXT1jfDMxLSgyNTYqZCtjKSUzMTt2YXIgbT10aGlzLmlucHV0O2lmKCJzdHJpbmciPT09dHlwZW9mIG0pe3ZhciBrPW0uc3BsaXQoIiIpLHAsdDtwPTA7Zm9yKHQ9ay5sZW5ndGg7cDx0O3ArKylrW3BdPQogICAgCShrW3BdLmNoYXJDb2RlQXQoMCkmMjU1KT4+PjA7bT1rO31mb3IodmFyIHU9MSxsPTAsaD1tLmxlbmd0aCxxLHM9MDswPGg7KXtxPTEwMjQ8aD8xMDI0Omg7aC09cTtkbyB1Kz1tW3MrK10sbCs9dTt3aGlsZSgtLXEpO3UlPTY1NTIxO2wlPTY1NTIxO31iPShsPDwxNnx1KT4+PjA7dGhpcy5qLmM9ZzthPXRoaXMuai5mKCk7Zz1hLmxlbmd0aDtDJiYoYT1uZXcgVWludDhBcnJheShhLmJ1ZmZlciksYS5sZW5ndGg8PWcrNCYmKHRoaXMuYT1uZXcgVWludDhBcnJheShhLmxlbmd0aCs0KSx0aGlzLmEuc2V0KGEpLGE9dGhpcy5hKSxhPWEuc3ViYXJyYXkoMCxnKzQpKTthW2crK109Yj4+MjQmMjU1O2FbZysrXT1iPj4xNiYyNTU7YVtnKytdPWI+PjgmMjU1O2FbZysrXT1iJjI1NTtyZXR1cm4gYX07YmEoIlpsaWIuRGVmbGF0ZSIsS2EpO2JhKCJabGliLkRlZmxhdGUuY29tcHJlc3MiLGZ1bmN0aW9uKGYsZCl7cmV0dXJuIChuZXcgS2EoZixkKSkuZigpfSk7YmEoIlpsaWIuRGVmbGF0ZS5wcm90b3R5cGUuY29tcHJlc3MiLEthLnByb3RvdHlwZS5mKTt2YXIgTWE9e05PTkU6Vi5OT05FLEZJWEVEOlYuaCxEWU5BTUlDOlYuZ30sTmEsT2EsVyxQYTtpZihPYmplY3Qua2V5cylOYT1PYmplY3Qua2V5cyhNYSk7ZWxzZSBmb3IoT2EgaW4gTmE9W10sVz0wLE1hKU5hW1crK109T2E7Vz0wO2ZvcihQYT1OYS5sZW5ndGg7VzxQYTsrK1cpT2E9TmFbV10sYmEoIlpsaWIuRGVmbGF0ZS5Db21wcmVzc2lvblR5cGUuIitPYSxNYVtPYV0pO30pLmNhbGwobW9kdWxlLmV4cG9ydHMpOyAKICAgIH0gKGRlZmxhdGVfbWluKSk7CgogICAgdmFyIGRlZmxhdGVfbWluRXhwb3J0cyA9IGRlZmxhdGVfbWluLmV4cG9ydHM7CiAgICB2YXIgWkxpYkRlZmxhdGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoZGVmbGF0ZV9taW5FeHBvcnRzKTsKCiAgICBmdW5jdGlvbiB0b1VURjhBcnJheShzdHIpIHsKICAgICAgICB2YXIgdXRmOCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjaGFyY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoY2hhcmNvZGUgPCAweDgwKQogICAgICAgICAgICAgICAgdXRmOC5wdXNoKGNoYXJjb2RlKTsKICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmNvZGUgPCAweDgwMCkgewogICAgICAgICAgICAgICAgdXRmOC5wdXNoKDB4YzAgfCAoY2hhcmNvZGUgPj4gNiksIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmNvZGUgPCAweGQ4MDAgfHwgY2hhcmNvZGUgPj0gMHhlMDAwKSB7CiAgICAgICAgICAgICAgICB1dGY4LnB1c2goMHhlMCB8IChjaGFyY29kZSA+PiAxMiksIDB4ODAgfCAoKGNoYXJjb2RlID4+IDYpICYgMHgzZiksIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcgogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgLy8gVVRGLTE2IGVuY29kZXMgMHgxMDAwMC0weDEwRkZGRiBieQogICAgICAgICAgICAgICAgLy8gc3VidHJhY3RpbmcgMHgxMDAwMCBhbmQgc3BsaXR0aW5nIHRoZQogICAgICAgICAgICAgICAgLy8gMjAgYml0cyBvZiAweDAtMHhGRkZGRiBpbnRvIHR3byBoYWx2ZXMKICAgICAgICAgICAgICAgIGNoYXJjb2RlID0gMHgxMDAwMCArICgoKGNoYXJjb2RlICYgMHgzZmYpIDw8IDEwKSB8CiAgICAgICAgICAgICAgICAgICAgKHN0ci5jaGFyQ29kZUF0KGkpICYgMHgzZmYpKTsKICAgICAgICAgICAgICAgIHV0ZjgucHVzaCgweGYwIHwgKGNoYXJjb2RlID4+IDE4KSwgMHg4MCB8ICgoY2hhcmNvZGUgPj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNoYXJjb2RlID4+IDYpICYgMHgzZiksIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHV0Zjg7CiAgICB9CgogICAgdmFyIFpsaWIgPSB7CiAgICAgICAgJ0RlZmxhdGUnOiBaTGliRGVmbGF0ZS5abGliLkRlZmxhdGUKICAgIH07CiAgICB2YXIgRW5jb2RpbmcgPSB7CiAgICAgICAgJ2Jhc2U2NFVybCc6ICdiYXNlNjR1cmwnLAogICAgICAgICdiaW5hcnknOiAnYmluYXJ5JwogICAgfTsKICAgIGZ1bmN0aW9uIGNvbXByZXNzKGpzb25fb2JqLCBlbmNvZGluZykgewogICAgICAgIGlmICghZW5jb2RpbmcpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5iYXNlNjRVcmw7CiAgICAgICAgfQogICAgICAgIC8qIC0tIFRoaXMgaXMgWkxJQiAqLwogICAgICAgIHZhciBjb21wcmVzc0RhdGEgPSB0b1VURjhBcnJheSh0eXBlb2YganNvbl9vYmogPT09ICdzdHJpbmcnID8ganNvbl9vYmogOiBKU09OLnN0cmluZ2lmeShqc29uX29iaikpOwogICAgICAgIHZhciBkZWZsYXRlID0gbmV3IFpsaWIuRGVmbGF0ZShjb21wcmVzc0RhdGEpOwogICAgICAgIHZhciBjb21wcmVzc2VkQnl0ZXMgPSBkZWZsYXRlLmNvbXByZXNzKCk7CiAgICAgICAgaWYgKGVuY29kaW5nID09PSBFbmNvZGluZy5iYXNlNjRVcmwpIHsKICAgICAgICAgICAgcmV0dXJuIGI2NC51aW50OFRvQmFzZTY0KGNvbXByZXNzZWRCeXRlcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gY29tcHJlc3NlZEJ5dGVzOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgT05FX0hVTkRSRURfTUJfSU5fQllURVMgPSAxMDAgKiAxMDI0ICogMTAyNDsKICAgIGZ1bmN0aW9uIG1hdGNoSG9zdGVkUmVzb3VyY2VzKHJlY29yZGluZ0V2ZW50LCBzdHJpbmdpZmllZFJlY29yZGluZ1BheWxvYWQpIHsKICAgICAgICB2YXIgZm9udFVSTFJlZ2V4ID0gL2h0dHBzOlwvXC9bXlxzXSs/XC4od29mZnx3b2ZmMnx0dGZ8b3RmfGVvdClcYi9nOwogICAgICAgIHZhciBob3N0ZWRSZXNvdXJjZXMgPSBzdHJpbmdpZmllZFJlY29yZGluZ1BheWxvYWQubWF0Y2goZm9udFVSTFJlZ2V4KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAndHlwZSc6ICdyZWNvcmRpbmcnLAogICAgICAgICAgICAndmlzaXRvcklkJzogcmVjb3JkaW5nRXZlbnQudmlzaXRvcklkLAogICAgICAgICAgICAnYWNjb3VudElkJzogcmVjb3JkaW5nRXZlbnQuYWNjb3VudElkLAogICAgICAgICAgICAna2V5RnJhbWUnOiBmYWxzZSwKICAgICAgICAgICAgJ2xhc3RLZXlGcmFtZSc6IHJlY29yZGluZ0V2ZW50Lmxhc3RLZXlGcmFtZSwKICAgICAgICAgICAgJ3JlY29yZGluZ0lkJzogcmVjb3JkaW5nRXZlbnQucmVjb3JkaW5nSWQsCiAgICAgICAgICAgICdyZWNvcmRpbmdTZXNzaW9uSWQnOiByZWNvcmRpbmdFdmVudC5yZWNvcmRpbmdTZXNzaW9uSWQsCiAgICAgICAgICAgICd1cmwnOiByZWNvcmRpbmdFdmVudC51cmwsCiAgICAgICAgICAgICdzdWJUeXBlJzogJ2hvc3RlZFJlc291cmNlcycsCiAgICAgICAgICAgICdyZWNvcmRpbmdQYXlsb2FkJzogW10sCiAgICAgICAgICAgICdyZWNvcmRpbmdQYXlsb2FkTWV0YWRhdGEnOiBbXSwKICAgICAgICAgICAgJ3NlcXVlbmNlJzogMCwKICAgICAgICAgICAgJ3JlY29yZGluZ1BheWxvYWRDb3VudCc6IDAsCiAgICAgICAgICAgICdob3N0ZWRSZXNvdXJjZXMnOiBob3N0ZWRSZXNvdXJjZXMgfHwgW10KICAgICAgICB9OwogICAgfQogICAgLy8ga2VlcCBpbiBtaW5kIGNoYW5nZXMgaGVyZSBtYXkgbmVlZCBhZGRyZXNzaW5nIGluIHRoZSBleHRlbnNpb24gd29ya2VyIHByb3h5IGFzIHdlbGwKICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoZS5kYXRhLnVybCAmJiBlLmRhdGEucGF5bG9hZCkgewogICAgICAgICAgICAgICAgdmFyIF9hID0gZS5kYXRhLCB1cmwgPSBfYS51cmwsIHBheWxvYWQgPSBfYS5wYXlsb2FkLCBzaG91bGRDYWNoZVJlc291cmNlcyA9IF9hLnNob3VsZENhY2hlUmVzb3VyY2VzOwogICAgICAgICAgICAgICAgdmFyIHNlcXVlbmNlXzEgPSBwYXlsb2FkLnNlcXVlbmNlOwogICAgICAgICAgICAgICAgdmFyIHN0cmluZ2lmaWVkUmVjb3JkaW5nUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQucmVjb3JkaW5nUGF5bG9hZCk7CiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgYW5kIHBvc3QgYmFjayB0aGUgcmVjb3JkaW5nIHBheWxvYWQgc2l6ZSBiZWZvcmUgdGhlIHBheWxvYWQgaXMgY29tcHJlc3NlZAogICAgICAgICAgICAgICAgdmFyIHJlY29yZGluZ1BheWxvYWRTaXplID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cmluZ2lmaWVkUmVjb3JkaW5nUGF5bG9hZCkubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGV4Y2VlZHNQYXlsb2FkU2l6ZUxpbWl0ID0gcmVjb3JkaW5nUGF5bG9hZFNpemUgPj0gT05FX0hVTkRSRURfTUJfSU5fQllURVM7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAncmVjb3JkaW5nUGF5bG9hZFNpemUnLAogICAgICAgICAgICAgICAgICAgICdyZWNvcmRpbmdQYXlsb2FkU2l6ZSc6IHJlY29yZGluZ1BheWxvYWRTaXplLAogICAgICAgICAgICAgICAgICAgICdleGNlZWRzUGF5bG9hZFNpemVMaW1pdCc6IGV4Y2VlZHNQYXlsb2FkU2l6ZUxpbWl0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGUgcGF5bG9hZCBpZiBpdCBleGNlZWRzIHRoZSBhbGxvd2VkIGxpbWl0CiAgICAgICAgICAgICAgICBpZiAoZXhjZWVkc1BheWxvYWRTaXplTGltaXQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZENhY2hlUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvc3RlZFJlc291cmNlc0V2ZW50ID0gbWF0Y2hIb3N0ZWRSZXNvdXJjZXMocGF5bG9hZCwgc3RyaW5naWZpZWRSZWNvcmRpbmdQYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdGVkUmVzb3VyY2VzRXZlbnQuaG9zdGVkUmVzb3VyY2VzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdob3N0ZWRSZXNvdXJjZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RlZFJlc291cmNlc0V2ZW50JzogaG9zdGVkUmVzb3VyY2VzRXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGF5bG9hZC5yZWNvcmRpbmdTaXplID0gcmVjb3JkaW5nUGF5bG9hZFNpemU7CiAgICAgICAgICAgICAgICB2YXIgYm9keSA9IGNvbXByZXNzKHBheWxvYWQsICdiaW5hcnknKTsKICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gY2FsY3VsYXRlIGN0IChjdXJyZW50IHRpbWUpIGFzIGNsb3NlIGFzIHdlIGNhbiB0byB0aGUgYWN0dWFsIFBPU1QgcmVxdWVzdAogICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCdzIGFzIGFjY3VyYXRlIGFzIHBvc3NpYmxlCiAgICAgICAgICAgICAgICB1cmwgPSAiIi5jb25jYXQodXJsLCAiJmN0PSIpLmNvbmNhdChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICBmZXRjaCh1cmwsIHsKICAgICAgICAgICAgICAgICAgICAnbWV0aG9kJzogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICdib2R5JzogYm9keQogICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJzogbmV3IEVycm9yKCJyZWNlaXZlZCBzdGF0dXMgY29kZSAiLmNvbmNhdChyZXNwb25zZS5zdGF0dXMsICI6ICIpLmNvbmNhdChyZXNwb25zZS5zdGF0dXNUZXh0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlXzEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTogc2VxdWVuY2VfMQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlXzEKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICdlcnJvcic6IGUKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICBleHBvcnRzLm1hdGNoSG9zdGVkUmVzb3VyY2VzID0gbWF0Y2hIb3N0ZWRSZXNvdXJjZXM7CgogICAgcmV0dXJuIGV4cG9ydHM7Cgp9KSh7fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXdvcmtlci5qcy5tYXAKCg==', null, false);
|
|
50392
50722
|
/* eslint-enable */
|
|
50393
50723
|
|
|
50394
50724
|
function createReplayPlugin() {
|