payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
208 lines (207 loc) • 20.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "LivePreviewProvider", {
enumerable: true,
get: function() {
return LivePreviewProvider;
}
});
const _core = require("@dnd-kit/core");
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
const _fieldSchemaToJSON = require("../../../../../utilities/fieldSchemaToJSON");
const _collisionDetection = require("./collisionDetection");
const _context = require("./context");
const _sizeReducer = require("./sizeReducer");
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const LivePreviewProvider = (props)=>{
const { breakpoints, children, isPopupOpen, openPopupWindow, popupRef, url } = props;
const [previewWindowType, setPreviewWindowType] = (0, _react.useState)('iframe');
const [appIsReady, setAppIsReady] = (0, _react.useState)(false);
const iframeRef = _react.default.useRef(null);
const [iframeHasLoaded, setIframeHasLoaded] = (0, _react.useState)(false);
const [zoom, setZoom] = (0, _react.useState)(1);
const [position, setPosition] = (0, _react.useState)({
x: 0,
y: 0
});
const [size, setSize] = _react.default.useReducer(_sizeReducer.sizeReducer, {
height: 0,
width: 0
});
const [measuredDeviceSize, setMeasuredDeviceSize] = (0, _react.useState)({
height: 0,
width: 0
});
const [breakpoint, setBreakpoint] = _react.default.useState('responsive');
const [fieldSchemaJSON] = (0, _react.useState)(()=>{
let fields;
if ('collection' in props) {
const { collection } = props;
fields = collection.fields;
}
if ('global' in props) {
const { global } = props;
fields = global.fields;
}
return (0, _fieldSchemaToJSON.fieldSchemaToJSON)(fields);
});
// The toolbar needs to freely drag and drop around the page
const handleDragEnd = (ev)=>{
// only update position if the toolbar is completely within the preview area
// otherwise reset it back to the previous position
// TODO: reset to the nearest edge of the preview area
if (ev.over && ev.over.id === 'live-preview-area') {
const newPos = {
x: position.x + ev.delta.x,
y: position.y + ev.delta.y
};
setPosition(newPos);
} else {
// reset
}
};
const setWidth = (0, _react.useCallback)((width)=>{
setSize({
type: 'width',
value: width
});
}, [
setSize
]);
const setHeight = (0, _react.useCallback)((height)=>{
setSize({
type: 'height',
value: height
});
}, [
setSize
]);
// explicitly set new width and height when as new breakpoints are selected
// exclude `custom` breakpoint as it is handled by the `setWidth` and `setHeight` directly
(0, _react.useEffect)(()=>{
const foundBreakpoint = breakpoints?.find((bp)=>bp.name === breakpoint);
if (foundBreakpoint && breakpoint !== 'responsive' && breakpoint !== 'custom' && typeof foundBreakpoint?.width === 'number' && typeof foundBreakpoint?.height === 'number') {
setSize({
type: 'reset',
value: {
height: foundBreakpoint.height,
width: foundBreakpoint.width
}
});
}
}, [
breakpoint,
breakpoints
]);
// Receive the `ready` message from the popup window
// This indicates that the app is ready to receive `window.postMessage` events
// This is also the only cross-origin way of detecting when a popup window has loaded
// Unlike iframe elements which have an `onLoad` handler, there is no way to access `window.open` on popups
(0, _react.useEffect)(()=>{
const handleMessage = (event)=>{
if (url?.startsWith(event.origin) && event.data && typeof event.data === 'object' && event.data.type === 'payload-live-preview') {
if (event.data.ready) {
setAppIsReady(true);
}
}
};
window.addEventListener('message', handleMessage);
return ()=>{
window.removeEventListener('message', handleMessage);
};
}, [
url
]);
const handleWindowChange = (0, _react.useCallback)((type)=>{
setAppIsReady(false);
setPreviewWindowType(type);
if (type === 'popup') openPopupWindow();
}, [
openPopupWindow
]);
// when the user closes the popup window, switch back to the iframe
// the `usePopupWindow` reports the `isPopupOpen` state for us to use here
(0, _react.useEffect)(()=>{
if (!isPopupOpen) {
handleWindowChange('iframe');
}
}, [
isPopupOpen,
handleWindowChange
]);
return /*#__PURE__*/ _react.default.createElement(_context.LivePreviewContext.Provider, {
value: {
appIsReady,
breakpoint,
breakpoints,
fieldSchemaJSON,
iframeHasLoaded,
iframeRef,
isPopupOpen,
measuredDeviceSize,
openPopupWindow,
popupRef,
previewWindowType,
setAppIsReady,
setBreakpoint,
setHeight,
setIframeHasLoaded,
setMeasuredDeviceSize,
setPreviewWindowType: handleWindowChange,
setSize,
setToolbarPosition: setPosition,
setWidth,
setZoom,
size,
toolbarPosition: position,
url,
zoom
}
}, /*#__PURE__*/ _react.default.createElement(_core.DndContext, {
collisionDetection: _collisionDetection.customCollisionDetection,
onDragEnd: handleDragEnd
}, children));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3ZpZXdzL0xpdmVQcmV2aWV3L0NvbnRleHQvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERuZENvbnRleHQgfSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB0eXBlIHsgTGl2ZVByZXZpZXdDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9leHBvcnRzL2NvbmZpZydcbmltcG9ydCB0eXBlIHsgRmllbGQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBFZGl0Vmlld1Byb3BzIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IHVzZVBvcHVwV2luZG93IH0gZnJvbSAnLi4vdXNlUG9wdXBXaW5kb3cnXG5cbmltcG9ydCB7IGZpZWxkU2NoZW1hVG9KU09OIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbGl0aWVzL2ZpZWxkU2NoZW1hVG9KU09OJ1xuaW1wb3J0IHsgY3VzdG9tQ29sbGlzaW9uRGV0ZWN0aW9uIH0gZnJvbSAnLi9jb2xsaXNpb25EZXRlY3Rpb24nXG5pbXBvcnQgeyBMaXZlUHJldmlld0NvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnXG5pbXBvcnQgeyBzaXplUmVkdWNlciB9IGZyb20gJy4vc2l6ZVJlZHVjZXInXG5cbmV4cG9ydCB0eXBlIExpdmVQcmV2aWV3UHJvdmlkZXJQcm9wcyA9IEVkaXRWaWV3UHJvcHMgJiB7XG4gIGFwcElzUmVhZHk/OiBib29sZWFuXG4gIGJyZWFrcG9pbnRzPzogTGl2ZVByZXZpZXdDb25maWdbJ2JyZWFrcG9pbnRzJ11cbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVxuICBkZXZpY2VTaXplPzoge1xuICAgIGhlaWdodDogbnVtYmVyXG4gICAgd2lkdGg6IG51bWJlclxuICB9XG4gIGlzUG9wdXBPcGVuPzogYm9vbGVhblxuICBvcGVuUG9wdXBXaW5kb3c/OiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VQb3B1cFdpbmRvdz5bJ29wZW5Qb3B1cFdpbmRvdyddXG4gIHBvcHVwUmVmPzogUmVhY3QuTXV0YWJsZVJlZk9iamVjdDxXaW5kb3c+XG4gIHVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTGl2ZVByZXZpZXdQcm92aWRlcjogUmVhY3QuRkM8TGl2ZVByZXZpZXdQcm92aWRlclByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGJyZWFrcG9pbnRzLCBjaGlsZHJlbiwgaXNQb3B1cE9wZW4sIG9wZW5Qb3B1cFdpbmRvdywgcG9wdXBSZWYsIHVybCB9ID0gcHJvcHNcblxuICBjb25zdCBbcHJldmlld1dpbmRvd1R5cGUsIHNldFByZXZpZXdXaW5kb3dUeXBlXSA9IHVzZVN0YXRlPCdpZnJhbWUnIHwgJ3BvcHVwJz4oJ2lmcmFtZScpXG5cbiAgY29uc3QgW2FwcElzUmVhZHksIHNldEFwcElzUmVhZHldID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgaWZyYW1lUmVmID0gUmVhY3QudXNlUmVmPEhUTUxJRnJhbWVFbGVtZW50PihudWxsKVxuXG4gIGNvbnN0IFtpZnJhbWVIYXNMb2FkZWQsIHNldElmcmFtZUhhc0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBbem9vbSwgc2V0Wm9vbV0gPSB1c2VTdGF0ZSgxKVxuXG4gIGNvbnN0IFtwb3NpdGlvbiwgc2V0UG9zaXRpb25dID0gdXNlU3RhdGUoeyB4OiAwLCB5OiAwIH0pXG5cbiAgY29uc3QgW3NpemUsIHNldFNpemVdID0gUmVhY3QudXNlUmVkdWNlcihzaXplUmVkdWNlciwgeyBoZWlnaHQ6IDAsIHdpZHRoOiAwIH0pXG5cbiAgY29uc3QgW21lYXN1cmVkRGV2aWNlU2l6ZSwgc2V0TWVhc3VyZWREZXZpY2VTaXplXSA9IHVzZVN0YXRlKHtcbiAgICBoZWlnaHQ6IDAsXG4gICAgd2lkdGg6IDAsXG4gIH0pXG5cbiAgY29uc3QgW2JyZWFrcG9pbnQsIHNldEJyZWFrcG9pbnRdID1cbiAgICBSZWFjdC51c2VTdGF0ZTxMaXZlUHJldmlld0NvbmZpZ1snYnJlYWtwb2ludHMnXVswXVsnbmFtZSddPigncmVzcG9uc2l2ZScpXG5cbiAgY29uc3QgW2ZpZWxkU2NoZW1hSlNPTl0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgbGV0IGZpZWxkczogRmllbGRbXVxuXG4gICAgaWYgKCdjb2xsZWN0aW9uJyBpbiBwcm9wcykge1xuICAgICAgY29uc3QgeyBjb2xsZWN0aW9uIH0gPSBwcm9wc1xuICAgICAgZmllbGRzID0gY29sbGVjdGlvbi5maWVsZHNcbiAgICB9XG5cbiAgICBpZiAoJ2dsb2JhbCcgaW4gcHJvcHMpIHtcbiAgICAgIGNvbnN0IHsgZ2xvYmFsIH0gPSBwcm9wc1xuICAgICAgZmllbGRzID0gZ2xvYmFsLmZpZWxkc1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZFNjaGVtYVRvSlNPTihmaWVsZHMpXG4gIH0pXG5cbiAgLy8gVGhlIHRvb2xiYXIgbmVlZHMgdG8gZnJlZWx5IGRyYWcgYW5kIGRyb3AgYXJvdW5kIHRoZSBwYWdlXG4gIGNvbnN0IGhhbmRsZURyYWdFbmQgPSAoZXYpID0+IHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBwb3NpdGlvbiBpZiB0aGUgdG9vbGJhciBpcyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcHJldmlldyBhcmVhXG4gICAgLy8gb3RoZXJ3aXNlIHJlc2V0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHBvc2l0aW9uXG4gICAgLy8gVE9ETzogcmVzZXQgdG8gdGhlIG5lYXJlc3QgZWRnZSBvZiB0aGUgcHJldmlldyBhcmVhXG4gICAgaWYgKGV2Lm92ZXIgJiYgZXYub3Zlci5pZCA9PT0gJ2xpdmUtcHJldmlldy1hcmVhJykge1xuICAgICAgY29uc3QgbmV3UG9zID0ge1xuICAgICAgICB4OiBwb3NpdGlvbi54ICsgZXYuZGVsdGEueCxcbiAgICAgICAgeTogcG9zaXRpb24ueSArIGV2LmRlbHRhLnksXG4gICAgICB9XG5cbiAgICAgIHNldFBvc2l0aW9uKG5ld1BvcylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZXRcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZXRXaWR0aCA9IHVzZUNhbGxiYWNrKFxuICAgICh3aWR0aCkgPT4ge1xuICAgICAgc2V0U2l6ZSh7IHR5cGU6ICd3aWR0aCcsIHZhbHVlOiB3aWR0aCB9KVxuICAgIH0sXG4gICAgW3NldFNpemVdLFxuICApXG5cbiAgY29uc3Qgc2V0SGVpZ2h0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGhlaWdodCkgPT4ge1xuICAgICAgc2V0U2l6ZSh7IHR5cGU6ICdoZWlnaHQnLCB2YWx1ZTogaGVpZ2h0IH0pXG4gICAgfSxcbiAgICBbc2V0U2l6ZV0sXG4gIClcblxuICAvLyBleHBsaWNpdGx5IHNldCBuZXcgd2lkdGggYW5kIGhlaWdodCB3aGVuIGFzIG5ldyBicmVha3BvaW50cyBhcmUgc2VsZWN0ZWRcbiAgLy8gZXhjbHVkZSBgY3VzdG9tYCBicmVha3BvaW50IGFzIGl0IGlzIGhhbmRsZWQgYnkgdGhlIGBzZXRXaWR0aGAgYW5kIGBzZXRIZWlnaHRgIGRpcmVjdGx5XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZm91bmRCcmVha3BvaW50ID0gYnJlYWtwb2ludHM/LmZpbmQoKGJwKSA9PiBicC5uYW1lID09PSBicmVha3BvaW50KVxuXG4gICAgaWYgKFxuICAgICAgZm91bmRCcmVha3BvaW50ICYmXG4gICAgICBicmVha3BvaW50ICE9PSAncmVzcG9uc2l2ZScgJiZcbiAgICAgIGJyZWFrcG9pbnQgIT09ICdjdXN0b20nICYmXG4gICAgICB0eXBlb2YgZm91bmRCcmVha3BvaW50Py53aWR0aCA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiBmb3VuZEJyZWFrcG9pbnQ/LmhlaWdodCA9PT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHNldFNpemUoe1xuICAgICAgICB0eXBlOiAncmVzZXQnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGhlaWdodDogZm91bmRCcmVha3BvaW50LmhlaWdodCxcbiAgICAgICAgICB3aWR0aDogZm91bmRCcmVha3BvaW50LndpZHRoLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0sIFticmVha3BvaW50LCBicmVha3BvaW50c10pXG5cbiAgLy8gUmVjZWl2ZSB0aGUgYHJlYWR5YCBtZXNzYWdlIGZyb20gdGhlIHBvcHVwIHdpbmRvd1xuICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgaXMgcmVhZHkgdG8gcmVjZWl2ZSBgd2luZG93LnBvc3RNZXNzYWdlYCBldmVudHNcbiAgLy8gVGhpcyBpcyBhbHNvIHRoZSBvbmx5IGNyb3NzLW9yaWdpbiB3YXkgb2YgZGV0ZWN0aW5nIHdoZW4gYSBwb3B1cCB3aW5kb3cgaGFzIGxvYWRlZFxuICAvLyBVbmxpa2UgaWZyYW1lIGVsZW1lbnRzIHdoaWNoIGhhdmUgYW4gYG9uTG9hZGAgaGFuZGxlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGFjY2VzcyBgd2luZG93Lm9wZW5gIG9uIHBvcHVwc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB1cmw/LnN0YXJ0c1dpdGgoZXZlbnQub3JpZ2luKSAmJlxuICAgICAgICBldmVudC5kYXRhICYmXG4gICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBldmVudC5kYXRhLnR5cGUgPT09ICdwYXlsb2FkLWxpdmUtcHJldmlldydcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnQuZGF0YS5yZWFkeSkge1xuICAgICAgICAgIHNldEFwcElzUmVhZHkodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlTWVzc2FnZSlcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpXG4gICAgfVxuICB9LCBbdXJsXSlcblxuICBjb25zdCBoYW5kbGVXaW5kb3dDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodHlwZTogJ2lmcmFtZScgfCAncG9wdXAnKSA9PiB7XG4gICAgICBzZXRBcHBJc1JlYWR5KGZhbHNlKVxuICAgICAgc2V0UHJldmlld1dpbmRvd1R5cGUodHlwZSlcbiAgICAgIGlmICh0eXBlID09PSAncG9wdXAnKSBvcGVuUG9wdXBXaW5kb3coKVxuICAgIH0sXG4gICAgW29wZW5Qb3B1cFdpbmRvd10sXG4gIClcblxuICAvLyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgcG9wdXAgd2luZG93LCBzd2l0Y2ggYmFjayB0byB0aGUgaWZyYW1lXG4gIC8vIHRoZSBgdXNlUG9wdXBXaW5kb3dgIHJlcG9ydHMgdGhlIGBpc1BvcHVwT3BlbmAgc3RhdGUgZm9yIHVzIHRvIHVzZSBoZXJlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc1BvcHVwT3Blbikge1xuICAgICAgaGFuZGxlV2luZG93Q2hhbmdlKCdpZnJhbWUnKVxuICAgIH1cbiAgfSwgW2lzUG9wdXBPcGVuLCBoYW5kbGVXaW5kb3dDaGFuZ2VdKVxuXG4gIHJldHVybiAoXG4gICAgPExpdmVQcmV2aWV3Q29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgYXBwSXNSZWFkeSxcbiAgICAgICAgYnJlYWtwb2ludCxcbiAgICAgICAgYnJlYWtwb2ludHMsXG4gICAgICAgIGZpZWxkU2NoZW1hSlNPTixcbiAgICAgICAgaWZyYW1lSGFzTG9hZGVkLFxuICAgICAgICBpZnJhbWVSZWYsXG4gICAgICAgIGlzUG9wdXBPcGVuLFxuICAgICAgICBtZWFzdXJlZERldmljZVNpemUsXG4gICAgICAgIG9wZW5Qb3B1cFdpbmRvdyxcbiAgICAgICAgcG9wdXBSZWYsXG4gICAgICAgIHByZXZpZXdXaW5kb3dUeXBlLFxuICAgICAgICBzZXRBcHBJc1JlYWR5LFxuICAgICAgICBzZXRCcmVha3BvaW50LFxuICAgICAgICBzZXRIZWlnaHQsXG4gICAgICAgIHNldElmcmFtZUhhc0xvYWRlZCxcbiAgICAgICAgc2V0TWVhc3VyZWREZXZpY2VTaXplLFxuICAgICAgICBzZXRQcmV2aWV3V2luZG93VHlwZTogaGFuZGxlV2luZG93Q2hhbmdlLFxuICAgICAgICBzZXRTaXplLFxuICAgICAgICBzZXRUb29sYmFyUG9zaXRpb246IHNldFBvc2l0aW9uLFxuICAgICAgICBzZXRXaWR0aCxcbiAgICAgICAgc2V0Wm9vbSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdG9vbGJhclBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgdXJsLFxuICAgICAgICB6b29tLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8RG5kQ29udGV4dCBjb2xsaXNpb25EZXRlY3Rpb249e2N1c3RvbUNvbGxpc2lvbkRldGVjdGlvbn0gb25EcmFnRW5kPXtoYW5kbGVEcmFnRW5kfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9EbmRDb250ZXh0PlxuICAgIDwvTGl2ZVByZXZpZXdDb250ZXh0LlByb3ZpZGVyPlxuICApXG59XG4iXSwibmFtZXMiOlsiTGl2ZVByZXZpZXdQcm92aWRlciIsInByb3BzIiwiYnJlYWtwb2ludHMiLCJjaGlsZHJlbiIsImlzUG9wdXBPcGVuIiwib3BlblBvcHVwV2luZG93IiwicG9wdXBSZWYiLCJ1cmwiLCJwcmV2aWV3V2luZG93VHlwZSIsInNldFByZXZpZXdXaW5kb3dUeXBlIiwidXNlU3RhdGUiLCJhcHBJc1JlYWR5Iiwic2V0QXBwSXNSZWFkeSIsImlmcmFtZVJlZiIsIlJlYWN0IiwidXNlUmVmIiwiaWZyYW1lSGFzTG9hZGVkIiwic2V0SWZyYW1lSGFzTG9hZGVkIiwiem9vbSIsInNldFpvb20iLCJwb3NpdGlvbiIsInNldFBvc2l0aW9uIiwieCIsInkiLCJzaXplIiwic2V0U2l6ZSIsInVzZVJlZHVjZXIiLCJzaXplUmVkdWNlciIsImhlaWdodCIsIndpZHRoIiwibWVhc3VyZWREZXZpY2VTaXplIiwic2V0TWVhc3VyZWREZXZpY2VTaXplIiwiYnJlYWtwb2ludCIsInNldEJyZWFrcG9pbnQiLCJmaWVsZFNjaGVtYUpTT04iLCJmaWVsZHMiLCJjb2xsZWN0aW9uIiwiZ2xvYmFsIiwiZmllbGRTY2hlbWFUb0pTT04iLCJoYW5kbGVEcmFnRW5kIiwiZXYiLCJvdmVyIiwiaWQiLCJuZXdQb3MiLCJkZWx0YSIsInNldFdpZHRoIiwidXNlQ2FsbGJhY2siLCJ0eXBlIiwidmFsdWUiLCJzZXRIZWlnaHQiLCJ1c2VFZmZlY3QiLCJmb3VuZEJyZWFrcG9pbnQiLCJmaW5kIiwiYnAiLCJuYW1lIiwiaGFuZGxlTWVzc2FnZSIsImV2ZW50Iiwic3RhcnRzV2l0aCIsIm9yaWdpbiIsImRhdGEiLCJyZWFkeSIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaGFuZGxlV2luZG93Q2hhbmdlIiwiTGl2ZVByZXZpZXdDb250ZXh0IiwiUHJvdmlkZXIiLCJzZXRUb29sYmFyUG9zaXRpb24iLCJ0b29sYmFyUG9zaXRpb24iLCJEbmRDb250ZXh0IiwiY29sbGlzaW9uRGV0ZWN0aW9uIiwiY3VzdG9tQ29sbGlzaW9uRGV0ZWN0aW9uIiwib25EcmFnRW5kIl0sIm1hcHBpbmdzIjoiOzs7OytCQTJCYUE7OztlQUFBQTs7O3NCQTNCYzsrREFDNkI7bUNBT3RCO29DQUNPO3lCQUNOOzZCQUNQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQnJCLE1BQU1BLHNCQUEwRCxDQUFDQztJQUN0RSxNQUFNLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLGVBQWUsRUFBRUMsUUFBUSxFQUFFQyxH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