UNPKG

react-background-animation

Version:
309 lines (247 loc) 37.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _lodash = _interopRequireDefault(require("lodash")); var _jquery = _interopRequireDefault(require("jquery")); var _sketch2 = require("./sketch"); var _buildingStyled = require("./buildingStyled"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var CrossBuildingEffect = /*#__PURE__*/ function (_PureComponent) { _inherits(CrossBuildingEffect, _PureComponent); function CrossBuildingEffect(props) { var _this; _classCallCheck(this, CrossBuildingEffect); _this = _possibleConstructorReturn(this, _getPrototypeOf(CrossBuildingEffect).call(this, props)); _this.excuteEffect = _this.excuteEffect.bind(_assertThisInitialized(_this)); return _this; } _createClass(CrossBuildingEffect, [{ key: "excuteEffect", value: function excuteEffect() { (function () { var Building, Skyline, dt, sketch, skylines; var _sketch = (0, _sketch2.getSketch)(window, _sketch2.sketchFactory); if (!sketch) { _sketch = window.Sketch; } sketch = _sketch.create(); sketch.mouse.x = sketch.width / 10; sketch.mouse.y = sketch.height; skylines = []; dt = 1; // BUILDINGS Building = function Building(config) { return this.reset(config); }; Building.prototype.reset = function (config) { this.layer = config.layer; this.x = config.x; this.y = config.y; this.width = config.width; this.height = config.height; this.color = config.color; this.slantedTop = Math.floor(Math.random(0, 10)) === 0; this.slantedTopHeight = this.width / Math.random(2, 4); this.slantedTopDirection = Math.round(Math.random(0, 1)) === 0; this.spireTop = Math.floor(Math.random(0, 15)) === 0; this.spireTopWidth = Math.random(this.width * .01, this.width * .07); this.spireTopHeight = Math.random(10, 20); this.antennaTop = !this.spireTop && Math.floor(Math.random(0, 10)) === 0; this.antennaTopWidth = this.layer / 2; return this.antennaTopHeight = Math.random(5, 20); }; Building.prototype.render = function () { sketch.fillStyle = sketch.strokeStyle = this.color; sketch.lineWidth = 2; sketch.beginPath(); sketch.rect(this.x, this.y, this.width, this.height); sketch.fill(); sketch.stroke(); if (this.slantedTop) { sketch.beginPath(); sketch.moveTo(this.x, this.y); sketch.lineTo(this.x + this.width, this.y); if (this.slantedTopDirection) { sketch.lineTo(this.x + this.width, this.y - this.slantedTopHeight); } else { sketch.lineTo(this.x, this.y - this.slantedTopHeight); } sketch.closePath(); sketch.fill(); sketch.stroke(); } if (this.spireTop) { sketch.beginPath(); sketch.moveTo(this.x + this.width / 2, this.y - this.spireTopHeight); sketch.lineTo(this.x + this.width / 2 + this.spireTopWidth, this.y); sketch.lineTo(this.x + this.width / 2 - this.spireTopWidth, this.y); sketch.closePath(); sketch.fill(); sketch.stroke(); } if (this.antennaTop) { sketch.beginPath(); sketch.moveTo(this.x + this.width / 2, this.y - this.antennaTopHeight); sketch.lineTo(this.x + this.width / 2, this.y); sketch.lineWidth = this.antennaTopWidth; return sketch.stroke(); } }; // SKYLINES Skyline = function Skyline(config) { this.x = 0; this.buildings = []; this.layer = config.layer; this.width = { min: config.width.min, max: config.width.max }; this.height = { min: config.height.min, max: config.height.max }; this.speed = config.speed; this.color = config.color; this.populate(); return this; }; Skyline.prototype.populate = function () { var newHeight, newWidth, results, totalWidth; totalWidth = 0; results = []; while (totalWidth <= sketch.width + this.width.max * 2) { if (window.CP.shouldStopExecution(0)) break; newWidth = Math.round(Math.random(this.width.min, this.width.max)); newHeight = Math.round(Math.random(this.height.min, this.height.max)); this.buildings.push(new Building({ layer: this.layer, x: this.buildings.length === 0 ? 0 : this.buildings[this.buildings.length - 1].x + this.buildings[this.buildings.length - 1].width, y: sketch.height - newHeight, width: newWidth, height: newHeight, color: this.color })); results.push(totalWidth += newWidth); } window.CP.exitedLoop(0); return results; }; Skyline.prototype.update = function () { var firstBuilding, lastBuilding, newHeight, newWidth; this.x -= sketch.mouse.x * this.speed * dt; firstBuilding = this.buildings[0]; if (firstBuilding.width + firstBuilding.x + this.x < 0) { newWidth = Math.round(Math.random(this.width.min, this.width.max)); newHeight = Math.round(Math.random(this.height.min, this.height.max)); lastBuilding = this.buildings[this.buildings.length - 1]; firstBuilding.reset({ layer: this.layer, x: lastBuilding.x + lastBuilding.width, y: sketch.height - newHeight, width: newWidth, height: newHeight, color: this.color }); return this.buildings.push(this.buildings.shift()); } }; Skyline.prototype.render = function () { var i; i = this.buildings.length; sketch.save(); sketch.translate(this.x, (sketch.height - sketch.mouse.y) / 20 * this.layer); while (i--) { if (window.CP.shouldStopExecution(1)) break; this.buildings[i].render(i); } window.CP.exitedLoop(1); return sketch.restore(); }; // SETUP sketch.setup = function () { var i, results; i = 5; results = []; while (i--) { if (window.CP.shouldStopExecution(2)) break; results.push(skylines.push(new Skyline({ layer: i + 1, width: { min: (i + 1) * 30, max: (i + 1) * 40 }, height: { min: 150 - i * 35, max: 300 - i * 35 }, speed: (i + 1) * .003, color: 'hsl( 200, ' + ((i + 1) * 1 + 10) + '%, ' + (75 - i * 13) + '% )' }))); } window.CP.exitedLoop(2); return results; }; // CLEAR sketch.clear = function () { return sketch.clearRect(0, 0, sketch.width, sketch.height); }; // UPDATE sketch.update = function () { var i, results; dt = sketch.dt < .1 ? .1 : sketch.dt / 16; dt = dt > 5 ? 5 : dt; i = skylines.length; results = []; while (i--) { if (window.CP.shouldStopExecution(3)) break; results.push(skylines[i].update(i)); } window.CP.exitedLoop(3); return results; }; // DRAW sketch.draw = function () { var i, results; i = skylines.length; results = []; while (i--) { if (window.CP.shouldStopExecution(4)) break; results.push(skylines[i].render(i)); } window.CP.exitedLoop(4); return results; }; // Mousemove Fix (0, _jquery["default"])(window).on('mousemove', function (e) { sketch.mouse.x = e.pageX; return sketch.mouse.y = e.pageY; }); }).call(this); //# sourceURL=coffeescript } }, { key: "componentDidMount", value: function componentDidMount() { this.excuteEffect(); } }, { key: "render", value: function render() { return _react["default"].createElement("div", { className: this.props.className || '' }, _react["default"].createElement(_buildingStyled.Building, null)); } }]); return CrossBuildingEffect; }(_react.PureComponent); var _default = CrossBuildingEffect; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jc3NFZmZlY3RzL2Nyb3NzQnVpbGRpbmcvY3Jvc3NCdWlsZGluZy5qc3giXSwibmFtZXMiOlsiQ3Jvc3NCdWlsZGluZ0VmZmVjdCIsInByb3BzIiwiZXhjdXRlRWZmZWN0IiwiYmluZCIsIkJ1aWxkaW5nIiwiU2t5bGluZSIsImR0Iiwic2tldGNoIiwic2t5bGluZXMiLCJfc2tldGNoIiwid2luZG93Iiwic2tldGNoRmFjdG9yeSIsIlNrZXRjaCIsImNyZWF0ZSIsIm1vdXNlIiwieCIsIndpZHRoIiwieSIsImhlaWdodCIsImNvbmZpZyIsInJlc2V0IiwicHJvdG90eXBlIiwibGF5ZXIiLCJjb2xvciIsInNsYW50ZWRUb3AiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJzbGFudGVkVG9wSGVpZ2h0Iiwic2xhbnRlZFRvcERpcmVjdGlvbiIsInJvdW5kIiwic3BpcmVUb3AiLCJzcGlyZVRvcFdpZHRoIiwic3BpcmVUb3BIZWlnaHQiLCJhbnRlbm5hVG9wIiwiYW50ZW5uYVRvcFdpZHRoIiwiYW50ZW5uYVRvcEhlaWdodCIsInJlbmRlciIsImZpbGxTdHlsZSIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwiYmVnaW5QYXRoIiwicmVjdCIsImZpbGwiLCJzdHJva2UiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJidWlsZGluZ3MiLCJtaW4iLCJtYXgiLCJzcGVlZCIsInBvcHVsYXRlIiwibmV3SGVpZ2h0IiwibmV3V2lkdGgiLCJyZXN1bHRzIiwidG90YWxXaWR0aCIsIkNQIiwic2hvdWxkU3RvcEV4ZWN1dGlvbiIsInB1c2giLCJsZW5ndGgiLCJleGl0ZWRMb29wIiwidXBkYXRlIiwiZmlyc3RCdWlsZGluZyIsImxhc3RCdWlsZGluZyIsInNoaWZ0IiwiaSIsInNhdmUiLCJ0cmFuc2xhdGUiLCJyZXN0b3JlIiwic2V0dXAiLCJjbGVhciIsImNsZWFyUmVjdCIsImRyYXciLCJvbiIsImUiLCJwYWdlWCIsInBhZ2VZIiwi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QU9OLE9BQVA7QUFDRCxTQVRELENBck5XLENBaU9YOzs7QUFFQSxnQ0FBRTdDLE1BQUYsRUFBVWdFLEVBQVYsQ0FBYSxXQUFiLEVBQTBCLFVBQVVDLENBQVYsRUFBYTtBQUNyQ3BFLFVBQUFBLE1BQU0sQ0FBQ08sS0FBUCxDQUFhQyxDQUFiLEdBQWlCNEQsQ0FBQyxDQUFDQyxLQUFuQjtBQUNBLGlCQUFPckUsTUFBTSxDQUFDTyxLQUFQLENBQWFHLENBQWIsR0FBaUIwRCxDQUFDLENBQUNFLEtBQTFCO0FBQ0QsU0FIRDtBQUtELE9BeE9ELEVBd09HQyxJQXhPSCxDQXdPUSxJQXhPUixFQURhLENBNE9iO0FBQ0Q7Ozt3Q0FFbUI7QUFDbEIsV0FBSzVFLFlBQUw7QUFDRDs7OzZCQUVRO0FBQ1AsYUFDRTtBQUFLLFFBQUEsU0FBUyxFQUFFLEtBQUtELEtBQUwsQ0FBVzhFLFNBQVgsSUFBd0I7QUFBeEMsU0FDRSxnQ0FBQyx3QkFBRCxPQURGLENBREY7QUFLRDs7OztFQWhRK0JDLG9COztlQW1RbkJoRixtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSdcclxuaW1wb3J0IHsgZ2V0U2tldGNoLCBza2V0Y2hGYWN0b3J5IH0gZnJvbSAnLi9za2V0Y2gnXHJcblxyXG4vLyBpbXBvcnQgJy4vYnVpbGRpbmcuc2NzcydcclxuaW1wb3J0IHsgQnVpbGRpbmcgfSBmcm9tICcuL2J1aWxkaW5nU3R5bGVkJ1xyXG5cclxuLy8gY29uc3QgU2tldGNoID0gZ2V0U2tldGNoKClcclxuXHJcbmNsYXNzIENyb3NzQnVpbGRpbmdFZmZlY3QgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgIHN1cGVyKHByb3BzKVxyXG4gICAgdGhpcy5leGN1dGVFZmZlY3QgPSB0aGlzLmV4Y3V0ZUVmZmVjdC5iaW5kKHRoaXMpXHJcbiAgfVxyXG5cclxuICBleGN1dGVFZmZlY3QoKSB7XHJcbiAgICAoZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgQnVpbGRpbmcsIFNreWxpbmUsIGR0LCBza2V0Y2gsIHNreWxpbmVzO1xyXG5cclxuICAgICAgdmFyIF9za2V0Y2ggPSBnZXRTa2V0Y2god2luZG93LCBza2V0Y2hGYWN0b3J5KTtcclxuICAgICAgaWYgKCFza2V0Y2gpIHtcclxuICAgICAgICBfc2tldGNoID0gd2luZG93LlNrZXRjaFxyXG4gICAgICB9XHJcbiAgICAgIHNrZXRjaCA9IF9za2V0Y2guY3JlYXRlKClcclxuXHJcbiAgICAgIHNrZXRjaC5tb3VzZS54ID0gc2tldGNoLndpZHRoIC8gMTA7XHJcblxyXG4gICAgICBza2V0Y2gubW91c2UueSA9IHNrZXRjaC5oZWlnaHQ7XHJcblxyXG4gICAgICBza3lsaW5lcyA9IFtdO1xyXG5cclxuICAgICAgZHQgPSAxO1xyXG5cclxuXHJcbiAgICAgIC8vIEJVSUxESU5HU1xyXG5cclxuICAgICAgQnVpbGRpbmcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzZXQoY29uZmlnKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIEJ1aWxkaW5nLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIChjb25maWcpIHtcclxuICAgICAgICB0aGlzLmxheWVyID0gY29uZmlnLmxheWVyO1xyXG4gICAgICAgIHRoaXMueCA9IGNvbmZpZy54O1xyXG4gICAgICAgIHRoaXMueSA9IGNvbmZpZy55O1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBjb25maWcud2lkdGg7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBjb25maWcuaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBjb25maWcuY29sb3I7XHJcbiAgICAgICAgdGhpcy5zbGFudGVkVG9wID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgwLCAxMCkpID09PSAwO1xyXG4gICAgICAgIHRoaXMuc2xhbnRlZFRvcEhlaWdodCA9IHRoaXMud2lkdGggLyBNYXRoLnJhbmRvbSgyLCA0KTtcclxuICAgICAgICB0aGlzLnNsYW50ZWRUb3BEaXJlY3Rpb24gPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKDAsIDEpKSA9PT0gMDtcclxuICAgICAgICB0aGlzLnNwaXJlVG9wID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgwLCAxNSkpID09PSAwO1xyXG4gICAgICAgIHRoaXMuc3BpcmVUb3BXaWR0aCA9IE1hdGgucmFuZG9tKHRoaXMud2lkdGggKiAuMDEsIHRoaXMud2lkdGggKiAuMDcpO1xyXG4gICAgICAgIHRoaXMuc3BpcmVUb3BIZWlnaHQgPSBNYXRoLnJhbmRvbSgxMCwgMjApO1xyXG4gICAgICAgIHRoaXMuYW50ZW5uYVRvcCA9ICF0aGlzLnNwaXJlVG9wICYmIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oMCwgMTApKSA9PT0gMDtcclxuICAgICAgICB0aGlzLmFudGVubmFUb3BXaWR0aCA9IHRoaXMubGF5ZXIgLyAyO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFudGVubmFUb3BIZWlnaHQgPSBNYXRoLnJhbmRvbSg1LCAyMCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBCdWlsZGluZy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHNrZXRjaC5maWxsU3R5bGUgPSBza2V0Y2guc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yO1xyXG4gICAgICAgIHNrZXRjaC5saW5lV2lkdGggPSAyO1xyXG4gICAgICAgIHNrZXRjaC5iZWdpblBhdGgoKTtcclxuICAgICAgICBza2V0Y2gucmVjdCh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIHNrZXRjaC5maWxsKCk7XHJcbiAgICAgICAgc2tldGNoLnN0cm9rZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLnNsYW50ZWRUb3ApIHtcclxuICAgICAgICAgIHNrZXRjaC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgIHNrZXRjaC5tb3ZlVG8odGhpcy54LCB0aGlzLnkpO1xyXG4gICAgICAgICAgc2tldGNoLmxpbmVUbyh0aGlzLnggKyB0aGlzLndpZHRoLCB0aGlzLnkpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2xhbnRlZFRvcERpcmVjdGlvbikge1xyXG4gICAgICAgICAgICBza2V0Y2gubGluZVRvKHRoaXMueCArIHRoaXMud2lkdGgsIHRoaXMueSAtIHRoaXMuc2xhbnRlZFRvcEhlaWdodCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBza2V0Y2gubGluZVRvKHRoaXMueCwgdGhpcy55IC0gdGhpcy5zbGFudGVkVG9wSGVpZ2h0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNrZXRjaC5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgIHNrZXRjaC5maWxsKCk7XHJcbiAgICAgICAgICBza2V0Y2guc3Ryb2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNwaXJlVG9wKSB7XHJcbiAgICAgICAgICBza2V0Y2guYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICBza2V0Y2gubW92ZVRvKHRoaXMueCArIHRoaXMud2lkdGggLyAyLCB0aGlzLnkgLSB0aGlzLnNwaXJlVG9wSGVpZ2h0KTtcclxuICAgICAgICAgIHNrZXRjaC5saW5lVG8odGhpcy54ICsgdGhpcy53aWR0aCAvIDIgKyB0aGlzLnNwaXJlVG9wV2lkdGgsIHRoaXMueSk7XHJcbiAgICAgICAgICBza2V0Y2gubGluZVRvKHRoaXMueCArIHRoaXMud2lkdGggLyAyIC0gdGhpcy5zcGlyZVRvcFdpZHRoLCB0aGlzLnkpO1xyXG4gICAgICAgICAgc2tldGNoLmNsb3NlUGF0aCgpO1xyXG4gICAgICAgICAgc2tldGNoLmZpbGwoKTtcclxuICAgICAgICAgIHNrZXRjaC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuYW50ZW5uYVRvcCkge1xyXG4gICAgICAgICAgc2tldGNoLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgc2tldGNoLm1vdmVUbyh0aGlzLnggKyB0aGlzLndpZHRoIC8gMiwgdGhpcy55IC0gdGhpcy5hbnRlbm5hVG9wSGVpZ2h0KTtcclxuICAgICAgICAgIHNrZXRjaC5saW5lVG8odGhpcy54ICsgdGhpcy53aWR0aCAvIDIsIHRoaXMueSk7XHJcbiAgICAgICAgICBza2V0Y2gubGluZVdpZHRoID0gdGhpcy5hbnRlbm5hVG9wV2lkdGg7XHJcbiAgICAgICAgICByZXR1cm4gc2tldGNoLnN0cm9rZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcblxyXG4gICAgICAvLyBTS1lMSU5FU1xyXG5cclxuICAgICAgU2t5bGluZSA9IGZ1bmN0aW9uIChjb25maWcpIHtcclxuICAgICAgICB0aGlzLnggPSAwO1xyXG4gICAgICAgIHRoaXMuYnVpbGRpbmdzID0gW107XHJcbiAgICAgICAgdGhpcy5sYXllciA9IGNvbmZpZy5sYXllcjtcclxuICAgICAgICB0aGlzLndpZHRoID0ge1xyXG4gICAgICAgICAgbWluOiBjb25maWcud2lkdGgubWluLFxyXG4gICAgICAgICAgbWF4OiBjb25maWcud2lkdGgubWF4XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB7XHJcbiAgICAgICAgICBtaW46IGNvbmZpZy5oZWlnaHQubWluLFxyXG4gICAgICAgICAgbWF4OiBjb25maWcuaGVpZ2h0Lm1heFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc3BlZWQgPSBjb25maWcuc3BlZWQ7XHJcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbmZpZy5jb2xvcjtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBTa3lsaW5lLnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgcmVzdWx0cywgdG90YWxXaWR0aDtcclxuICAgICAgICB0b3RhbFdpZHRoID0gMDtcclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKHRvdGFsV2lkdGggPD0gc2tldGNoLndpZHRoICsgdGhpcy53aWR0aC5tYXggKiAyKSB7XHJcbiAgICAgICAgICBpZiAod2luZG93LkNQLnNob3VsZFN0b3BFeGVjdXRpb24oMCkpIGJyZWFrO1xyXG4gICAgICAgICAgbmV3V2lkdGggPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKHRoaXMud2lkdGgubWluLCB0aGlzLndpZHRoLm1heCkpO1xyXG4gICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSh0aGlzLmhlaWdodC5taW4sIHRoaXMuaGVpZ2h0Lm1heCkpO1xyXG4gICAgICAgICAgdGhpcy5idWlsZGluZ3MucHVzaChuZXcgQnVpbGRpbmcoe1xyXG4gICAgICAgICAgICBsYXllcjogdGhpcy5sYXllcixcclxuICAgICAgICAgICAgeDogdGhpcy5idWlsZGluZ3MubGVuZ3RoID09PSAwID8gMCA6IHRoaXMuYnVpbGRpbmdzW3RoaXMuYnVpbGRpbmdzLmxlbmd0aCAtIDFdLnggKyB0aGlzLmJ1aWxkaW5nc1t0aGlzLmJ1aWxkaW5ncy5sZW5ndGggLSAxXS53aWR0aCxcclxuICAgICAgICAgICAgeTogc2tldGNoLmhlaWdodCAtIG5ld0hlaWdodCxcclxuICAgICAgICAgICAgd2lkdGg6IG5ld1dpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCxcclxuICAgICAgICAgICAgY29sb3I6IHRoaXMuY29sb3JcclxuICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICByZXN1bHRzLnB1c2godG90YWxXaWR0aCArPSBuZXdXaWR0aCk7XHJcbiAgICAgICAgfSB3aW5kb3cuQ1AuZXhpdGVkTG9vcCgwKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIFNreWxpbmUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgZmlyc3RCdWlsZGluZywgbGFzdEJ1aWxkaW5nLCBuZXdIZWlnaHQsIG5ld1dpZHRoO1xyXG4gICAgICAgIHRoaXMueCAtPSBza2V0Y2gubW91c2UueCAqIHRoaXMuc3BlZWQgKiBkdDtcclxuICAgICAgICBmaXJzdEJ1aWxkaW5nID0gdGhpcy5idWlsZGluZ3NbMF07XHJcbiAgICAgICAgaWYgKGZpcnN0QnVpbGRpbmcud2lkdGggKyBmaXJzdEJ1aWxkaW5nLnggKyB0aGlzLnggPCAwKSB7XHJcbiAgICAgICAgICBuZXdXaWR0aCA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20odGhpcy53aWR0aC5taW4sIHRoaXMud2lkdGgubWF4KSk7XHJcbiAgICAgICAgICBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKHRoaXMuaGVpZ2h0Lm1pbiwgdGhpcy5oZWlnaHQubWF4KSk7XHJcbiAgICAgICAgICBsYXN0QnVpbGRpbmcgPSB0aGlzLmJ1aWxkaW5nc1t0aGlzLmJ1aWxkaW5ncy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIGZpcnN0QnVpbGRpbmcucmVzZXQoe1xyXG4gICAgICAgICAgICBsYXllcjogdGhpcy5sYXllcixcclxuICAgICAgICAgICAgeDogbGFzdEJ1aWxkaW5nLnggKyBsYXN0QnVpbGRpbmcud2lkdGgsXHJcbiAgICAgICAgICAgIHk6IHNrZXRjaC5oZWlnaHQgLSBuZXdIZWlnaHQsXHJcbiAgICAgICAgICAgIHdpZHRoOiBuZXdXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXHJcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZGluZ3MucHVzaCh0aGlzLmJ1aWxkaW5ncy5zaGlmdCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBTa3lsaW5lLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgaSA9IHRoaXMuYnVpbGRpbmdzLmxlbmd0aDtcclxuICAgICAgICBza2V0Y2guc2F2ZSgpO1xyXG4gICAgICAgIHNrZXRjaC50cmFuc2xhdGUodGhpcy54LCAoc2tldGNoLmhlaWdodCAtIHNrZXRjaC5tb3VzZS55KSAvIDIwICogdGhpcy5sYXllcik7XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgaWYgKHdpbmRvdy5DUC5zaG91bGRTdG9wRXhlY3V0aW9uKDEpKSBicmVhaztcclxuICAgICAgICAgIHRoaXMuYnVpbGRpbmdzW2ldLnJlbmRlcihpKTtcclxuICAgICAgICB9IHdpbmRvdy5DUC5leGl0ZWRMb29wKDEpO1xyXG4gICAgICAgIHJldHVybiBza2V0Y2gucmVzdG9yZSgpO1xyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIC8vIFNFVFVQXHJcblxyXG4gICAgICBza2V0Y2guc2V0dXAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGksIHJlc3VsdHM7XHJcbiAgICAgICAgaSA9IDU7XHJcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgIGlmICh3aW5kb3cuQ1Auc2hvdWxkU3RvcEV4ZWN1dGlvbigyKSkgYnJlYWs7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2goc2t5bGluZXMucHVzaChuZXcgU2t5bGluZSh7XHJcbiAgICAgICAgICAgIGxheWVyOiBpICsgMSxcclxuICAgICAgICAgICAgd2lkdGg6IHtcclxuICAgICAgICAgICAgICBtaW46IChpICsgMSkgKiAzMCxcclxuICAgICAgICAgICAgICBtYXg6IChpICsgMSkgKiA0MFxyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgaGVpZ2h0OiB7XHJcbiAgICAgICAgICAgICAgbWluOiAxNTAgLSBpICogMzUsXHJcbiAgICAgICAgICAgICAgbWF4OiAzMDAgLSBpICogMzVcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIHNwZWVkOiAoaSArIDEpICogLjAwMyxcclxuICAgICAgICAgICAgY29sb3I6ICdoc2woIDIwMCwgJyArICgoaSArIDEpICogMSArIDEwKSArICclLCAnICsgKDc1IC0gaSAqIDEzKSArICclICknXHJcbiAgICAgICAgICB9KSkpO1xyXG5cclxuICAgICAgICB9IHdpbmRvdy5DUC5leGl0ZWRMb29wKDIpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIC8vIENMRUFSXHJcblxyXG4gICAgICBza2V0Y2guY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNrZXRjaC5jbGVhclJlY3QoMCwgMCwgc2tldGNoLndpZHRoLCBza2V0Y2guaGVpZ2h0KTtcclxuICAgICAgfTtcclxuXHJcblxyXG4gICAgICAvLyBVUERBVEVcclxuXHJcbiAgICAgIHNrZXRjaC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGksIHJlc3VsdHM7XHJcbiAgICAgICAgZHQgPSBza2V0Y2guZHQgPCAuMSA/IC4xIDogc2tldGNoLmR0IC8gMTY7XHJcbiAgICAgICAgZHQgPSBkdCA+IDUgPyA1IDogZHQ7XHJcbiAgICAgICAgaSA9IHNreWxpbmVzLmxlbmd0aDtcclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgaWYgKHdpbmRvdy5DUC5zaG91bGRTdG9wRXhlY3V0aW9uKDMpKSBicmVhaztcclxuICAgICAgICAgIHJlc3VsdHMucHVzaChza3lsaW5lc1tpXS51cGRhdGUoaSkpO1xyXG4gICAgICAgIH0gd2luZG93LkNQLmV4aXRlZExvb3AoMyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgIH07XHJcblxyXG5cclxuICAgICAgLy8gRFJBV1xyXG5cclxuICAgICAgc2tldGNoLmRyYXcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGksIHJlc3VsdHM7XHJcbiAgICAgICAgaSA9IHNreWxpbmVzLmxlbmd0aDtcclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgaWYgKHdpbmRvdy5DUC5zaG91bGRTdG9wRXhlY3V0aW9uKDQpKSBicmVhaztcclxuICAgICAgICAgIHJlc3VsdHMucHVzaChza3lsaW5lc1tpXS5yZW5kZXIoaSkpO1xyXG4gICAgICAgIH0gd2luZG93LkNQLmV4aXRlZExvb3AoNCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgIH07XHJcblxyXG5cclxuICAgICAgLy8gTW91c2Vtb3ZlIEZpeFxyXG5cclxuICAgICAgJCh3aW5kb3cpLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHNrZXRjaC5tb3VzZS54ID0gZS5wYWdlWDtcclxuICAgICAgICByZXR1cm4gc2tldGNoLm1vdXNlLnkgPSBlLnBhZ2VZO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KS5jYWxsKHRoaXMpO1xyXG5cclxuXHJcbiAgICAvLyMgc291cmNlVVJMPWNvZmZlZXNjcmlwdFxyXG4gIH1cclxuXHJcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICB0aGlzLmV4Y3V0ZUVmZmVjdCgpXHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJyd9PlxyXG4gICAgICAgIDxCdWlsZGluZyAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENyb3NzQnVpbGRpbmdFZmZlY3QiXX0=