scrollscene
Version:
ScrollScene is an extra layer on top of ScrollMagic as well as using IntersectionObserver to achieve similar effects.
532 lines (416 loc) • 73.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _scrollmagicWithSsr = _interopRequireDefault(require("../scrollmagic-with-ssr"));
var NAMESPACE = 'debug.addIndicators';
var console = window.console || {},
err = Function.prototype.bind.call(console.error || console.log || function () {}, console);
if (!_scrollmagicWithSsr["default"]) {
err('(' + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs.");
}
var FONT_SIZE = '0.85em',
ZINDEX = '9999',
EDGE_OFFSET = 15;
var _util = _scrollmagicWithSsr["default"]._util,
_autoindex = 0;
_scrollmagicWithSsr["default"].Scene.extend(function () {
var Scene = this,
_indicator;
var log = function log() {
if (Scene._log) {
Array.prototype.splice.call(arguments, 1, 0, '(' + NAMESPACE + ')', '->');
Scene._log.apply(this, arguments);
}
};
Scene.addIndicators = function (options) {
if (!_indicator) {
var DEFAULT_OPTIONS = {
name: '',
indent: 0,
parent: undefined,
colorStart: 'green',
colorEnd: 'red',
colorTrigger: 'blue'
};
options = _util.extend({}, DEFAULT_OPTIONS, options);
_autoindex++;
_indicator = new Indicator(Scene, options);
Scene.on('add.plugin_addIndicators', _indicator.add);
Scene.on('remove.plugin_addIndicators', _indicator.remove);
Scene.on('destroy.plugin_addIndicators', Scene.removeIndicators);
if (Scene.controller()) {
_indicator.add();
}
}
return Scene;
};
Scene.removeIndicators = function () {
if (_indicator) {
_indicator.remove();
this.off('*.plugin_addIndicators');
_indicator = undefined;
}
return Scene;
};
});
_scrollmagicWithSsr["default"].Controller.addOption('addIndicators', false);
_scrollmagicWithSsr["default"].Controller.extend(function () {
var Controller = this,
_info = Controller.info(),
_container = _info.container,
_isDocument = _info.isDocument,
_vertical = _info.vertical,
_indicators = {
groups: []
};
var log = function log() {
if (Controller._log) {
Array.prototype.splice.call(arguments, 1, 0, '(' + NAMESPACE + ')', '->');
Controller._log.apply(this, arguments);
}
};
if (Controller._indicators) {
log(2, "WARNING: Scene already has a property '_indicators', which will be overwritten by plugin.");
}
this._indicators = _indicators;
var handleBoundsPositionChange = function handleBoundsPositionChange() {
_indicators.updateBoundsPositions();
};
var handleTriggerPositionChange = function handleTriggerPositionChange() {
_indicators.updateTriggerGroupPositions();
};
_container.addEventListener('resize', handleTriggerPositionChange);
if (!_isDocument) {
window.addEventListener('resize', handleTriggerPositionChange);
window.addEventListener('scroll', handleTriggerPositionChange);
}
_container.addEventListener('resize', handleBoundsPositionChange);
_container.addEventListener('scroll', handleBoundsPositionChange);
this._indicators.updateBoundsPositions = function (specificIndicator) {
var groups = specificIndicator ? [_util.extend({}, specificIndicator.triggerGroup, {
members: [specificIndicator]
})] : _indicators.groups,
g = groups.length,
css = {},
paramPos = _vertical ? 'left' : 'top',
paramDimension = _vertical ? 'width' : 'height',
edge = _vertical ? _util.get.scrollLeft(_container) + _util.get.width(_container) - EDGE_OFFSET : _util.get.scrollTop(_container) + _util.get.height(_container) - EDGE_OFFSET,
b,
triggerSize,
group;
while (g--) {
group = groups[g];
b = group.members.length;
triggerSize = _util.get[paramDimension](group.element.firstChild);
while (b--) {
css[paramPos] = edge - triggerSize;
_util.css(group.members[b].bounds, css);
}
}
};
this._indicators.updateTriggerGroupPositions = function (specificGroup) {
var groups = specificGroup ? [specificGroup] : _indicators.groups,
i = groups.length,
container = _isDocument ? document.body : _container,
containerOffset = _isDocument ? {
top: 0,
left: 0
} : _util.get.offset(container, true),
edge = _vertical ? _util.get.width(_container) - EDGE_OFFSET : _util.get.height(_container) - EDGE_OFFSET,
paramDimension = _vertical ? 'width' : 'height',
paramTransform = _vertical ? 'Y' : 'X';
var group, elem, pos, elemSize, transform;
while (i--) {
group = groups[i];
elem = group.element;
pos = group.triggerHook * Controller.info('size');
elemSize = _util.get[paramDimension](elem.firstChild.firstChild);
transform = pos > elemSize ? 'translate' + paramTransform + '(-100%)' : '';
_util.css(elem, {
top: containerOffset.top + (_vertical ? pos : edge - group.members[0].options.indent),
left: containerOffset.left + (_vertical ? edge - group.members[0].options.indent : pos)
});
_util.css(elem.firstChild.firstChild, {
'-ms-transform': transform,
'-webkit-transform': transform,
transform: transform
});
}
};
this._indicators.updateTriggerGroupLabel = function (group) {
var text = 'trigger' + (group.members.length > 1 ? '' : ' ' + group.members[0].options.name),
elem = group.element.firstChild.firstChild,
doUpdate = elem.textContent !== text;
if (doUpdate) {
elem.textContent = text;
if (_vertical) {
_indicators.updateBoundsPositions();
}
}
};
this.addScene = function (newScene) {
if (this._options.addIndicators && newScene instanceof _scrollmagicWithSsr["default"].Scene && newScene.controller() === Controller) {
newScene.addIndicators();
}
this.$super.addScene.apply(this, arguments);
};
this.destroy = function () {
_container.removeEventListener('resize', handleTriggerPositionChange);
if (!_isDocument) {
window.removeEventListener('resize', handleTriggerPositionChange);
window.removeEventListener('scroll', handleTriggerPositionChange);
}
_container.removeEventListener('resize', handleBoundsPositionChange);
_container.removeEventListener('scroll', handleBoundsPositionChange);
this.$super.destroy.apply(this, arguments);
};
return Controller;
});
var Indicator = function Indicator(Scene, options) {
var Indicator = this,
_elemBounds = TPL.bounds(),
_elemStart = TPL.start(options.colorStart),
_elemEnd = TPL.end(options.colorEnd),
_boundsContainer = options.parent && _util.get.elements(options.parent)[0],
_vertical,
_ctrl;
var log = function log() {
if (Scene._log) {
Array.prototype.splice.call(arguments, 1, 0, '(' + NAMESPACE + ')', '->');
Scene._log.apply(this, arguments);
}
};
options.name = options.name || _autoindex;
_elemStart.firstChild.textContent += ' ' + options.name;
_elemEnd.textContent += ' ' + options.name;
_elemBounds.appendChild(_elemStart);
_elemBounds.appendChild(_elemEnd);
Indicator.options = options;
Indicator.bounds = _elemBounds;
Indicator.triggerGroup = undefined;
this.add = function () {
_ctrl = Scene.controller();
_vertical = _ctrl.info('vertical');
var isDocument = _ctrl.info('isDocument');
if (!_boundsContainer) {
_boundsContainer = isDocument ? document.body : _ctrl.info('container');
}
if (!isDocument && _util.css(_boundsContainer, 'position') === 'static') {
_util.css(_boundsContainer, {
position: 'relative'
});
}
Scene.on('change.plugin_addIndicators', handleTriggerParamsChange);
Scene.on('shift.plugin_addIndicators', handleBoundsParamsChange);
updateTriggerGroup();
updateBounds();
setTimeout(function () {
_ctrl._indicators.updateBoundsPositions(Indicator);
}, 0);
log(3, 'added indicators');
};
this.remove = function () {
if (Indicator.triggerGroup) {
Scene.off('change.plugin_addIndicators', handleTriggerParamsChange);
Scene.off('shift.plugin_addIndicators', handleBoundsParamsChange);
if (Indicator.triggerGroup.members.length > 1) {
var group = Indicator.triggerGroup;
group.members.splice(group.members.indexOf(Indicator), 1);
_ctrl._indicators.updateTriggerGroupLabel(group);
_ctrl._indicators.updateTriggerGroupPositions(group);
Indicator.triggerGroup = undefined;
} else {
removeTriggerGroup();
}
removeBounds();
log(3, 'removed indicators');
}
};
var handleBoundsParamsChange = function handleBoundsParamsChange() {
updateBounds();
};
var handleTriggerParamsChange = function handleTriggerParamsChange(e) {
if (e.what === 'triggerHook') {
updateTriggerGroup();
}
};
var addBounds = function addBounds() {
var v = _ctrl.info('vertical');
_util.css(_elemStart.firstChild, {
'border-bottom-width': v ? 1 : 0,
'border-right-width': v ? 0 : 1,
bottom: v ? -1 : options.indent,
right: v ? options.indent : -1,
padding: v ? '0 8px' : '2px 4px'
});
_util.css(_elemEnd, {
'border-top-width': v ? 1 : 0,
'border-left-width': v ? 0 : 1,
top: v ? '100%' : '',
right: v ? options.indent : '',
bottom: v ? '' : options.indent,
left: v ? '' : '100%',
padding: v ? '0 8px' : '2px 4px'
});
_boundsContainer.appendChild(_elemBounds);
};
var removeBounds = function removeBounds() {
_elemBounds.parentNode.removeChild(_elemBounds);
};
var updateBounds = function updateBounds() {
if (_elemBounds.parentNode !== _boundsContainer) {
addBounds();
}
var css = {};
css[_vertical ? 'top' : 'left'] = Scene.triggerPosition();
css[_vertical ? 'height' : 'width'] = Scene.duration();
_util.css(_elemBounds, css);
_util.css(_elemEnd, {
display: Scene.duration() > 0 ? '' : 'none'
});
};
var addTriggerGroup = function addTriggerGroup() {
var triggerElem = TPL.trigger(options.colorTrigger);
var css = {};
css[_vertical ? 'right' : 'bottom'] = 0;
css[_vertical ? 'border-top-width' : 'border-left-width'] = 1;
_util.css(triggerElem.firstChild, css);
_util.css(triggerElem.firstChild.firstChild, {
padding: _vertical ? '0 8px 3px 8px' : '3px 4px'
});
document.body.appendChild(triggerElem);
var newGroup = {
triggerHook: Scene.triggerHook(),
element: triggerElem,
members: [Indicator]
};
_ctrl._indicators.groups.push(newGroup);
Indicator.triggerGroup = newGroup;
_ctrl._indicators.updateTriggerGroupLabel(newGroup);
_ctrl._indicators.updateTriggerGroupPositions(newGroup);
};
var removeTriggerGroup = function removeTriggerGroup() {
_ctrl._indicators.groups.splice(_ctrl._indicators.groups.indexOf(Indicator.triggerGroup), 1);
Indicator.triggerGroup.element.parentNode.removeChild(Indicator.triggerGroup.element);
Indicator.triggerGroup = undefined;
};
var updateTriggerGroup = function updateTriggerGroup() {
var triggerHook = Scene.triggerHook(),
closeEnough = 0.0001;
if (Indicator.triggerGroup) {
if (Math.abs(Indicator.triggerGroup.triggerHook - triggerHook) < closeEnough) {
return;
}
}
var groups = _ctrl._indicators.groups,
group,
i = groups.length;
while (i--) {
group = groups[i];
if (Math.abs(group.triggerHook - triggerHook) < closeEnough) {
if (Indicator.triggerGroup) {
if (Indicator.triggerGroup.members.length === 1) {
removeTriggerGroup();
} else {
Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1);
_ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup);
_ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
}
}
group.members.push(Indicator);
Indicator.triggerGroup = group;
_ctrl._indicators.updateTriggerGroupLabel(group);
return;
}
}
if (Indicator.triggerGroup) {
if (Indicator.triggerGroup.members.length === 1) {
Indicator.triggerGroup.triggerHook = triggerHook;
_ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
return;
} else {
Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1);
_ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup);
_ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
Indicator.triggerGroup = undefined;
}
}
addTriggerGroup();
};
};
var TPL = {
start: function start(color) {
var inner = document.createElement('div');
inner.textContent = 'start';
_util.css(inner, {
position: 'absolute',
overflow: 'visible',
'border-width': 0,
'border-style': 'solid',
color: color,
'border-color': color
});
var e = document.createElement('div');
_util.css(e, {
position: 'absolute',
overflow: 'visible',
width: 0,
height: 0
});
e.appendChild(inner);
return e;
},
end: function end(color) {
var e = document.createElement('div');
e.textContent = 'end';
_util.css(e, {
position: 'absolute',
overflow: 'visible',
'border-width': 0,
'border-style': 'solid',
color: color,
'border-color': color
});
return e;
},
bounds: function bounds() {
var e = document.createElement('div');
_util.css(e, {
position: 'absolute',
overflow: 'visible',
'white-space': 'nowrap',
'pointer-events': 'none',
'font-size': FONT_SIZE
});
e.style.zIndex = ZINDEX;
return e;
},
trigger: function trigger(color) {
var inner = document.createElement('div');
inner.textContent = 'trigger';
_util.css(inner, {
position: 'relative'
});
var w = document.createElement('div');
_util.css(w, {
position: 'absolute',
overflow: 'visible',
'border-width': 0,
'border-style': 'solid',
color: color,
'border-color': color
});
w.appendChild(inner);
var e = document.createElement('div');
_util.css(e, {
position: 'fixed',
overflow: 'visible',
'white-space': 'nowrap',
'pointer-events': 'none',
'font-size': FONT_SIZE
});
e.style.zIndex = ZINDEX;
e.appendChild(w);
return e;
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMudHMiXSwibmFtZXMiOlsiTkFNRVNQQUNFIiwiY29uc29sZSIsIndpbmRvdyIsImVyciIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiYmluZCIsImNhbGwiLCJlcnJvciIsImxvZyIsIlNjcm9sbE1hZ2ljIiwiRk9OVF9TSVpFIiwiWklOREVYIiwiRURHRV9PRkZTRVQiLCJfdXRpbCIsIl9hdXRvaW5kZXgiLCJTY2VuZSIsImV4dGVuZCIsIl9pbmRpY2F0b3IiLCJfbG9nIiwiQXJyYXkiLCJzcGxpY2UiLCJhcmd1bWVudHMiLCJhcHBseSIsImFkZEluZGljYXRvcnMiLCJvcHRpb25zIiwiREVGQVVMVF9PUFRJT05TIiwibmFtZSIsImluZGVudCIsInBhcmVudCIsInVuZGVmaW5lZCIsImNvbG9yU3RhcnQiLCJjb2xvckVuZCIsImNvbG9yVHJpZ2dlciIsIkluZGljYXRvciIsIm9uIiwiYWRkIiwicmVtb3ZlIiwicmVtb3ZlSW5kaWNhdG9ycyIsImNvbnRyb2xsZXIiLCJvZmYiLCJDb250cm9sbGVyIiwiYWRkT3B0aW9uIiwiX2luZm8iLCJpbmZvIiwiX2NvbnRhaW5lciIsImNvbnRhaW5lciIsIl9pc0RvY3VtZW50IiwiaXNEb2N1bWVudCIsIl92ZXJ0aWNhbCIsInZlcnRpY2FsIiwiX2luZGljYXRvcnMiLCJncm91cHMiLCJoYW5kbGVCb3VuZHNQb3NpdGlvbkNoYW5nZSIsInVwZGF0ZUJvdW5kc1Bvc2l0aW9ucyIsImhhbmRsZVRyaWdnZXJQb3NpdGlvbkNoYW5nZSIsInVwZGF0ZVRyaWdnZXJHcm91cFBvc2l0aW9ucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzcGVjaWZpY0luZGljYXRvciIsInRyaWdnZXJHcm91cCIsIm1lbWJlcnMiLCJnIiwibGVuZ3RoIiwiY3NzIiwicGFyYW1Qb3MiLCJwYXJhbURpbWVuc2lvbiIsImVkZ2UiLCJnZXQiLCJzY3JvbGxMZWZ0Iiwid2lkdGgiLCJzY3JvbGxUb3AiLCJoZWlnaHQiLCJiIiwidHJpZ2dlclNpemUiLCJncm91cCIsImVsZW1lbnQiLCJmaXJzdENoaWxkIiwiYm91bmRzIiwic3BlY2lmaWNHcm91cCIsImkiLCJkb2N1bWVudCIsImJvZHkiLCJjb250YWluZXJPZmZzZXQiLCJ0b3AiLCJsZWZ0Iiwib2Zmc2V0IiwicGFyYW1UcmFuc2Zvcm0iLCJlbGVtIiwicG9zIiwiZWxlbVNpemUiLCJ0cmFuc2Zvcm0iLCJ0cmlnZ2VySG9vayIsInVwZGF0ZVRyaWdnZXJHcm91cExhYmVsIiwidGV4dCIsImRvVXBkYXRlIiwidGV4dENvbnRlbnQiLCJhZGRTY2VuZSIsIm5ld1NjZW5lIiwiX29wdGlvbnMiLCIkc3VwZXIiLCJkZXN0cm95IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9lbGVtQm91bmRzIiwiVFBMIiwiX2VsZW1TdGFydCIsInN0YXJ0IiwiX2VsZW1FbmQiLCJlbmQiLCJfYm91bmRzQ29udGFpbmVyIiwiZWxlbWVudHMiLCJfY3RybCIsImFwcGVuZENoaWxkIiwicG9zaXRpb24iLCJoYW5kbGVUcmlnZ2VyUGFyYW1zQ2hhbmdlIiwiaGFuZGxlQm91bmRzUGFyYW1zQ2hhbmdlIiwidXBkYXRlVHJpZ2dlckdyb3VwIiwidXBkYXRlQm91bmRzIiwic2V0VGltZW91dCIsImluZGV4T2YiLCJyZW1vdmVUcmlnZ2VyR3JvdXAiLCJyZW1vdmVCb3VuZHMiLCJlIiwid2hhdCIsImFkZEJvdW5kcyIsInYiLCJib3R0b20iLCJyaWdodCIsInBhZGRpbmciLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJ0cmlnZ2VyUG9zaXRpb24iLCJkdXJhdGlvbiIsImRpc3BsYXkiLCJhZGRUcmlnZ2VyR3JvdXAiLCJ0cmlnZ2VyRWxlbSIsInRyaWdnZXIiLCJuZXdHcm91cCIsInB1c2giLCJjbG9zZUVub3VnaCIsIk1hdGgiLCJhYnMiLCJjb2xvciIsImlubmVyIiwiY3JlYXRlRWxlbWVudCIsIm92ZXJmbG93Iiwic3R5bGUiLCJ6SW5kZXgiLCJ3Il0sIm1h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LEtBQWQ7QUFFQSxRQUFJckIsQ0FBQyxHQUFHekMsUUFBUSxDQUFDK0QsYUFBVCxDQUF1QixLQUF2QixDQUFSOztBQUNBakksSUFBQUEsS0FBSyxDQUFDaUQsR0FBTixDQUFVMEQsQ0FBVixFQUFhO0FBQ1hULE1BQUFBLFFBQVEsRUFBRSxPQURDO0FBRVhnQyxNQUFBQSxRQUFRLEVBQUUsU0FGQztBQUdYLHFCQUFlLFFBSEo7QUFJWCx3QkFBa0IsTUFKUDtBQUtYLG1CQUFhckk7QUFMRixLQUFiOztBQU9BOEcsSUFBQUEsQ0FBQyxDQUFDd0IsS0FBRixDQUFRQyxNQUFSLEdBQWlCdEksTUFBakI7QUFDQTZHLElBQUFBLENBQUMsQ0FBQ1YsV0FBRixDQUFjb0MsQ0FBZDtBQUNBLFdBQU8xQixDQUFQO0FBQ0Q7QUEvRU8sQ0FBViIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xyXG5cclxuLypcclxuU2xpZ2h0bHkgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzOiBodHRwczovL2dpdGh1Yi5jb20vamFucGFlcGtlL1Njcm9sbE1hZ2ljL2Jsb2IvbWFzdGVyL2Rldi9zcmMvcGx1Z2lucy9kZWJ1Zy5hZGRJbmRpY2F0b3JzLmpzXHJcbiovXHJcblxyXG5pbXBvcnQgU2Nyb2xsTWFnaWMgZnJvbSAnLi4vc2Nyb2xsbWFnaWMtd2l0aC1zc3InXHJcblxyXG52YXIgTkFNRVNQQUNFID0gJ2RlYnVnLmFkZEluZGljYXRvcnMnXHJcblxyXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlIHx8IHt9LFxyXG4gIC8vQHRzLWlnbm9yZVxyXG4gIGVyciA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS5lcnJvciB8fCBjb25zb2xlLmxvZyB8fCBmdW5jdGlvbigpIHt9LCBjb25zb2xlKVxyXG5pZiAoIVNjcm9sbE1hZ2ljKSB7XHJcbiAgZXJyKFxyXG4gICAgJygnICtcclxuICAgICAgTkFNRVNQQUNFICtcclxuICAgICAgXCIpIC0+IEVSUk9SOiBUaGUgU2Nyb2xsTWFnaWMgbWFpbiBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLiBQbGVhc2UgbWFrZSBzdXJlIGl0J3MgbG9hZGVkIGJlZm9yZSB0aGlzIHBsdWdpbiBvciB1c2UgYW4gYXN5bmNocm9ub3VzIGxvYWRlciBsaWtlIHJlcXVpcmVqcy5cIixcclxuICApXHJcbn1cclxuXHJcbi8vIHBsdWdpbiBzZXR0aW5nc1xyXG52YXIgRk9OVF9TSVpFID0gJzAuODVlbScsXHJcbiAgWklOREVYID0gJzk5OTknLFxyXG4gIEVER0VfT0ZGU0VUID0gMTUgLy8gbWluaW11bSBlZGdlIGRpc3RhbmNlLCBhZGRlZCB0byBpbmRlbnRhdGlvblxyXG5cclxuLy8gb3ZlcmFsbCB2YXJzXHJcbnZhciBfdXRpbCA9IFNjcm9sbE1hZ2ljLl91dGlsLFxyXG4gIF9hdXRvaW5kZXggPSAwXHJcblxyXG5TY3JvbGxNYWdpYy5TY2VuZS5leHRlbmQoZnVuY3Rpb24oKSB7XHJcbiAgdmFyIFNjZW5lID0gdGhpcyxcclxuICAgIF9pbmRpY2F0b3JcclxuICAvL0B0cy1pZ25vcmVcclxuICB2YXIgbG9nID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoU2NlbmUuX2xvZykge1xyXG4gICAgICAvLyBub3QgYXZhaWxhYmxlLCB3aGVuIG1haW4gc291cmNlIG1pbmlmaWVkXHJcbiAgICAgIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDEsIDAsICcoJyArIE5BTUVTUEFDRSArICcpJywgJy0+JylcclxuICAgICAgU2NlbmUuX2xvZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuXHRcdCAqIEFkZCB2aXN1YWwgaW5kaWNhdG9ycyBmb3IgYSBTY3JvbGxNYWdpYy5TY2VuZS4gIFxyXG5cdFx0ICogQG1lbWJlcm9mISBkZWJ1Zy5hZGRJbmRpY2F0b3JzI1xyXG5cdFx0ICpcclxuXHRcdCAqIEBleGFtcGxlXHJcblx0XHQgKiAvLyBhZGQgYmFzaWMgaW5kaWNhdG9yc1xyXG5cdFx0ICogc2NlbmUuYWRkSW5kaWNhdG9ycygpXHJcblx0XHQgKlxyXG5cdFx0ICogLy8gcGFzc2luZyBvcHRpb25zXHJcblx0XHQgKiBzY2VuZS5hZGRJbmRpY2F0b3JzKHtuYW1lOiBcInBpbiBzY2VuZVwiLCBjb2xvckVuZDogXCIjRkZGRkZGXCJ9KTtcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgb3B0aW9ucyBmb3IgdGhlIGluZGljYXRvcnMuXHJcblx0XHQgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gW29wdGlvbnMucGFyZW50XSAtIEEgc2VsZWN0b3IsIERPTSBPYmplY3Qgb3IgYSBqUXVlcnkgb2JqZWN0IHRoYXQgdGhlIGluZGljYXRvcnMgc2hvdWxkIGJlIGFkZGVkIHRvLiAgXHJcblx0XHQgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IElmIHVuZGVmaW5lZCwgdGhlIGNvbnRyb2xsZXIncyBjb250YWluZXIgd2lsbCBiZSB1c2VkLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm5hbWU9XCJcIl0gLSBUaGlzIHN0cmluZyB3aWxsIGJlIGRpc3BsYXllZCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBpbmRpY2F0b3JzIG9mIHRoZSBzY2VuZSBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMuIElmIG5vIG5hbWUgaXMgc3VwcGxpZWQgYW4gYXV0b21hdGljIGluZGV4IHdpbGwgYmUgdXNlZC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5pbmRlbnQ9MF0gLSBBZGRpdGlvbmFsIHBvc2l0aW9uIG9mZnNldCBmb3IgdGhlIGluZGljYXRvcnMgKHVzZWZ1bCwgd2hlbiBoYXZpbmcgbXVsdGlwbGUgc2NlbmVzIHN0YXJ0aW5nIGF0IHRoZSBzYW1lIHBvc2l0aW9uKS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb2xvclN0YXJ0PWdyZWVuXSAtIENTUyBjb2xvciBkZWZpbml0aW9uIGZvciB0aGUgc3RhcnQgaW5kaWNhdG9yLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbG9yRW5kPXJlZF0gLSBDU1MgY29sb3IgZGVmaW5pdGlvbiBmb3IgdGhlIGVuZCBpbmRpY2F0b3IuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29sb3JUcmlnZ2VyPWJsdWVdIC0gQ1NTIGNvbG9yIGRlZmluaXRpb24gZm9yIHRoZSB0cmlnZ2VyIGluZGljYXRvci5cclxuXHRcdCAqL1xyXG4gIFNjZW5lLmFkZEluZGljYXRvcnMgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgICBpZiAoIV9pbmRpY2F0b3IpIHtcclxuICAgICAgdmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcclxuICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICBpbmRlbnQ6IDAsXHJcbiAgICAgICAgcGFyZW50OiB1bmRlZmluZWQsXHJcbiAgICAgICAgY29sb3JTdGFydDogJ2dyZWVuJyxcclxuICAgICAgICBjb2xvckVuZDogJ3JlZCcsXHJcbiAgICAgICAgY29sb3JUcmlnZ2VyOiAnYmx1ZScsXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG9wdGlvbnMgPSBfdXRpbC5leHRlbmQoe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucylcclxuXHJcbiAgICAgIF9hdXRvaW5kZXgrK1xyXG4gICAgICBfaW5kaWNhdG9yID0gbmV3IEluZGljYXRvcihTY2VuZSwgb3B0aW9ucylcclxuXHJcbiAgICAgIFNjZW5lLm9uKCdhZGQucGx1Z2luX2FkZEluZGljYXRvcnMnLCBfaW5kaWNhdG9yLmFkZClcclxuICAgICAgU2NlbmUub24oJ3JlbW92ZS5wbHVnaW5fYWRkSW5kaWNhdG9ycycsIF9pbmRpY2F0b3IucmVtb3ZlKVxyXG4gICAgICBTY2VuZS5vbignZGVzdHJveS5wbHVnaW5fYWRkSW5kaWNhdG9ycycsIFNjZW5lLnJlbW92ZUluZGljYXRvcnMpXHJcblxyXG4gICAgICAvLyBpdCB0aGUgc2NlbmUgYWxyZWFkeSBoYXMgYSBjb250cm9sbGVyIHdlIGNhbiBzdGFydCByaWdodCBhd2F5LlxyXG4gICAgICBpZiAoU2NlbmUuY29udHJvbGxlcigpKSB7XHJcbiAgICAgICAgX2luZGljYXRvci5hZGQoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU2NlbmVcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgdmlzdWFsIGluZGljYXRvcnMgZnJvbSBhIFNjcm9sbE1hZ2ljLlNjZW5lLlxyXG4gICAqIEBtZW1iZXJvZiEgZGVidWcuYWRkSW5kaWNhdG9ycyNcclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogLy8gcmVtb3ZlIHByZXZpb3VzbHkgYWRkZWQgaW5kaWNhdG9yc1xyXG4gICAqIHNjZW5lLnJlbW92ZUluZGljYXRvcnMoKVxyXG4gICAqXHJcbiAgICovXHJcbiAgU2NlbmUucmVtb3ZlSW5kaWNhdG9ycyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKF9pbmRpY2F0b3IpIHtcclxuICAgICAgX2luZGljYXRvci5yZW1vdmUoKVxyXG4gICAgICB0aGlzLm9mZignKi5wbHVnaW5fYWRkSW5kaWNhdG9ycycpXHJcbiAgICAgIF9pbmRpY2F0b3IgPSB1bmRlZmluZWRcclxuICAgIH1cclxuICAgIHJldHVybiBTY2VuZVxyXG4gIH1cclxufSlcclxuXHJcbi8qXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICogRXh0ZW5zaW9uIGZvciBjb250cm9sbGVyIHRvIHN0b3JlIGFuZCB1cGRhdGUgcmVsYXRlZCBpbmRpY2F0b3JzXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICovXHJcbi8vIGFkZCBvcHRpb24gdG8gZ2xvYmFsbHkgYXV0by1hZGQgaW5kaWNhdG9ycyB0byBzY2VuZXNcclxuLyoqXHJcbiAqIEV2ZXJ5IFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIgaW5zdGFuY2Ugbm93IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBvcHRpb24uXHJcbiAqIFNlZSB7QGxpbmsgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcn0gZm9yIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgc3RhbmRhcmQgb3B0aW9ucy5cclxuICogQG1lbWJlcm9mISBkZWJ1Zy5hZGRJbmRpY2F0b3JzI1xyXG4gKiBAbWV0aG9kIG5ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyKG9wdGlvbnMpXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIG1ha2UgYSBjb250cm9sbGVyIGFuZCBhZGQgaW5kaWNhdG9ycyB0byBhbGwgc2NlbmVzIGF0dGFjaGVkXHJcbiAqIHZhciBjb250cm9sbGVyID0gbmV3IFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIoe2FkZEluZGljYXRvcnM6IHRydWV9KTtcclxuICogLy8gdGhpcyBzY2VuZSB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBpbmRpY2F0b3JzIGFkZGVkIHRvIGl0XHJcbiAqIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSgpXHJcbiAqICAgICAgICAgICAgICAgIC5hZGRUbyhjb250cm9sbGVyKTtcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgZm9yIHRoZSBDb250cm9sbGVyLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFkZEluZGljYXRvcnM9ZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCBldmVyeSBzY2VuZSB0aGF0IGlzIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyIHdpbGwgYXV0b21hdGljYWxseSBnZXQgaW5kaWNhdG9ycyBhZGRlZCB0byBpdC5cclxuICovXHJcblNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIuYWRkT3B0aW9uKCdhZGRJbmRpY2F0b3JzJywgZmFsc2UpXHJcbi8vIGV4dGVuZCBDb250cm9sbGVyXHJcblNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIuZXh0ZW5kKGZ1bmN0aW9uKCkge1xyXG4gIHZhciBDb250cm9sbGVyID0gdGhpcyxcclxuICAgIF9pbmZvID0gQ29udHJvbGxlci5pbmZvKCksXHJcbiAgICBfY29udGFpbmVyID0gX2luZm8uY29udGFpbmVyLFxyXG4gICAgX2lzRG9jdW1lbnQgPSBfaW5mby5pc0RvY3VtZW50LFxyXG4gICAgX3ZlcnRpY2FsID0gX2luZm8udmVydGljYWwsXHJcbiAgICBfaW5kaWNhdG9ycyA9IHtcclxuICAgICAgLy8gY29udGFpbmVyIGZvciBhbGwgaW5kaWNhdG9ycyBhbmQgbWV0aG9kc1xyXG4gICAgICBncm91cHM6IFtdLFxyXG4gICAgfVxyXG5cclxuICB2YXIgbG9nID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoQ29udHJvbGxlci5fbG9nKSB7XHJcbiAgICAgIC8vIG5vdCBhdmFpbGFibGUsIHdoZW4gbWFpbiBzb3VyY2UgbWluaWZpZWRcclxuICAgICAgQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgMCwgJygnICsgTkFNRVNQQUNFICsgJyknLCAnLT4nKVxyXG4gICAgICBDb250cm9sbGVyLl9sb2cuYXBwbHkodGhpcywgYXJndW1lbnRzKVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoQ29udHJvbGxlci5faW5kaWNhdG9ycykge1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsb2coMiwgXCJXQVJOSU5HOiBTY2VuZSBhbHJlYWR5IGhhcyBhIHByb3BlcnR5ICdfaW5kaWNhdG9ycycsIHdoaWNoIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgcGx1Z2luLlwiKVxyXG4gIH1cclxuXHJcbiAgLy8gYWRkIGluZGljYXRvcnMgY29udGFpbmVyXHJcbiAgdGhpcy5faW5kaWNhdG9ycyA9IF9pbmRpY2F0b3JzXHJcbiAgLypcclxuXHRcdFx0bmVlZGVkIHVwZGF0ZXM6XHJcblx0XHRcdCsrKysrKysrKysrKysrK1xyXG5cdFx0XHRzdGFydC9lbmQgcG9zaXRpb24gb24gc2NlbmUgc2hpZnQgKGhhbmRsZWQgaW4gSW5kaWNhdG9yIGNsYXNzKVxyXG5cdFx0XHR0cmlnZ2VyIHBhcmFtZXRlcnMgb24gdHJpZ2dlckhvb2sgdmFsdWUgY2hhbmdlIChoYW5kbGVkIGluIEluZGljYXRvciBjbGFzcylcclxuXHRcdFx0Ym91bmRzIHBvc2l0aW9uIG9uIGNvbnRhaW5lciBzY3JvbGwgb3IgcmVzaXplICh0byBrZWVwIGFsaWdubWVudCB0byBib3R0b20vcmlnaHQpXHJcblx0XHRcdHRyaWdnZXIgcG9zaXRpb24gb24gY29udGFpbmVyIHJlc2l6ZSwgd2luZG93IHJlc2l6ZSAoaWYgY29udGFpbmVyIGlzbid0IGRvY3VtZW50KSBhbmQgd2luZG93IHNjcm9sbCAoaWYgY29udGFpbmVyIGlzbid0IGRvY3VtZW50KVxyXG5cdFx0Ki9cclxuXHJcbiAgLy8gZXZlbnQgaGFuZGxlciBmb3Igd2hlbiBhc3NvY2lhdGVkIGJvdW5kcyBtYXJrZXJzIG5lZWQgdG8gYmUgcmVwb3NpdGlvbmVkXHJcbiAgdmFyIGhhbmRsZUJvdW5kc1Bvc2l0aW9uQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIF9pbmRpY2F0b3JzLnVwZGF0ZUJvdW5kc1Bvc2l0aW9ucygpXHJcbiAgfVxyXG5cclxuICAvLyBldmVudCBoYW5kbGVyIGZvciB3aGVuIGFzc29jaWF0ZWQgdHJpZ2dlciBncm91cHMgbmVlZCB0byBiZSByZXBvc2l0aW9uZWRcclxuICB2YXIgaGFuZGxlVHJpZ2dlclBvc2l0aW9uQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIF9pbmRpY2F0b3JzLnVwZGF0ZVRyaWdnZXJHcm91cFBvc2l0aW9ucygpXHJcbiAgfVxyXG5cclxuICBfY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVRyaWdnZXJQb3NpdGlvbkNoYW5nZSlcclxuICBpZiAoIV9pc0RvY3VtZW50KSB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlVHJpZ2dlclBvc2l0aW9uQ2hhbmdlKVxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVRyaWdnZXJQb3NpdGlvbkNoYW5nZSlcclxuICB9XHJcbiAgLy8gdXBkYXRlIGFsbCByZWxhdGVkIGJvdW5kcyBjb250YWluZXJzXHJcbiAgX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVCb3VuZHNQb3NpdGlvbkNoYW5nZSlcclxuICBfY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZUJvdW5kc1Bvc2l0aW9uQ2hhbmdlKVxyXG5cclxuICAvLyB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYm91bmRzIGNvbnRhaW5lciB0byBhbGlnbmVkIHRvIHRoZSByaWdodCBmb3IgdmVydGljYWwgY29udGFpbmVycyBhbmQgdG8gdGhlIGJvdHRvbSBmb3IgaG9yaXpvbnRhbFxyXG4gIHRoaXMuX2luZGljYXRvcnMudXBkYXRlQm91bmRzUG9zaXRpb25zID0gZnVuY3Rpb24oc3BlY2lmaWNJbmRpY2F0b3IpIHtcclxuICAgIHZhciAvLyBjb25zdGFudCBmb3IgYWxsIGJvdW5kc1xyXG4gICAgICBncm91cHMgPSBzcGVjaWZpY0luZGljYXRvclxyXG4gICAgICAgID8gW1xyXG4gICAgICAgICAgICBfdXRpbC5leHRlbmQoe30sIHNwZWNpZmljSW5kaWNhdG9yLnRyaWdnZXJHcm91cCwge1xyXG4gICAgICAgICAgICAgIG1lbWJlcnM6IFtzcGVjaWZpY0luZGljYXRvcl0sXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgXSAvLyBjcmVhdGUgYSBncm91cCB3aXRoIG9ubHkgb25lIGVsZW1lbnRcclxuICAgICAgICA6IF9pbmRpY2F0b3JzLmdyb3VwcywgLy8gdXNlIGFsbFxyXG4gICAgICBnID0gZ3JvdXBzLmxlbmd0aCxcclxuICAgICAgY3NzID0ge30sXHJcbiAgICAgIHBhcmFtUG9zID0gX3ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCcsXHJcbiAgICAgIHBhcmFtRGltZW5zaW9uID0gX3ZlcnRpY2FsID8gJ3dpZHRoJyA6