UNPKG

@flosportsinc/ng-video-autoplay

Version:

Simple way to ensure videos autoplay even if they need to be muted first.

345 lines 24.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, Renderer2, ContentChildren, QueryList } from '@angular/core'; import { share, takeUntil, map, flatMap, filter, tap, take } from 'rxjs/operators'; import { fromEvent, Subject } from 'rxjs'; import { maybe, either } from 'typescript-monads'; /** * @record */ function VideoHaltStatus() { } if (false) { /** @type {?} */ VideoHaltStatus.prototype.videoElement; /** @type {?} */ VideoHaltStatus.prototype.halted; } // tslint:disable:no-object-mutation /** @type {?} */ const filterHalted = (/** * @param {?} source * @return {?} */ (source) => source.pipe(filter((/** * @param {?} res * @return {?} */ res => res.halted === true)))); const ɵ0 = filterHalted; /** @type {?} */ const tryPlayVideoAsIs = (/** * @param {?} source * @return {?} */ (source) => source.pipe(flatMap((/** * @param {?} videoElement * @return {?} */ videoElement => videoElement.play() .then((/** * @return {?} */ () => ({ videoElement, halted: false }))) .catch((/** * @return {?} */ () => ({ videoElement, halted: true }))))), filterHalted)); const ɵ1 = tryPlayVideoAsIs; /** @type {?} */ const tryPlayVideoMuted = (/** * @param {?} source * @return {?} */ (source) => source.pipe(map((/** * @param {?} res * @return {?} */ res => { res.videoElement.muted = true; res.videoElement.volume = 0; return res.videoElement; })), tryPlayVideoAsIs)) // 1) attempt to play as-is (including autoplay + unmuted) // 2) attempt to play muted, showing unmite button // 3) show click to play ; const ɵ2 = tryPlayVideoMuted; // 1) attempt to play as-is (including autoplay + unmuted) // 2) attempt to play muted, showing unmite button // 3) show click to play export class FloVideoAutoplayDirective { /** * @param {?} elmRef * @param {?} rd */ constructor(elmRef, rd) { this.elmRef = elmRef; this.rd = rd; this.floVideoAutoplay = true; this.floVideoAutoplayIndex = 0; this.onDestroySource = new Subject(); this.onDestroy = this.onDestroySource.pipe(share()); this.canExecute = (/** * @return {?} */ () => this.floVideoAutoplay === true || this.floVideoAutoplay === ''); this.maybeVideoElement = (/** * @return {?} */ () => maybe(this.elmRef.nativeElement).filter((/** * @param {?} e * @return {?} */ e => e.nodeName === 'VIDEO'))); this.maybeUnmuteActionRef = (/** * @return {?} */ () => maybe(this.floVideoAutoplayClickUnmuteRef).filter((/** * @param {?} a * @return {?} */ a => (/** @type {?} */ (a)) !== ''))); this.maybePlayActionRef = (/** * @return {?} */ () => maybe(this.floVideoAutoplayClickPlayRef).filter((/** * @param {?} a * @return {?} */ a => (/** @type {?} */ (a)) !== ''))); this.hideRef = (/** * @param {?} ref * @return {?} */ (ref) => this.rd.setStyle(ref, 'display', 'none')); this.showRef = (/** * @param {?} ref * @return {?} */ (ref) => this.rd.setStyle(ref, 'display', 'block')); this.volumeChange = (/** * @param {?} videoElement * @return {?} */ (videoElement) => fromEvent(videoElement, 'volumechange', { passive: true }).pipe(map((/** * @param {?} evt * @return {?} */ evt => (/** @type {?} */ (evt.target)))), share(), takeUntil(this.onDestroy))); this.initOnVideo = (/** * @param {?} videoElement * @return {?} */ (videoElement) => fromEvent(videoElement, 'loadstart').pipe(tap((/** * @return {?} */ () => videoElement.setAttribute('autoplay', 'true'))), map((/** * @param {?} evt * @return {?} */ evt => (/** @type {?} */ (evt.target)))), tryPlayVideoAsIs, tryPlayVideoMuted, take(1)).subscribe((/** * @param {?} res * @return {?} */ res => { res.videoElement.preload = 'none'; res.videoElement.muted = false; res.videoElement.volume = 1; this.maybePlayActionRef().tapSome(this.showRef); }))); this.runUnmuteSequence = (/** * @param {?} actionRef * @return {?} */ (actionRef) => (/** * @param {?} runOnce * @return {?} */ (runOnce) => (/** * @param {?} videoElement * @return {?} */ (videoElement) => { videoElement.setAttribute('autoplay', 'true'); fromEvent(actionRef, 'click').pipe(takeUntil(this.onDestroy)).subscribe((/** * @return {?} */ () => { videoElement.muted = false; videoElement.volume = 1; })); this.volumeChange(videoElement).pipe(filter((/** * @param {?} v * @return {?} */ v => !v.muted || v.volume > 0)), takeUntil(this.onDestroy)) .subscribe((/** * @return {?} */ () => this.hideRef(actionRef))); /** @type {?} */ const showRef = this.volumeChange(videoElement).pipe(filter((/** * @param {?} v * @return {?} */ v => v.muted || v.volume <= 0))); (runOnce ? showRef.pipe(take(1)) : showRef).subscribe((/** * @return {?} */ () => this.showRef(actionRef))); }))); } /** * @return {?} */ ngAfterContentInit() { if (!this.canExecute()) { return; } this.maybeVideoElement().tapSome(this.initOnVideo); this.videos.map((/** * @param {?} a * @return {?} */ a => a.nativeElement)).forEach(this.initOnVideo); this.maybeUnmuteActionRef().tapSome((/** * @param {?} ref * @return {?} */ ref => { this.hideRef(ref); either(this.maybeVideoElement().valueOrUndefined(), maybe(this.videos.toArray()[this.floVideoAutoplayIndex]).map((/** * @param {?} a * @return {?} */ a => a.nativeElement)).valueOrUndefined()) .tap({ left: this.runUnmuteSequence(ref)(false), right: this.runUnmuteSequence(ref)(true) }); })); this.maybePlayActionRef().tapSome((/** * @param {?} actionRef * @return {?} */ actionRef => { this.hideRef(actionRef); fromEvent(actionRef, 'click').pipe(takeUntil(this.onDestroy)).subscribe((/** * @return {?} */ () => { this.hideRef(actionRef); this.maybeVideoElement().tapSome((/** * @param {?} v * @return {?} */ v => v.play())); })); })); } /** * @return {?} */ ngOnDestroy() { this.onDestroySource.next(); this.onDestroySource.complete(); } } FloVideoAutoplayDirective.decorators = [ { type: Directive, args: [{ selector: '[floVideoAutoplay]' },] } ]; /** @nocollapse */ FloVideoAutoplayDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 } ]; FloVideoAutoplayDirective.propDecorators = { floVideoAutoplay: [{ type: Input }], floVideoAutoplayClickUnmuteRef: [{ type: Input }], floVideoAutoplayClickPlayRef: [{ type: Input }], floVideoAutoplayIndex: [{ type: Input }], videos: [{ type: ContentChildren, args: ['floVideoAutoplay', { descendants: true },] }] }; if (false) { /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplay; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayClickUnmuteRef; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayClickPlayRef; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayIndex; /** @type {?} */ FloVideoAutoplayDirective.prototype.videos; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.onDestroySource; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.onDestroy; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.canExecute; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybeVideoElement; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybeUnmuteActionRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybePlayActionRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.hideRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.showRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.volumeChange; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.initOnVideo; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.runUnmuteSequence; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.elmRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.rd; } export { ɵ0, ɵ1, ɵ2 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlkZW8tYXV0b3BsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZsb3Nwb3J0c2luYy9uZy12aWRlby1hdXRvcGxheS8iLCJzb3VyY2VzIjpbImxpYi9uZy12aWRlby1hdXRvcGxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQStCLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEksT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7Ozs7QUFFakQsOEJBR0M7OztJQUZDLHVDQUF1Qzs7SUFDdkMsaUNBQXdCOzs7O01BSXBCLFlBQVk7Ozs7QUFDaEIsQ0FBQyxNQUFtQyxFQUFFLEVBQUUsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNOzs7O0FBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksRUFBQyxDQUFDLENBQUE7OztNQUU3QyxnQkFBZ0I7Ozs7QUFDcEIsQ0FBQyxNQUFvQyxFQUFFLEVBQUUsQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7O0FBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0tBQ3BELElBQUk7OztBQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUM7S0FDN0MsS0FBSzs7O0FBQUMsR0FBRyxFQUFF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QVMsU0FBUzs7OytCQXFDN0MsS0FBSzs2Q0FDTCxLQUFLOzJDQUNMLEtBQUs7b0NBQ0wsS0FBSztxQkFFTCxlQUFlLFNBQUMsa0JBQWtCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFOzs7O0lBTDFELHFEQUFnRDs7SUFDaEQsbUVBQXFFOztJQUNyRSxpRUFBbUU7O0lBQ25FLDBEQUFrRDs7SUFFbEQsMkNBQTJIOzs7OztJQUUzSCxvREFBZ0Q7Ozs7O0lBQ2hELDhDQUErRDs7Ozs7SUFDL0QsK0NBQWtHOzs7OztJQUNsRyxzREFBK0c7Ozs7O0lBQy9HLHlEQUFxSDs7Ozs7SUFDckgsdURBQWlIOzs7OztJQUVqSCw0Q0FBeUY7Ozs7O0lBQ3pGLDRDQUEwRjs7Ozs7SUFFMUYsaURBSThCOzs7OztJQUU5QixnREFZSTs7Ozs7SUFJSixzREFXQzs7Ozs7SUFiVywyQ0FBNEM7Ozs7O0lBQUUsdUNBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgUmVuZGVyZXIyLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IHNoYXJlLCB0YWtlVW50aWwsIG1hcCwgZmxhdE1hcCwgZmlsdGVyLCB0YXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXliZSwgZWl0aGVyIH0gZnJvbSAndHlwZXNjcmlwdC1tb25hZHMnXG5cbmludGVyZmFjZSBWaWRlb0hhbHRTdGF0dXMge1xuICByZWFkb25seSB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnRcbiAgcmVhZG9ubHkgaGFsdGVkOiBib29sZWFuXG59XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLW9iamVjdC1tdXRhdGlvblxuY29uc3QgZmlsdGVySGFsdGVkID1cbiAgKHNvdXJjZTogT2JzZXJ2YWJsZTxWaWRlb0hhbHRTdGF0dXM+KSA9PlxuICAgIHNvdXJjZS5waXBlKGZpbHRlcihyZXMgPT4gcmVzLmhhbHRlZCA9PT0gdHJ1ZSkpXG5cbmNvbnN0IHRyeVBsYXlWaWRlb0FzSXMgPVxuICAoc291cmNlOiBPYnNlcnZhYmxlPEhUTUxWaWRlb0VsZW1lbnQ+KSA9PlxuICAgIHNvdXJjZS5waXBlKGZsYXRNYXAodmlkZW9FbGVtZW50ID0+IHZpZGVvRWxlbWVudC5wbGF5KClcbiAgICAgIC50aGVuKCgpID0+ICh7IHZpZGVvRWxlbWVudCwgaGFsdGVkOiBmYWxzZSB9KSlcbiAgICAgIC5jYXRjaCgoKSA9PiAoeyB2aWRlb0VsZW1lbnQsIGhhbHRlZDogdHJ1ZSB9KSlcbiAgICApLCBmaWx0ZXJIYWx0ZWQpXG5cbmNvbnN0IHRyeVBsYXlWaWRlb011dGVkID1cbiAgKHNvdXJjZTogT2JzZXJ2YWJsZTxWaWRlb0hhbHRTdGF0dXM+KSA9PlxuICAgIHNvdXJjZS5waXBlKG1hcChyZXMgPT4ge1xuICAgICAgcmVzLnZpZGVvRWxlbWVudC5tdXRlZCA9IHRydWVcbiAgICAgIHJlcy52aWRlb0VsZW1lbnQudm9sdW1lID0gMFxuICAgICAgcmV0dXJuIHJlcy52aWRlb0VsZW1lbnRcbiAgICB9KSwgdHJ5UGxheVZpZGVvQXNJcylcblxuLy8gMSkgYXR0ZW1wdCB0byBwbGF5IGFzLWlzIChpbmNsdWRpbmcgYXV0b3BsYXkgKyB1bm11dGVkKVxuLy8gMikgYXR0ZW1wdCB0byBwbGF5IG11dGVkLCBzaG93aW5nIHVubWl0ZSBidXR0b25cbi8vIDMpIHNob3cgY2xpY2sgdG8gcGxheVxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Zsb1ZpZGVvQXV0b3BsYXldJ1xufSlcbmV4cG9ydCBjbGFzcyBGbG9WaWRlb0F1dG9wbGF5RGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5IGZsb1ZpZGVvQXV0b3BsYXkgPSB0cnVlXG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSBmbG9WaWRlb0F1dG9wbGF5Q2xpY2tVbm11dGVSZWY/OiBIVE1MRWxlbWVudFxuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHkgZmxvVmlkZW9BdXRvcGxheUNsaWNrUGxheVJlZj86IEhUTUxFbGVtZW50XG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSBmbG9WaWRlb0F1dG9wbGF5SW5kZXggPSAwXG5cbiAgQENvbnRlbnRDaGlsZHJlbignZmxvVmlkZW9BdXRvcGxheScsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgcHVibGljIHJlYWRvbmx5IHZpZGVvczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3lTb3VyY2UgPSBuZXcgU3ViamVjdCgpXG4gIHByaXZhdGUgcmVhZG9ubHkgb25EZXN0cm95ID0gdGhpcy5vbkRlc3Ryb3lTb3VyY2UucGlwZShzaGFyZSgpKVxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkV4ZWN1dGUgPSAoKSA9PiB0aGlzLmZsb1ZpZGVvQXV0b3BsYXkgPT09IHRydWUgfHwgdGhpcy5mbG9WaWRlb0F1dG9wbGF5ID09PSAnJ1xuICBwcml2YXRlIHJlYWRvbmx5IG1heWJlVmlkZW9FbGVtZW50ID0gKCkgPT4gbWF5YmUodGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCkuZmlsdGVyKGUgPT4gZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJylcbiAgcHJpdmF0ZSByZWFkb25seSBtYXliZVVubXV0ZUFjdGlvblJlZiA9ICgpID0+IG1heWJlKHRoaXMuZmxvVmlkZW9BdXRvcGxheUNsaWNrVW5tdXRlUmVmKS5maWx0ZXIoYSA9PiBhIGFzIGFueSAhPT0gJycpXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF5YmVQbGF5QWN0aW9uUmVmID0gKCkgPT4gbWF5YmUodGhpcy5mbG9WaWRlb0F1dG9wbGF5Q2xpY2tQbGF5UmVmKS5maWx0ZXIoYSA9PiBhIGFzIGFueSAhPT0gJycpXG5cbiAgcHJpdmF0ZSByZWFkb25seSBoaWRlUmVmID0gKHJlZjogSFRNTEVsZW1lbnQpID0+IHRoaXMucmQuc2V0U3R5bGUocmVmLCAnZGlzcGxheScsICdub25lJylcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93UmVmID0gKHJlZjogSFRNTEVsZW1lbnQpID0+IHRoaXMucmQuc2V0U3R5bGUocmVmLCAnZGlzcGxheScsICdibG9jaycpXG5cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVDaGFuZ2UgPSAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PlxuICAgIGZyb21FdmVudCh2aWRlb0VsZW1lbnQsICd2b2x1bWVjaGFuZ2UnLCB7IHBhc3NpdmU6IHRydWUgfSkucGlwZShcbiAgICAgIG1hcChldnQgPT4gZXZ0LnRhcmdldCBhcyBIVE1MVmlkZW9FbGVtZW50KSxcbiAgICAgIHNoYXJlKCksXG4gICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdE9uVmlkZW8gPSAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PlxuICAgIGZyb21FdmVudCh2aWRlb0VsZW1lbnQsICdsb2Fkc3RhcnQnKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHZpZGVvRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJ3RydWUnKSksXG4gICAgICBtYXAoZXZ0ID0+IGV2dC50YXJnZXQgYXMgSFRNTFZpZGVvRWxlbWVudCksXG4gICAgICB0cnlQbGF5VmlkZW9Bc0lzLFxuICAgICAgdHJ5UGxheVZpZGVvTXV0ZWQsXG4gICAgICB0YWtlKDEpXG4gICAgKS5zdWJzY3JpYmUocmVzID0+IHsgLy8gY291bGQgbm90IGF1dG9wbGF5LCBtdXN0IGNsaWNrIHRvIHBsYXlcbiAgICAgIHJlcy52aWRlb0VsZW1lbnQucHJlbG9hZCA9ICdub25lJ1xuICAgICAgcmVzLnZpZGVvRWxlbWVudC5tdXRlZCA9IGZhbHNlXG4gICAgICByZXMudmlkZW9FbGVtZW50LnZvbHVtZSA9IDFcbiAgICAgIHRoaXMubWF5YmVQbGF5QWN0aW9uUmVmKCkudGFwU29tZSh0aGlzLnNob3dSZWYpXG4gICAgfSlcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiwgcHJpdmF0ZSByZDogUmVuZGVyZXIyKSB7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1blVubXV0ZVNlcXVlbmNlID0gKGFjdGlvblJlZjogSFRNTEVsZW1lbnQpID0+IChydW5PbmNlOiBib29sZWFuKSA9PiAodmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50KSA9PiB7XG4gICAgdmlkZW9FbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCAndHJ1ZScpXG4gICAgZnJvbUV2ZW50KGFjdGlvblJlZiwgJ2NsaWNrJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdmlkZW9FbGVtZW50Lm11dGVkID0gZmFsc2VcbiAgICAgIHZpZGVvRWxlbWVudC52b2x1bWUgPSAxXG4gICAgfSlcblxuICAgIHRoaXMudm9sdW1lQ2hhbmdlKHZpZGVvRWxlbWVudCkucGlwZShmaWx0ZXIodiA9PiAhdi5tdXRlZCB8fCB2LnZvbHVtZSA+IDApLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGVSZWYoYWN0aW9uUmVmKSlcbiAgICBjb25zdCBzaG93UmVmID0gdGhpcy52b2x1bWVDaGFuZ2UodmlkZW9FbGVtZW50KS5waXBlKGZpbHRlcih2ID0+IHYubXV0ZWQgfHwgdi52b2x1bWUgPD0gMCkpO1xuICAgIChydW5PbmNlID8gc2hvd1JlZi5waXBlKHRha2UoMSkpIDogc2hvd1JlZikuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd1JlZihhY3Rpb25SZWYpKVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICghdGhpcy5jYW5FeGVjdXRlKCkpIHsgcmV0dXJuIH1cblxuICAgIHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS50YXBTb21lKHRoaXMuaW5pdE9uVmlkZW8pXG4gICAgdGhpcy52aWRlb3MubWFwKGEgPT4gYS5uYXRpdmVFbGVtZW50KS5mb3JFYWNoKHRoaXMuaW5pdE9uVmlkZW8pXG5cbiAgICB0aGlzLm1heWJlVW5tdXRlQWN0aW9uUmVmKCkudGFwU29tZShyZWYgPT4ge1xuICAgICAgdGhpcy5oaWRlUmVmKHJlZilcblxuICAgICAgZWl0aGVyKHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS52YWx1ZU9yVW5kZWZpbmVkKCksXG4gICAgICAgIG1heWJlKHRoaXMudmlkZW9zLnRvQXJyYXkoKVt0aGlzLmZsb1ZpZGVvQXV0b3BsYXlJbmRleF0pLm1hcChhID0+IGEubmF0aXZlRWxlbWVudCkudmFsdWVPclVuZGVmaW5lZCgpKVxuICAgICAgICAudGFwKHtcbiAgICAgICAgICBsZWZ0OiB0aGlzLnJ1blVubXV0ZVNlcXVlbmNlKHJlZikoZmFsc2UpLFxuICAgICAgICAgIHJpZ2h0OiB0aGlzLnJ1blVubXV0ZVNlcXVlbmNlKHJlZikodHJ1ZSlcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy5tYXliZVBsYXlBY3Rpb25SZWYoKS50YXBTb21lKGFjdGlvblJlZiA9PiB7XG4gICAgICB0aGlzLmhpZGVSZWYoYWN0aW9uUmVmKVxuXG4gICAgICBmcm9tRXZlbnQoYWN0aW9uUmVmLCAnY2xpY2snKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVJlZihhY3Rpb25SZWYpXG4gICAgICAgIHRoaXMubWF5YmVWaWRlb0VsZW1lbnQoKS50YXBTb21lKHYgPT4gdi5wbGF5KCkpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveVNvdXJjZS5uZXh0KClcbiAgICB0aGlzLm9uRGVzdHJveVNvdXJjZS5jb21wbGV0ZSgpXG4gIH1cbn1cbiJdfQ==