react-flashlight
Version:
A flashlight effect for React
205 lines (185 loc) • 27 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = ReactFlashlight;
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
/**
*
* @param {HTMLElement} children The component's children
* @param {bool} showCursor If true, shows the cursor
* @param {number} size the initial size of the light
* @param {object} initialPosition An object {x: value, y: value} defining the initial position
* @param {object} moveTo An object {x: value, y: value} defining the location to where the light will be moved
* @param {number} speed Defines the transition speed of the movement of the light
* @param {bool} contain If true, the light can't move outside of the container
* @param {bool} enableMouse If true, the user can control the light with its mouse
* @param {number} darkness Defines how dark is the "room"
*/
function ReactFlashlight(props) {
var enabled = props.enabled,
children = props.children,
showCursor = props.showCursor,
size = props.size,
initialPosition = props.initialPosition,
moveTo = props.moveTo,
speed = props.speed,
enableMouse = props.enableMouse,
darkness = props.darkness;
var lightStyle = {
position: "absolute",
top: 0,
left: 0,
// To control the size of the light, simply use a percentage on the background creating the effect - init with size
background: "radial-gradient(transparent 0%, rgba(0, 0, 0, " + darkness + ") " + size + "px, rgba(0, 0, 0, " + (darkness + 0.1) + ") 80%)",
transition: "none",
pointerEvents: "none",
willChange: "transform"
};
var elements = _react["default"].Children.map(children, function (child) {
return {
light: _react["default"].useRef(),
container: _react["default"].useRef()
};
});
_react["default"].useEffect(function () {
var last_known_scroll_position = 0;
var ticking = false;
elements.forEach(function (element) {
var container = element.container.current;
container.style.overflow = "hidden";
container.style.position = "relative";
if (!showCursor) container.style.cursor = "none";
}); // Resizes the light
function resizeLights() {
elements.forEach(function (element) {
resizeLight(element);
});
}
function resizeLight(element) {
var light = element.light.current;
var maskSize = window.innerWidth > window.innerHeight ? window.innerWidth : window.innerHeight;
light.style.width = maskSize * 2 + "px";
light.style.height = maskSize * 2 + "px";
light.style.left = initialPosition.x - maskSize + "px";
light.style.top = initialPosition.y - maskSize + "px";
}
function handleMouseMove(e) {
if (!ticking) {
window.requestAnimationFrame(function () {
ticking = false;
elements.forEach(function (element) {
var light = element.light.current;
var container = element.container.current;
var lightStyle = window.getComputedStyle(light, null);
var containerStyle = container.getBoundingClientRect();
light.style.transition = "opacity ease-in-out " + speed + "ms";
light.style.left = e.clientX - containerStyle.left - parseInt(lightStyle.width) / 2 + "px";
light.style.top = e.clientY - containerStyle.top - parseInt(lightStyle.height) / 2 + "px";
});
});
ticking = true;
}
}
function handleScroll(e) {
var increment = window.scrollY - last_known_scroll_position;
last_known_scroll_position = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function () {
ticking = false;
elements.forEach(function (element) {
var light = element.light.current;
light.style.transition = "opacity ease-in-out " + speed + "ms";
light.style.top = parseInt(light.style.top) + increment + "px";
});
});
ticking = true;
}
}
resizeLights();
var resizeObservers = [children.length];
elements.forEach(function (element, i) {
resizeObservers[i] = new _resizeObserverPolyfill["default"](function () {
return resizeLights();
});
});
if (enableMouse) window.addEventListener("mousemove", handleMouseMove);
if (enableMouse) window.addEventListener('scroll', handleScroll);
window.addEventListener("resize", resizeLights);
elements.forEach(function (element, i) {
resizeObservers[i].observe(element.container.current);
}); // Cleanup
return function () {
if (enableMouse) window.removeEventListener("mousemove", handleMouseMove);
if (enableMouse) window.removeEventListener("scroll", handleScroll);
window.removeEventListener("resize", resizeLights);
elements.forEach(function (element, i) {
resizeObservers[i].disconnect;
});
};
}, []);
/**
* This is executed when moveTo props change
*/
_react["default"].useEffect(function () {
if (moveTo) {
elements.forEach(function (element) {
var light = element.light.current;
light.style.transition = "all ease-in-out " + speed + "ms";
var lightStyle = window.getComputedStyle(light, null);
light.style.left = moveTo.x - parseInt(lightStyle.width) / 2 + "px";
light.style.top = moveTo.y - parseInt(lightStyle.height) / 2 + "px";
});
}
}, [moveTo]);
_react["default"].useEffect(function () {
elements.forEach(function (element) {
var light = element.light.current;
light.style.transition = "opacity ease-in-out " + speed + "ms";
enabled ? light.style.opacity = "1" : light.style.opacity = "0";
});
}, [enabled]);
return _react["default"].Children.map(children, function (child, i) {
return _react["default"].cloneElement(child, {
ref: elements[i].container,
children: _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("div", {
"data-testid": "react-flashlight",
style: lightStyle,
ref: elements[i].light
}), child.props.children)
});
});
}
ReactFlashlight.propTypes = {
enabled: _propTypes["default"].bool,
children: _propTypes["default"].node,
showCursor: _propTypes["default"].bool,
size: _propTypes["default"].number,
initialPosition: _propTypes["default"].shape({
x: _propTypes["default"].number,
y: _propTypes["default"].number
}),
moveTo: _propTypes["default"].object,
speed: _propTypes["default"].number,
contain: _propTypes["default"].bool,
enableMouse: _propTypes["default"].bool,
darkness: _propTypes["default"].number
};
ReactFlashlight.defaultProps = {
enabled: true,
children: _react["default"].createElement("div", null),
showCursor: false,
size: 150,
initialPosition: {
x: 0,
y: 0
},
moveTo: null,
speed: 1000,
enableMouse: true,
darkness: 0.9
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZWFjdEZsYXNobGlnaHQuanMiXSwibmFtZXMiOlsiUmVhY3RGbGFzaGxpZ2h0IiwicHJvcHMiLCJlbmFibGVkIiwiY2hpbGRyZW4iLCJzaG93Q3Vyc29yIiwic2l6ZSIsImluaXRpYWxQb3NpdGlvbiIsIm1vdmVUbyIsInNwZWVkIiwiZW5hYmxlTW91c2UiLCJkYXJrbmVzcyIsImxpZ2h0U3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJiYWNrZ3JvdW5kIiwidHJhbnNpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJ3aWxsQ2hhbmdlIiwiZWxlbWVudHMiLCJSZWFjdCIsIkNoaWxkcmVuIiwibWFwIiwiY2hpbGQiLCJsaWdodCIsInVzZVJlZiIsImNvbnRhaW5lciIsInVzZUVmZmVjdCIsImxhc3Rfa25vd25fc2Nyb2xsX3Bvc2l0aW9uIiwidGlja2luZyIsImZvckVhY2giLCJlbGVtZW50IiwiY3VycmVudCIsInN0eWxlIiwib3ZlcmZsb3ciLCJjdXJzb3IiLCJyZXNpemVMaWdodHMiLCJyZXNpemVMaWdodCIsIm1hc2tTaXplIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImhhbmRsZU1vdXNlTW92ZSIsImUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb21wdXRlZFN0eWxlIiwiY29udGFpbmVyU3R5bGUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwicGFyc2VJbnQiLCJjbGllbnRZIiwiaGFuZGxlU2Nyb2xsIiwiaW5jcmVtZW50Iiwic2Nyb2xsWSIsInJlc2l6ZU9ic2VydmVycyIsImxlbmd0aCIsImkiLCJSZXNpemVPYnNlcnZlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJvYnNlcnZlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRpc2Nvbm5lY3QiLCJvcGFjaXR5IiwiY2xvbmVFbGVtZW50IiwicmVmIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYm9vbCIsIm5vZGUiLCJudW1iZXIiLCJzaGFwZSIsIm9iamVjdCIsImNvbnRhaW4iLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQUVBOzs7Ozs7Ozs7Ozs7QUFhZSxTQUFTQSxlQUFULENBQXlCQyxLQUF6QixFQUFnQztBQUFBLE1BRzNDQyxPQUgyQyxHQVl6Q0QsS0FaeUMsQ0FHM0NDLE9BSDJDO0FBQUEsTUFJM0NDLFFBSjJDLEdBWXpDRixLQVp5QyxDQUkzQ0UsUUFKMkM7QUFBQSxNQUszQ0MsVUFMMkMsR0FZekNILEtBWnlDLENBSzNDRyxVQUwyQztBQUFBLE1BTTNDQyxJQU4yQyxHQVl6Q0osS0FaeUMsQ0FNM0NJLElBTjJDO0FBQUEsTUFPM0NDLGVBUDJDLEdBWXpDTCxLQVp5QyxDQU8zQ0ssZUFQMkM7QUFBQSxNQVEzQ0MsTUFSMkMsR0FZekNOLEtBWnlDLENBUTNDTSxNQVIyQztBQUFBLE1BUzNDQyxLQVQyQyxHQVl6Q1AsS0FaeUMsQ0FTM0NPLEtBVDJDO0FBQUEsTUFVM0NDLFdBVjJDLEdBWXpDUixLQVp5QyxDQVUzQ1EsV0FWMkM7QUFBQSxNQVczQ0MsUUFYMkMsR0FZekNULEtBWnlDLENBVzNDUyxRQVgyQztBQWM3QyxNQUFNQyxVQUFVLEdBQUc7QUFDakJDLElBQUFBLFFBQVEsRUFBRSxVQURPO0FBRWpCQyxJQUFBQSxHQUFHLEVBQUUsQ0FGWTtBQUdqQkMsSUFBQUEsSUFBSSxFQUFFLENBSFc7QUFJakI7QUFDQUMsSUFBQUEsVUFBVSxFQUFFLG1EQUFtREwsUUFBbkQsR0FBOEQsSUFBOUQsR0FBcUVMLElBQXJFLEdBQTRFLG9CQUE1RSxJQUFvR0ssUUFBUSxHQUFHLEdBQS9HLElBQXNILFFBTGpIO0FBTWpCTSxJQUFBQSxVQUFVLEVBQUUsTUFOSztBQU9qQkMsSUFBQUEsYUFBYSxFQUFFLE1BUEU7QUFRakJDLElBQUFBLFVBQVUsRUFBRTtBQVJLLEdBQW5COztBQVdBLE1BQU1DLFFBQVEsR0FBR0Msa0JBQU1DLFFB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QUFZMUI5RCxFQUFBQSxXQUFXLEVBQUU2RCxzQkFBVUMsSUFaRztBQWExQjdELEVBQUFBLFFBQVEsRUFBRTRELHNCQUFVRztBQWJNLENBQTVCO0FBZ0JBekUsZUFBZSxDQUFDNkUsWUFBaEIsR0FBK0I7QUFDN0IzRSxFQUFBQSxPQUFPLEVBQUUsSUFEb0I7QUFFN0JDLEVBQUFBLFFBQVEsRUFBRSw0Q0FGbUI7QUFHN0JDLEVBQUFBLFVBQVUsRUFBRSxLQUhpQjtBQUk3QkMsRUFBQUEsSUFBSSxFQUFFLEdBSnVCO0FBSzdCQyxFQUFBQSxlQUFlLEVBQUU7QUFBQ3NDLElBQUFBLENBQUMsRUFBRSxDQUFKO0FBQU9DLElBQUFBLENBQUMsRUFBRTtBQUFWLEdBTFk7QUFNN0J0QyxFQUFBQSxNQUFNLEVBQUUsSUFOcUI7QUFPN0JDLEVBQUFBLEtBQUssRUFBRSxJQVBzQjtBQVE3QkMsRUFBQUEsV0FBVyxFQUFFLElBUmdCO0FBUzdCQyxFQUFBQSxRQUFRLEVBQUU7QUFUbUIsQ0FBL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcclxuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNoaWxkcmVuIFRoZSBjb21wb25lbnQncyBjaGlsZHJlblxyXG4gKiBAcGFyYW0ge2Jvb2x9IHNob3dDdXJzb3IgSWYgdHJ1ZSwgc2hvd3MgdGhlIGN1cnNvclxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBsaWdodFxyXG4gKiBAcGFyYW0ge29iamVjdH0gaW5pdGlhbFBvc2l0aW9uIEFuIG9iamVjdCB7eDogdmFsdWUsIHk6IHZhbHVlfSBkZWZpbmluZyB0aGUgaW5pdGlhbCBwb3NpdGlvblxyXG4gKiBAcGFyYW0ge29iamVjdH0gbW92ZVRvIEFuIG9iamVjdCB7eDogdmFsdWUsIHk6IHZhbHVlfSBkZWZpbmluZyB0aGUgbG9jYXRpb24gdG8gd2hlcmUgdGhlIGxpZ2h0IHdpbGwgYmUgbW92ZWRcclxuICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkIERlZmluZXMgdGhlIHRyYW5zaXRpb24gc3BlZWQgb2YgdGhlIG1vdmVtZW50IG9mIHRoZSBsaWdodFxyXG4gKiBAcGFyYW0ge2Jvb2x9IGNvbnRhaW4gSWYgdHJ1ZSwgdGhlIGxpZ2h0IGNhbid0IG1vdmUgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXHJcbiAqIEBwYXJhbSB7Ym9vbH0gZW5hYmxlTW91c2UgSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGNvbnRyb2wgdGhlIGxpZ2h0IHdpdGggaXRzIG1vdXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXJrbmVzcyBEZWZpbmVzIGhvdyBkYXJrIGlzIHRoZSBcInJvb21cIlxyXG4gKi9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFJlYWN0Rmxhc2hsaWdodChwcm9wcykge1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBlbmFibGVkLFxyXG4gICAgY2hpbGRyZW4sXHJcbiAgICBzaG93Q3Vyc29yLFxyXG4gICAgc2l6ZSxcclxuICAgIGluaXRpYWxQb3NpdGlvbixcclxuICAgIG1vdmVUbyxcclxuICAgIHNwZWVkLFxyXG4gICAgZW5hYmxlTW91c2UsXHJcbiAgICBkYXJrbmVzcyxcclxuICB9ID0gcHJvcHM7IFxyXG5cclxuICBjb25zdCBsaWdodFN0eWxlID0ge1xyXG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcclxuICAgIHRvcDogMCxcclxuICAgIGxlZnQ6IDAsXHJcbiAgICAvLyBUbyBjb250cm9sIHRoZSBzaXplIG9mIHRoZSBsaWdodCwgc2ltcGx5IHVzZSBhIHBlcmNlbnRhZ2Ugb24gdGhlIGJhY2tncm91bmQgY3JlYXRpbmcgdGhlIGVmZmVjdCAtIGluaXQgd2l0aCBzaXplXHJcbiAgICBiYWNrZ3JvdW5kOiBcInJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCAwJSwgcmdiYSgwLCAwLCAwLCBcIiArIGRhcmtuZXNzICsgXCIpIFwiICsgc2l6ZSArIFwicHgsIHJnYmEoMCwgMCwgMCwgXCIgKyAoZGFya25lc3MgKyAwLjEpICsgXCIpIDgwJSlcIixcclxuICAgIHRyYW5zaXRpb246IFwibm9uZVwiLFxyXG4gICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXHJcbiAgICB3aWxsQ2hhbmdlOiBcInRyYW5zZm9ybVwiXHJcbiAgfVxyXG5cclxuICBjb25zdCBlbGVtZW50cyA9IFJlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgY2hpbGQgPT4gKHtcclxuICAgIGxpZ2h0OiBSZWFjdC51c2VSZWYoKSxcclxuICAgIGNvbnRhaW5lcjogUmVhY3QudXNlUmVmKCksXHJcbiAgfSkpXHJcblxyXG4gIFJlYWN0LnVzZUVmZmVjdCgoKT0+e1xyXG5cclxuICAgIGxldCBsYXN0X2tub3duX3Njcm9sbF9wb3NpdGlvbiA9IDA7XHJcbiAgICBsZXQgdGlja2luZyA9IGZhbHNlO1xyXG5cclxuICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQuY29udGFpbmVyLmN1cnJlbnQ7XHJcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XHJcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgaWYgKCFzaG93Q3Vyc29yKSBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gXCJub25lXCI7XHJcbiAgICB9KVxyXG5cclxuICAgIC8vIFJlc2l6ZXMgdGhlIGxpZ2h0XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzaXplTGlnaHRzKCkge1xyXG4gICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIHJlc2l6ZUxpZ2h0KGVsZW1lbnQpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlc2l6ZUxpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgY29uc3QgbGlnaHQgPSBlbGVtZW50LmxpZ2h0LmN1cnJlbnQ7XHJcbiAgICAgIGNvbnN0IG1hc2tTaXplID0gd2luZG93LmlubmVyV2lkdGggPiB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHdpbmRvdy5pbm5lckhlaWdodFxyXG5cclxuICAgICAgbGlnaHQuc3R5bGUud2lkdGggPSBtYXNrU2l6ZSAqIDIgKyBcInB4XCI7XHJcbiAgICAgIGxpZ2h0LnN0eWxlLmhlaWdodCA9IG1hc2tTaXplICogMiArIFwicHhcIjtcclxuICBcclxuICAgICAgbGlnaHQuc3R5bGUubGVmdCA9IGluaXRpYWxQb3NpdGlvbi54IC0gbWFza1NpemUgKyBcInB4XCI7XHJcbiAgICAgIGxpZ2h0LnN0eWxlLnRvcCA9IGluaXRpYWxQb3NpdGlvbi55IC0gbWFza1NpemUgKyBcInB4XCI7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGUpIHtcclxuICAgICAgaWYgKCF0aWNraW5nKSB7XHJcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHRpY2tpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpZ2h0ID0gZWxlbWVudC5saWdodC5jdXJyZW50O1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50LmNvbnRhaW5lci5jdXJyZW50O1xyXG4gICAgICAgICAgICBjb25zdCBsaWdodFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobGlnaHQsIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJTdHlsZSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgbGlnaHQuc3R5bGUudHJhbnNpdGlvbiA9IFwib3BhY2l0eSBlYXNlLWluLW91dCBcIiArIHNwZWVkICsgXCJtc1wiO1xyXG4gICAgICAgICAgICBsaWdodC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYIC0gY29udGFpbmVyU3R5bGUubGVmdCAtIHBhcnNlSW50KGxpZ2h0U3R5bGUud2lkdGgpIC8gMiArIFwicHhcIjtcclxuICAgICAgICAgICAgbGlnaHQuc3R5bGUudG9wID0gZS5jbGllbnRZIC0gY29udGFpbmVyU3R5bGUudG9wIC0gcGFyc2VJbnQobGlnaHRTdHlsZS5oZWlnaHQpIC8gMiArIFwicHhcIjtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGlja2luZyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVTY3JvbGwoZSkge1xyXG4gICAgICBsZXQgaW5jcmVtZW50ID0gd2luZG93LnNjcm9sbFkgLSBsYXN0X2tub3duX3Njcm9sbF9wb3NpdGlvbjtcclxuICAgICAgbGFzdF9rbm93bl9zY3JvbGxfcG9zaXRpb24gPSB3aW5kb3cuc2Nyb2xsWTtcclxuICAgICAgaWYgKCF0aWNraW5nKSB7XHJcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHRpY2tpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpZ2h0ID0gZWxlbWVudC5saWdodC5jdXJyZW50O1xyXG4gICAgICAgICAgICBsaWdodC5zdHlsZS50cmFuc2l0aW9uID0gXCJvcGFjaXR5IGVhc2UtaW4tb3V0IFwiICsgc3BlZWQgKyBcIm1zXCI7XHJcbiAgICAgICAgICAgIGxpZ2h0LnN0eWxlLnRvcCA9IHBhcnNlSW50KGxpZ2h0LnN0eWxlLnRvcCkgKyBpbmNyZW1lbnQgKyBcInB4XCI7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRpY2tpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzaXplTGlnaHRzKCk7XHJcblxyXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXJzID0gW2NoaWxkcmVuLmxlbmd0aF07XHJcblxyXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xyXG4gICAgICByZXNpemVPYnNlcnZlcnNbaV0gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCk9PnJlc2l6ZUxpZ2h0cygpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChlbmFibGVNb3VzZSkgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcclxuICAgIGlmIChlbmFibGVNb3VzZSkgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbCk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemVMaWdodHMpO1xyXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xyXG4gICAgICByZXNpemVPYnNlcnZlcnNbaV0ub2JzZXJ2ZShlbGVtZW50LmNvbnRhaW5lci5jdXJyZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENsZWFudXBcclxuICAgIHJldHVybiAoKT0+e1xyXG4gICAgICBpZiAoZW5hYmxlTW91c2UpIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XHJcbiAgICAgIGlmIChlbmFibGVNb3VzZSkgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgaGFuZGxlU2Nyb2xsKTtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplTGlnaHRzKVxyXG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpKSA9PiB7XHJcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXJzW2ldLmRpc2Nvbm5lY3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9LCBbXSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgZXhlY3V0ZWQgd2hlbiBtb3ZlVG8gcHJvcHMgY2hhbmdlXHJcbiAgICovXHJcblxyXG4gIFJlYWN0LnVzZUVmZmVjdCgoKT0+e1xyXG5cclxuICAgIGlmIChtb3ZlVG8pIHtcclxuICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBjb25zdCBsaWdodCA9IGVsZW1lbnQubGlnaHQuY3VycmVudDtcclxuICAgICAgICBsaWdodC5zdHlsZS50cmFuc2l0aW9uID0gXCJhbGwgZWFzZS1pbi1vdXQgXCIgKyBzcGVlZCArIFwibXNcIjtcclxuICAgICAgICBjb25zdCBsaWdodFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobGlnaHQsIG51bGwpO1xyXG4gICAgICAgIGxpZ2h0LnN0eWxlLmxlZnQgPSBtb3ZlVG8ueCAtIHBhcnNlSW50KGxpZ2h0U3R5bGUud2lkdGgpIC8gMiArIFwicHhcIjtcclxuICAgICAgICBsaWdodC5zdHlsZS50b3AgPSBtb3ZlVG8ueSAtIHBhcnNlSW50KGxpZ2h0U3R5bGUuaGVpZ2h0KSAvIDIgKyBcInB4XCI7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfSwgW21vdmVUb10pXHJcblxyXG4gIFJlYWN0LnVzZUVmZmVjdCgoKT0+e1xyXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgbGlnaHQgPSBlbGVtZW50LmxpZ2h0LmN1cnJlbnQ7XHJcbiAgICAgIGxpZ2h0LnN0eWxlLnRyYW5zaXRpb24gPSBcIm9wYWNpdHkgZWFzZS1pbi1vdXQgXCIgKyBzcGVlZCArIFwibXNcIjtcclxuICAgICAgZW5hYmxlZCA/IGxpZ2h0LnN0eWxlLm9wYWNpdHkgPSBcIjFcIiA6IGxpZ2h0LnN0eWxlLm9wYWNpdHkgPSBcIjBcIjtcclxuICAgIH0pO1xyXG5cclxuICB9LCBbZW5hYmxlZF0pXHJcblxyXG4gIHJldHVybiAoIFxyXG4gICAgUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCAoY2hpbGQsIGkpID0+XHJcbiAgICAgIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWY6IGVsZW1lbnRzW2ldLmNvbnRhaW5lcixcclxuICAgICAgICAgIGNoaWxkcmVuOlxyXG4gICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicmVhY3QtZmxhc2hsaWdodFwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT17bGlnaHRTdHlsZX1cclxuICAgICAgICAgICAgICAgIHJlZj17ZWxlbWVudHNbaV0ubGlnaHR9XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICB7Y2hpbGQucHJvcHMuY2hpbGRyZW59XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgIH0pIFxyXG4gICAgKVxyXG4gIClcclxufVxyXG5cclxuUmVhY3RGbGFzaGxpZ2h0LnByb3BUeXBlcyA9IHtcclxuICBlbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXHJcbiAgc2hvd0N1cnNvcjogUHJvcFR5cGVzLmJvb2wsXHJcbiAgc2l6ZTogUHJvcFR5cGVzLm51bWJlcixcclxuICBpbml0aWFsUG9zaXRpb246IFByb3BUeXBlcy5zaGFwZSh7XHJcbiAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxyXG4gICAgeTogUHJvcFR5cGVzLm51bWJlcixcclxuICB9KSxcclxuICBtb3ZlVG86IFByb3BUeXBlcy5vYmplY3QsXHJcbiAgc3BlZWQ6IFByb3BUeXBlcy5udW1iZXIsXHJcbiAgY29udGFpbjogUHJvcFR5cGVzLmJvb2wsXHJcbiAgZW5hYmxlTW91c2U6IFByb3BUeXBlcy5ib29sLFxyXG4gIGRhcmtuZXNzOiBQcm9wVHlwZXMubnVtYmVyLFxyXG59XHJcblxyXG5SZWFjdEZsYXNobGlnaHQuZGVmYXVsdFByb3BzID0ge1xyXG4gIGVuYWJsZWQ6IHRydWUsXHJcbiAgY2hpbGRyZW46IDxkaXY+PC9kaXY+LFxyXG4gIHNob3dDdXJzb3I6IGZhbHNlLFxyXG4gIHNpemU6IDE1MCxcclxuICBpbml0aWFsUG9zaXRpb246IHt4OiAwLCB5OiAwfSxcclxuICBtb3ZlVG86IG51bGwsXHJcbiAgc3BlZWQ6IDEwMDAsXHJcbiAgZW5hYmxlTW91c2U6IHRydWUsXHJcbiAgZGFya25lc3M6IDAuOSxcclxufSAiXX0=
;