@atlaskit/media-file-preview 0.15.1 → 0.15.3
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/CHANGELOG.md +16 -0
- package/dist/cjs/globalScope/globalScope.js +18 -79
- package/dist/cjs/globalScope/originalScriptCode.js +93 -0
- package/dist/cjs/useFilePreview.js +14 -7
- package/dist/es2019/globalScope/globalScope.js +17 -71
- package/dist/es2019/globalScope/originalScriptCode.js +89 -0
- package/dist/es2019/useFilePreview.js +18 -11
- package/dist/esm/globalScope/globalScope.js +17 -75
- package/dist/esm/globalScope/originalScriptCode.js +91 -0
- package/dist/esm/useFilePreview.js +14 -7
- package/dist/types/globalScope/globalScope.d.ts +2 -3
- package/dist/types/globalScope/originalScriptCode.d.ts +0 -0
- package/dist/types/useFilePreview.d.ts +1 -1
- package/dist/types-ts4.5/globalScope/globalScope.d.ts +2 -3
- package/dist/types-ts4.5/globalScope/originalScriptCode.d.ts +0 -0
- package/dist/types-ts4.5/useFilePreview.d.ts +1 -1
- package/package.json +4 -7
- package/dist/cjs/globalScope/printScript.js +0 -37
- package/dist/es2019/globalScope/printScript.js +0 -23
- package/dist/esm/globalScope/printScript.js +0 -30
- package/dist/types/globalScope/printScript.d.ts +0 -2
- package/dist/types-ts4.5/globalScope/printScript.d.ts +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/media-file-preview
|
|
2
2
|
|
|
3
|
+
## 0.15.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`71b895a2fd401`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/71b895a2fd401) -
|
|
8
|
+
Fix SSR preview generation to only be attempted in SSR and not in client if the ssr="client" prop
|
|
9
|
+
is sent
|
|
10
|
+
- Updated dependencies
|
|
11
|
+
|
|
12
|
+
## 0.15.2
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- [`5e282b606cfbf`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5e282b606cfbf) -
|
|
17
|
+
Fixing the inline script to be injected correctly without susception to minification
|
|
18
|
+
|
|
3
19
|
## 0.15.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -3,13 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getKey = exports.generateScriptProps = exports.GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_CARD_SSR = void 0;
|
|
6
|
+
exports.getKey = exports.generateScriptProps = exports.GLOBAL_MEDIA_PERFORMANCE_ENTRIES = exports.GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_CARD_SSR = void 0;
|
|
7
7
|
exports.getMediaCardSSR = getMediaCardSSR;
|
|
8
|
-
exports.getMediaCountSSR = getMediaCountSSR;
|
|
9
8
|
exports.getMediaGlobalScope = getMediaGlobalScope;
|
|
10
|
-
exports.incrementMediaCountSSR = incrementMediaCountSSR;
|
|
11
|
-
exports.storeDataURI = void 0;
|
|
12
|
-
var _printScript = require("./printScript");
|
|
13
9
|
// ----- WARNING -----
|
|
14
10
|
// This is a very sensitive fraction of code.
|
|
15
11
|
// Any changes to this file must be tested directly in product before merging.
|
|
@@ -18,6 +14,7 @@ var _printScript = require("./printScript");
|
|
|
18
14
|
|
|
19
15
|
var GLOBAL_MEDIA_CARD_SSR = exports.GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
|
|
20
16
|
var GLOBAL_MEDIA_COUNT_SSR = exports.GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
|
|
17
|
+
var GLOBAL_MEDIA_PERFORMANCE_ENTRIES = exports.GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
|
|
21
18
|
var GLOBAL_MEDIA_NAMESPACE = exports.GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
|
|
22
19
|
var MAX_EAGER_LOAD_COUNT = 6;
|
|
23
20
|
function getMediaGlobalScope() {
|
|
@@ -39,26 +36,6 @@ function getMediaCardSSR() {
|
|
|
39
36
|
}
|
|
40
37
|
return globalMedia[key];
|
|
41
38
|
}
|
|
42
|
-
function getMediaCountSSR() {
|
|
43
|
-
var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
|
|
44
|
-
var globalMedia = getMediaGlobalScope(globalScope);
|
|
45
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
46
|
-
var key = 'mediaCountSsr';
|
|
47
|
-
if (!globalMedia[key]) {
|
|
48
|
-
globalMedia[key] = 0;
|
|
49
|
-
}
|
|
50
|
-
return globalMedia[key];
|
|
51
|
-
}
|
|
52
|
-
function incrementMediaCountSSR() {
|
|
53
|
-
var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
|
|
54
|
-
var globalMedia = getMediaGlobalScope(globalScope);
|
|
55
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
56
|
-
var key = 'mediaCountSsr';
|
|
57
|
-
if (!globalMedia[key]) {
|
|
58
|
-
globalMedia[key] = 0;
|
|
59
|
-
}
|
|
60
|
-
globalMedia[key]++;
|
|
61
|
-
}
|
|
62
39
|
var dashed = function dashed(param) {
|
|
63
40
|
return param ? "-".concat(param) : '';
|
|
64
41
|
};
|
|
@@ -68,62 +45,24 @@ var getKey = exports.getKey = function getKey(_ref, resizeMode) {
|
|
|
68
45
|
occurrenceKey = _ref.occurrenceKey;
|
|
69
46
|
return "".concat(id).concat(dashed(collectionName)).concat(dashed(occurrenceKey)).concat(dashed(resizeMode));
|
|
70
47
|
};
|
|
71
|
-
var storeDataURI = exports.storeDataURI = function storeDataURI(key, paramDataURI, paramMode, paramSrcSet, dimensions, error) {
|
|
72
|
-
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
73
|
-
var globalScope = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : window;
|
|
74
|
-
var mediaCardSsr = getMediaCardSSR(globalScope);
|
|
75
|
-
var mediaCountSsr = getMediaCountSSR(globalScope);
|
|
76
|
-
if (featureFlags['media-perf-uplift-mutation-fix']) {
|
|
77
|
-
var _prevData$dimensions, _script;
|
|
78
|
-
var prevData = mediaCardSsr[key];
|
|
79
|
-
var isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
80
|
-
var srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
|
|
81
|
-
var dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
|
|
82
|
-
var currData = {
|
|
83
|
-
dataURI: dataURI,
|
|
84
|
-
dimensions: dimensions,
|
|
85
|
-
error: error,
|
|
86
|
-
srcSet: srcSet,
|
|
87
|
-
loading: 'lazy'
|
|
88
|
-
};
|
|
89
|
-
var img = (_script = script) === null || _script === void 0 || (_script = _script.parentElement) === null || _script === void 0 ? void 0 : _script.querySelector('img');
|
|
90
|
-
if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
|
|
91
|
-
incrementMediaCountSSR(globalScope);
|
|
92
|
-
if (img.getAttribute('loading') === 'lazy') {
|
|
93
|
-
img.removeAttribute('loading');
|
|
94
|
-
}
|
|
95
|
-
currData.loading = '';
|
|
96
|
-
}
|
|
97
|
-
if (img && dataURI) {
|
|
98
|
-
img.src = dataURI;
|
|
99
|
-
}
|
|
100
|
-
if (img && srcSet) {
|
|
101
|
-
img.srcset = srcSet;
|
|
102
|
-
}
|
|
103
|
-
currData.loadPromise = new Promise(function (resolve, reject) {
|
|
104
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
105
|
-
img === null || img === void 0 || img.addEventListener('load', function () {
|
|
106
|
-
resolve(void 0);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
110
|
-
img === null || img === void 0 || img.addEventListener('error', function () {
|
|
111
|
-
reject(new Error('Failed to load image'));
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
115
|
-
} else {
|
|
116
|
-
mediaCardSsr[key] = {
|
|
117
|
-
dataURI: paramDataURI,
|
|
118
|
-
dimensions: dimensions,
|
|
119
|
-
error: error
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
48
|
var generateScript = function generateScript(identifier, dataURI, mode, srcSet, dimensions, error) {
|
|
124
49
|
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
125
|
-
var
|
|
126
|
-
|
|
50
|
+
var key = getKey(identifier, mode);
|
|
51
|
+
|
|
52
|
+
// Serialize the parameters for injection into the script
|
|
53
|
+
var params = {
|
|
54
|
+
key: key,
|
|
55
|
+
dataURI: dataURI,
|
|
56
|
+
mode: mode,
|
|
57
|
+
srcSet: srcSet,
|
|
58
|
+
dimensions: dimensions,
|
|
59
|
+
error: error,
|
|
60
|
+
featureFlags: featureFlags,
|
|
61
|
+
maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Read originalScriptCode.ts before making changes
|
|
65
|
+
return "!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l[\"media-perf-uplift-mutation-fix\"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:\"lazy\",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector(\"img\");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l[\"media-perf-lazy-loading-optimisation\"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute(\"loading\"),w.loading=\"\";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:\"resource\"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener(\"load\",(function(){return e()})),S.addEventListener(\"error\",(function(){return r(new Error(\"Failed to load image\"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:\"\"});".replace('{replace:""}', JSON.stringify(params));
|
|
127
66
|
};
|
|
128
67
|
var generateScriptProps = exports.generateScriptProps = function generateScriptProps(identifier, dataURI, mode, srcSet, dimensions, error) {
|
|
129
68
|
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @atlaskit/platform/no-direct-document-usage */
|
|
4
|
+
|
|
5
|
+
/** IMPORTANT: This is the original code for the script.
|
|
6
|
+
* Do not change the code without testing it in product first.
|
|
7
|
+
* Steps:
|
|
8
|
+
* 1. Make changes in this code
|
|
9
|
+
* 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
|
|
10
|
+
* Ensure the settings have: Minification on and
|
|
11
|
+
* 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
|
|
12
|
+
* 4. Run the tests and make sure they pass
|
|
13
|
+
* 5. TEST IN PRODUCTS BEFORE MERGING
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
(function (params) {
|
|
18
|
+
var script = document.currentScript;
|
|
19
|
+
var globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
|
|
20
|
+
var mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
|
|
21
|
+
var key = params.key,
|
|
22
|
+
paramDataURI = params.dataURI,
|
|
23
|
+
paramMode = params.mode,
|
|
24
|
+
paramSrcSet = params.srcSet,
|
|
25
|
+
dimensions = params.dimensions,
|
|
26
|
+
error = params.error,
|
|
27
|
+
featureFlags = params.featureFlags;
|
|
28
|
+
if (featureFlags["media-perf-uplift-mutation-fix"]) {
|
|
29
|
+
var _prevData$dimensions, _script$parentElement;
|
|
30
|
+
var prevData = mediaCardSsr[key];
|
|
31
|
+
var isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
32
|
+
var srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
|
|
33
|
+
var dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
|
|
34
|
+
var currData = {
|
|
35
|
+
dataURI: dataURI,
|
|
36
|
+
dimensions: dimensions,
|
|
37
|
+
error: error,
|
|
38
|
+
srcSet: srcSet,
|
|
39
|
+
loading: "lazy",
|
|
40
|
+
loadPromise: undefined,
|
|
41
|
+
mode: paramMode
|
|
42
|
+
};
|
|
43
|
+
var img = script === null || script === void 0 || (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
|
|
44
|
+
globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
|
|
45
|
+
if (img) {
|
|
46
|
+
if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
|
|
47
|
+
globalMedia.mediaCountSsr++;
|
|
48
|
+
img.removeAttribute("loading");
|
|
49
|
+
currData.loading = "";
|
|
50
|
+
var observer = new PerformanceObserver(function (entries) {
|
|
51
|
+
entries.getEntries().forEach(function (entry) {
|
|
52
|
+
if (srcSet.includes(entry.name)) {
|
|
53
|
+
globalMedia.performanceEntries = globalMedia.performanceEntries || [];
|
|
54
|
+
globalMedia.performanceEntries.push(entry);
|
|
55
|
+
observer.disconnect();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
observer.observe({
|
|
60
|
+
type: 'resource'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (dataURI) {
|
|
64
|
+
img.src = dataURI;
|
|
65
|
+
}
|
|
66
|
+
if (srcSet) {
|
|
67
|
+
img.srcset = srcSet;
|
|
68
|
+
}
|
|
69
|
+
currData.loadPromise = new Promise(function (resolve, reject) {
|
|
70
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
71
|
+
img.addEventListener("load", function () {
|
|
72
|
+
return resolve();
|
|
73
|
+
});
|
|
74
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
75
|
+
img.addEventListener("error", function () {
|
|
76
|
+
return reject(new Error("Failed to load image"));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
81
|
+
} else {
|
|
82
|
+
mediaCardSsr[key] = {
|
|
83
|
+
dataURI: paramDataURI,
|
|
84
|
+
dimensions: dimensions,
|
|
85
|
+
error: error
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
script === null || script === void 0 || script.remove();
|
|
89
|
+
|
|
90
|
+
// this replace will be used as a placeholder for the stringified params to be injected into the script
|
|
91
|
+
})({
|
|
92
|
+
replace: ""
|
|
93
|
+
});
|
|
@@ -115,12 +115,19 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
115
115
|
});
|
|
116
116
|
}
|
|
117
117
|
if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
// Only attempt SSR preview generation if:
|
|
119
|
+
// 1. We're on the server (ssr='server'), OR
|
|
120
|
+
// 2. We're on the client AND there is SSR data (meaning SSR actually happened)
|
|
121
|
+
// If ssr='client' but there's no SSR data, it means this is a client-side navigation
|
|
122
|
+
// where no SSR occurred, so we should skip SSR preview generation entirely.
|
|
123
|
+
if (ssr === 'server' || ssrData) {
|
|
124
|
+
try {
|
|
125
|
+
return (0, _getPreview.getSSRPreview)(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
|
|
126
|
+
} catch (e) {
|
|
127
|
+
ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, (0, _defineProperty2.default)({}, ssr, _objectSpread({
|
|
128
|
+
status: 'fail'
|
|
129
|
+
}, (0, _analytics.extractErrorInfo)(e, traceContext))));
|
|
130
|
+
}
|
|
124
131
|
}
|
|
125
132
|
} else {
|
|
126
133
|
var _dimensions = ssrData.dimensions,
|
|
@@ -306,7 +313,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
306
313
|
client: (0, _analytics.createFailedSSRObject)(failedPreview, traceContext)
|
|
307
314
|
});
|
|
308
315
|
}
|
|
309
|
-
var isSSR = (0, _getPreview.isSSRDataPreview)(failedPreview) || (
|
|
316
|
+
var isSSR = (0, _getPreview.isSSRDataPreview)(failedPreview) || (0, _getPreview.isSSRClientPreview)(failedPreview);
|
|
310
317
|
|
|
311
318
|
// If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
|
|
312
319
|
if (isSSR) {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { printFunctionCall, printScript } from './printScript';
|
|
2
1
|
// ----- WARNING -----
|
|
3
2
|
// This is a very sensitive fraction of code.
|
|
4
3
|
// Any changes to this file must be tested directly in product before merging.
|
|
@@ -7,6 +6,7 @@ import { printFunctionCall, printScript } from './printScript';
|
|
|
7
6
|
|
|
8
7
|
export const GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
|
|
9
8
|
export const GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
|
|
9
|
+
export const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
|
|
10
10
|
export const GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
|
|
11
11
|
const MAX_EAGER_LOAD_COUNT = 6;
|
|
12
12
|
export function getMediaGlobalScope(globalScope = window) {
|
|
@@ -26,83 +26,29 @@ export function getMediaCardSSR(globalScope = window) {
|
|
|
26
26
|
}
|
|
27
27
|
return globalMedia[key];
|
|
28
28
|
}
|
|
29
|
-
export function getMediaCountSSR(globalScope = window) {
|
|
30
|
-
const globalMedia = getMediaGlobalScope(globalScope);
|
|
31
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
32
|
-
const key = 'mediaCountSsr';
|
|
33
|
-
if (!globalMedia[key]) {
|
|
34
|
-
globalMedia[key] = 0;
|
|
35
|
-
}
|
|
36
|
-
return globalMedia[key];
|
|
37
|
-
}
|
|
38
|
-
export function incrementMediaCountSSR(globalScope = window) {
|
|
39
|
-
const globalMedia = getMediaGlobalScope(globalScope);
|
|
40
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
41
|
-
const key = 'mediaCountSsr';
|
|
42
|
-
if (!globalMedia[key]) {
|
|
43
|
-
globalMedia[key] = 0;
|
|
44
|
-
}
|
|
45
|
-
globalMedia[key]++;
|
|
46
|
-
}
|
|
47
29
|
const dashed = param => param ? `-${param}` : '';
|
|
48
30
|
export const getKey = ({
|
|
49
31
|
id,
|
|
50
32
|
collectionName,
|
|
51
33
|
occurrenceKey
|
|
52
34
|
}, resizeMode) => `${id}${dashed(collectionName)}${dashed(occurrenceKey)}${dashed(resizeMode)}`;
|
|
53
|
-
export const storeDataURI = (key, paramDataURI, paramMode, paramSrcSet, dimensions, error, featureFlags = {}, globalScope = window) => {
|
|
54
|
-
const mediaCardSsr = getMediaCardSSR(globalScope);
|
|
55
|
-
const mediaCountSsr = getMediaCountSSR(globalScope);
|
|
56
|
-
if (featureFlags['media-perf-uplift-mutation-fix']) {
|
|
57
|
-
var _prevData$dimensions, _script, _script$parentElement;
|
|
58
|
-
const prevData = mediaCardSsr[key];
|
|
59
|
-
const isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
60
|
-
const srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
|
|
61
|
-
const dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
|
|
62
|
-
const currData = {
|
|
63
|
-
dataURI,
|
|
64
|
-
dimensions,
|
|
65
|
-
error,
|
|
66
|
-
srcSet,
|
|
67
|
-
loading: 'lazy'
|
|
68
|
-
};
|
|
69
|
-
const img = (_script = script) === null || _script === void 0 ? void 0 : (_script$parentElement = _script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector('img');
|
|
70
|
-
if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
|
|
71
|
-
incrementMediaCountSSR(globalScope);
|
|
72
|
-
if (img.getAttribute('loading') === 'lazy') {
|
|
73
|
-
img.removeAttribute('loading');
|
|
74
|
-
}
|
|
75
|
-
currData.loading = '';
|
|
76
|
-
}
|
|
77
|
-
if (img && dataURI) {
|
|
78
|
-
img.src = dataURI;
|
|
79
|
-
}
|
|
80
|
-
if (img && srcSet) {
|
|
81
|
-
img.srcset = srcSet;
|
|
82
|
-
}
|
|
83
|
-
currData.loadPromise = new Promise((resolve, reject) => {
|
|
84
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
85
|
-
img === null || img === void 0 ? void 0 : img.addEventListener('load', () => {
|
|
86
|
-
resolve(void 0);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
90
|
-
img === null || img === void 0 ? void 0 : img.addEventListener('error', () => {
|
|
91
|
-
reject(new Error('Failed to load image'));
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
95
|
-
} else {
|
|
96
|
-
mediaCardSsr[key] = {
|
|
97
|
-
dataURI: paramDataURI,
|
|
98
|
-
dimensions,
|
|
99
|
-
error
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
35
|
const generateScript = (identifier, dataURI, mode, srcSet, dimensions, error, featureFlags = {}) => {
|
|
104
|
-
const
|
|
105
|
-
|
|
36
|
+
const key = getKey(identifier, mode);
|
|
37
|
+
|
|
38
|
+
// Serialize the parameters for injection into the script
|
|
39
|
+
const params = {
|
|
40
|
+
key,
|
|
41
|
+
dataURI,
|
|
42
|
+
mode,
|
|
43
|
+
srcSet,
|
|
44
|
+
dimensions,
|
|
45
|
+
error,
|
|
46
|
+
featureFlags,
|
|
47
|
+
maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Read originalScriptCode.ts before making changes
|
|
51
|
+
return `!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l["media-perf-uplift-mutation-fix"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:"lazy",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector("img");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l["media-perf-lazy-loading-optimisation"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute("loading"),w.loading="";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:"resource"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener("load",(function(){return e()})),S.addEventListener("error",(function(){return r(new Error("Failed to load image"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:""});`.replace('{replace:""}', JSON.stringify(params));
|
|
106
52
|
};
|
|
107
53
|
export const generateScriptProps = (identifier, dataURI, mode, srcSet, dimensions, error, featureFlags = {}) => ({
|
|
108
54
|
dangerouslySetInnerHTML: {
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* eslint-disable @atlaskit/platform/no-direct-document-usage */
|
|
2
|
+
|
|
3
|
+
/** IMPORTANT: This is the original code for the script.
|
|
4
|
+
* Do not change the code without testing it in product first.
|
|
5
|
+
* Steps:
|
|
6
|
+
* 1. Make changes in this code
|
|
7
|
+
* 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
|
|
8
|
+
* Ensure the settings have: Minification on and
|
|
9
|
+
* 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
|
|
10
|
+
* 4. Run the tests and make sure they pass
|
|
11
|
+
* 5. TEST IN PRODUCTS BEFORE MERGING
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
(function (params) {
|
|
16
|
+
const script = document.currentScript;
|
|
17
|
+
const globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
|
|
18
|
+
const mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
|
|
19
|
+
const {
|
|
20
|
+
key,
|
|
21
|
+
dataURI: paramDataURI,
|
|
22
|
+
mode: paramMode,
|
|
23
|
+
srcSet: paramSrcSet,
|
|
24
|
+
dimensions,
|
|
25
|
+
error,
|
|
26
|
+
featureFlags
|
|
27
|
+
} = params;
|
|
28
|
+
if (featureFlags["media-perf-uplift-mutation-fix"]) {
|
|
29
|
+
var _prevData$dimensions, _script$parentElement;
|
|
30
|
+
const prevData = mediaCardSsr[key];
|
|
31
|
+
const isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
32
|
+
const srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
|
|
33
|
+
const dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
|
|
34
|
+
const currData = {
|
|
35
|
+
dataURI,
|
|
36
|
+
dimensions,
|
|
37
|
+
error,
|
|
38
|
+
srcSet,
|
|
39
|
+
loading: "lazy",
|
|
40
|
+
loadPromise: undefined,
|
|
41
|
+
mode: paramMode
|
|
42
|
+
};
|
|
43
|
+
const img = script === null || script === void 0 ? void 0 : (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
|
|
44
|
+
globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
|
|
45
|
+
if (img) {
|
|
46
|
+
if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
|
|
47
|
+
globalMedia.mediaCountSsr++;
|
|
48
|
+
img.removeAttribute("loading");
|
|
49
|
+
currData.loading = "";
|
|
50
|
+
const observer = new PerformanceObserver(entries => {
|
|
51
|
+
entries.getEntries().forEach(entry => {
|
|
52
|
+
if (srcSet.includes(entry.name)) {
|
|
53
|
+
globalMedia.performanceEntries = globalMedia.performanceEntries || [];
|
|
54
|
+
globalMedia.performanceEntries.push(entry);
|
|
55
|
+
observer.disconnect();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
observer.observe({
|
|
60
|
+
type: 'resource'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (dataURI) {
|
|
64
|
+
img.src = dataURI;
|
|
65
|
+
}
|
|
66
|
+
if (srcSet) {
|
|
67
|
+
img.srcset = srcSet;
|
|
68
|
+
}
|
|
69
|
+
currData.loadPromise = new Promise(function (resolve, reject) {
|
|
70
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
71
|
+
img.addEventListener("load", () => resolve());
|
|
72
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
73
|
+
img.addEventListener("error", () => reject(new Error("Failed to load image")));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
77
|
+
} else {
|
|
78
|
+
mediaCardSsr[key] = {
|
|
79
|
+
dataURI: paramDataURI,
|
|
80
|
+
dimensions,
|
|
81
|
+
error
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
script === null || script === void 0 ? void 0 : script.remove();
|
|
85
|
+
|
|
86
|
+
// this replace will be used as a placeholder for the stringified params to be injected into the script
|
|
87
|
+
})({
|
|
88
|
+
replace: ""
|
|
89
|
+
});
|
|
@@ -86,16 +86,23 @@ export const useFilePreview = ({
|
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
89
|
+
// Only attempt SSR preview generation if:
|
|
90
|
+
// 1. We're on the server (ssr='server'), OR
|
|
91
|
+
// 2. We're on the client AND there is SSR data (meaning SSR actually happened)
|
|
92
|
+
// If ssr='client' but there's no SSR data, it means this is a client-side navigation
|
|
93
|
+
// where no SSR occurred, so we should skip SSR preview generation entirely.
|
|
94
|
+
if (ssr === 'server' || ssrData) {
|
|
95
|
+
try {
|
|
96
|
+
return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
|
|
97
|
+
} catch (e) {
|
|
98
|
+
ssrReliabilityRef.current = {
|
|
99
|
+
...ssrReliabilityRef.current,
|
|
100
|
+
[ssr]: {
|
|
101
|
+
status: 'fail',
|
|
102
|
+
...extractErrorInfo(e, traceContext)
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
99
106
|
}
|
|
100
107
|
} else {
|
|
101
108
|
const {
|
|
@@ -282,7 +289,7 @@ export const useFilePreview = ({
|
|
|
282
289
|
client: createFailedSSRObject(failedPreview, traceContext)
|
|
283
290
|
};
|
|
284
291
|
}
|
|
285
|
-
const isSSR = isSSRDataPreview(failedPreview) ||
|
|
292
|
+
const isSSR = isSSRDataPreview(failedPreview) || isSSRClientPreview(failedPreview);
|
|
286
293
|
|
|
287
294
|
// If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
|
|
288
295
|
if (isSSR) {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { printFunctionCall, printScript } from './printScript';
|
|
2
1
|
// ----- WARNING -----
|
|
3
2
|
// This is a very sensitive fraction of code.
|
|
4
3
|
// Any changes to this file must be tested directly in product before merging.
|
|
@@ -7,6 +6,7 @@ import { printFunctionCall, printScript } from './printScript';
|
|
|
7
6
|
|
|
8
7
|
export var GLOBAL_MEDIA_CARD_SSR = 'mediaCardSsr';
|
|
9
8
|
export var GLOBAL_MEDIA_COUNT_SSR = 'mediaCountSsr';
|
|
9
|
+
export var GLOBAL_MEDIA_PERFORMANCE_ENTRIES = 'performanceEntries';
|
|
10
10
|
export var GLOBAL_MEDIA_NAMESPACE = '__MEDIA_INTERNAL';
|
|
11
11
|
var MAX_EAGER_LOAD_COUNT = 6;
|
|
12
12
|
export function getMediaGlobalScope() {
|
|
@@ -28,26 +28,6 @@ export function getMediaCardSSR() {
|
|
|
28
28
|
}
|
|
29
29
|
return globalMedia[key];
|
|
30
30
|
}
|
|
31
|
-
export function getMediaCountSSR() {
|
|
32
|
-
var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
|
|
33
|
-
var globalMedia = getMediaGlobalScope(globalScope);
|
|
34
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
35
|
-
var key = 'mediaCountSsr';
|
|
36
|
-
if (!globalMedia[key]) {
|
|
37
|
-
globalMedia[key] = 0;
|
|
38
|
-
}
|
|
39
|
-
return globalMedia[key];
|
|
40
|
-
}
|
|
41
|
-
export function incrementMediaCountSSR() {
|
|
42
|
-
var globalScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
|
|
43
|
-
var globalMedia = getMediaGlobalScope(globalScope);
|
|
44
|
-
// Must match GLOBAL_MEDIA_COUNT_SSR. Can't reference the constant from here.
|
|
45
|
-
var key = 'mediaCountSsr';
|
|
46
|
-
if (!globalMedia[key]) {
|
|
47
|
-
globalMedia[key] = 0;
|
|
48
|
-
}
|
|
49
|
-
globalMedia[key]++;
|
|
50
|
-
}
|
|
51
31
|
var dashed = function dashed(param) {
|
|
52
32
|
return param ? "-".concat(param) : '';
|
|
53
33
|
};
|
|
@@ -57,62 +37,24 @@ export var getKey = function getKey(_ref, resizeMode) {
|
|
|
57
37
|
occurrenceKey = _ref.occurrenceKey;
|
|
58
38
|
return "".concat(id).concat(dashed(collectionName)).concat(dashed(occurrenceKey)).concat(dashed(resizeMode));
|
|
59
39
|
};
|
|
60
|
-
export var storeDataURI = function storeDataURI(key, paramDataURI, paramMode, paramSrcSet, dimensions, error) {
|
|
61
|
-
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
62
|
-
var globalScope = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : window;
|
|
63
|
-
var mediaCardSsr = getMediaCardSSR(globalScope);
|
|
64
|
-
var mediaCountSsr = getMediaCountSSR(globalScope);
|
|
65
|
-
if (featureFlags['media-perf-uplift-mutation-fix']) {
|
|
66
|
-
var _prevData$dimensions, _script;
|
|
67
|
-
var prevData = mediaCardSsr[key];
|
|
68
|
-
var isPreviousImageLarger = (prevData === null || prevData === void 0 ? void 0 : prevData.mode) === paramMode && prevData && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
69
|
-
var srcSet = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.srcSet : paramSrcSet;
|
|
70
|
-
var dataURI = isPreviousImageLarger ? prevData === null || prevData === void 0 ? void 0 : prevData.dataURI : paramDataURI;
|
|
71
|
-
var currData = {
|
|
72
|
-
dataURI: dataURI,
|
|
73
|
-
dimensions: dimensions,
|
|
74
|
-
error: error,
|
|
75
|
-
srcSet: srcSet,
|
|
76
|
-
loading: 'lazy'
|
|
77
|
-
};
|
|
78
|
-
var img = (_script = script) === null || _script === void 0 || (_script = _script.parentElement) === null || _script === void 0 ? void 0 : _script.querySelector('img');
|
|
79
|
-
if (img && featureFlags['media-perf-lazy-loading-optimisation'] && mediaCountSsr < MAX_EAGER_LOAD_COUNT) {
|
|
80
|
-
incrementMediaCountSSR(globalScope);
|
|
81
|
-
if (img.getAttribute('loading') === 'lazy') {
|
|
82
|
-
img.removeAttribute('loading');
|
|
83
|
-
}
|
|
84
|
-
currData.loading = '';
|
|
85
|
-
}
|
|
86
|
-
if (img && dataURI) {
|
|
87
|
-
img.src = dataURI;
|
|
88
|
-
}
|
|
89
|
-
if (img && srcSet) {
|
|
90
|
-
img.srcset = srcSet;
|
|
91
|
-
}
|
|
92
|
-
currData.loadPromise = new Promise(function (resolve, reject) {
|
|
93
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
94
|
-
img === null || img === void 0 || img.addEventListener('load', function () {
|
|
95
|
-
resolve(void 0);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
99
|
-
img === null || img === void 0 || img.addEventListener('error', function () {
|
|
100
|
-
reject(new Error('Failed to load image'));
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
104
|
-
} else {
|
|
105
|
-
mediaCardSsr[key] = {
|
|
106
|
-
dataURI: paramDataURI,
|
|
107
|
-
dimensions: dimensions,
|
|
108
|
-
error: error
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
40
|
var generateScript = function generateScript(identifier, dataURI, mode, srcSet, dimensions, error) {
|
|
113
41
|
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
114
|
-
var
|
|
115
|
-
|
|
42
|
+
var key = getKey(identifier, mode);
|
|
43
|
+
|
|
44
|
+
// Serialize the parameters for injection into the script
|
|
45
|
+
var params = {
|
|
46
|
+
key: key,
|
|
47
|
+
dataURI: dataURI,
|
|
48
|
+
mode: mode,
|
|
49
|
+
srcSet: srcSet,
|
|
50
|
+
dimensions: dimensions,
|
|
51
|
+
error: error,
|
|
52
|
+
featureFlags: featureFlags,
|
|
53
|
+
maxEagerLoadCount: MAX_EAGER_LOAD_COUNT
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Read originalScriptCode.ts before making changes
|
|
57
|
+
return "!function(e){var r=document.currentScript,i=window.__MEDIA_INTERNAL=window.__MEDIA_INTERNAL||{},n=i.mediaCardSsr=i.mediaCardSsr||{},o=e.key,t=e.dataURI,d=e.mode,a=e.srcSet,s=e.dimensions,m=e.error,l=e.featureFlags;if(l[\"media-perf-uplift-mutation-fix\"]){var u,c,f=n[o],v=f&&f.mode===d&&(null===(u=f.dimensions)||void 0===u?void 0:u.width)&&(null==s?void 0:s.width)&&f.dimensions.width>s.width,E=v?f.srcSet:a,p=v?f.dataURI:t,w={dataURI:p,dimensions:s,error:m,srcSet:E,loading:\"lazy\",loadPromise:void 0,mode:d},S=null==r||null===(c=r.parentElement)||void 0===c?void 0:c.querySelector(\"img\");if(i.mediaCountSsr=i.mediaCountSsr||0,S){if(l[\"media-perf-lazy-loading-optimisation\"]&&i.mediaCountSsr<e.maxEagerLoadCount){i.mediaCountSsr++,S.removeAttribute(\"loading\"),w.loading=\"\";var g=new PerformanceObserver((function(e){e.getEntries().forEach((function(e){E.includes(e.name)&&(i.performanceEntries=i.performanceEntries||[],i.performanceEntries.push(e),g.disconnect())}))}));g.observe({type:\"resource\"})}p&&(S.src=p),E&&(S.srcset=E),w.loadPromise=new Promise((function(e,r){S.addEventListener(\"load\",(function(){return e()})),S.addEventListener(\"error\",(function(){return r(new Error(\"Failed to load image\"))}))}))}n[o]=v?f:w}else n[o]={dataURI:t,dimensions:s,error:m};null==r||r.remove()}({replace:\"\"});".replace('{replace:""}', JSON.stringify(params));
|
|
116
58
|
};
|
|
117
59
|
export var generateScriptProps = function generateScriptProps(identifier, dataURI, mode, srcSet, dimensions, error) {
|
|
118
60
|
var featureFlags = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* eslint-disable @atlaskit/platform/no-direct-document-usage */
|
|
2
|
+
|
|
3
|
+
/** IMPORTANT: This is the original code for the script.
|
|
4
|
+
* Do not change the code without testing it in product first.
|
|
5
|
+
* Steps:
|
|
6
|
+
* 1. Make changes in this code
|
|
7
|
+
* 2. Manually minify the code into: https://repl.parceljs.org/#JTdCJTIyZmlsZXMlMjIlM0ElNUIlNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiUyQyU3QiUyMnZhbHVlJTIyJTNBJTIyJTJGKiUyMGVzbGludC1kaXNhYmxlJTIwJTQwYXRsYXNraXQlMkZwbGF0Zm9ybSUyRm5vLWRpcmVjdC1kb2N1bWVudC11c2FnZSUyMColMkYlNUNuJTVDbiUyRioqJTIwSU1QT1JUQU5UJTNBJTIwVGhpcyUyMGlzJTIwdGhlJTIwb3JpZ2luYWwlMjBjb2RlJTIwZm9yJTIwdGhlJTIwc2NyaXB0LiU1Q24lMjAqJTIwRG8lMjBub3QlMjBjaGFuZ2UlMjB0aGUlMjBjb2RlJTIwd2l0aG91dCUyMHRlc3RpbmclMjBpdCUyMGluJTIwcHJvZHVjdCUyMGZpcnN0LiU1Q24lMjAqJTIwU3RlcHMlM0ElNUNuJTIwKiUyMDEuJTIwTWFrZSUyMGNoYW5nZXMlMjBpbiUyMHRoaXMlMjBjb2RlJTVDbiUyMColMjAyLiUyME1hbnVhbGx5JTIwbWluaWZ5JTIwdGhlJTIwY29kZSUyMGludG8lM0ElMjBodHRwcyUzQSUyRiUyRnJlcGwucGFyY2VsanMub3JnJTJGJTIzSlRkQ0pUSXlabWxzWlhNbE1qSWxNMEVsTlVJbE5VSWxNaklsTWtaemNtTWxNa1pwYm1SbGVDNTBjeVV5TWlVeVF5VTNRaVV5TW5aaGJIVmxKVEl5SlROQkpUSXlKVEpHS2lVeU1HVnpiR2x1ZEMxa2FYTmhZbXhsSlRJd0pUUXdZWFJzWVhOcmFYUWxNa1p3YkdGMFptOXliU1V5Um01dkxXUnBjbVZqZEMxa2IyTjFiV1Z1ZEMxMWMyRm5aU1V5TUNvbE1rWWxOVU51SlRWRGJpVXlSaW9xSlRJd1NVMVFUMUpVUVU1VUpUTkJKVEl3VkdocGN5VXlNR2x6SlRJd2RHaGxKVEl3YjNKcFoybHVZV3dsTWpCamIyUmxKVEl3Wm05eUpUSXdkR2hsSlRJd2MyTnlhWEIwTGlVMVEyNGxNakFxSlRJd1JHOGxNakJ1YjNRbE1qQmphR0Z1WjJVbE1qQjBhR1VsTWpCamIyUmxKVEl3ZDJsMGFHOTFkQ1V5TUhSbGMzUnBibWNsTWpCcGRDVXlNR2x1SlRJd2NISnZaSFZqZENVeU1HWnBjbk4wTGlVMVEyNGxNakFxSlRJd1UzUmxjSE1sTTBFbE5VTnVKVEl3S2lVeU1ERXVKVEl3VFdGclpTVXlNR05vWVc1blpYTWxNakJwYmlVeU1IUm9hWE1sTWpCamIyUmxKVFZEYmlVeU1Db2xNakF5TGlVeU1FMWhiblZoYkd4NUpUSXdiV2x1YVdaNUpUSXdkR2hsSlRJd1kyOWtaU1V5TUhacFlTVXlNR2gwZEhCekpUTkJKVEpHSlRKR2NtVndiQzV3WVhKalpXeHFjeTV2Y21jbE1rWWxOVU51SlRJd0tpVXlNRE11SlRJd1EyOXdlU1V5TUhSb1pTVXlNRzFwYm1sbWFXVmtKVEl3WTI5a1pTVXlNR2x1ZEc4bE1qQm5iRzlpWVd4VFkyOXdaUzUwYzNnbE1qQnlaWEJzWVdOcGJtY2xNakIwYUdVbE1qQmxlR2x6ZEdsdVp5VXlNSE4wY21sdVp5VXlNSGRvWlhKbEpUSXdhWFFsTWpCellYbHpKVEl3VUVGVFZFVWxNakJJUlZKRkpUVkRiaVV5TUNvbE1qQTBMaVV5TUZKMWJpVXlNSFJvWlNVeU1IUmxjM1J6SlRJd1lXNWtKVEl3YldGclpTVXlNSE4xY21VbE1qQjBhR1Y1SlRJd2NHRnpjeVUxUTI0bE1qQXFKVEl3TlM0bE1qQlVSVk5VSlRJd1NVNGxNakJRVWs5RVZVTlVVeVV5TUVKRlJrOVNSU1V5TUUxRlVrZEpUa2NsTlVOdUpUSXdLaVUxUTI0bE1qQXFKVEpHSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUjJ4dlltRnNVMk52Y0dVb0tTVXlNQ1UzUWlVMVEyNGxNakFsTWpCamIyNXpkQ1V5TUc1aGJXVnpjR0ZqWlNVeU1DVXpSQ1V5TUNVMVF5VXlNbDlmVFVWRVNVRmZTVTVVUlZKT1FVd2xOVU1sTWpJbE0wSWxOVU51SlRJd0pUSXdhV1lsTWpBb0lTaDNhVzVrYjNjbE1qQmhjeVV5TUdGdWVTa2xOVUp1WVcxbGMzQmhZMlVsTlVRcEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ2gzYVc1a2IzY2xNakJoY3lVeU1HRnVlU2tsTlVKdVlXMWxjM0JoWTJVbE5VUWxNakFsTTBRbE1qQWxOMElsTjBRbE0wSWxOVU51SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUhKbGRIVnliaVV5TUNoM2FXNWtiM2NsTWpCaGN5VXlNR0Z1ZVNrbE5VSnVZVzFsYzNCaFkyVWxOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdkbGRFMWxaR2xoUTJGeVpGTlRVaWdwSlRJd0pUZENKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdaMnh2WW1Gc1RXVmthV0VsTWpBbE0wUWxNakJuWlhSTlpXUnBZVWRzYjJKaGJGTmpiM0JsS0NrbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQnJaWGtsTWpBbE0wUWxNakFsTlVNbE1qSnRaV1JwWVVOaGNtUlRjM0lsTlVNbE1qSWxNMElsTlVOdUpUSXdKVEl3YVdZbE1qQW9JV2RzYjJKaGJFMWxaR2xoSlRWQ2EyVjVKVFZFS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQm5iRzlpWVd4TlpXUnBZU1UxUW10bGVTVTFSQ1V5TUNVelJDVXlNQ1UzUWlVM1JDVXpRaVUxUTI0bE1qQWxNakFsTjBRbE5VTnVKVEl3SlRJd2NtVjBkWEp1SlRJd1oyeHZZbUZzVFdWa2FXRWxOVUpyWlhrbE5VUWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNW1kVzVqZEdsdmJpVXlNR2RsZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdjbVYwZFhKdUpUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTTBJbE5VTnVKVGRFSlRWRGJpVTFRMjVtZFc1amRHbHZiaVV5TUdsdVkzSmxiV1Z1ZEUxbFpHbGhRMjkxYm5SVFUxSW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HZHNiMkpoYkUxbFpHbGhKVEl3SlRORUpUSXdaMlYwVFdWa2FXRkhiRzlpWVd4VFkyOXdaU2dwSlROQ0pUVkRiaVV5TUNVeU1HTnZibk4wSlRJd2EyVjVKVEl3SlRORUpUSXdKVFZESlRJeWJXVmthV0ZEYjNWdWRGTnpjaVUxUXlVeU1pVXpRaVUxUTI0bE1qQWxNakJwWmlVeU1DZ2haMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFwSlRJd0pUZENKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HZHNiMkpoYkUxbFpHbGhKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdNQ1V6UWlVMVEyNGxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdaMnh2WW1Gc1RXVmthV0VsTlVKclpYa2xOVVFsTWtJbE1rSWxNMElsTlVOdUpUZEVKVFZEYmlVMVEyNG9ablZ1WTNScGIyNGxNakFvY0dGeVlXMXpKVE5CSlRJd1lXNTVLU1V5TUNVM1FpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1ITmpjbWx3ZENVeU1DVXpSQ1V5TUdSdlkzVnRaVzUwTG1OMWNuSmxiblJUWTNKcGNIUWxNMElsTlVOdUpUVkRiaVV5TUNVeU1DVXlSaVV5UmlVeU1GTjBiM0psSlRJd2RHaGxKVEl3WkdGMFlTVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1HMWxaR2xoUTJGeVpGTnpjaVV5TUNVelJDVXlNR2RsZEUxbFpHbGhRMkZ5WkZOVFVpZ3BKVE5DSlRWRGJpVXlNQ1V5TUdOdmJuTjBKVEl3YldWa2FXRkRiM1Z1ZEZOemNpVXlNQ1V6UkNVeU1HZGxkRTFsWkdsaFEyOTFiblJUVTFJb0tTVXpRaVUxUTI0bE1qQWxNakJqYjI1emRDVXlNQ1UzUWlVeU1HdGxlU1V5TUNVM1JDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3lVelFpVTFRMjRsTWpBbE1qQmpiMjV6ZENVeU1IQmhjbUZ0UkdGMFlWVlNTU1V5TUNVelJDVXlNSEJoY21GdGN5NWtZWFJoVlZKSkpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRORUpUSXdjR0Z5WVcxekxtMXZaR1VsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpCd1lYSmhiVk55WTFObGRDVXlNQ1V6UkNVeU1IQmhjbUZ0Y3k1emNtTlRaWFFsTTBJbE5VTnVKVEl3SlRJd1kyOXVjM1FsTWpBbE4wSWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUZEVKVEl3SlRORUpUSXdjR0Z5WVcxekpUTkNKVFZEYmlVeU1DVXlNR052Ym5OMEpUSXdKVGRDSlRJd1pYSnliM0lsTWpBbE4wUWxNakFsTTBRbE1qQndZWEpoYlhNbE0wSWxOVU51SlRJd0pUSXdZMjl1YzNRbE1qQWxOMElsTWpCbVpXRjBkWEpsUm14aFozTWxNakFsTjBRbE1qQWxNMFFsTWpCd1lYSmhiWE1sTTBJbE5VTnVKVFZEYmlVeU1DVXlNR2xtSlRJd0tHWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0ZFhCc2FXWjBMVzExZEdGMGFXOXVMV1pwZUNVMVF5VXlNaVUxUkNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQndjbVYyUkdGMFlTVXlNQ1V6UkNVeU1HMWxaR2xoUTJGeVpGTnpjaVUxUW10bGVTVTFSQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakJqYjI1emRDVXlNR2x6VUhKbGRtbHZkWE5KYldGblpVeGhjbWRsY2lVeU1DVXpSQ1UxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCd2NtVjJSR0YwWVNVeU1DVXlOaVV5TmlVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQndjbVYyUkdGMFlTNXRiMlJsSlRJd0pUTkVKVE5FSlRORUpUSXdjR0Z5WVcxTmIyUmxKVEl3SlRJMkpUSTJKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUhCeVpYWkVZWFJoTG1ScGJXVnVjMmx2Ym5NbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V5TmlVeU5pVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrYVcxbGJuTnBiMjV6SlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjSEpsZGtSaGRHRXVaR2x0Wlc1emFXOXVjeTUzYVdSMGFDVXlNQ1V6UlNVeU1HUnBiV1Z1YzJsdmJuTXVkMmxrZEdnbE0wSWxOVU51SlRWRGJpVXlNQ1V5TUNVeU1DVXlNR052Ym5OMEpUSXdjM0pqVTJWMEpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVjM0pqVTJWMEpUSXdKVE5CSlRJd2NHRnlZVzFUY21OVFpYUWxNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdZMjl1YzNRbE1qQmtZWFJoVlZKSkpUSXdKVE5FSlRJd2FYTlFjbVYyYVc5MWMwbHRZV2RsVEdGeVoyVnlKVEl3SlROR0pUSXdjSEpsZGtSaGRHRXVaR0YwWVZWU1NTVXlNQ1V6UVNVeU1IQmhjbUZ0UkdGMFlWVlNTU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd1kyOXVjM1FsTWpCamRYSnlSR0YwWVNVelFTVXlNR0Z1ZVNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjM0pqVTJWMEpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUnBibWNsTTBFbE1qQWxOVU1sTWpKc1lYcDVKVFZESlRJeUpUSkRKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUd4dllXUlFjbTl0YVhObEpUTkJKVEl3ZFc1a1pXWnBibVZrSlRKREpUVkRiaVUxUTNRbE5VTjBKVFZEZEcxdlpHVWxNMEVsTWpCd1lYSmhiVTF2WkdVbE1rTWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVKVE5DSlRWRGJpVTFRMjRsTWpBbE1qQWxNakFsTWpCamIyNXpkQ1V5TUdsdFp5VXlNQ1V6UkNVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnpZM0pwY0hRbE1qQWxNallsTWpZbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdjMk55YVhCMExuQmhjbVZ1ZEVWc1pXMWxiblFsTWpBbE1qWWxNallsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2MyTnlhWEIwTG5CaGNtVnVkRVZzWlcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnbE5VTWxNakpwYldjbE5VTWxNaklwSlROQ0pUVkRiaVUxUTI0bE1qQWxNakFsTWpBbE1qQnBaaVV5TUNnbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdhVzFuSlRJd0pUSTJKVEkySlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HWmxZWFIxY21WR2JHRm5jeVUxUWlVMVF5VXlNbTFsWkdsaExYQmxjbVl0YkdGNmVTMXNiMkZrYVc1bkxXOXdkR2x0YVhOaGRHbHZiaVUxUXlVeU1pVTFSQ1V5TUNVeU5pVXlOaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpCdFpXUnBZVU52ZFc1MFUzTnlKVEl3SlROREpUSXdjR0Z5WVcxekxtMWhlRVZoWjJWeVRHOWhaRU52ZFc1MEpUVkRiaVV5TUNVeU1DVXlNQ1V5TUNrbE1qQWxOMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd2FXNWpjbVZ0Wlc1MFRXVmthV0ZEYjNWdWRGTlRVaWdwSlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeTVuWlhSQmRIUnlhV0oxZEdVb0pUVkRKVEl5Ykc5aFpHbHVaeVUxUXlVeU1pa2xNakFsTTBRbE0wUWxNMFFsTWpBbE5VTWxNakpzWVhwNUpUVkRKVEl5S1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJwYldjdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NVMVF5VXlNbXh2WVdScGJtY2xOVU1sTWpJcEpUTkNKVFZEYmlVeU1DVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJqZFhKeVJHRjBZUzVzYjJGa2FXNW5KVEl3SlRORUpUSXdKVFZESlRJeUpUVkRKVEl5SlROQ0pUVkRiaVV5TUNVeU1DVXlNQ1V5TUNVM1JDVTFRMjRsTlVOdUpUSXdKVEl3SlRJd0pUSXdhV1lsTWpBb2FXMW5KVEl3SlRJMkpUSTJKVEl3WkdGMFlWVlNTU2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZeVV5TUNVelJDVXlNR1JoZEdGVlVra2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVGRFSlRWRGJpVXlNQ1V5TUNVeU1DVXlNR2xtSlRJd0tHbHRaeVV5TUNVeU5pVXlOaVV5TUhOeVkxTmxkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVcxbkxuTnlZM05sZENVeU1DVXpSQ1V5TUhOeVkxTmxkQ1V6UWlVMVEyNGxNakFsTWpBbE1qQWxNakFsTjBRbE5VTnVKVFZEYmlVeU1DVXlNQ1V5TUNVeU1HTjFjbkpFWVhSaExteHZZV1JRY205dGFYTmxKVEl3SlRORUpUSXdibVYzSlRJd1VISnZiV2x6WlNVelEzWnZhV1FsTTBVb1puVnVZM1JwYjI0bE1qQW9jbVZ6YjJ4MlpTVXlReVV5TUhKbGFtVmpkQ2tsTWpBbE4wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3YVdZbE1qQW9hVzFuS1NVeU1DVTNRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWtZbE1rWWxNakJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWxNakFsTkRCeVpYQnZKVEpHYVc1MFpYSnVZV3dsTWtaa2IyMHRaWFpsYm5SekpUSkdibTh0ZFc1ellXWmxMV1YyWlc1MExXeHBjM1JsYm1WeWN5VTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQnBiV2N1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWdsTlVNbE1qSnNiMkZrSlRWREpUSXlKVEpESlRJd1puVnVZM1JwYjI0bE1qQW9LU1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCeVpYTnZiSFpsS0hWdVpHVm1hVzVsWkNrbE0wSWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVGRFS1NVelFpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNa1lsTWtZbE1qQmxjMnhwYm5RdFpHbHpZV0pzWlMxdVpYaDBMV3hwYm1VbE1qQWxOREJ5WlhCdkpUSkdhVzUwWlhKdVlXd2xNa1prYjIwdFpYWmxiblJ6SlRKR2JtOHRkVzV6WVdabExXVjJaVzUwTFd4cGMzUmxibVZ5Y3lVMVEyNGxNakFsTWpBbE1qQWxNakFsTWpBbE1qQWxNakFsTWpCcGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2xOVU1sTWpKbGNuSnZjaVUxUXlVeU1pVXlReVV5TUdaMWJtTjBhVzl1SlRJd0tDa2xNakFsTjBJbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3Y21WcVpXTjBLRzVsZHlVeU1FVnljbTl5S0NVMVF5VXlNa1poYVd4bFpDVXlNSFJ2SlRJd2JHOWhaQ1V5TUdsdFlXZGxKVFZESlRJeUtTa2xNMElsTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd0pUSXdKVEl3SlRkRUtTVXpRaVUxUTI0bE1qQWxNakFsTWpBbE1qQWxNakFsTWpBbE4wUWxOVU51SlRJd0pUSXdKVEl3SlRJd0pUZEVLU1V6UWlVMVEyNGxOVU51SlRJd0pUSXdKVEl3SlRJd2JXVmthV0ZEWVhKa1UzTnlKVFZDYTJWNUpUVkVKVEl3SlRORUpUSXdhWE5RY21WMmFXOTFjMGx0WVdkbFRHRnlaMlZ5SlRJd0pUTkdKVEl3Y0hKbGRrUmhkR0VsTWpBbE0wRWxNakJqZFhKeVJHRjBZU1V6UWlVMVEyNGxNakFsTWpBbE4wUWxNakJsYkhObEpUSXdKVGRDSlRWRGJpVXlNQ1V5TUNVeU1DVXlNRzFsWkdsaFEyRnlaRk56Y2lVMVFtdGxlU1UxUkNVeU1DVXpSQ1V5TUNVM1FpVTFRMjRsTWpBbE1qQWxNakFsTWpBbE1qQWxNakJrWVhSaFZWSkpKVE5CSlRJd2NHRnlZVzFFWVhSaFZWSkpKVEpESlRWRGJpVXlNQ1V5TUNVeU1DVXlNQ1V5TUNVeU1HUnBiV1Z1YzJsdmJuTWxNa01sTlVOdUpUSXdKVEl3SlRJd0pUSXdKVEl3SlRJd1pYSnliM0lsTWtNbE5VTnVKVEl3SlRJd0pUSXdKVEl3SlRkRUpUTkNKVFZEYmlVeU1DVXlNQ1UzUkNVMVEyNGxOVU51SlRJd0pUSXdKVEpHSlRKR0pUSXdVbVZ0YjNabEpUSXdjMk55YVhCMEpUSXdkRzhsTWpCd2NtVjJaVzUwSlRJd2FIbGtjbUYwYVc5dUpUSXdiV2x6YldGMFkyZ2xOVU51SlRJd0pUSXdaRzlqZFcxbGJuUXVZM1Z5Y21WdWRGTmpjbWx3ZENVelJpNXlaVzF2ZG1Vb0tTVXpRaVUxUTI0bE5VTnVKVFZEZENVeVJpVXlSaVV5TUhSb2FYTWxNakJ5WlhCc1lXTmxKVEl3ZDJsc2JDVXlNR0psSlRJd2RYTmxaQ1V5TUdGekpUSXdZU1V5TUhCc1lXTmxhRzlzWkdWeUpUSXdabTl5SlRJd2RHaGxKVEl3YzNSeWFXNW5hV1pwWldRbE1qQndZWEpoYlhNbE1qQjBieVV5TUdKbEpUSXdhVzVxWldOMFpXUWxNakJwYm5SdkpUSXdkR2hsSlRJd2MyTnlhWEIwSlRWRGJpVTNSQ2tvSlRkQ0pUSXdjbVZ3YkdGalpTVXpRU1V5TUNVMVF5VXlNaVUxUXlVeU1pVXlNQ1UzUkNrbE0wSWxOVU51SlRJeUpUSkRKVEl5YVhORmJuUnllU1V5TWlVelFYUnlkV1VsTjBRbE5VUWxOVVFsTWtNbE1qSnZjSFJwYjI1ekpUSXlKVE5CSlRkQ0pUSXlaVzUwY21sbGN5VXlNaVV6UVNVMVFpVTFSQ1V5UXlVeU1tMXBibWxtZVNVeU1pVXpRWFJ5ZFdVbE1rTWxNakp6WTI5d1pVaHZhWE4wSlRJeUpUTkJkSEoxWlNVeVF5VXlNbk52ZFhKalpVMWhjSE1sTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbkIxWW14cFkxVnliQ1V5TWlVelFTVXlNaVV5Umw5ZmNtVndiRjlrYVhOMEpUSXlKVEpESlRJeWRHRnlaMlYwVkhsd1pTVXlNaVV6UVNVeU1tSnliM2R6WlhKekpUSXlKVEpESlRJeWRHRnlaMlYwUlc1MkpUSXlKVE5CYm5Wc2JDVXlReVV5TW05MWRIQjFkRVp2Y20xaGRDVXlNaVV6UVc1MWJHd2xNa01sTWpKb2JYSWxNaklsTTBGbVlXeHpaU1V5UXlVeU1tMXZaR1VsTWpJbE0wRWxNakp3Y205a2RXTjBhVzl1SlRJeUpUSkRKVEl5Y21WdVpHVnlSM0poY0doekpUSXlKVE5CWm1Gc2MyVWxNa01sTWpKMmFXVjNVMjkxY21ObGJXRndjeVV5TWlVelFXWmhiSE5sSlRKREpUSXlaR1Z3Wlc1a1pXNWphV1Z6SlRJeUpUTkJKVFZDSlRWRUpUSkRKVEl5Ym5WdFYyOXlhMlZ5Y3lVeU1pVXpRVEFsTjBRbE1rTWxNakoxYzJWVVlXSnpKVEl5SlROQmRISjFaU1V5UXlVeU1tSnliM2R6WlhKRGIyeHNZWEJ6WldRbE1qSWxNMEVsTlVJbE5VUWxNa01sTWpKMmFXVjNjeVV5TWlVelFTVTFRaVV5TWlVeVJuTnlZeVV5Um1sdVpHVjRMblJ6SlRJeUpUVkVKVEpESlRJeVkzVnljbVZ1ZEZacFpYY2xNaklsTTBFd0pUZEUlNUNuJTIwKiUyMDMuJTIwQ29weSUyMHRoZSUyMG1pbmlmaWVkJTIwY29kZSUyMGludG8lMjBnbG9iYWxTY29wZS50c3glMjByZXBsYWNpbmclMjB0aGUlMjBleGlzdGluZyUyMHN0cmluZyUyMHdoZXJlJTIwaXQlMjBzYXlzJTIwUEFTVEUlMjBIRVJFJTVDbiUyMColMjA0LiUyMFJ1biUyMHRoZSUyMHRlc3RzJTIwYW5kJTIwbWFrZSUyMHN1cmUlMjB0aGV5JTIwcGFzcyU1Q24lMjAqJTIwNS4lMjBURVNUJTIwSU4lMjBQUk9EVUNUUyUyMEJFRk9SRSUyME1FUkdJTkclNUNuJTIwKiU1Q24lMjAqJTJGJTVDbiU1Q24oZnVuY3Rpb24lMjAocGFyYW1zJTNBJTIwYW55KSUyMCU3QiU1Q24lNUN0Y29uc3QlMjBzY3JpcHQlMjAlM0QlMjBkb2N1bWVudC5jdXJyZW50U2NyaXB0JTNCJTVDbiU1Q3Rjb25zdCUyMGdsb2JhbE1lZGlhJTIwJTNEJTIwKCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCUzRCUyMCh3aW5kb3clMjBhcyUyMGFueSkuX19NRURJQV9JTlRFUk5BTCUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwbWVkaWFDYXJkU3NyJTIwJTNEJTIwKGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ2FyZFNzciUyMCU3QyU3QyUyMCU3QiU3RCklM0IlNUNuJTVDdGNvbnN0JTIwJTdCJTIwa2V5JTJDJTIwZGF0YVVSSSUzQSUyMHBhcmFtRGF0YVVSSSUyQyUyMG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlMjBzcmNTZXQlM0ElMjBwYXJhbVNyY1NldCUyQyUyMGRpbWVuc2lvbnMlMkMlMjBlcnJvciUyQyUyMGZlYXR1cmVGbGFncyUyMCU3RCUyMCUzRCUyMHBhcmFtcyUzQiU1Q24lNUNuJTVDdGlmJTIwKGZlYXR1cmVGbGFncyU1QiU1QyUyMm1lZGlhLXBlcmYtdXBsaWZ0LW11dGF0aW9uLWZpeCU1QyUyMiU1RCklMjAlN0IlNUNuJTVDdCU1Q3Rjb25zdCUyMHByZXZEYXRhJTIwJTNEJTIwbWVkaWFDYXJkU3NyJTVCa2V5JTVEJTNCJTVDbiU1Q3QlNUN0Y29uc3QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0QlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGElMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEubW9kZSUyMCUzRCUzRCUzRCUyMHBhcmFtTW9kZSUyMCUyNiUyNiU1Q24lNUN0JTVDdCU1Q3RwcmV2RGF0YS5kaW1lbnNpb25zJTNGLndpZHRoJTIwJTI2JTI2JTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlM0Yud2lkdGglMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0cHJldkRhdGEuZGltZW5zaW9ucy53aWR0aCUyMCUzRSUyMGRpbWVuc2lvbnMud2lkdGglM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBzcmNTZXQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YS5zcmNTZXQlMjAlM0ElMjBwYXJhbVNyY1NldCUzQiU1Q24lNUN0JTVDdGNvbnN0JTIwZGF0YVVSSSUyMCUzRCUyMGlzUHJldmlvdXNJbWFnZUxhcmdlciUyMCUzRiUyMHByZXZEYXRhLmRhdGFVUkklMjAlM0ElMjBwYXJhbURhdGFVUkklM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBjdXJyRGF0YSUzQSUyMGFueSUyMCUzRCUyMCU3QiU1Q24lNUN0JTVDdCU1Q3RkYXRhVVJJJTJDJTVDbiU1Q3QlNUN0JTVDdGRpbWVuc2lvbnMlMkMlNUNuJTVDdCU1Q3QlNUN0ZXJyb3IlMkMlNUNuJTVDdCU1Q3QlNUN0c3JjU2V0JTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRpbmclM0ElMjAlNUMlMjJsYXp5JTVDJTIyJTJDJTVDbiU1Q3QlNUN0JTVDdGxvYWRQcm9taXNlJTNBJTIwdW5kZWZpbmVkJTJDJTVDbiU1Q3QlNUN0JTVDdG1vZGUlM0ElMjBwYXJhbU1vZGUlMkMlNUNuJTVDdCU1Q3QlN0QlM0IlNUNuJTVDbiU1Q3QlNUN0Y29uc3QlMjBpbWclMjAlM0QlMjBzY3JpcHQlM0YucGFyZW50RWxlbWVudCUzRi5xdWVyeVNlbGVjdG9yKCU1QyUyMmltZyU1QyUyMiklM0IlNUNuJTVDbiU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyMCUzRCUyMGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlN0MlN0MlMjAwJTNCJTVDbiU1Q24lNUN0JTVDdGlmJTIwKGltZyklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0aWYlMjAoJTVDbiU1Q3QlNUN0JTVDdCU1Q3RmZWF0dXJlRmxhZ3MlNUIlNUMlMjJtZWRpYS1wZXJmLWxhenktbG9hZGluZy1vcHRpbWlzYXRpb24lNUMlMjIlNUQlMjAlMjYlMjYlNUNuJTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLm1lZGlhQ291bnRTc3IlMjAlM0MlMjBwYXJhbXMubWF4RWFnZXJMb2FkQ291bnQlNUNuJTVDdCU1Q3QlNUN0KSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0Z2xvYmFsTWVkaWEubWVkaWFDb3VudFNzciUyQiUyQiUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLnJlbW92ZUF0dHJpYnV0ZSglNUMlMjJsb2FkaW5nJTVDJTIyKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0Y3VyckRhdGEubG9hZGluZyUyMCUzRCUyMCU1QyUyMiU1QyUyMiUzQiU1Q24lNUNuJTVDdCU1Q3QlNUN0JTVDdGNvbnN0JTIwb2JzZXJ2ZXIlMjAlM0QlMjBuZXclMjBQZXJmb3JtYW5jZU9ic2VydmVyKChlbnRyaWVzKSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdGVudHJpZXMuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSUyMCUzRCUzRSUyMCU3QiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQuaW5jbHVkZXMoZW50cnkubmFtZSkpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3RnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlM0QlMjBnbG9iYWxNZWRpYS5wZXJmb3JtYW5jZUVudHJpZXMlMjAlN0MlN0MlMjAlNUIlNUQlM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdGdsb2JhbE1lZGlhLnBlcmZvcm1hbmNlRW50cmllcy5wdXNoKGVudHJ5KSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU1Q3QlNUN0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpJTNCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdCU3RCklM0IlNUNuJTVDdCU1Q3QlNUN0JTVDdG9ic2VydmVyLm9ic2VydmUoJTdCJTIwdHlwZSUzQSUyMCdyZXNvdXJjZSclMjAlN0QpJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3QlNUN0aWYlMjAoZGF0YVVSSSklMjAlN0IlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5zcmMlMjAlM0QlMjBkYXRhVVJJJTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RpZiUyMChzcmNTZXQpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3RpbWcuc3Jjc2V0JTIwJTNEJTIwc3JjU2V0JTNCJTVDbiU1Q3QlNUN0JTVDdCU3RCU1Q24lNUN0JTVDdCU1Q3RjdXJyRGF0YS5sb2FkUHJvbWlzZSUyMCUzRCUyMG5ldyUyMFByb21pc2UlM0N2b2lkJTNFKGZ1bmN0aW9uJTIwKHJlc29sdmUlMkMlMjByZWplY3QpJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdCU1Q3QlMkYlMkYlMjBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUlMjAlNDByZXBvJTJGaW50ZXJuYWwlMkZkb20tZXZlbnRzJTJGbm8tdW5zYWZlLWV2ZW50LWxpc3RlbmVycyU1Q24lNUN0JTVDdCU1Q3QlNUN0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJTVDJTIybG9hZCU1QyUyMiUyQyUyMCgpJTIwJTNEJTNFJTIwcmVzb2x2ZSgpKSUzQiU1Q24lNUN0JTVDdCU1Q3QlNUN0JTJGJTJGJTIwZXNsaW50LWRpc2FibGUtbmV4dC1saW5lJTIwJTQwcmVwbyUyRmludGVybmFsJTJGZG9tLWV2ZW50cyUyRm5vLXVuc2FmZS1ldmVudC1saXN0ZW5lcnMlNUNuJTVDdCU1Q3QlNUN0JTVDdGltZy5hZGRFdmVudExpc3RlbmVyKCU1QyUyMmVycm9yJTVDJTIyJTJDJTIwKCklMjAlM0QlM0UlMjByZWplY3QobmV3JTIwRXJyb3IoJTVDJTIyRmFpbGVkJTIwdG8lMjBsb2FkJTIwaW1hZ2UlNUMlMjIpKSklM0IlNUNuJTVDdCU1Q3QlNUN0JTdEKSUzQiU1Q24lNUN0JTVDdCU3RCU1Q24lNUNuJTVDdCU1Q3RtZWRpYUNhcmRTc3IlNUJrZXklNUQlMjAlM0QlMjBpc1ByZXZpb3VzSW1hZ2VMYXJnZXIlMjAlM0YlMjBwcmV2RGF0YSUyMCUzQSUyMGN1cnJEYXRhJTNCJTVDbiU1Q3QlN0QlMjBlbHNlJTIwJTdCJTVDbiU1Q3QlNUN0bWVkaWFDYXJkU3NyJTVCa2V5JTVEJTIwJTNEJTIwJTdCJTVDbiU1Q3QlNUN0JTVDdGRhdGFVUkklM0ElMjBwYXJhbURhdGFVUkklMkMlNUNuJTVDdCU1Q3QlNUN0ZGltZW5zaW9ucyUyQyU1Q24lNUN0JTVDdCU1Q3RlcnJvciUyQyU1Q24lNUN0JTVDdCU3RCUzQiU1Q24lNUN0JTdEJTVDbiU1Q24lNUN0c2NyaXB0JTNGLnJlbW92ZSgpJTNCJTVDbiU1Q24lNUN0JTJGJTJGJTIwdGhpcyUyMHJlcGxhY2UlMjB3aWxsJTIwYmUlMjB1c2VkJTIwYXMlMjBhJTIwcGxhY2Vob2xkZXIlMjBmb3IlMjB0aGUlMjBzdHJpbmdpZmllZCUyMHBhcmFtcyUyMHRvJTIwYmUlMjBpbmplY3RlZCUyMGludG8lMjB0aGUlMjBzY3JpcHQlNUNuJTdEKSglN0IlMjByZXBsYWNlJTNBJTIwJTVDJTIyJTVDJTIyJTIwJTdEKSUzQiU1Q24lMjIlMkMlMjJpc0VudHJ5JTIyJTNBdHJ1ZSU3RCU1RCU1RCUyQyUyMm9wdGlvbnMlMjIlM0ElN0IlMjJlbnRyaWVzJTIyJTNBJTVCJTVEJTJDJTIybWluaWZ5JTIyJTNBdHJ1ZSUyQyUyMnNjb3BlSG9pc3QlMjIlM0F0cnVlJTJDJTIyc291cmNlTWFwcyUyMiUzQWZhbHNlJTJDJTIycHVibGljVXJsJTIyJTNBJTIyJTJGX19yZXBsX2Rpc3QlMjIlMkMlMjJ0YXJnZXRUeXBlJTIyJTNBJTIyYnJvd3NlcnMlMjIlMkMlMjJ0YXJnZXRFbnYlMjIlM0ElMjJzaW5jZSUyMDIwMTUlMjIlMkMlMjJvdXRwdXRGb3JtYXQlMjIlM0FudWxsJTJDJTIyaG1yJTIyJTNBZmFsc2UlMkMlMjJtb2RlJTIyJTNBJTIycHJvZHVjdGlvbiUyMiUyQyUyMnJlbmRlckdyYXBocyUyMiUzQWZhbHNlJTJDJTIydmlld1NvdXJjZW1hcHMlMjIlM0FmYWxzZSUyQyUyMmRlcGVuZGVuY2llcyUyMiUzQSU1QiU1RCUyQyUyMm51bVdvcmtlcnMlMjIlM0EwJTdEJTJDJTIydXNlVGFicyUyMiUzQXRydWUlMkMlMjJicm93c2VyQ29sbGFwc2VkJTIyJTNBJTVCJTVEJTJDJTIydmlld3MlMjIlM0ElNUIlMjIlMkZzcmMlMkZpbmRleC50cyUyMiU1RCUyQyUyMmN1cnJlbnRWaWV3JTIyJTNBMCU3RA==
|
|
8
|
+
* Ensure the settings have: Minification on and
|
|
9
|
+
* 3. Copy the minified code into globalScope.tsx replacing the existing string where it says PASTE HERE
|
|
10
|
+
* 4. Run the tests and make sure they pass
|
|
11
|
+
* 5. TEST IN PRODUCTS BEFORE MERGING
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
(function (params) {
|
|
16
|
+
var script = document.currentScript;
|
|
17
|
+
var globalMedia = window.__MEDIA_INTERNAL = window.__MEDIA_INTERNAL || {};
|
|
18
|
+
var mediaCardSsr = globalMedia.mediaCardSsr = globalMedia.mediaCardSsr || {};
|
|
19
|
+
var key = params.key,
|
|
20
|
+
paramDataURI = params.dataURI,
|
|
21
|
+
paramMode = params.mode,
|
|
22
|
+
paramSrcSet = params.srcSet,
|
|
23
|
+
dimensions = params.dimensions,
|
|
24
|
+
error = params.error,
|
|
25
|
+
featureFlags = params.featureFlags;
|
|
26
|
+
if (featureFlags["media-perf-uplift-mutation-fix"]) {
|
|
27
|
+
var _prevData$dimensions, _script$parentElement;
|
|
28
|
+
var prevData = mediaCardSsr[key];
|
|
29
|
+
var isPreviousImageLarger = prevData && prevData.mode === paramMode && ((_prevData$dimensions = prevData.dimensions) === null || _prevData$dimensions === void 0 ? void 0 : _prevData$dimensions.width) && (dimensions === null || dimensions === void 0 ? void 0 : dimensions.width) && prevData.dimensions.width > dimensions.width;
|
|
30
|
+
var srcSet = isPreviousImageLarger ? prevData.srcSet : paramSrcSet;
|
|
31
|
+
var dataURI = isPreviousImageLarger ? prevData.dataURI : paramDataURI;
|
|
32
|
+
var currData = {
|
|
33
|
+
dataURI: dataURI,
|
|
34
|
+
dimensions: dimensions,
|
|
35
|
+
error: error,
|
|
36
|
+
srcSet: srcSet,
|
|
37
|
+
loading: "lazy",
|
|
38
|
+
loadPromise: undefined,
|
|
39
|
+
mode: paramMode
|
|
40
|
+
};
|
|
41
|
+
var img = script === null || script === void 0 || (_script$parentElement = script.parentElement) === null || _script$parentElement === void 0 ? void 0 : _script$parentElement.querySelector("img");
|
|
42
|
+
globalMedia.mediaCountSsr = globalMedia.mediaCountSsr || 0;
|
|
43
|
+
if (img) {
|
|
44
|
+
if (featureFlags["media-perf-lazy-loading-optimisation"] && globalMedia.mediaCountSsr < params.maxEagerLoadCount) {
|
|
45
|
+
globalMedia.mediaCountSsr++;
|
|
46
|
+
img.removeAttribute("loading");
|
|
47
|
+
currData.loading = "";
|
|
48
|
+
var observer = new PerformanceObserver(function (entries) {
|
|
49
|
+
entries.getEntries().forEach(function (entry) {
|
|
50
|
+
if (srcSet.includes(entry.name)) {
|
|
51
|
+
globalMedia.performanceEntries = globalMedia.performanceEntries || [];
|
|
52
|
+
globalMedia.performanceEntries.push(entry);
|
|
53
|
+
observer.disconnect();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
observer.observe({
|
|
58
|
+
type: 'resource'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (dataURI) {
|
|
62
|
+
img.src = dataURI;
|
|
63
|
+
}
|
|
64
|
+
if (srcSet) {
|
|
65
|
+
img.srcset = srcSet;
|
|
66
|
+
}
|
|
67
|
+
currData.loadPromise = new Promise(function (resolve, reject) {
|
|
68
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
69
|
+
img.addEventListener("load", function () {
|
|
70
|
+
return resolve();
|
|
71
|
+
});
|
|
72
|
+
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
73
|
+
img.addEventListener("error", function () {
|
|
74
|
+
return reject(new Error("Failed to load image"));
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
mediaCardSsr[key] = isPreviousImageLarger ? prevData : currData;
|
|
79
|
+
} else {
|
|
80
|
+
mediaCardSsr[key] = {
|
|
81
|
+
dataURI: paramDataURI,
|
|
82
|
+
dimensions: dimensions,
|
|
83
|
+
error: error
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
script === null || script === void 0 || script.remove();
|
|
87
|
+
|
|
88
|
+
// this replace will be used as a placeholder for the stringified params to be injected into the script
|
|
89
|
+
})({
|
|
90
|
+
replace: ""
|
|
91
|
+
});
|
|
@@ -108,12 +108,19 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
110
|
if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
// Only attempt SSR preview generation if:
|
|
112
|
+
// 1. We're on the server (ssr='server'), OR
|
|
113
|
+
// 2. We're on the client AND there is SSR data (meaning SSR actually happened)
|
|
114
|
+
// If ssr='client' but there's no SSR data, it means this is a client-side navigation
|
|
115
|
+
// where no SSR occurred, so we should skip SSR preview generation entirely.
|
|
116
|
+
if (ssr === 'server' || ssrData) {
|
|
117
|
+
try {
|
|
118
|
+
return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
ssrReliabilityRef.current = _objectSpread(_objectSpread({}, ssrReliabilityRef.current), {}, _defineProperty({}, ssr, _objectSpread({
|
|
121
|
+
status: 'fail'
|
|
122
|
+
}, extractErrorInfo(e, traceContext))));
|
|
123
|
+
}
|
|
117
124
|
}
|
|
118
125
|
} else {
|
|
119
126
|
var _dimensions = ssrData.dimensions,
|
|
@@ -299,7 +306,7 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
299
306
|
client: createFailedSSRObject(failedPreview, traceContext)
|
|
300
307
|
});
|
|
301
308
|
}
|
|
302
|
-
var isSSR = isSSRDataPreview(failedPreview) ||
|
|
309
|
+
var isSSR = isSSRDataPreview(failedPreview) || isSSRClientPreview(failedPreview);
|
|
303
310
|
|
|
304
311
|
// If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
|
|
305
312
|
if (isSSR) {
|
|
@@ -5,10 +5,12 @@ import { type MediaFilePreviewErrorInfo } from '../analytics';
|
|
|
5
5
|
import { type MediaCardSsr } from './types';
|
|
6
6
|
export declare const GLOBAL_MEDIA_CARD_SSR = "mediaCardSsr";
|
|
7
7
|
export declare const GLOBAL_MEDIA_COUNT_SSR = "mediaCountSsr";
|
|
8
|
+
export declare const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = "performanceEntries";
|
|
8
9
|
export declare const GLOBAL_MEDIA_NAMESPACE = "__MEDIA_INTERNAL";
|
|
9
10
|
export type MediaGlobalScope = {
|
|
10
11
|
[GLOBAL_MEDIA_CARD_SSR]?: MediaCardSsr;
|
|
11
12
|
[GLOBAL_MEDIA_COUNT_SSR]?: number;
|
|
13
|
+
[GLOBAL_MEDIA_PERFORMANCE_ENTRIES]?: PerformanceEntry[];
|
|
12
14
|
};
|
|
13
15
|
type MediaFeatureFlags = {
|
|
14
16
|
'media-perf-uplift-mutation-fix'?: boolean;
|
|
@@ -16,9 +18,6 @@ type MediaFeatureFlags = {
|
|
|
16
18
|
};
|
|
17
19
|
export declare function getMediaGlobalScope(globalScope?: any): MediaGlobalScope;
|
|
18
20
|
export declare function getMediaCardSSR(globalScope?: any): MediaCardSsr;
|
|
19
|
-
export declare function getMediaCountSSR(globalScope?: any): number;
|
|
20
|
-
export declare function incrementMediaCountSSR(globalScope?: any): void;
|
|
21
21
|
export declare const getKey: ({ id, collectionName, occurrenceKey }: FileIdentifier, resizeMode?: string) => string;
|
|
22
|
-
export declare const storeDataURI: (key: string, paramDataURI?: string, paramMode?: string, paramSrcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags, globalScope?: any) => void;
|
|
23
22
|
export declare const generateScriptProps: (identifier: FileIdentifier, dataURI?: string, mode?: string, srcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags) => React.ScriptHTMLAttributes<HTMLScriptElement>;
|
|
24
23
|
export {};
|
|
File without changes
|
|
@@ -39,5 +39,5 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
|
|
|
39
39
|
onImageError: (failedPreview?: MediaFilePreview) => void;
|
|
40
40
|
onImageLoad: (newPreview?: MediaFilePreview) => void;
|
|
41
41
|
getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
|
|
42
|
-
copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void;
|
|
42
|
+
copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
43
43
|
};
|
|
@@ -5,10 +5,12 @@ import { type MediaFilePreviewErrorInfo } from '../analytics';
|
|
|
5
5
|
import { type MediaCardSsr } from './types';
|
|
6
6
|
export declare const GLOBAL_MEDIA_CARD_SSR = "mediaCardSsr";
|
|
7
7
|
export declare const GLOBAL_MEDIA_COUNT_SSR = "mediaCountSsr";
|
|
8
|
+
export declare const GLOBAL_MEDIA_PERFORMANCE_ENTRIES = "performanceEntries";
|
|
8
9
|
export declare const GLOBAL_MEDIA_NAMESPACE = "__MEDIA_INTERNAL";
|
|
9
10
|
export type MediaGlobalScope = {
|
|
10
11
|
[GLOBAL_MEDIA_CARD_SSR]?: MediaCardSsr;
|
|
11
12
|
[GLOBAL_MEDIA_COUNT_SSR]?: number;
|
|
13
|
+
[GLOBAL_MEDIA_PERFORMANCE_ENTRIES]?: PerformanceEntry[];
|
|
12
14
|
};
|
|
13
15
|
type MediaFeatureFlags = {
|
|
14
16
|
'media-perf-uplift-mutation-fix'?: boolean;
|
|
@@ -16,9 +18,6 @@ type MediaFeatureFlags = {
|
|
|
16
18
|
};
|
|
17
19
|
export declare function getMediaGlobalScope(globalScope?: any): MediaGlobalScope;
|
|
18
20
|
export declare function getMediaCardSSR(globalScope?: any): MediaCardSsr;
|
|
19
|
-
export declare function getMediaCountSSR(globalScope?: any): number;
|
|
20
|
-
export declare function incrementMediaCountSSR(globalScope?: any): void;
|
|
21
21
|
export declare const getKey: ({ id, collectionName, occurrenceKey }: FileIdentifier, resizeMode?: string) => string;
|
|
22
|
-
export declare const storeDataURI: (key: string, paramDataURI?: string, paramMode?: string, paramSrcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags, globalScope?: any) => void;
|
|
23
22
|
export declare const generateScriptProps: (identifier: FileIdentifier, dataURI?: string, mode?: string, srcSet?: string, dimensions?: Partial<NumericalCardDimensions>, error?: MediaFilePreviewErrorInfo, featureFlags?: MediaFeatureFlags) => React.ScriptHTMLAttributes<HTMLScriptElement>;
|
|
24
23
|
export {};
|
|
File without changes
|
|
@@ -39,5 +39,5 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
|
|
|
39
39
|
onImageError: (failedPreview?: MediaFilePreview) => void;
|
|
40
40
|
onImageLoad: (newPreview?: MediaFilePreview) => void;
|
|
41
41
|
getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
|
|
42
|
-
copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void;
|
|
42
|
+
copyNodeRef: (instance: HTMLDivElement | HTMLImageElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES];
|
|
43
43
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/media-file-preview",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.3",
|
|
4
4
|
"description": "A React Hook to fetch and render file previews. It's overloaded with fancy features like SSR, lazy loading, memory cache and local preview.",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"atlaskit:src": "src/index.ts",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@atlaskit/media-client": "^35.
|
|
33
|
+
"@atlaskit/media-client": "^35.7.0",
|
|
34
34
|
"@atlaskit/media-client-react": "^4.1.0",
|
|
35
35
|
"@atlaskit/media-common": "^12.3.0",
|
|
36
36
|
"@atlaskit/media-ui": "^28.7.0",
|
|
37
37
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
38
|
-
"@atlaskit/react-ufo": "^4.
|
|
38
|
+
"@atlaskit/react-ufo": "^4.17.0",
|
|
39
39
|
"@babel/runtime": "^7.0.0",
|
|
40
40
|
"eventemitter2": "^4.1.0",
|
|
41
41
|
"lru_map": "^0.4.1"
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@af/visual-regression": "workspace:^",
|
|
50
50
|
"@atlaskit/media-state": "^1.8.0",
|
|
51
51
|
"@atlaskit/media-test-data": "^3.2.0",
|
|
52
|
-
"@atlaskit/section-message": "^8.
|
|
52
|
+
"@atlaskit/section-message": "^8.12.0",
|
|
53
53
|
"@atlaskit/ssr": "workspace:^",
|
|
54
54
|
"@atlassian/feature-flags-test-utils": "^1.0.0",
|
|
55
55
|
"@testing-library/react": "^13.4.0",
|
|
@@ -99,9 +99,6 @@
|
|
|
99
99
|
"media-perf-uplift-mutation-fix": {
|
|
100
100
|
"type": "boolean"
|
|
101
101
|
},
|
|
102
|
-
"jfp-magma-fix-failed-ssr-preview-load": {
|
|
103
|
-
"type": "boolean"
|
|
104
|
-
},
|
|
105
102
|
"media-perf-lazy-loading-optimisation": {
|
|
106
103
|
"type": "boolean"
|
|
107
104
|
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.printScript = exports.printFunctionCall = void 0;
|
|
8
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
9
|
-
var printParam = function printParam(param) {
|
|
10
|
-
if (typeof param === 'string') {
|
|
11
|
-
return "'".concat(param, "'");
|
|
12
|
-
} else if ((0, _typeof2.default)(param) === 'object') {
|
|
13
|
-
return JSON.stringify(param);
|
|
14
|
-
} else if (param === undefined) {
|
|
15
|
-
return 'undefined';
|
|
16
|
-
}
|
|
17
|
-
return param;
|
|
18
|
-
};
|
|
19
|
-
var printParams = function printParams(args) {
|
|
20
|
-
return args.map(function (arg) {
|
|
21
|
-
return printParam(arg);
|
|
22
|
-
}).join(',');
|
|
23
|
-
};
|
|
24
|
-
var printFunctionCall = exports.printFunctionCall = function printFunctionCall(fn) {
|
|
25
|
-
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
26
|
-
args[_key - 1] = arguments[_key];
|
|
27
|
-
}
|
|
28
|
-
return "(".concat(fn.toString(), ")(").concat(printParams(args), ");");
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// Removing the script tag after execution to prevent hydration
|
|
32
|
-
// mismatch issues after SSR. We don't want to render different
|
|
33
|
-
// HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
|
|
34
|
-
// Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
|
|
35
|
-
var printScript = exports.printScript = function printScript(statements) {
|
|
36
|
-
return "(function(){\n\t\t\t let script = document.currentScript;\n \t\t\t ".concat(statements.join(';'), "\n\t\t\t document.currentScript.remove();\n\t\t})();\n\t\t");
|
|
37
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const printParam = param => {
|
|
2
|
-
if (typeof param === 'string') {
|
|
3
|
-
return `'${param}'`;
|
|
4
|
-
} else if (typeof param === 'object') {
|
|
5
|
-
return JSON.stringify(param);
|
|
6
|
-
} else if (param === undefined) {
|
|
7
|
-
return 'undefined';
|
|
8
|
-
}
|
|
9
|
-
return param;
|
|
10
|
-
};
|
|
11
|
-
const printParams = args => args.map(arg => printParam(arg)).join(',');
|
|
12
|
-
export const printFunctionCall = (fn, ...args) => `(${fn.toString()})(${printParams(args)});`;
|
|
13
|
-
|
|
14
|
-
// Removing the script tag after execution to prevent hydration
|
|
15
|
-
// mismatch issues after SSR. We don't want to render different
|
|
16
|
-
// HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
|
|
17
|
-
// Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
|
|
18
|
-
export const printScript = statements => `(function(){
|
|
19
|
-
let script = document.currentScript;
|
|
20
|
-
${statements.join(';')}
|
|
21
|
-
document.currentScript.remove();
|
|
22
|
-
})();
|
|
23
|
-
`;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
|
-
var printParam = function printParam(param) {
|
|
3
|
-
if (typeof param === 'string') {
|
|
4
|
-
return "'".concat(param, "'");
|
|
5
|
-
} else if (_typeof(param) === 'object') {
|
|
6
|
-
return JSON.stringify(param);
|
|
7
|
-
} else if (param === undefined) {
|
|
8
|
-
return 'undefined';
|
|
9
|
-
}
|
|
10
|
-
return param;
|
|
11
|
-
};
|
|
12
|
-
var printParams = function printParams(args) {
|
|
13
|
-
return args.map(function (arg) {
|
|
14
|
-
return printParam(arg);
|
|
15
|
-
}).join(',');
|
|
16
|
-
};
|
|
17
|
-
export var printFunctionCall = function printFunctionCall(fn) {
|
|
18
|
-
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
19
|
-
args[_key - 1] = arguments[_key];
|
|
20
|
-
}
|
|
21
|
-
return "(".concat(fn.toString(), ")(").concat(printParams(args), ");");
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// Removing the script tag after execution to prevent hydration
|
|
25
|
-
// mismatch issues after SSR. We don't want to render different
|
|
26
|
-
// HTML on the client and server https://react.dev/reference/react-dom/client/hydrateRoot
|
|
27
|
-
// Note: document.currentScript gets incorrectly transpiled to globalThis.currentScript so we need to use it here to avoid transpilation
|
|
28
|
-
export var printScript = function printScript(statements) {
|
|
29
|
-
return "(function(){\n\t\t\t let script = document.currentScript;\n \t\t\t ".concat(statements.join(';'), "\n\t\t\t document.currentScript.remove();\n\t\t})();\n\t\t");
|
|
30
|
-
};
|