@foblex/flow-animator
Version:
Animation library for @foblex/flow.
95 lines • 14.9 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { concatMap, finalize, forkJoin, from, Observable, tap } from 'rxjs';
import { DOCUMENT } from '@angular/common';
import { AnimateElementHandler } from './animate-element/animate-element.handler';
import { AnimateElementRequest } from './animate-element/animate-element-request';
import { GetAllAnimatedElementsRequest } from './get-all-animated-elements/get-all-animated-elements-request';
import { GetAllAnimatedElementsHandler } from './get-all-animated-elements/get-all-animated-elements.handler';
import * as i0 from "@angular/core";
import * as i1 from "@angular/animations";
/**
* Service for animating elements in the @foblex/flow-animator library.
* This service handles the orchestration of animations for elements.
*/
export class FFlowAnimatorService {
/**
* Creates an instance of FFlowAnimatorService.
* @param {AnimationBuilder} animationBuilder - The AnimationBuilder service for creating animations.
* @param {Document} document - The DOM Document object to interact with the DOM.
*/
constructor(animationBuilder, document) {
this.animationBuilder = animationBuilder;
this.document = document;
}
/**
* Initiates the animation process for the specified flow.
* @param {any} flowId - The identifier of the flow to be animated.
* @param {IFAnimationConfiguration} configuration - The configuration settings for the animation.
* @return {Observable<IFAnimationResult>} An Observable that emits the result of the animation process.
*/
animate(flowId, configuration) {
return new Observable((observer) => {
setTimeout(() => {
const toAnimate = new GetAllAnimatedElementsHandler(this.document).handle(new GetAllAnimatedElementsRequest(flowId, configuration.items));
this.animateSequentially(toAnimate, configuration, observer);
}, 0);
});
}
/**
* Animates elements sequentially according to the provided configuration.
* @private
* @param {IFElementToAnimate[][]} rows - A two-dimensional array of elements to animate in sequence.
* @param {IFAnimationConfiguration} configuration - The configuration settings for the animation.
* @param {Subscriber<IFAnimationResult>} observer - The observer to emit the results to.
*/
animateSequentially(rows, configuration, observer) {
const singleDuration = configuration.duration / rows.length;
let toRemove = [];
from(rows).pipe(concatMap((row, index) => forkJoin(row.map(x => this.animateElement(x.element, x.duration || singleDuration).pipe(tap((overlayElement) => {
toRemove.push(overlayElement);
})))).pipe(finalize(() => {
if (configuration.removeOverlayAfterRowComplete) {
toRemove = this.removeCreatedElements(toRemove);
}
observer.next({ completeRowIndex: index });
}))), finalize(() => {
if (!configuration.removeOverlayAfterRowComplete) {
toRemove = this.removeCreatedElements(toRemove);
}
observer.next({ completeAll: true });
observer.complete();
})).subscribe();
}
/**
* Animates an individual element.
* @private
* @param {(HTMLElement | SVGPathElement)} element - The element to be animated.
* @param {number} duration - The duration of the animation in milliseconds.
* @return {Observable<HTMLElement | SVGPathElement>} An Observable that emits the animated element.
*/
animateElement(element, duration) {
return new AnimateElementHandler(this.animationBuilder).handle(new AnimateElementRequest(element, duration));
}
/**
* Removes the specified elements from the DOM.
* @private
* @param {(HTMLElement | SVGPathElement)[]} toRemove - The elements to be removed.
* @return {(HTMLElement | SVGPathElement)[]} An array of the removed elements.
*/
removeCreatedElements(toRemove) {
toRemove.forEach(x => x.remove());
return [];
}
}
FFlowAnimatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, deps: [{ token: i1.AnimationBuilder }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
FFlowAnimatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.AnimationBuilder }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1mbG93LWFuaW1hdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3ctYW5pbWF0b3Ivc3JjL2xpYi9mLWZsb3ctYW5pbWF0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQzlHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtEQUErRCxDQUFDOzs7QUFLOUc7OztHQUdHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQjs7OztPQUlHO0lBQ0gsWUFDWSxnQkFBa0MsRUFDaEIsUUFBa0I7UUFEcEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBRWhELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxNQUFXLEVBQUUsYUFBdUM7UUFDakUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUNyRSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQ2pFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0QsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssbUJBQW1CLENBQUMsSUFBNEIsRUFBRSxhQUF1QyxFQUFFLFFBQXVDO1FBQ3hJLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1RCxJQUFJLFFBQVEsR0FBcUMsRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ1gsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQzdCLFFBQVEsQ0FDSixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLENBQUMsSUFBSSxDQUMxRSxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUNMLENBQUMsQ0FDTCxDQUFDLElBQUksQ0FDRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxhQUFhLENBQUMsNkJBQTZCLEVBQUU7Z0JBQy9DLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDTCxDQUNKLEVBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEVBQUU7Z0JBQ2hELFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGNBQWMsQ0FBQyxPQUF1QyxFQUFFLFFBQWdCO1FBQzlFLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQzFELElBQUkscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCLENBQUMsUUFBMEM7UUFDdEUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7aUhBMUZVLG9CQUFvQixrREFTbkIsUUFBUTtxSEFUVCxvQkFBb0IsY0FGbkIsTUFBTTsyRkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CO3lGQVV5QyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IGNvbmNhdE1hcCwgZmluYWxpemUsIGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpYmVyLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFuaW1hdGVFbGVtZW50SGFuZGxlciB9IGZyb20gJy4vYW5pbWF0ZS1lbGVtZW50L2FuaW1hdGUtZWxlbWVudC5oYW5kbGVyJztcbmltcG9ydCB7IEFuaW1hdGVFbGVtZW50UmVxdWVzdCB9IGZyb20gJy4vYW5pbWF0ZS1lbGVtZW50L2FuaW1hdGUtZWxlbWVudC1yZXF1ZXN0JztcbmltcG9ydCB7IEdldEFsbEFuaW1hdGVkRWxlbWVudHNSZXF1ZXN0IH0gZnJvbSAnLi9nZXQtYWxsLWFuaW1hdGVkLWVsZW1lbnRzL2dldC1hbGwtYW5pbWF0ZWQtZWxlbWVudHMtcmVxdWVzdCc7XG5pbXBvcnQgeyBHZXRBbGxBbmltYXRlZEVsZW1lbnRzSGFuZGxlciB9IGZyb20gJy4vZ2V0LWFsbC1hbmltYXRlZC1lbGVtZW50cy9nZXQtYWxsLWFuaW1hdGVkLWVsZW1lbnRzLmhhbmRsZXInO1xuaW1wb3J0IHsgSUZBbmltYXRpb25SZXN1bHQgfSBmcm9tICcuL2ktZi1hbmltYXRpb24tcmVzdWx0JztcbmltcG9ydCB7IElGQW5pbWF0aW9uQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vaS1mLWFuaW1hdGlvbi1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElGRWxlbWVudFRvQW5pbWF0ZSB9IGZyb20gJy4vaS1mLWVsZW1lbnQtdG8tYW5pbWF0ZSc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgYW5pbWF0aW5nIGVsZW1lbnRzIGluIHRoZSBAZm9ibGV4L2Zsb3ctYW5pbWF0b3IgbGlicmFyeS5cbiAqIFRoaXMgc2VydmljZSBoYW5kbGVzIHRoZSBvcmNoZXN0cmF0aW9uIG9mIGFuaW1hdGlvbnMgZm9yIGVsZW1lbnRzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGRmxvd0FuaW1hdG9yU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRkZsb3dBbmltYXRvclNlcnZpY2UuXG4gICAqIEBwYXJhbSB7QW5pbWF0aW9uQnVpbGRlcn0gYW5pbWF0aW9uQnVpbGRlciAtIFRoZSBBbmltYXRpb25CdWlsZGVyIHNlcnZpY2UgZm9yIGNyZWF0aW5nIGFuaW1hdGlvbnMuXG4gICAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvY3VtZW50IC0gVGhlIERPTSBEb2N1bWVudCBvYmplY3QgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRE9NLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGFuaW1hdGlvbkJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGFuaW1hdGlvbiBwcm9jZXNzIGZvciB0aGUgc3BlY2lmaWVkIGZsb3cuXG4gICAqIEBwYXJhbSB7YW55fSBmbG93SWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgZmxvdyB0byBiZSBhbmltYXRlZC5cbiAgICogQHBhcmFtIHtJRkFuaW1hdGlvbkNvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb24gLSBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxJRkFuaW1hdGlvblJlc3VsdD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSBhbmltYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKGZsb3dJZDogYW55LCBjb25maWd1cmF0aW9uOiBJRkFuaW1hdGlvbkNvbmZpZ3VyYXRpb24pOiBPYnNlcnZhYmxlPElGQW5pbWF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvQW5pbWF0ZSA9IG5ldyBHZXRBbGxBbmltYXRlZEVsZW1lbnRzSGFuZGxlcih0aGlzLmRvY3VtZW50KS5oYW5kbGUoXG4gICAgICAgICAgICBuZXcgR2V0QWxsQW5pbWF0ZWRFbGVtZW50c1JlcXVlc3QoZmxvd0lkLCBjb25maWd1cmF0aW9uLml0ZW1zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFuaW1hdGVTZXF1ZW50aWFsbHkodG9BbmltYXRlLCBjb25maWd1cmF0aW9uLCBvYnNlcnZlcik7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlcyBlbGVtZW50cyBzZXF1ZW50aWFsbHkgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0lGRWxlbWVudFRvQW5pbWF0ZVtdW119IHJvd3MgLSBBIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBlbGVtZW50cyB0byBhbmltYXRlIGluIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge0lGQW5pbWF0aW9uQ29uZmlndXJhdGlvbn0gY29uZmlndXJhdGlvbiAtIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgYW5pbWF0aW9uLlxuICAgKiBAcGFyYW0ge1N1YnNjcmliZXI8SUZBbmltYXRpb25SZXN1bHQ+fSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byBlbWl0IHRoZSByZXN1bHRzIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhbmltYXRlU2VxdWVudGlhbGx5KHJvd3M6IElGRWxlbWVudFRvQW5pbWF0ZVtdW10sIGNvbmZpZ3VyYXRpb246IElGQW5pbWF0aW9uQ29uZmlndXJhdGlvbiwgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8SUZBbmltYXRpb25SZXN1bHQ+KTogdm9pZCB7XG4gICAgY29uc3Qgc2luZ2xlRHVyYXRpb24gPSBjb25maWd1cmF0aW9uLmR1cmF0aW9uIC8gcm93cy5sZW5ndGg7XG4gICAgbGV0IHRvUmVtb3ZlOiAoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXSA9IFtdO1xuXG4gICAgZnJvbShyb3dzKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKHJvdywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgICAgICAgIHJvdy5tYXAoeCA9PiB0aGlzLmFuaW1hdGVFbGVtZW50KHguZWxlbWVudCwgeC5kdXJhdGlvbiB8fCBzaW5nbGVEdXJhdGlvbikucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFwKChvdmVybGF5RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gob3ZlcmxheUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24ucmVtb3ZlT3ZlcmxheUFmdGVyUm93Q29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmUgPSB0aGlzLnJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgY29tcGxldGVSb3dJbmRleDogaW5kZXggfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5yZW1vdmVPdmVybGF5QWZ0ZXJSb3dDb21wbGV0ZSkge1xuICAgICAgICAgICAgdG9SZW1vdmUgPSB0aGlzLnJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBjb21wbGV0ZUFsbDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZXMgYW4gaW5kaXZpZHVhbCBlbGVtZW50LlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50KX0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJlIGFuaW1hdGVkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgYW5pbWF0ZWQgZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgYW5pbWF0ZUVsZW1lbnQoZWxlbWVudDogKEhUTUxFbGVtZW50IHwgU1ZHUGF0aEVsZW1lbnQpLCBkdXJhdGlvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTxIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRlRWxlbWVudEhhbmRsZXIodGhpcy5hbmltYXRpb25CdWlsZGVyKS5oYW5kbGUoXG4gICAgICAgIG5ldyBBbmltYXRlRWxlbWVudFJlcXVlc3QoZWxlbWVudCwgZHVyYXRpb24pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgZnJvbSB0aGUgRE9NLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50KVtdfSB0b1JlbW92ZSAtIFRoZSBlbGVtZW50cyB0byBiZSByZW1vdmVkLlxuICAgKiBAcmV0dXJuIHsoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXX0gQW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZTogKEhUTUxFbGVtZW50IHwgU1ZHUGF0aEVsZW1lbnQpW10pOiAoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXSB7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCh4ID0+IHgucmVtb3ZlKCkpO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIl19