scrollscene
Version:
ScrollScene is an extra layer on top of ScrollMagic as well as using IntersectionObserver to achieve similar effects.
524 lines (414 loc) • 73 kB
JavaScript
import ScrollMagic from "../scrollmagic-with-ssr";
var NAMESPACE = 'debug.addIndicators';
var console = window.console || {},
err = Function.prototype.bind.call(console.error || console.log || function () {}, console);
if (!ScrollMagic) {
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 = ScrollMagic._util,
_autoindex = 0;
ScrollMagic.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;
};
});
ScrollMagic.Controller.addOption('addIndicators', false);
ScrollMagic.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 ScrollMagic.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMudHMiXSwibmFtZXMiOlsiU2Nyb2xsTWFnaWMiLCJOQU1FU1BBQ0UiLCJjb25zb2xlIiwid2luZG93IiwiZXJyIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJiaW5kIiwiY2FsbCIsImVycm9yIiwibG9nIiwiRk9OVF9TSVpFIiwiWklOREVYIiwiRURHRV9PRkZTRVQiLCJfdXRpbCIsIl9hdXRvaW5kZXgiLCJTY2VuZSIsImV4dGVuZCIsIl9pbmRpY2F0b3IiLCJfbG9nIiwiQXJyYXkiLCJzcGxpY2UiLCJhcmd1bWVudHMiLCJhcHBseSIsImFkZEluZGljYXRvcnMiLCJvcHRpb25zIiwiREVGQVVMVF9PUFRJT05TIiwibmFtZSIsImluZGVudCIsInBhcmVudCIsInVuZGVmaW5lZCIsImNvbG9yU3RhcnQiLCJjb2xvckVuZCIsImNvbG9yVHJpZ2dlciIsIkluZGljYXRvciIsIm9uIiwiYWRkIiwicmVtb3ZlIiwicmVtb3ZlSW5kaWNhdG9ycyIsImNvbnRyb2xsZXIiLCJvZmYiLCJDb250cm9sbGVyIiwiYWRkT3B0aW9uIiwiX2luZm8iLCJpbmZvIiwiX2NvbnRhaW5lciIsImNvbnRhaW5lciIsIl9pc0RvY3VtZW50IiwiaXNEb2N1bWVudCIsIl92ZXJ0aWNhbCIsInZlcnRpY2FsIiwiX2luZGljYXRvcnMiLCJncm91cHMiLCJoYW5kbGVCb3VuZHNQb3NpdGlvbkNoYW5nZSIsInVwZGF0ZUJvdW5kc1Bvc2l0aW9ucyIsImhhbmRsZVRyaWdnZXJQb3NpdGlvbkNoYW5nZSIsInVwZGF0ZVRyaWdnZXJHcm91cFBvc2l0aW9ucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzcGVjaWZpY0luZGljYXRvciIsInRyaWdnZXJHcm91cCIsIm1lbWJlcnMiLCJnIiwibGVuZ3RoIiwiY3NzIiwicGFyYW1Qb3MiLCJwYXJhbURpbWVuc2lvbiIsImVkZ2UiLCJnZXQiLCJzY3JvbGxMZWZ0Iiwid2lkdGgiLCJzY3JvbGxUb3AiLCJoZWlnaHQiLCJiIiwidHJpZ2dlclNpemUiLCJncm91cCIsImVsZW1lbnQiLCJmaXJzdENoaWxkIiwiYm91bmRzIiwic3BlY2lmaWNHcm91cCIsImkiLCJkb2N1bWVudCIsImJvZHkiLCJjb250YWluZXJPZmZzZXQiLCJ0b3AiLCJsZWZ0Iiwib2Zmc2V0IiwicGFyYW1UcmFuc2Zvcm0iLCJlbGVtIiwicG9zIiwiZWxlbVNpemUiLCJ0cmFuc2Zvcm0iLCJ0cmlnZ2VySG9vayIsInVwZGF0ZVRyaWdnZXJHcm91cExhYmVsIiwidGV4dCIsImRvVXBkYXRlIiwidGV4dENvbnRlbnQiLCJhZGRTY2VuZSIsIm5ld1NjZW5lIiwiX29wdGlvbnMiLCIkc3VwZXIiLCJkZXN0cm95IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9lbGVtQm91bmRzIiwiVFBMIiwiX2VsZW1TdGFydCIsInN0YXJ0IiwiX2VsZW1FbmQiLCJlbmQiLCJfYm91bmRzQ29udGFpbmVyIiwiZWxlbWVudHMiLCJfY3RybCIsImFwcGVuZENoaWxkIiwicG9zaXRpb24iLCJoYW5kbGVUcmlnZ2VyUGFyYW1zQ2hhbmdlIiwiaGFuZGxlQm91bmRzUGFyYW1zQ2hhbmdlIiwidXBkYXRlVHJpZ2dlckdyb3VwIiwidXBkYXRlQm91bmRzIiwic2V0VGltZW91dCIsImluZGV4T2YiLCJyZW1vdmVUcmlnZ2VyR3JvdXAiLCJyZW1vdmVCb3VuZHMiLCJlIiwid2hhdCIsImFkZEJvdW5kcyIsInYiLCJib3R0b20iLCJyaWdodCIsInBhZGRpbmciLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJ0cmlnZ2VyUG9zaXRpb24iLCJkdXJhdGlvbiIsImRpc3BsYXkiLCJhZGRUcmlnZ2VyR3JvdXAiLCJ0cmlnZ2VyRWxlbSIsInRyaWdnZXIiLCJuZXdHcm91cCIsInB1c2giLCJjbG9zZUVub3VnaCIsIk1hdGgiLCJhYnMiLCJjb2xvciIsImlubmVyIiwiY3JlYXRlRWxlbWVudCIsIm92ZXJmbG93Iiwic3R5bGUiLCJ6SW5kZXgiLCJ3Il0sIm1h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QyxDQUFDcEMsV0FBRixDQUFjK0IsS0FBZDtBQUVBLFFBQUlyQixDQUFDLEdBQUd6QyxRQUFRLENBQUMrRCxhQUFULENBQXVCLEtBQXZCLENBQVI7O0FBQ0FqSSxJQUFBQSxLQUFLLENBQUNpRCxHQUFOLENBQVUwRCxDQUFWLEVBQWE7QUFDWFQsTUFBQUEsUUFBUSxFQUFFLE9BREM7QUFFWGdDLE1BQUFBLFFBQVEsRUFBRSxTQUZDO0FBR1gscUJBQWUsUUFISjtBQUlYLHdCQUFrQixNQUpQO0FBS1gsbUJBQWFySTtBQUxGLEtBQWI7O0FBT0E4RyxJQUFBQSxDQUFDLENBQUN3QixLQUFGLENBQVFDLE1BQVIsR0FBaUJ0SSxNQUFqQjtBQUNBNkcsSUFBQUEsQ0FBQyxDQUFDVixXQUFGLENBQWNvQyxDQUFkO0FBQ0EsV0FBTzFCLENBQVA7QUFDRDtBQS9FTyxDQUFWIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cclxuLyogcHJldHRpZXItaWdub3JlICovXHJcblxyXG4vKlxyXG5TbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5wYWVwa2UvU2Nyb2xsTWFnaWMvYmxvYi9tYXN0ZXIvZGV2L3NyYy9wbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMuanNcclxuKi9cclxuXHJcbmltcG9ydCBTY3JvbGxNYWdpYyBmcm9tICcuLi9zY3JvbGxtYWdpYy13aXRoLXNzcidcclxuXHJcbnZhciBOQU1FU1BBQ0UgPSAnZGVidWcuYWRkSW5kaWNhdG9ycydcclxuXHJcbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGUgfHwge30sXHJcbiAgLy9AdHMtaWdub3JlXHJcbiAgZXJyID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChjb25zb2xlLmVycm9yIHx8IGNvbnNvbGUubG9nIHx8IGZ1bmN0aW9uKCkge30sIGNvbnNvbGUpXHJcbmlmICghU2Nyb2xsTWFnaWMpIHtcclxuICBlcnIoXHJcbiAgICAnKCcgK1xyXG4gICAgICBOQU1FU1BBQ0UgK1xyXG4gICAgICBcIikgLT4gRVJST1I6IFRoZSBTY3JvbGxNYWdpYyBtYWluIG1vZHVsZSBjb3VsZCBub3QgYmUgZm91bmQuIFBsZWFzZSBtYWtlIHN1cmUgaXQncyBsb2FkZWQgYmVmb3JlIHRoaXMgcGx1Z2luIG9yIHVzZSBhbiBhc3luY2hyb25vdXMgbG9hZGVyIGxpa2UgcmVxdWlyZWpzLlwiLFxyXG4gIClcclxufVxyXG5cclxuLy8gcGx1Z2luIHNldHRpbmdzXHJcbnZhciBGT05UX1NJWkUgPSAnMC44NWVtJyxcclxuICBaSU5ERVggPSAnOTk5OScsXHJcbiAgRURHRV9PRkZTRVQgPSAxNSAvLyBtaW5pbXVtIGVkZ2UgZGlzdGFuY2UsIGFkZGVkIHRvIGluZGVudGF0aW9uXHJcblxyXG4vLyBvdmVyYWxsIHZhcnNcclxudmFyIF91dGlsID0gU2Nyb2xsTWFnaWMuX3V0aWwsXHJcbiAgX2F1dG9pbmRleCA9IDBcclxuXHJcblNjcm9sbE1hZ2ljLlNjZW5lLmV4dGVuZChmdW5jdGlvbigpIHtcclxuICB2YXIgU2NlbmUgPSB0aGlzLFxyXG4gICAgX2luZGljYXRvclxyXG4gIC8vQHRzLWlnbm9yZVxyXG4gIHZhciBsb2cgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmIChTY2VuZS5fbG9nKSB7XHJcbiAgICAgIC8vIG5vdCBhdmFpbGFibGUsIHdoZW4gbWFpbiBzb3VyY2UgbWluaWZpZWRcclxuICAgICAgQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgMCwgJygnICsgTkFNRVNQQUNFICsgJyknLCAnLT4nKVxyXG4gICAgICBTY2VuZS5fbG9nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG5cdFx0ICogQWRkIHZpc3VhbCBpbmRpY2F0b3JzIGZvciBhIFNjcm9sbE1hZ2ljLlNjZW5lLiAgXHJcblx0XHQgKiBAbWVtYmVyb2YhIGRlYnVnLmFkZEluZGljYXRvcnMjXHJcblx0XHQgKlxyXG5cdFx0ICogQGV4YW1wbGVcclxuXHRcdCAqIC8vIGFkZCBiYXNpYyBpbmRpY2F0b3JzXHJcblx0XHQgKiBzY2VuZS5hZGRJbmRpY2F0b3JzKClcclxuXHRcdCAqXHJcblx0XHQgKiAvLyBwYXNzaW5nIG9wdGlvbnNcclxuXHRcdCAqIHNjZW5lLmFkZEluZGljYXRvcnMoe25hbWU6IFwicGluIHNjZW5lXCIsIGNvbG9yRW5kOiBcIiNGRkZGRkZcIn0pO1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBBbiBvYmplY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBvcHRpb25zIGZvciB0aGUgaW5kaWNhdG9ycy5cclxuXHRcdCAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBbb3B0aW9ucy5wYXJlbnRdIC0gQSBzZWxlY3RvciwgRE9NIE9iamVjdCBvciBhIGpRdWVyeSBvYmplY3QgdGhhdCB0aGUgaW5kaWNhdG9ycyBzaG91bGQgYmUgYWRkZWQgdG8uICBcclxuXHRcdCBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgSWYgdW5kZWZpbmVkLCB0aGUgY29udHJvbGxlcidzIGNvbnRhaW5lciB3aWxsIGJlIHVzZWQuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubmFtZT1cIlwiXSAtIFRoaXMgc3RyaW5nIHdpbGwgYmUgZGlzcGxheWVkIGF0IHRoZSBzdGFydCBhbmQgZW5kIGluZGljYXRvcnMgb2YgdGhlIHNjZW5lIGZvciBpZGVudGlmaWNhdGlvbiBwdXJwb3Nlcy4gSWYgbm8gbmFtZSBpcyBzdXBwbGllZCBhbiBhdXRvbWF0aWMgaW5kZXggd2lsbCBiZSB1c2VkLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmluZGVudD0wXSAtIEFkZGl0aW9uYWwgcG9zaXRpb24gb2Zmc2V0IGZvciB0aGUgaW5kaWNhdG9ycyAodXNlZnVsLCB3aGVuIGhhdmluZyBtdWx0aXBsZSBzY2VuZXMgc3RhcnRpbmcgYXQgdGhlIHNhbWUgcG9zaXRpb24pLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbG9yU3RhcnQ9Z3JlZW5dIC0gQ1NTIGNvbG9yIGRlZmluaXRpb24gZm9yIHRoZSBzdGFydCBpbmRpY2F0b3IuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29sb3JFbmQ9cmVkXSAtIENTUyBjb2xvciBkZWZpbml0aW9uIGZvciB0aGUgZW5kIGluZGljYXRvci5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb2xvclRyaWdnZXI9Ymx1ZV0gLSBDU1MgY29sb3IgZGVmaW5pdGlvbiBmb3IgdGhlIHRyaWdnZXIgaW5kaWNhdG9yLlxyXG5cdFx0ICovXHJcbiAgU2NlbmUuYWRkSW5kaWNhdG9ycyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgIGlmICghX2luZGljYXRvcikge1xyXG4gICAgICB2YXIgREVGQVVMVF9PUFRJT05TID0ge1xyXG4gICAgICAgIG5hbWU6ICcnLFxyXG4gICAgICAgIGluZGVudDogMCxcclxuICAgICAgICBwYXJlbnQ6IHVuZGVmaW5lZCxcclxuICAgICAgICBjb2xvclN0YXJ0OiAnZ3JlZW4nLFxyXG4gICAgICAgIGNvbG9yRW5kOiAncmVkJyxcclxuICAgICAgICBjb2xvclRyaWdnZXI6ICdibHVlJyxcclxuICAgICAgfVxyXG5cclxuICAgICAgb3B0aW9ucyA9IF91dGlsLmV4dGVuZCh7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKVxyXG5cclxuICAgICAgX2F1dG9pbmRleCsrXHJcbiAgICAgIF9pbmRpY2F0b3IgPSBuZXcgSW5kaWNhdG9yKFNjZW5lLCBvcHRpb25zKVxyXG5cclxuICAgICAgU2NlbmUub24oJ2FkZC5wbHVnaW5fYWRkSW5kaWNhdG9ycycsIF9pbmRpY2F0b3IuYWRkKVxyXG4gICAgICBTY2VuZS5vbigncmVtb3ZlLnBsdWdpbl9hZGRJbmRpY2F0b3JzJywgX2luZGljYXRvci5yZW1vdmUpXHJcbiAgICAgIFNjZW5lLm9uKCdkZXN0cm95LnBsdWdpbl9hZGRJbmRpY2F0b3JzJywgU2NlbmUucmVtb3ZlSW5kaWNhdG9ycylcclxuXHJcbiAgICAgIC8vIGl0IHRoZSBzY2VuZSBhbHJlYWR5IGhhcyBhIGNvbnRyb2xsZXIgd2UgY2FuIHN0YXJ0IHJpZ2h0IGF3YXkuXHJcbiAgICAgIGlmIChTY2VuZS5jb250cm9sbGVyKCkpIHtcclxuICAgICAgICBfaW5kaWNhdG9yLmFkZCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBTY2VuZVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB2aXN1YWwgaW5kaWNhdG9ycyBmcm9tIGEgU2Nyb2xsTWFnaWMuU2NlbmUuXHJcbiAgICogQG1lbWJlcm9mISBkZWJ1Zy5hZGRJbmRpY2F0b3JzI1xyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiAvLyByZW1vdmUgcHJldmlvdXNseSBhZGRlZCBpbmRpY2F0b3JzXHJcbiAgICogc2NlbmUucmVtb3ZlSW5kaWNhdG9ycygpXHJcbiAgICpcclxuICAgKi9cclxuICBTY2VuZS5yZW1vdmVJbmRpY2F0b3JzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoX2luZGljYXRvcikge1xyXG4gICAgICBfaW5kaWNhdG9yLnJlbW92ZSgpXHJcbiAgICAgIHRoaXMub2ZmKCcqLnBsdWdpbl9hZGRJbmRpY2F0b3JzJylcclxuICAgICAgX2luZGljYXRvciA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFNjZW5lXHJcbiAgfVxyXG59KVxyXG5cclxuLypcclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gKiBFeHRlbnNpb24gZm9yIGNvbnRyb2xsZXIgdG8gc3RvcmUgYW5kIHVwZGF0ZSByZWxhdGVkIGluZGljYXRvcnNcclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gKi9cclxuLy8gYWRkIG9wdGlvbiB0byBnbG9iYWxseSBhdXRvLWFkZCBpbmRpY2F0b3JzIHRvIHNjZW5lc1xyXG4vKipcclxuICogRXZlcnkgU2Nyb2xsTWFnaWMuQ29udHJvbGxlciBpbnN0YW5jZSBub3cgYWNjZXB0cyBhbiBhZGRpdGlvbmFsIG9wdGlvbi5cclxuICogU2VlIHtAbGluayBTY3JvbGxNYWdpYy5Db250cm9sbGVyfSBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBzdGFuZGFyZCBvcHRpb25zLlxyXG4gKiBAbWVtYmVyb2YhIGRlYnVnLmFkZEluZGljYXRvcnMjXHJcbiAqIEBtZXRob2QgbmV3IFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIob3B0aW9ucylcclxuICogQGV4YW1wbGVcclxuICogLy8gbWFrZSBhIGNvbnRyb2xsZXIgYW5kIGFkZCBpbmRpY2F0b3JzIHRvIGFsbCBzY2VuZXMgYXR0YWNoZWRcclxuICogdmFyIGNvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcih7YWRkSW5kaWNhdG9yczogdHJ1ZX0pO1xyXG4gKiAvLyB0aGlzIHNjZW5lIHdpbGwgYXV0b21hdGljYWxseSBoYXZlIGluZGljYXRvcnMgYWRkZWQgdG8gaXRcclxuICogbmV3IFNjcm9sbE1hZ2ljLlNjZW5lKClcclxuICogICAgICAgICAgICAgICAgLmFkZFRvKGNvbnRyb2xsZXIpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBmb3IgdGhlIENvbnRyb2xsZXIuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWRkSW5kaWNhdG9ycz1mYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgIGV2ZXJ5IHNjZW5lIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCBpbmRpY2F0b3JzIGFkZGVkIHRvIGl0LlxyXG4gKi9cclxuU2Nyb2xsTWFnaWMuQ29udHJvbGxlci5hZGRPcHRpb24oJ2FkZEluZGljYXRvcnMnLCBmYWxzZSlcclxuLy8gZXh0ZW5kIENvbnRyb2xsZXJcclxuU2Nyb2xsTWFnaWMuQ29udHJvbGxlci5leHRlbmQoZnVuY3Rpb24oKSB7XHJcbiAgdmFyIENvbnRyb2xsZXIgPSB0aGlzLFxyXG4gICAgX2luZm8gPSBDb250cm9sbGVyLmluZm8oKSxcclxuICAgIF9jb250YWluZXIgPSBfaW5mby5jb250YWluZXIsXHJcbiAgICBfaXNEb2N1bWVudCA9IF9pbmZvLmlzRG9jdW1lbnQsXHJcbiAgICBfdmVydGljYWwgPSBfaW5mby52ZXJ0aWNhbCxcclxuICAgIF9pbmRpY2F0b3JzID0ge1xyXG4gICAgICAvLyBjb250YWluZXIgZm9yIGFsbCBpbmRpY2F0b3JzIGFuZCBtZXRob2RzXHJcbiAgICAgIGdyb3VwczogW10sXHJcbiAgICB9XHJcblxyXG4gIHZhciBsb2cgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmIChDb250cm9sbGVyLl9sb2cpIHtcclxuICAgICAgLy8gbm90IGF2YWlsYWJsZSwgd2hlbiBtYWluIHNvdXJjZSBtaW5pZmllZFxyXG4gICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLCAxLCAwLCAnKCcgKyBOQU1FU1BBQ0UgKyAnKScsICctPicpXHJcbiAgICAgIENvbnRyb2xsZXIuX2xvZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChDb250cm9sbGVyLl9pbmRpY2F0b3JzKSB7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGxvZygyLCBcIldBUk5JTkc6IFNjZW5lIGFscmVhZHkgaGFzIGEgcHJvcGVydHkgJ19pbmRpY2F0b3JzJywgd2hpY2ggd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBwbHVnaW4uXCIpXHJcbiAgfVxyXG5cclxuICAvLyBhZGQgaW5kaWNhdG9ycyBjb250YWluZXJcclxuICB0aGlzLl9pbmRpY2F0b3JzID0gX2luZGljYXRvcnNcclxuICAvKlxyXG5cdFx0XHRuZWVkZWQgdXBkYXRlczpcclxuXHRcdFx0KysrKysrKysrKysrKysrXHJcblx0XHRcdHN0YXJ0L2VuZCBwb3NpdGlvbiBvbiBzY2VuZSBzaGlmdCAoaGFuZGxlZCBpbiBJbmRpY2F0b3IgY2xhc3MpXHJcblx0XHRcdHRyaWdnZXIgcGFyYW1ldGVycyBvbiB0cmlnZ2VySG9vayB2YWx1ZSBjaGFuZ2UgKGhhbmRsZWQgaW4gSW5kaWNhdG9yIGNsYXNzKVxyXG5cdFx0XHRib3VuZHMgcG9zaXRpb24gb24gY29udGFpbmVyIHNjcm9sbCBvciByZXNpemUgKHRvIGtlZXAgYWxpZ25tZW50IHRvIGJvdHRvbS9yaWdodClcclxuXHRcdFx0dHJpZ2dlciBwb3NpdGlvbiBvbiBjb250YWluZXIgcmVzaXplLCB3aW5kb3cgcmVzaXplIChpZiBjb250YWluZXIgaXNuJ3QgZG9jdW1lbnQpIGFuZCB3aW5kb3cgc2Nyb2xsIChpZiBjb250YWluZXIgaXNuJ3QgZG9jdW1lbnQpXHJcblx0XHQqL1xyXG5cclxuICAvLyBldmVudCBoYW5kbGVyIGZvciB3aGVuIGFzc29jaWF0ZWQgYm91bmRzIG1hcmtlcnMgbmVlZCB0byBiZSByZXBvc2l0aW9uZWRcclxuICB2YXIgaGFuZGxlQm91bmRzUG9zaXRpb25DaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgX2luZGljYXRvcnMudXBkYXRlQm91bmRzUG9zaXRpb25zKClcclxuICB9XHJcblxyXG4gIC8vIGV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gYXNzb2NpYXRlZCB0cmlnZ2VyIGdyb3VwcyBuZWVkIHRvIGJlIHJlcG9zaXRpb25lZFxyXG4gIHZhciBoYW5kbGVUcmlnZ2VyUG9zaXRpb25DaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgX2luZGljYXRvcnMudXBkYXRlVHJpZ2dlckdyb3VwUG9zaXRpb25zKClcclxuICB9XHJcblxyXG4gIF9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlVHJpZ2dlclBvc2l0aW9uQ2hhbmdlKVxyXG4gIGlmICghX2lzRG9jdW1lbnQpIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVUcmlnZ2VyUG9zaXRpb25DaGFuZ2UpXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlVHJpZ2dlclBvc2l0aW9uQ2hhbmdlKVxyXG4gIH1cclxuICAvLyB1cGRhdGUgYWxsIHJlbGF0ZWQgYm91bmRzIGNvbnRhaW5lcnNcclxuICBfY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZUJvdW5kc1Bvc2l0aW9uQ2hhbmdlKVxyXG4gIF9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlQm91bmRzUG9zaXRpb25DaGFuZ2UpXHJcblxyXG4gIC8vIHVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBib3VuZHMgY29udGFpbmVyIHRvIGFsaWduZWQgdG8gdGhlIHJpZ2h0IGZvciB2ZXJ0aWNhbCBjb250YWluZXJzIGFuZCB0byB0aGUgYm90dG9tIGZvciBob3Jpem9udGFsXHJcbiAgdGhpcy5faW5kaWNhdG9ycy51cGRhdGVCb3VuZHNQb3NpdGlvbnMgPSBmdW5jdGlvbihzcGVjaWZpY0luZGljYXRvcikge1xyXG4gICAgdmFyIC8vIGNvbnN0YW50IGZvciBhbGwgYm91bmRzXHJcbiAgICAgIGdyb3VwcyA9IHNwZWNpZmljSW5kaWNhdG9yXHJcbiAgICAgICAgPyBbXHJcbiAgICAgICAgICAgIF91dGlsLmV4dGVuZCh7fSwgc3BlY2lmaWNJbmRpY2F0b3IudHJpZ2dlckdyb3VwLCB7XHJcbiAgICAgICAgICAgICAgbWVtYmVyczogW3NwZWNpZmljSW5kaWNhdG9yXSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICBdIC8vIGNyZWF0ZSBhIGdyb3VwIHdpdGggb25seSBvbmUgZWxlbWVudFxyXG4gICAgICAgIDogX2luZGljYXRvcnMuZ3JvdXBzLCAvLyB1c2UgYWxsXHJcbiAgICAgIGcgPSBncm91cHMubGVuZ3RoLFxyXG4gICAgICBjc3MgPSB7fSxcclxuICAgICAgcGFyYW1Qb3MgPSBfdmVydGljYWwgPyAnbGVmdCcgOiAndG9wJyxcclxuICAgICAgcGFyYW1EaW1lbnNpb24gPSBfdmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCcsXHJcbiAgICAgIGVkZ2UgPSBfdmVydGljYWxcclxuICAgICAgICA/IF91dGlsLmdldC5zY3JvbGxMZWZ0KF9jb250YWluZXIpICsgX3V0aWwuZ2V0LndpZHRoKF9jb250YWluZXIpIC0gRURHRV9PRkZTRVRcclxuICAgICAgICA6IF91dGlsLmdldC5zY3JvbGxUb3AoX2NvbnRhaW5lcik