UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

239 lines 53.1 kB
export function checkCropperPosition(cropperPosition, cropperState, maintainSize) { cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState); return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize); } export function checkCropperSizeRestriction(cropperPosition, cropperState) { let cropperWidth = cropperPosition.x2 - cropperPosition.x1; let cropperHeight = cropperPosition.y2 - cropperPosition.y1; const centerX = cropperPosition.x1 + cropperWidth / 2; const centerY = cropperPosition.y1 + cropperHeight / 2; if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) { cropperWidth = cropperState.maxSize.width > cropperState.options.cropperStaticWidth ? cropperState.options.cropperStaticWidth : cropperState.maxSize.width; cropperHeight = cropperState.maxSize.height > cropperState.options.cropperStaticHeight ? cropperState.options.cropperStaticHeight : cropperState.maxSize.height; } else { cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize.width)); cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize.height)); if (cropperState.options.maintainAspectRatio) { if (cropperState.maxSize.width / cropperState.options.aspectRatio < cropperState.maxSize.height) { cropperHeight = cropperWidth / cropperState.options.aspectRatio; } else { cropperWidth = cropperHeight * cropperState.options.aspectRatio; } } } const x1 = centerX - cropperWidth / 2; const x2 = x1 + cropperWidth; const y1 = centerY - cropperHeight / 2; const y2 = y1 + cropperHeight; return { x1, x2, y1, y2 }; } export function checkCropperWithinMaxSizeBounds(position, cropperState, maintainSize = false) { if (position.x1 < 0) { position = { ...position, x1: 0, x2: position.x2 - (maintainSize ? position.x1 : 0) }; } if (position.y1 < 0) { position = { ...position, y2: position.y2 - (maintainSize ? position.y1 : 0), y1: 0 }; } if (position.x2 > cropperState.maxSize.width) { position = { ...position, x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize.width) : 0), x2: cropperState.maxSize.width }; } if (position.y2 > cropperState.maxSize.height) { position = { ...position, y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize.height) : 0), y2: cropperState.maxSize.height }; } return position; } export function moveCropper(event, moveStart) { const diffX = getClientX(event) - moveStart.clientX; const diffY = getClientY(event) - moveStart.clientY; return { x1: moveStart.cropper.x1 + diffX, y1: moveStart.cropper.y1 + diffY, x2: moveStart.cropper.x2 + diffX, y2: moveStart.cropper.y2 + diffY }; } export function resizeCropper(event, moveStart, cropperState) { const cropperPosition = { ...cropperState.cropper }; const moveX = getClientX(event) - moveStart.clientX; const moveY = getClientY(event) - moveStart.clientY; switch (moveStart.position) { case 'left': cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth); break; case 'topleft': cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth); cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight); break; case 'top': cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight); break; case 'topright': cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth); cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight); break; case 'right': cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth); break; case 'bottomright': cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth); cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight); break; case 'bottom': cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight); break; case 'bottomleft': cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth); cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight); break; case 'center': const scale = 'scale' in event ? event.scale : 1; const newWidth = Math.min(Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale), cropperState.cropperScaledMaxWidth); const newHeight = Math.min(Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale), cropperState.cropperScaledMaxHeight); cropperPosition.x1 = moveStart.clientX - newWidth / 2; cropperPosition.x2 = moveStart.clientX + newWidth / 2; cropperPosition.y1 = moveStart.clientY - newHeight / 2; cropperPosition.y2 = moveStart.clientY + newHeight / 2; if (cropperPosition.x1 < 0) { cropperPosition.x2 -= cropperPosition.x1; cropperPosition.x1 = 0; } else if (cropperPosition.x2 > cropperState.maxSize.width) { cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize.width); cropperPosition.x2 = cropperState.maxSize.width; } if (cropperPosition.y1 < 0) { cropperPosition.y2 -= cropperPosition.y1; cropperPosition.y1 = 0; } else if (cropperPosition.y2 > cropperState.maxSize.height) { cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize.height); cropperPosition.y2 = cropperState.maxSize.height; } break; } if (cropperState.options.maintainAspectRatio) { return checkAspectRatio(moveStart.position, cropperPosition, cropperState); } else { return cropperPosition; } } export function checkAspectRatio(position, cropperPosition, cropperState) { cropperPosition = { ...cropperPosition }; let overflowX = 0; let overflowY = 0; switch (position) { case 'top': cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio; overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0); overflowY = Math.max(0 - cropperPosition.y1, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio; } break; case 'bottom': cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio; overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0); overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio); } break; case 'topleft': cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio; overflowX = Math.max(0 - cropperPosition.x1, 0); overflowY = Math.max(0 - cropperPosition.y1, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio; } break; case 'topright': cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio; overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0); overflowY = Math.max(0 - cropperPosition.y1, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio; } break; case 'right': case 'bottomright': cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio; overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0); overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio; } break; case 'left': case 'bottomleft': cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio; overflowX = Math.max(0 - cropperPosition.x1, 0); overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0); if (overflowX > 0 || overflowY > 0) { cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX; cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio; } break; case 'center': cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio; cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio; const overflowX1 = Math.max(0 - cropperPosition.x1, 0); const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0); const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0); const overflowY2 = Math.max(0 - cropperPosition.y1, 0); if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) { cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1; cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2; cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio; cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio; } break; } return cropperPosition; } export function getClientX(event) { if ('touches' in event && event.touches[0]) { return event.touches[0].clientX; } else if ('clientX' in event) { return event.clientX; } return 0; } export function getClientY(event) { if ('touches' in event && event.touches[0]) { return event.touches[0].clientY; } else if ('clientX' in event) { return event.clientY; } return 0; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvdXRpbHMvY3JvcHBlci1wb3NpdGlvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxZQUEwQixFQUFFLFlBQXFCO0lBQ3RILGVBQWUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsZUFBZ0MsRUFBRSxZQUEwQjtJQUN0RyxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdkQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7WUFDbEYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ3pDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBUSxDQUFDLEtBQUssQ0FBQztRQUNoQyxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQVEsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7WUFDckYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CO1lBQzFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBUSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JKLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLE9BQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFKLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdDLElBQUksWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLE9BQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEcsYUFBYSxHQUFHLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0lBQzdCLE1BQU0sRUFBRSxHQUFHLE9BQU8sR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUM7SUFDOUIsT0FBTyxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsK0JBQStCLENBQUMsUUFBeUIsRUFBRSxZQUEwQixFQUFFLFlBQVksR0FBRyxLQUFLO0lBQ3pILElBQUksUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwQixRQUFRLEdBQUc7WUFDVCxHQUFHLFFBQVE7WUFDWCxFQUFFLEVBQUUsQ0FBQztZQUNMLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEIsUUFBUSxHQUFHO1lBQ1QsR0FBRyxRQUFRO1lBQ1gsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxFQUFFLEVBQUUsQ0FBQztTQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxPQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUMsUUFBUSxHQUFHO1lBQ1QsR0FBRyxRQUFRO1lBQ1gsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsT0FBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFRLENBQUMsS0FBSztTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsT0FBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLFFBQVEsR0FBRztZQUNULEdBQUcsUUFBUTtZQUNYLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLE9BQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBUSxDQUFDLE1BQU07U0FDakMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUF5QixFQUFFLFNBQW9CO0lBQ3pFLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBRXBELE9BQU87UUFDTCxFQUFFLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSztRQUNoQyxFQUFFLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSztRQUNoQyxFQUFFLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSztRQUNoQyxFQUFFLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSztLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBeUIsRUFBRSxTQUFvQixFQUFFLFlBQTBCO0lBQ3ZHLE1BQU0sZUFBZSxHQUFHLEVBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFDLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsUUFBUSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNO1lBQ1QsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDLEVBQzNILGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDM0QsTUFBTTtRQUNSLEtBQUssU0FBUztZQUNaLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzSCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzNELGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUM1SCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzVELE1BQU07UUFDUixLQUFLLEtBQUs7WUFDUixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxD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QUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDNUgsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxNQUFNO1FBQ1IsS0FBSyxRQUFRO1lBQ1gsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzdHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzlHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3ZDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FB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QyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBc0M7SUFDL0QsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyb3BwZXJQb3NpdGlvbiwgTW92ZVN0YXJ0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU3RhdGUgfSBmcm9tICcuLi9jb21wb25lbnQvY3JvcHBlci5zdGF0ZSc7XG5pbXBvcnQgeyBCYXNpY0V2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyUG9zaXRpb24oY3JvcHBlclBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemU6IGJvb2xlYW4pOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjcm9wcGVyUG9zaXRpb24gPSBjaGVja0Nyb3BwZXJTaXplUmVzdHJpY3Rpb24oY3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGUpO1xuICByZXR1cm4gY2hlY2tDcm9wcGVyV2l0aGluTWF4U2l6ZUJvdW5kcyhjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSwgbWFpbnRhaW5TaXplKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ3JvcHBlclNpemVSZXN0cmljdGlvbihjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBsZXQgY3JvcHBlcldpZHRoID0gY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxO1xuICBsZXQgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MTtcbiAgY29uc3QgY2VudGVyWCA9IGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IGNlbnRlclkgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVySGVpZ2h0IC8gMjtcblxuICBpZiAoY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodCAmJiBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGgpIHtcbiAgICBjcm9wcGVyV2lkdGggPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGggPiBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGhcbiAgICAgID8gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY1dpZHRoXG4gICAgICA6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aDtcbiAgICBjcm9wcGVySGVpZ2h0ID0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCA+IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNIZWlnaHRcbiAgICAgID8gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodFxuICAgICAgOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGNyb3BwZXJXaWR0aCA9IE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgsIE1hdGgubWluKGNyb3BwZXJXaWR0aCwgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCwgY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoKSk7XG4gICAgY3JvcHBlckhlaWdodCA9IE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0LCBNYXRoLm1pbihjcm9wcGVySGVpZ2h0LCBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCwgY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCkpO1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBpZiAoY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8gPCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgICAgIGNyb3BwZXJIZWlnaHQgPSBjcm9wcGVyV2lkdGggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyb3BwZXJXaWR0aCA9IGNyb3BwZXJIZWlnaHQgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB4MSA9IGNlbnRlclggLSBjcm9wcGVyV2lkdGggLyAyO1xuICBjb25zdCB4MiA9IHgxICsgY3JvcHBlcldpZHRoO1xuICBjb25zdCB5MSA9IGNlbnRlclkgLSBjcm9wcGVySGVpZ2h0IC8gMjtcbiAgY29uc3QgeTIgPSB5MSArIGNyb3BwZXJIZWlnaHQ7XG4gIHJldHVybiB7eDEsIHgyLCB5MSwgeTJ9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyV2l0aGluTWF4U2l6ZUJvdW5kcyhwb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSwgbWFpbnRhaW5TaXplID0gZmFsc2UpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBpZiAocG9zaXRpb24ueDEgPCAwKSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHgxOiAwLFxuICAgICAgeDI6IHBvc2l0aW9uLngyIC0gKG1haW50YWluU2l6ZSA/IHBvc2l0aW9uLngxIDogMClcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbi55MSA8IDApIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeTI6IHBvc2l0aW9uLnkyIC0gKG1haW50YWluU2l6ZSA/IHBvc2l0aW9uLnkxIDogMCksXG4gICAgICB5MTogMFxuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uLngyID4gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoKSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHgxOiBwb3NpdGlvbi54MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIDogMCksXG4gICAgICB4MjogY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24ueTIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHkxOiBwb3NpdGlvbi55MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSA6IDApLFxuICAgICAgeTI6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHRcbiAgICB9O1xuICB9XG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVDcm9wcGVyKGV2ZW50OiBFdmVudCB8IEJhc2ljRXZlbnQsIG1vdmVTdGFydDogTW92ZVN0YXJ0KTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgY29uc3QgZGlmZlggPSBnZXRDbGllbnRYKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRYO1xuICBjb25zdCBkaWZmWSA9IGdldENsaWVudFkoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFk7XG5cbiAgcmV0dXJuIHtcbiAgICB4MTogbW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBkaWZmWCxcbiAgICB5MTogbW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBkaWZmWSxcbiAgICB4MjogbW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBkaWZmWCxcbiAgICB5MjogbW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBkaWZmWVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQ3JvcHBlcihldmVudDogRXZlbnQgfCBCYXNpY0V2ZW50LCBtb3ZlU3RhcnQ6IE1vdmVTdGFydCwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjb25zdCBjcm9wcGVyUG9zaXRpb24gPSB7Li4uY3JvcHBlclN0YXRlLmNyb3BwZXJ9O1xuICBjb25zdCBtb3ZlWCA9IGdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gIGNvbnN0IG1vdmVZID0gZ2V0Q2xpZW50WShldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WTtcbiAgc3dpdGNoIChtb3ZlU3RhcnQucG9zaXRpb24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLngxICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcGxlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3ByaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci54MiArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbXJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjb25zdCBzY2FsZSA9ICdzY2FsZScgaW4gZXZlbnQgPyBldmVudC5zY2FsZSBhcyBudW1iZXIgOiAxO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCwgKE1hdGguYWJzKG1vdmVTdGFydC5jcm9wcGVyLngyIC0gbW92ZVN0YXJ0LmNyb3BwZXIueDEpKSAqIHNjYWxlKSxcbiAgICAgICAgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCk7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIChNYXRoLmFicyhtb3ZlU3RhcnQuY3JvcHBlci55MiAtIG1vdmVTdGFydC5jcm9wcGVyLnkxKSkgKiBzY2FsZSksXG4gICAgICAgIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IG1vdmVTdGFydC5jbGllbnRYIC0gbmV3V2lkdGggLyAyO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gbW92ZVN0YXJ0LmNsaWVudFggKyBuZXdXaWR0aCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBtb3ZlU3RhcnQuY2xpZW50WSAtIG5ld0hlaWdodCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBtb3ZlU3RhcnQuY2xpZW50WSArIG5ld0hlaWdodCAvIDI7XG4gICAgICBpZiAoY3JvcHBlclBvc2l0aW9uLngxIDwgMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gY3JvcHBlclBvc2l0aW9uLngxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjcm9wcGVyUG9zaXRpb24ueDIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxIC09IChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoY3JvcHBlclBvc2l0aW9uLnkxIDwgMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gY3JvcHBlclBvc2l0aW9uLnkxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjcm9wcGVyUG9zaXRpb24ueTIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSAtPSAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgcmV0dXJuIGNoZWNrQXNwZWN0UmF0aW8obW92ZVN0YXJ0LnBvc2l0aW9uISwgY3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcm9wcGVyUG9zaXRpb247XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXNwZWN0UmF0aW8ocG9zaXRpb246IHN0cmluZywgY3JvcHBlclBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlKTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgY3JvcHBlclBvc2l0aW9uID0gey4uLmNyb3BwZXJQb3NpdGlvbn07XG4gIGxldCBvdmVyZmxvd1ggPSAwO1xuICBsZXQgb3ZlcmZsb3dZID0gMDtcbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IChvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3BsZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLngxLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3ByaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBjcm9wcGVyUG9zaXRpb24ueTIgLSAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAnYm90dG9tcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclBvc2l0aW9uLnkxICsgKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXg