react-film
Version:
React component for showing carousel just like a film strip
233 lines (217 loc) • 31.8 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import "core-js/modules/es.array.iterator.js";
import "core-js/modules/es.object.from-entries.js";
import "core-js/modules/es.array.map.js";
import "core-js/modules/es.object.entries.js";
import "core-js/modules/web.timers.js";
import "core-js/modules/es.object.keys.js";
import "core-js/modules/es.symbol.js";
import "core-js/modules/es.array.filter.js";
import "core-js/modules/es.object.get-own-property-descriptor.js";
import "core-js/modules/es.array.for-each.js";
import "core-js/modules/web.dom-collections.for-each.js";
import "core-js/modules/es.object.get-own-property-descriptors.js";
import "core-js/modules/es.object.define-properties.js";
import "core-js/modules/es.object.define-property.js";
import createEmotion from '@emotion/css/create-instance';
import PropTypes from 'prop-types';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import AutoCenter from './AutoCenter';
import computeScrollLeft from './computeScrollLeft';
import createBasicStyleSet from './createBasicStyleSet';
import createCSSKey from './util/createCSSKey';
import FunctionContext from './FunctionContext';
import getView from './getView';
import InternalContext from './InternalContext';
import LegacyContext from './LegacyContext';
import patchStyleOptions from './patchStyleOptions';
import PropsContext from './PropsContext';
import useAnimateScrollLeft from './hooks/internal/useAnimateScrollLeft';
import useCallbackRefWithSubscribe from './hooks/internal/useCallbackRefWithSubscribe';
import useObserveScrollLeft from './hooks/internal/useObserveScrollLeft';
import ViewContext from './ViewContext'; // We pool the emotion, so we don't create a new set of <style> for every component and reuse as much as we could.
var emotionPool = {};
var Composer = function Composer(_ref) {
var children = _ref.children,
dir = _ref.dir,
height = _ref.height,
nonce = _ref.nonce,
numItems = _ref.numItems,
styleOptions = _ref.styleOptions,
styleSet = _ref.styleSet;
dir = dir === 'ltr' || dir === 'rtl' ? dir : undefined;
var patchedStyleOptions = useMemo(function () {
return patchStyleOptions(styleOptions);
}, [styleOptions]);
var patchedStyleSet = useMemo(function () {
return styleSet || createBasicStyleSet(patchedStyleOptions);
}, [patchedStyleOptions, styleSet]);
var styleSetClassNames = useMemo(function () {
var emotion = emotionPool[nonce] || (emotionPool[nonce] = createEmotion({
key: "react-film--css-".concat(createCSSKey()),
nonce: nonce
}));
return Object.fromEntries(Object.entries(patchedStyleSet).map(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
name = _ref3[0],
style = _ref3[1];
return [name, emotion.css(style) + ''];
}));
}, [nonce, patchedStyleSet]);
var _useState = useState(),
_useState2 = _slicedToArray(_useState, 2),
_ = _useState2[0],
forceRender = _useState2[1];
var itemContainerCallbackRefWithSubscribe = useCallbackRefWithSubscribe();
var scrollableCallbackRefWithSubscribe = useCallbackRefWithSubscribe();
var scrollLeftRef = useRef(null);
var scrollTimeoutRef = useRef();
useEffect(function () {
return function () {
return clearTimeout(scrollTimeoutRef.current);
};
}, [scrollTimeoutRef]);
var scrollTo = useCallback(function (scrollFn) {
var view = getView(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current);
if (view) {
var index = view.index,
indexFraction = view.indexFraction;
var targetIndex = scrollFn({
index: index,
indexFraction: indexFraction
});
if (typeof targetIndex === 'number') {
scrollLeftRef.current = computeScrollLeft(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, targetIndex);
forceRender({});
}
}
}, [dir, forceRender, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef]);
var scrollOneLeft = useCallback(function () {
scrollTo(function (_ref4) {
var indexFraction = _ref4.indexFraction;
return dir === 'rtl' ? Math.floor(indexFraction) + 1 : Math.ceil(indexFraction) - 1;
});
}, [dir, scrollTo]);
var scrollOneRight = useCallback(function () {
scrollTo(function (_ref5) {
var indexFraction = _ref5.indexFraction;
return dir === 'rtl' ? Math.ceil(indexFraction) - 1 : Math.floor(indexFraction) + 1;
});
}, [dir, scrollTo]);
var functionContext = useMemo(function () {
return {
scrollTo: scrollTo,
scrollOneLeft: scrollOneLeft,
scrollOneRight: scrollOneRight
};
}, [scrollTo, scrollOneLeft, scrollOneRight]);
var internalContext = useMemo(function () {
return {
itemContainerCallbackRefWithSubscribe: itemContainerCallbackRefWithSubscribe,
scrollableCallbackRefWithSubscribe: scrollableCallbackRefWithSubscribe
};
}, [itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe]);
var propsContext = useMemo(function () {
return {
dir: dir,
height: height,
nonce: nonce,
numItems: numItems,
styleOptions: patchedStyleOptions,
styleSetClassNames: styleSetClassNames
};
}, [dir, height, nonce, numItems, patchedStyleOptions, styleSetClassNames]);
var _useState3 = useState({
index: 0,
indexFraction: 0,
scrollBarPercentage: '0%',
scrollBarWidth: '0%',
scrolling: false
}),
_useState4 = _slicedToArray(_useState3, 2),
viewContext = _useState4[0],
setViewContext = _useState4[1]; // This will setViewContext and reset the "scrolling" flag after a period of time.
var setViewContext2 = useCallback(function (nextViewContext) {
setViewContext(nextViewContext);
clearTimeout(scrollTimeoutRef.current);
if (nextViewContext.scrolling) {
scrollTimeoutRef.current = setTimeout(function () {
return setViewContext(_objectSpread(_objectSpread({}, nextViewContext), {}, {
scrolling: false
}));
}, // eslint-disable-next-line no-magic-numbers
500);
}
}, [scrollTimeoutRef, setViewContext]);
var handleScroll = useCallback(function (_ref6) {
var scrollBarPercentage = _ref6.fraction,
initial = _ref6.initial,
scrollBarWidth = _ref6.width;
var view = getView(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current);
if (view) {
var index = view.index,
indexFraction = view.indexFraction;
setViewContext2({
index: index,
indexFraction: indexFraction,
scrolling: !initial,
scrollBarPercentage: scrollBarPercentage,
scrollBarWidth: scrollBarWidth
});
}
}, [dir, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef, setViewContext2]);
var handleScrollToEnd = useCallback(function () {
scrollLeftRef.current = null;
forceRender({});
}, [forceRender, scrollLeftRef]);
var legacyContext = useMemo(function () {
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, functionContext), internalContext), propsContext), viewContext);
}, [functionContext, internalContext, propsContext, viewContext]);
useAnimateScrollLeft(typeof scrollLeftRef.current === 'number' && scrollableCallbackRefWithSubscribe.current, scrollLeftRef.current, handleScrollToEnd);
useEffect(function () {
return scrollableCallbackRefWithSubscribe.subscribe(function (current) {
if (current) {
current.addEventListener('pointerdown', handleScrollToEnd, {
passive: true
});
return function () {
return current.removeEventListener('pointerdown', handleScrollToEnd);
};
}
});
}, [handleScrollToEnd, scrollableCallbackRefWithSubscribe]);
useObserveScrollLeft(scrollableCallbackRefWithSubscribe, handleScroll);
return /*#__PURE__*/React.createElement(PropsContext.Provider, {
value: propsContext
}, /*#__PURE__*/React.createElement(InternalContext.Provider, {
value: internalContext
}, /*#__PURE__*/React.createElement(FunctionContext.Provider, {
value: functionContext
}, /*#__PURE__*/React.createElement(ViewContext.Provider, {
value: viewContext
}, /*#__PURE__*/React.createElement(LegacyContext.Provider, {
value: legacyContext
}, children, patchedStyleOptions.autoCenter && /*#__PURE__*/React.createElement(AutoCenter, null))))));
};
Composer.defaultProps = {
children: undefined,
dir: undefined,
height: undefined,
nonce: undefined,
styleOptions: undefined,
styleSet: undefined
};
Composer.propTypes = {
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.element), PropTypes.element]),
dir: PropTypes.oneOf(['ltr', 'rtl']),
height: PropTypes.number,
nonce: PropTypes.string,
numItems: PropTypes.number.isRequired,
styleOptions: PropTypes.any,
styleSet: PropTypes.any
};
export default Composer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJjcmVhdGVFbW90aW9uIiwiUHJvcFR5cGVzIiwiUmVhY3QiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIkF1dG9DZW50ZXIiLCJjb21wdXRlU2Nyb2xsTGVmdCIsImNyZWF0ZUJhc2ljU3R5bGVTZXQiLCJjcmVhdGVDU1NLZXkiLCJGdW5jdGlvbkNvbnRleHQiLCJnZXRWaWV3IiwiSW50ZXJuYWxDb250ZXh0IiwiTGVnYWN5Q29udGV4dCIsInBhdGNoU3R5bGVPcHRpb25zIiwiUHJvcHNDb250ZXh0IiwidXNlQW5pbWF0ZVNjcm9sbExlZnQiLCJ1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUiLCJ1c2VPYnNlcnZlU2Nyb2xsTGVmdCIsIlZpZXdDb250ZXh0IiwiZW1vdGlvblBvb2wiLCJDb21wb3NlciIsImNoaWxkcmVuIiwiZGlyIiwiaGVpZ2h0Iiwibm9uY2UiLCJudW1JdGVtcyIsInN0eWxlT3B0aW9ucyIsInN0eWxlU2V0IiwidW5kZWZpbmVkIiwicGF0Y2hlZFN0eWxlT3B0aW9ucyIsInBhdGNoZWRTdHlsZVNldCIsInN0eWxlU2V0Q2xhc3NOYW1lcyIsImVtb3Rpb24iLCJrZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJuYW1lIiwic3R5bGUiLCJjc3MiLCJfIiwiZm9yY2VSZW5kZXIiLCJpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlIiwic2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZSIsInNjcm9sbExlZnRSZWYiLCJzY3JvbGxUaW1lb3V0UmVmIiwiY2xlYXJUaW1lb3V0IiwiY3VycmVudCIsInNjcm9sbFRvIiwic2Nyb2xsRm4iLCJ2aWV3IiwiaW5kZXgiLCJpbmRleEZyYWN0aW9uIiwidGFyZ2V0SW5kZXgiLCJzY3JvbGxPbmVMZWZ0IiwiTWF0aCIsImZsb29yIiwiY2VpbCIsInNjcm9sbE9uZVJpZ2h0IiwiZnVuY3Rpb25Db250ZXh0IiwiaW50ZXJuYWxDb250ZXh0IiwicHJvcHNDb250ZXh0Iiwic2Nyb2xsQmFyUGVyY2VudGFnZSIsInNjcm9sbEJhcldpZHRoIiwic2Nyb2xsaW5nIiwidmlld0NvbnRleHQiLCJzZXRWaWV3Q29udGV4dCIsInNldFZpZXdDb250ZXh0MiIsIm5leHRWaWV3Q29udGV4dCIsInNldFRpbWVvdXQiLCJoYW5kbGVTY3JvbGwiLCJmcmFjdGlvbiIsImluaXRpYWwiLCJ3aWR0aCIsImhhbmRsZVNjcm9sbFRvRW5kIiwibGVnYWN5Q29udGV4dCIsInN1YnNjcmliZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImF1dG9DZW50ZXIiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJhcnJheU9mIiwiZWxlbWVudCIsIm9uZU9mIiwibnVtYmVyIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsYUFBUCxNQUEwQiw4QkFBMUI7QUFDQSxPQUFPQyxTQUFQLE1BQXNCLFlBQXRCO0FBQ0EsT0FBT0MsS0FBUCxJQUFnQkMsV0FBaEIsRUFBNkJDLFNBQTdCLEVBQXdDQyxPQUF4QyxFQUFpREMsTUFBakQsRUFBeURDLFFBQXpELFFBQXlFLE9BQXpFO0FBRUEsT0FBT0MsVUFBUCxNQUF1QixjQUF2QjtBQUNBLE9BQU9DLGlCQUFQLE1BQThCLHFCQUE5QjtBQUNBLE9BQU9DLG1CQUFQLE1BQWdDLHVCQUFoQztBQUNBLE9BQU9DLFlBQVAsTUFBeUIscUJBQXpCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxPQUFQLE1BQW9CLFdBQXBCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxhQUFQLE1BQTBCLGlCQUExQjtBQUNBLE9BQU9DLGlC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USxDQUFDK0QsU0FBVCxHQUFxQjtBQUNuQjlELEVBQUFBLFFBQVEsRUFBRXZCLFNBQVMsQ0FBQ3NGLFNBQVYsQ0FBb0IsQ0FBQ3RGLFNBQVMsQ0FBQ3VGLE9BQVYsQ0FBa0J2RixTQUFTLENBQUN3RixPQUE1QixDQUFELEVBQXVDeEYsU0FBUyxDQUFDd0YsT0FBakQsQ0FBcEIsQ0FEUztBQUVuQmhFLEVBQUFBLEdBQUcsRUFBRXhCLFNBQVMsQ0FBQ3lGLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFoQixDQUZjO0FBR25CaEUsRUFBQUEsTUFBTSxFQUFFekIsU0FBUyxDQUFDMEYsTUFIQztBQUluQmhFLEVBQUFBLEtBQUssRUFBRTFCLFNBQVMsQ0FBQzJGLE1BSkU7QUFLbkJoRSxFQUFBQSxRQUFRLEVBQUUzQixTQUFTLENBQUMwRixNQUFWLENBQWlCRSxVQUxSO0FBTW5CaEUsRUFBQUEsWUFBWSxFQUFFNUIsU0FBUyxDQUFDNkYsR0FOTDtBQU9uQmhFLEVBQUFBLFFBQVEsRUFBRTdCLFNBQVMsQ0FBQzZGO0FBUEQsQ0FBckI7QUFVQSxlQUFldkUsUUFBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVFbW90aW9uIGZyb20gJ0BlbW90aW9uL2Nzcy9jcmVhdGUtaW5zdGFuY2UnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0b0NlbnRlciBmcm9tICcuL0F1dG9DZW50ZXInO1xuaW1wb3J0IGNvbXB1dGVTY3JvbGxMZWZ0IGZyb20gJy4vY29tcHV0ZVNjcm9sbExlZnQnO1xuaW1wb3J0IGNyZWF0ZUJhc2ljU3R5bGVTZXQgZnJvbSAnLi9jcmVhdGVCYXNpY1N0eWxlU2V0JztcbmltcG9ydCBjcmVhdGVDU1NLZXkgZnJvbSAnLi91dGlsL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgRnVuY3Rpb25Db250ZXh0IGZyb20gJy4vRnVuY3Rpb25Db250ZXh0JztcbmltcG9ydCBnZXRWaWV3IGZyb20gJy4vZ2V0Vmlldyc7XG5pbXBvcnQgSW50ZXJuYWxDb250ZXh0IGZyb20gJy4vSW50ZXJuYWxDb250ZXh0JztcbmltcG9ydCBMZWdhY3lDb250ZXh0IGZyb20gJy4vTGVnYWN5Q29udGV4dCc7XG5pbXBvcnQgcGF0Y2hTdHlsZU9wdGlvbnMgZnJvbSAnLi9wYXRjaFN0eWxlT3B0aW9ucyc7XG5pbXBvcnQgUHJvcHNDb250ZXh0IGZyb20gJy4vUHJvcHNDb250ZXh0JztcbmltcG9ydCB1c2VBbmltYXRlU2Nyb2xsTGVmdCBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZUFuaW1hdGVTY3JvbGxMZWZ0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUnO1xuaW1wb3J0IHVzZU9ic2VydmVTY3JvbGxMZWZ0IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlT2JzZXJ2ZVNjcm9sbExlZnQnO1xuaW1wb3J0IFZpZXdDb250ZXh0IGZyb20gJy4vVmlld0NvbnRleHQnO1xuXG4vLyBXZSBwb29sIHRoZSBlbW90aW9uLCBzbyB3ZSBkb24ndCBjcmVhdGUgYSBuZXcgc2V0IG9mIDxzdHlsZT4gZm9yIGV2ZXJ5IGNvbXBvbmVudCBhbmQgcmV1c2UgYXMgbXVjaCBhcyB3ZSBjb3VsZC5cbmNvbnN0IGVtb3Rpb25Qb29sID0ge307XG5cbmNvbnN0IENvbXBvc2VyID0gKHsgY2hpbGRyZW4sIGRpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQgfSkgPT4ge1xuICBkaXIgPSBkaXIgPT09ICdsdHInIHx8IGRpciA9PT0gJ3J0bCcgPyBkaXIgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlT3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gcGF0Y2hTdHlsZU9wdGlvbnMoc3R5bGVPcHRpb25zKSwgW3N0eWxlT3B0aW9uc10pO1xuICBjb25zdCBwYXRjaGVkU3R5bGVTZXQgPSB1c2VNZW1vKFxuICAgICgpID0+IHN0eWxlU2V0IHx8IGNyZWF0ZUJhc2ljU3R5bGVTZXQocGF0Y2hlZFN0eWxlT3B0aW9ucyksXG4gICAgW3BhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0XVxuICApO1xuXG4gIGNvbnN0IHN0eWxlU2V0Q2xhc3NOYW1lcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgcmVhY3QtZmlsbS0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXRjaGVkU3R5bGVTZXQpLm1hcCgoW25hbWUsIHN0eWxlXSkgPT4gW25hbWUsIGVtb3Rpb24uY3NzKHN0eWxlKSArICcnXSkpO1xuICB9LCBbbm9uY2UsIHBhdGNoZWRTdHlsZVNldF0pO1xuXG4gIGNvbnN0IFtfLCBmb3JjZVJlbmRlcl0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlID0gdXNlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlKCk7XG4gIGNvbnN0IHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgPSB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUoKTtcbiAgY29uc3Qgc2Nyb2xsTGVmdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2Nyb2xsVGltZW91dFJlZiA9IHVzZVJlZigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZW91dFJlZi5jdXJyZW50KSwgW3Njcm9sbFRpbWVvdXRSZWZdKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIHNjcm9sbEZuID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gc2Nyb2xsRm4oeyBpbmRleCwgaW5kZXhGcmFjdGlvbiB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNjcm9sbExlZnRSZWYuY3VycmVudCA9IGNvbXB1dGVTY3JvbGxMZWZ0KFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2RpciwgZm9yY2VSZW5kZXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWZdXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lTGVmdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUbygoeyBpbmRleEZyYWN0aW9uIH0pID0+IChkaXIgPT09ICdydGwnID8gTWF0aC5mbG9vcihpbmRleEZyYWN0aW9uKSArIDEgOiBNYXRoLmNlaWwoaW5kZXhGcmFjdGlvbikgLSAxKSk7XG4gIH0sIFtkaXIsIHNjcm9sbFRvXSk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lUmlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2Nyb2xsVG8oKHsgaW5kZXhGcmFjdGlvbiB9KSA9PiAoZGlyID09PSAncnRsJyA/IE1hdGguY2VpbChpbmRleEZyYWN0aW9uKSAtIDEgOiBNYXRoLmZsb29yKGluZGV4RnJhY3Rpb24pICsgMSkpO1xuICB9LCBbZGlyLCBzY3JvbGxUb10pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNjcm9sbFRvLFxuICAgICAgc2Nyb2xsT25lTGVmdCxcbiAgICAgIHNjcm9sbE9uZVJpZ2h0XG4gICAgfSksXG4gICAgW3Njcm9sbFRvLCBzY3JvbGxPbmVMZWZ0LCBzY3JvbGxPbmVSaWdodF1cbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbENvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLFxuICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZVxuICAgIH0pLFxuICAgIFtpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlXVxuICApO1xuXG4gIGNvbnN0IHByb3BzQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHsgZGlyLCBoZWlnaHQsIG5vbmNlLCBudW1JdGVtcywgc3R5bGVPcHRpb25zOiBwYXRjaGVkU3R5bGVPcHRpb25zLCBzdHlsZVNldENsYXNzTmFtZXMgfSksXG4gICAgW2RpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHBhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0Q2xhc3NOYW1lc11cbiAgKTtcblxuICBjb25zdCBbdmlld0NvbnRleHQsIHNldFZpZXdDb250ZXh0XSA9IHVzZVN0YXRlKHtcbiAgICBpbmRleDogMCxcbiAgICBpbmRleEZyYWN0aW9uOiAwLFxuICAgIHNjcm9sbEJhclBlcmNlbnRhZ2U6ICcwJScsXG4gICAgc2Nyb2xsQmFyV2lkdGg6ICcwJScsXG4gICAgc2Nyb2xsaW5nOiBmYWxzZVxuICB9KTtcblxuICAvLyBUaGlzIHdpbGwgc2V0Vmlld0NvbnRleHQgYW5kIHJlc2V0IHRoZSBcInNjcm9sbGluZ1wiIGZsYWcgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgY29uc3Qgc2V0Vmlld0NvbnRleHQyID0gdXNlQ2FsbGJhY2soXG4gICAgbmV4dFZpZXdDb250ZXh0ID0+IHtcbiAgICAgIHNldFZpZXdDb250ZXh0KG5leHRWaWV3Q29udGV4dCk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAobmV4dFZpZXdDb250ZXh0LnNjcm9sbGluZykge1xuICAgICAgICBzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBzZXRWaWV3Q29udGV4dCh7XG4gICAgICAgICAgICAgIC4uLm5leHRWaWV3Q29udGV4dCxcbiAgICAgICAgICAgICAgc2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzY3JvbGxUaW1lb3V0UmVmLCBzZXRWaWV3Q29udGV4dF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGwgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBmcmFjdGlvbjogc2Nyb2xsQmFyUGVyY2VudGFnZSwgaW5pdGlhbCwgd2lkdGg6IHNjcm9sbEJhcldpZHRoIH0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG5cbiAgICAgICAgc2V0Vmlld0NvbnRleHQyKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpbmRleEZyYWN0aW9uLFxuICAgICAgICAgIHNjcm9sbGluZzogIWluaXRpYWwsXG4gICAgICAgICAgc2Nyb2xsQmFyUGVyY2VudGFnZSxcbiAgICAgICAgICBzY3JvbGxCYXJXaWR0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWYsIHNldFZpZXdDb250ZXh0Ml1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0VuZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgfSwgW2ZvcmNlUmVuZGVyLCBzY3JvbGxMZWZ0UmVmXSk7XG5cbiAgY29uc3QgbGVnYWN5Q29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIC4uLmZ1bmN0aW9uQ29udGV4dCxcbiAgICAgIC4uLmludGVybmFsQ29udGV4dCxcbiAgICAgIC4uLnByb3BzQ29udGV4dCxcbiAgICAgIC4uLnZpZXdDb250ZXh0XG4gICAgfSksXG4gICAgW2Z1bmN0aW9uQ29udGV4dCwgaW50ZXJuYWxDb250ZXh0LCBwcm9wc0NvbnRleHQsIHZpZXdDb250ZXh0XVxuICApO1xuXG4gIHVzZUFuaW1hdGVTY3JvbGxMZWZ0KFxuICAgIHR5cGVvZiBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPT09ICdudW1iZXInICYmIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQsXG4gICAgaGFuZGxlU2Nyb2xsVG9FbmRcbiAgKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuc3Vic2NyaWJlKGN1cnJlbnQgPT4ge1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgcmV0dXJuICgpID0+IGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIFtoYW5kbGVTY3JvbGxUb0VuZCwgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZV1cbiAgKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsTGVmdChzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBoYW5kbGVTY3JvbGwpO1xuXG4gIHJldHVybiAoXG4gICAgPFByb3BzQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvcHNDb250ZXh0fT5cbiAgICAgIDxJbnRlcm5hbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ludGVybmFsQ29udGV4dH0+XG4gICAgICAgIDxGdW5jdGlvbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2Z1bmN0aW9uQ29udGV4dH0+XG4gICAgICAgICAgPFZpZXdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2aWV3Q29udGV4dH0+XG4gICAgICAgICAgICA8TGVnYWN5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17bGVnYWN5Q29udGV4dH0+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAge3BhdGNoZWRTdHlsZU9wdGlvbnMuYXV0b0NlbnRlciAmJiA8QXV0b0NlbnRlciAvPn1cbiAgICAgICAgICAgIDwvTGVnYWN5Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1ZpZXdDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L0Z1bmN0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSW50ZXJuYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUHJvcHNDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuQ29tcG9zZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBkaXI6IHVuZGVmaW5lZCxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIG5vbmNlOiB1bmRlZmluZWQsXG4gIHN0eWxlT3B0aW9uczogdW5kZWZpbmVkLFxuICBzdHlsZVNldDogdW5kZWZpbmVkXG59O1xuXG5Db21wb3Nlci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuZWxlbWVudCksIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGRpcjogUHJvcFR5cGVzLm9uZU9mKFsnbHRyJywgJ3J0bCddKSxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbnVtSXRlbXM6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc3R5bGVPcHRpb25zOiBQcm9wVHlwZXMuYW55LFxuICBzdHlsZVNldDogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zZXI7XG4iXX0=