@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
393 lines • 45 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { fromEvent, merge } from 'rxjs';
import { share, map, filter, tap, switchMap, takeUntil, take, skip } from 'rxjs/operators';
import { DraggableEvent } from './DraggableEvent';
import { utils } from './utils';
export class Draggable {
/**
* @param {?} element
* @param {?=} config
*/
constructor(element, config = {}) {
this.mousemove = merge(fromEvent(document, 'mousemove'), fromEvent(document, 'touchmove', { passive: false })).pipe(share());
this.mouseup = merge(fromEvent(document, 'mouseup'), fromEvent(document, 'touchend'), fromEvent(document, 'touchcancel')).pipe(share());
this.config = {
handlerClass: null,
scroll: true,
scrollEdge: 36,
scrollDirection: null
};
// reference to auto scrolling listeners
this.autoScrollingInterval = [];
this.element = element;
this.mousedown = merge(fromEvent(element, 'mousedown'), fromEvent(element, 'touchstart')).pipe(share());
this.config = Object.assign({}, this.config, config);
this.dragStart = this.createDragStartObservable().pipe(share());
this.dragMove = this.createDragMoveObservable(this.dragStart);
this.dragStop = this.createDragStopObservable(this.dragStart);
this.fixProblemWithDnDForIE(element);
this.requestAnimationFrame =
window.requestAnimationFrame || (callback => setTimeout(callback, 1000 / 60));
this.cancelAnimationFrame = window.cancelAnimationFrame || (cafID => clearTimeout(cafID));
}
/**
* @return {?}
*/
createDragStartObservable() {
return this.mousedown.pipe(map(md => new DraggableEvent(md)), filter((event) => this.isDragingByHandler(event)), tap(e => {
if (!e.isTouchEvent()) {
e.pauseEvent();
}
if (document.activeElement) {
((/** @type {?} */ (document.activeElement))).blur();
}
// prevents rendering performance issues while dragging item with selection inside
utils.clearSelection();
}), switchMap((startEvent) => {
return this.mousemove.pipe(map(mm => new DraggableEvent(mm)), filter((moveEvent) => this.inRange(startEvent, moveEvent, 5)), map(() => startEvent), takeUntil(this.mouseup), take(1));
}));
}
/**
* @param {?} dragStart
* @return {?}
*/
createDragMoveObservable(dragStart) {
return dragStart.pipe(tap(event => {
this.addTouchActionNone(event.target);
}), switchMap(startEvent => {
return this.mousemove.pipe(skip(1), map(mm => new DraggableEvent(mm)), tap(event => {
event.pauseEvent();
startEvent.pauseEvent();
}), takeUntil(this.mouseup));
}), filter(val => !!val), tap((event) => {
if (this.config.scroll) {
this.startScroll(this.element, event);
}
}));
}
/**
* @param {?} dragStart
* @return {?}
*/
createDragStopObservable(dragStart) {
return dragStart.pipe(switchMap(() => {
return this.mouseup.pipe(take(1));
}), map(e => new DraggableEvent(e)), tap(e => {
if (e.target) {
this.removeTouchActionNone(e.target);
}
this.autoScrollingInterval.forEach(raf => this.cancelAnimationFrame(raf));
}));
}
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
startScroll(item, event) {
/** @type {?} */
const scrollContainer = this.getScrollContainer(item);
this.autoScrollingInterval.forEach(raf => this.cancelAnimationFrame(raf));
if (scrollContainer) {
this.startScrollForContainer(event, scrollContainer);
}
else {
this.startScrollForWindow(event);
}
}
/**
* @param {?} event
* @param {?} scrollContainer
* @return {?}
*/
startScrollForContainer(event, scrollContainer) {
if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') {
this.startScrollVerticallyForContainer(event, scrollContainer);
}
if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') {
this.startScrollHorizontallyForContainer(event, scrollContainer);
}
}
/**
* @param {?} event
* @param {?} scrollContainer
* @return {?}
*/
startScrollVerticallyForContainer(event, scrollContainer) {
if (event.pageY - this.getOffset(scrollContainer).top < this.config.scrollEdge) {
this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollTop');
}
else if (this.getOffset(scrollContainer).top +
scrollContainer.getBoundingClientRect().height -
event.pageY <
this.config.scrollEdge) {
this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollTop');
}
}
/**
* @param {?} event
* @param {?} scrollContainer
* @return {?}
*/
startScrollHorizontallyForContainer(event, scrollContainer) {
if (event.pageX - scrollContainer.getBoundingClientRect().left < this.config.scrollEdge) {
this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollLeft');
}
else if (this.getOffset(scrollContainer).left +
scrollContainer.getBoundingClientRect().width -
event.pageX <
this.config.scrollEdge) {
this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollLeft');
}
}
/**
* @param {?} event
* @return {?}
*/
startScrollForWindow(event) {
if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') {
this.startScrollVerticallyForWindow(event);
}
if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') {
this.startScrollHorizontallyForWindow(event);
}
}
/**
* @param {?} event
* @return {?}
*/
startScrollVerticallyForWindow(event) {
/** @type {?} */
const scrollingElement = document.scrollingElement || document.documentElement || document.body;
// NOTE: Using `window.pageYOffset` here because IE doesn't have `window.scrollY`.
if (event.pageY - window.pageYOffset < this.config.scrollEdge) {
this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollTop');
}
else if (window.innerHeight - (event.pageY - window.pageYOffset) <
this.config.scrollEdge) {
this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollTop');
}
}
/**
* @param {?} event
* @return {?}
*/
startScrollHorizontallyForWindow(event) {
/** @type {?} */
const scrollingElement = document.scrollingElement || document.documentElement || document.body;
// NOTE: Using `window.pageXOffset` here because IE doesn't have `window.scrollX`.
if (event.pageX - window.pageXOffset < this.config.scrollEdge) {
this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollLeft');
}
else if (window.innerWidth - (event.pageX - window.pageXOffset) <
this.config.scrollEdge) {
this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollLeft');
}
}
/**
* @param {?} node
* @return {?}
*/
getScrollContainer(node) {
/** @type {?} */
const nodeOuterHeight = utils.getElementOuterHeight(node);
if (node.scrollHeight > Math.ceil(nodeOuterHeight)) {
return node;
}
if (!new RegExp('(body|html)', 'i').test(node.parentNode.tagName)) {
return this.getScrollContainer(node.parentNode);
}
return null;
}
/**
* @param {?} node
* @param {?} amount
* @param {?} direction
* @return {?}
*/
startAutoScrolling(node, amount, direction) {
this.autoScrollingInterval.push(this.requestAnimationFrame(function () {
this.startAutoScrolling(node, amount, direction);
}.bind(this)));
return (node[direction] += amount * 0.25);
}
/**
* @param {?} el
* @return {?}
*/
getOffset(el) {
/** @type {?} */
const rect = el.getBoundingClientRect();
return {
left: rect.left + this.getScroll('scrollLeft', 'pageXOffset'),
top: rect.top + this.getScroll('scrollTop', 'pageYOffset')
};
}
/**
* @param {?} scrollProp
* @param {?} offsetProp
* @return {?}
*/
getScroll(scrollProp, offsetProp) {
if (typeof window[offsetProp] !== 'undefined') {
return window[offsetProp];
}
if (document.documentElement.clientHeight) {
return document.documentElement[scrollProp];
}
return document.body[scrollProp];
}
/**
* @param {?} event
* @return {?}
*/
isDragingByHandler(event) {
if (!this.isValidDragHandler(event.target)) {
return false;
}
return (!this.config.handlerClass ||
(this.config.handlerClass &&
this.hasElementWithClass(this.config.handlerClass, event.target)));
}
/**
* @param {?} targetEl
* @return {?}
*/
isValidDragHandler(targetEl) {
return ['input', 'textarea'].indexOf(targetEl.tagName.toLowerCase()) === -1;
}
/**
* @param {?} startEvent
* @param {?} moveEvent
* @param {?} range
* @return {?}
*/
inRange(startEvent, moveEvent, range) {
return (Math.abs(moveEvent.clientX - startEvent.clientX) > range ||
Math.abs(moveEvent.clientY - startEvent.clientY) > range);
}
/**
* @param {?} className
* @param {?} target
* @return {?}
*/
hasElementWithClass(className, target) {
while (target !== this.element) {
if (target.classList.contains(className)) {
return true;
}
target = target.parentElement;
}
return false;
}
/**
* @param {?} e
* @return {?}
*/
pauseEvent(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
if (e.preventDefault) {
e.preventDefault();
}
e.cancelBubble = true;
e.returnValue = false;
}
/**
* @param {?} element
* @return {?}
*/
fixProblemWithDnDForIE(element) {
if (this.isTouchDevice() && this.isIEorEdge() && ((/** @type {?} */ (element))).style) {
((/** @type {?} */ (element))).style['touch-action'] = 'none';
}
}
/**
* @param {?} element
* @return {?}
*/
removeTouchActionNone(element) {
if (!((/** @type {?} */ (element))).style) {
return;
}
((/** @type {?} */ (element))).style['touch-action'] = '';
}
/**
* @param {?} element
* @return {?}
*/
addTouchActionNone(element) {
if (!((/** @type {?} */ (element))).style) {
return;
}
((/** @type {?} */ (element))).style['touch-action'] = 'none';
}
/**
* @return {?}
*/
isTouchDevice() {
return ('ontouchstart' in window || navigator.maxTouchPoints // works on most browsers
); // works on IE10/11 and Surface
}
/**
* @return {?}
*/
isIEorEdge() {
/** @type {?} */
const ua = window.navigator.userAgent;
/** @type {?} */
const msie = ua.indexOf('MSIE ');
if (msie > 0) {
// IE 10 or older => return version number
return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
}
/** @type {?} */
const trident = ua.indexOf('Trident/');
if (trident > 0) {
// IE 11 => return version number
/** @type {?} */
const rv = ua.indexOf('rv:');
return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
}
/** @type {?} */
const edge = ua.indexOf('Edge/');
if (edge > 0) {
// Edge (IE 12+) => return version number
return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
}
// other browser
return false;
}
}
Draggable.SCROLL_SPEED = 20;
if (false) {
/** @type {?} */
Draggable.SCROLL_SPEED;
/** @type {?} */
Draggable.prototype.element;
/** @type {?} */
Draggable.prototype.dragStart;
/** @type {?} */
Draggable.prototype.dragMove;
/** @type {?} */
Draggable.prototype.dragStop;
/** @type {?} */
Draggable.prototype.requestAnimationFrame;
/** @type {?} */
Draggable.prototype.cancelAnimationFrame;
/** @type {?} */
Draggable.prototype.mousemove;
/** @type {?} */
Draggable.prototype.mouseup;
/** @type {?} */
Draggable.prototype.mousedown;
/** @type {?} */
Draggable.prototype.config;
/** @type {?} */
Draggable.prototype.autoScrollingInterval;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvdXRpbHMvZHJhZ2dhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQWMsU0FBUyxFQUFFLEtBQUssRUFBUSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxTQUFTOzs7OztJQTZCbEIsWUFBWSxPQUFnQixFQUFFLE1BQU0sR0FBRyxFQUFFO1FBbkJqQyxjQUFTLEdBQTJCLEtBQUssQ0FDN0MsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFDaEMsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDdkQsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNSLFlBQU8sR0FBMkIsS0FBSyxDQUMzQyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUM5QixTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUMvQixTQUFTLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUNyQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRVIsV0FBTSxHQUFHO1lBQ2IsWUFBWSxFQUFFLElBQUk7WUFDbEIsTUFBTSxFQUFFLElBQUk7WUFDWixVQUFVLEVBQUUsRUFBRTtZQUNkLGVBQWUsRUFBRSxJQUFJO1NBQ3hCLENBQUM7O1FB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QU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7OztrQkFFUCxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDNUIsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbEU7O2NBRUssSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNWLHlDQUF5QztZQUN6QyxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN0RTtRQUVELGdCQUFnQjtRQUNoQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOztBQTNWTSxzQkFBWSxHQUFHLEVBQUUsQ0FBQzs7O0lBQXpCLHVCQUF5Qjs7SUFDekIsNEJBQWlCOztJQUVqQiw4QkFBc0M7O0lBQ3RDLDZCQUFxQzs7SUFDckMsNkJBQXFDOztJQUVyQywwQ0FBd0M7O0lBQ3hDLHlDQUF1Qzs7SUFDdkMsOEJBR2dCOztJQUNoQiw0QkFJZ0I7O0lBQ2hCLDhCQUEwQzs7SUFDMUMsMkJBS0U7O0lBRUYsMENBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbUV2ZW50LCBtZXJnZSwgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUsIG1hcCwgZmlsdGVyLCB0YXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YWtlLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4vRHJhZ2dhYmxlRXZlbnQnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIERyYWdnYWJsZSB7XG4gICAgc3RhdGljIFNDUk9MTF9TUEVFRCA9IDIwO1xuICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG5cbiAgICBkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+O1xuICAgIGRyYWdNb3ZlOiBPYnNlcnZhYmxlPERyYWdnYWJsZUV2ZW50PjtcbiAgICBkcmFnU3RvcDogT2JzZXJ2YWJsZTxEcmFnZ2FibGVFdmVudD47XG4gICAgLy8gQSBzaW1wbGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBvbHlmaWxsXG4gICAgcHJpdmF0ZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgbW91c2Vtb3ZlOiBPYnNlcnZhYmxlPHt9IHwgRXZlbnQ+ID0gbWVyZ2UoXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpLFxuICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB7IHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgKS5waXBlKHNoYXJlKCkpO1xuICAgIHByaXZhdGUgbW91c2V1cDogT2JzZXJ2YWJsZTx7fSB8IEV2ZW50PiA9IG1lcmdlKFxuICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZXVwJyksXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNoZW5kJyksXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJylcbiAgICApLnBpcGUoc2hhcmUoKSk7XG4gICAgcHJpdmF0ZSBtb3VzZWRvd246IE9ic2VydmFibGU8e30gfCBFdmVudD47XG4gICAgcHJpdmF0ZSBjb25maWcgPSB7XG4gICAgICAgIGhhbmRsZXJDbGFzczogbnVsbCxcbiAgICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgICBzY3JvbGxFZGdlOiAzNixcbiAgICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBudWxsXG4gICAgfTtcbiAgICAvLyByZWZlcmVuY2UgdG8gYXV0byBzY3JvbGxpbmcgbGlzdGVuZXJzXG4gICAgcHJpdmF0ZSBhdXRvU2Nyb2xsaW5nSW50ZXJ2YWwgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnQsIGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubW91c2Vkb3duID0gbWVyZ2UoXG4gICAgICAgICAgICBmcm9tRXZlbnQoZWxlbWVudCwgJ21vdXNlZG93bicpLFxuICAgICAgICAgICAgZnJvbUV2ZW50KGVsZW1lbnQsICd0b3VjaHN0YXJ0JylcbiAgICAgICAgKS5waXBlKHNoYXJlKCkpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgLi4uY29uZmlnIH07XG5cbiAgICAgICAgdGhpcy5kcmFnU3RhcnQgPSB0aGlzLmNyZWF0ZURyYWdTdGFydE9ic2VydmFibGUoKS5waXBlKHNoYXJlKCkpO1xuICAgICAgICB0aGlzLmRyYWdNb3ZlID0gdGhpcy5jcmVhdGVEcmFnTW92ZU9ic2VydmFibGUodGhpcy5kcmFnU3RhcnQpO1xuICAgICAgICB0aGlzLmRyYWdTdG9wID0gdGhpcy5jcmVhdGVEcmFnU3RvcE9ic2VydmFibGUodGhpcy5kcmFnU3RhcnQpO1xuXG4gICAgICAgIHRoaXMuZml4UHJvYmxlbVdpdGhEbkRGb3JJRShlbGVtZW50KTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IChjYWxsYmFjayA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApKTtcbiAgICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCAoY2FmSUQgPT4gY2xlYXJUaW1lb3V0KGNhZklEKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnU3RhcnRPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW91c2Vkb3duLnBpcGUoXG4gICAgICAgICAgICBtYXAobWQgPT4gbmV3IERyYWdnYWJsZUV2ZW50KG1kKSksXG4gICAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4gdGhpcy5pc0RyYWdpbmdCeUhhbmRsZXIoZXZlbnQpKSxcbiAgICAgICAgICAgIHRhcChlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuaXNUb3VjaEV2ZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wYXVzZUV2ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICg8YW55PmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcHJldmVudHMgcmVuZGVyaW5nIHBlcmZvcm1hbmNlIGlzc3VlcyB3aGlsZSBkcmFnZ2luZyBpdGVtIHdpdGggc2VsZWN0aW9uIGluc2lkZVxuICAgICAgICAgICAgICAgIHV0aWxzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoc3RhcnRFdmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZW1vdmUucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKG1tID0+IG5ldyBEcmFnZ2FibGVFdmVudChtbSkpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKG1vdmVFdmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHRoaXMuaW5SYW5nZShzdGFydEV2ZW50LCBtb3ZlRXZlbnQsIDUpKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5tb3VzZXVwKSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ01vdmVPYnNlcnZhYmxlKFxuICAgICAgICBkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+XG4gICAgKTogT2JzZXJ2YWJsZTxEcmFnZ2FibGVFdmVudD4ge1xuICAgICAgICByZXR1cm4gZHJhZ1N0YXJ0LnBpcGUoXG4gICAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG91Y2hBY3Rpb25Ob25lKGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChzdGFydEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZW1vdmUucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKG1tID0+IG5ldyBEcmFnZ2FibGVFdmVudChtbSkpLFxuICAgICAgICAgICAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucGF1c2VFdmVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRFdmVudC5wYXVzZUV2ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5tb3VzZXVwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcih2YWwgPT4gISF2YWwpLFxuICAgICAgICAgICAgdGFwKChldmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGwodGhpcy5lbGVtZW50LCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdTdG9wT2JzZXJ2YWJsZShkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIGRyYWdTdGFydC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZXVwLnBpcGUodGFrZSgxKSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcChlID0+IG5ldyBEcmFnZ2FibGVFdmVudChlKSksXG4gICAgICAgICAgICB0YXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVG91Y2hBY3Rpb25Ob25lKGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsaW5nSW50ZXJ2YWwuZm9yRWFjaChyYWYgPT4gdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZShyYWYpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbChpdGVtOiBFbGVtZW50LCBldmVudDogRHJhZ2dhYmxlRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5nZXRTY3JvbGxDb250YWluZXIoaXRlbSk7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGluZ0ludGVydmFsLmZvckVhY2gocmFmID0+IHRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKSk7XG5cbiAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5zdGFydFNjcm9sbEZvckNvbnRhaW5lcihldmVudCwgc2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGxGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbEZvckNvbnRhaW5lcihldmVudDogRHJhZ2dhYmxlRXZlbnQsIHNjcm9sbENvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zY3JvbGxEaXJlY3Rpb24gfHwgdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsVmVydGljYWxseUZvckNvbnRhaW5lcihldmVudCwgc2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uIHx8IHRoaXMuY29uZmlnLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yQ29udGFpbmVyKGV2ZW50LCBzY3JvbGxDb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JDb250YWluZXIoXG4gICAgICAgIGV2ZW50OiBEcmFnZ2FibGVFdmVudCxcbiAgICAgICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQucGFnZVkgLSB0aGlzLmdldE9mZnNldChzY3JvbGxDb250YWluZXIpLnRvcCA8IHRoaXMuY29uZmlnLnNjcm9sbEVkZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKHNjcm9sbENvbnRhaW5lciwgLURyYWdnYWJsZS5TQ1JPTExfU1BFRUQsICdzY3JvbGxUb3AnKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZ2V0T2Zmc2V0KHNjcm9sbENvbnRhaW5lcikudG9wICtcbiAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC1cbiAgICAgICAgICAgICAgICBldmVudC5wYWdlWSA8XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGxpbmcoc2Nyb2xsQ29udGFpbmVyLCBEcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yQ29udGFpbmVyKFxuICAgICAgICBldmVudDogRHJhZ2dhYmxlRXZlbnQsXG4gICAgICAgIHNjcm9sbENvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LnBhZ2VYIC0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPCB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxDb250YWluZXIsIC1EcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsTGVmdCcpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5nZXRPZmZzZXQoc2Nyb2xsQ29udGFpbmVyKS5sZWZ0ICtcbiAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLVxuICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VYIDxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjcm9sbEVkZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxDb250YWluZXIsIERyYWdnYWJsZS5TQ1JPTExfU1BFRUQsICdzY3JvbGxMZWZ0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsRm9yV2luZG93KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uIHx8IHRoaXMuY29uZmlnLnNjcm9sbERpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgICAgdGhpcy5zdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zY3JvbGxEaXJlY3Rpb24gfHwgdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGxIb3Jpem9udGFsbHlGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JXaW5kb3coZXZlbnQ6IERyYWdnYWJsZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGluZ0VsZW1lbnQgPVxuICAgICAgICAgICAgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgICAgICAvLyBOT1RFOiBVc2luZyBgd2luZG93LnBhZ2VZT2Zmc2V0YCBoZXJlIGJlY2F1c2UgSUUgZG9lc24ndCBoYXZlIGB3aW5kb3cuc2Nyb2xsWWAuXG4gICAgICAgIGlmIChldmVudC5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCA8IHRoaXMuY29uZmlnLnNjcm9sbEVkZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKHNjcm9sbGluZ0VsZW1lbnQsIC1EcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLSAoZXZlbnQucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIDxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjcm9sbEVkZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxpbmdFbGVtZW50LCBEcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yV2luZG93KGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxpbmdFbGVtZW50ID1cbiAgICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgLy8gTk9URTogVXNpbmcgYHdpbmRvdy5wYWdlWE9mZnNldGAgaGVyZSBiZWNhdXNlIElFIGRvZXNuJ3QgaGF2ZSBgd2luZG93LnNjcm9sbFhgLlxuICAgICAgICBpZiAoZXZlbnQucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQgPCB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxpbmdFbGVtZW50LCAtRHJhZ2dhYmxlLlNDUk9MTF9TUEVFRCwgJ3Njcm9sbExlZnQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIC0gKGV2ZW50LnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0KSA8XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGxpbmcoc2Nyb2xsaW5nRWxlbWVudCwgRHJhZ2dhYmxlLlNDUk9MTF9TUEVFRCwgJ3Njcm9sbExlZnQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKG5vZGUpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IG5vZGVPdXRlckhlaWdodCA9IHV0aWxzLmdldEVsZW1lbnRPdXRlckhlaWdodChub2RlKTtcblxuICAgICAgICBpZiAobm9kZS5zY3JvbGxIZWlnaHQgPiBNYXRoLmNlaWwobm9kZU91dGVySGVpZ2h0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoJyhib2R5fGh0bWwpJywgJ2knKS50ZXN0KG5vZGUucGFyZW50Tm9kZS50YWdOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsQ29udGFpbmVyKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0QXV0b1Njcm9sbGluZyhub2RlLCBhbW91bnQsIGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLmF1dG9TY3JvbGxpbmdJbnRlcnZhbC5wdXNoKFxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKG5vZGUsIGFtb3VudCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKG5vZGVbZGlyZWN0aW9uXSArPSBhbW91bnQgKiAwLjI1KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9mZnNldChlbCkge1xuICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyB0aGlzLmdldFNjcm9sbCgnc2Nyb2xsTGVmdCcsICdwYWdlWE9mZnNldCcpLFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCArIHRoaXMuZ2V0U2Nyb2xsKCdzY3JvbGxUb3AnLCAncGFnZVlPZmZzZXQnKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsKHNjcm9sbFByb3AsIG9mZnNldFByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3dbb2Zmc2V0UHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93W29mZnNldFByb3BdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbFByb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5W3Njcm9sbFByb3BdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEcmFnaW5nQnlIYW5kbGVyKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZERyYWdIYW5kbGVyKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhdGhpcy5jb25maWcuaGFuZGxlckNsYXNzIHx8XG4gICAgICAgICAgICAodGhpcy5jb25maWcuaGFuZGxlckNsYXNzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNFbGVtZW50V2l0aENsYXNzKHRoaXMuY29uZmlnLmhhbmRsZXJDbGFzcywgZXZlbnQudGFyZ2V0KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcmFnSGFuZGxlcih0YXJnZXRFbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBbJ2lucHV0JywgJ3RleHRhcmVhJ10uaW5kZXhPZih0YXJnZXRFbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluUmFuZ2Uoc3RhcnRFdmVudDogRHJhZ2dhYmxlRXZlbnQsIG1vdmVFdmVudDogRHJhZ2dhYmxlRXZlbnQsIHJhbmdlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIE1hdGguYWJzKG1vdmVFdmVudC5jbGllbnRYIC0gc3RhcnRFdmVudC5jbGllbnRYKSA+IHJhbmdlIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhtb3ZlRXZlbnQuY2xpZW50WSAtIHN0YXJ0RXZlbnQuY2xpZW50WSkgPiByYW5nZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzRWxlbWVudFdpdGhDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgd2hpbGUgKHRhcmdldCAhPT0gdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXVzZUV2ZW50KGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZml4UHJvYmxlbVdpdGhEbkRGb3JJRShlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVG91Y2hEZXZpY2UoKSAmJiB0aGlzLmlzSUVvckVkZ2UoKSAmJiAoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlKSB7XG4gICAgICAgICAgICAoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVG91Y2hBY3Rpb25Ob25lKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKDxIVE1MRWxlbWVudD5lbGVtZW50KS5zdHlsZVsndG91Y2gtYWN0aW9uJ10gPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvdWNoQWN0aW9uTm9uZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghKDxIVE1MRWxlbWVudD5lbGVtZW50KS5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICg8SFRNTEVsZW1lbnQ+ZWxlbWVudCkuc3R5bGVbJ3RvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUb3VjaERldmljZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgLy8gd29ya3Mgb24gbW9zdCBicm93c2Vyc1xuICAgICAgICApOyAvLyB3b3JrcyBvbiBJRTEwLzExIGFuZCBTdXJmYWNlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0lFb3JFZGdlKCkge1xuICAgICAgICBjb25zdCB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuXG4gICAgICAgIGNvbnN0IG1zaWUgPSB1YS5pbmRleE9mKCdNU0lFICcpO1xuICAgICAgICBpZiAobXNpZSA+IDApIHtcbiAgICAgICAgICAgIC8vIElFIDEwIG9yIG9sZGVyID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhtc2llICsgNSwgdWEuaW5kZXhPZignLicsIG1zaWUpKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJpZGVudCA9IHVhLmluZGV4T2YoJ1RyaWRlbnQvJyk7XG4gICAgICAgIGlmICh0cmlkZW50ID4gMCkge1xuICAgICAgICAgICAgLy8gSUUgMTEgPT4gcmV0dXJuIHZlcnNpb24gbnVtYmVyXG4gICAgICAgICAgICBjb25zdCBydiA9IHVhLmluZGV4T2YoJ3J2OicpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhydiArIDMsIHVhLmluZGV4T2YoJy4nLCBydikpLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlZGdlID0gdWEuaW5kZXhPZignRWRnZS8nKTtcbiAgICAgICAgaWYgKGVkZ2UgPiAwKSB7XG4gICAgICAgICAgICAvLyBFZGdlIChJRSAxMispID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhlZGdlICsgNSwgdWEuaW5kZXhPZignLicsIGVkZ2UpKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3RoZXIgYnJvd3NlclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19