UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

208 lines (207 loc) • 20.6 kB
"use strict"; 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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