ngx-plyr
Version:
Angular 6+ bindings for [plyr video and audio player](https://github.com/sampotts/plyr). Supports everything that original library supports.
342 lines • 32.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestroy, Output, Renderer2, SimpleChange, ViewChild } from '@angular/core';
import * as Plyr from 'plyr';
import { BehaviorSubject, Observable } from 'rxjs';
import { filter, first, switchMap } from 'rxjs/operators';
import { DefaultPlyrDriver } from '../plyr-driver/default-plyr-driver';
var PlyrComponent = /** @class */ (function () {
function PlyrComponent(elementRef, ngZone, renderer) {
this.elementRef = elementRef;
this.ngZone = ngZone;
this.renderer = renderer;
this.playerChange = new BehaviorSubject(null);
this.events = new Map();
this.plyrType = 'video';
// ngx-plyr events
this.plyrInit = this.playerChange.pipe(filter(function (player) { return !!player; }));
// standard media events
this.plyrProgress = this.createLazyEvent('progress');
this.plyrPlaying = this.createLazyEvent('playing');
this.plyrPlay = this.createLazyEvent('play');
this.plyrPause = this.createLazyEvent('pause');
this.plyrTimeUpdate = this.createLazyEvent('timeupdate');
this.plyrVolumeChange = this.createLazyEvent('volumechange');
this.plyrSeeking = this.createLazyEvent('seeking');
this.plyrSeeked = this.createLazyEvent('seeked');
this.plyrRateChange = this.createLazyEvent('ratechange');
this.plyrEnded = this.createLazyEvent('ended');
this.plyrEnterFullScreen = this.createLazyEvent('enterfullscreen');
this.plyrExitFullScreen = this.createLazyEvent('exitfullscreen');
this.plyrCaptionsEnabled = this.createLazyEvent('captionsenabled');
this.plyrCaptionsDisabled = this.createLazyEvent('captionsdisabled');
this.plyrLanguageChange = this.createLazyEvent('languagechange');
this.plyrControlsHidden = this.createLazyEvent('controlshidden');
this.plyrControlsShown = this.createLazyEvent('controlsshown');
this.plyrReady = this.createLazyEvent('ready');
// HTML5 events
this.plyrLoadStart = this.createLazyEvent('loadstart');
this.plyrLoadedData = this.createLazyEvent('loadeddata');
this.plyrLoadedMetadata = this.createLazyEvent('loadedmetadata');
this.plyrQualityChange = this.createLazyEvent('qualitychange');
this.plyrCanPlay = this.createLazyEvent('canplay');
this.plyrCanPlayThrough = this.createLazyEvent('canplaythrough');
this.plyrStalled = this.createLazyEvent('stalled');
this.plyrWaiting = this.createLazyEvent('waiting');
this.plyrEmptied = this.createLazyEvent('emptied');
this.plyrCueChange = this.createLazyEvent('cuechange');
this.plyrError = this.createLazyEvent('error');
// YouTube events
this.plyrStateChange = this.createLazyEvent('statechange');
this.subscriptions = [];
}
Object.defineProperty(PlyrComponent.prototype, "player", {
get: function () {
return this.playerChange.getValue();
},
enumerable: true,
configurable: true
});
PlyrComponent.prototype.ngOnChanges = function (changes) {
var _this = this;
this.subscriptions.push(this.plyrInit.pipe(first()).subscribe(function (player) {
var reinitTriggers = [changes.plyrOptions, changes.plyrPlaysInline, changes.plyrCrossOrigin].filter(function (t) { return !!t; });
if (reinitTriggers.length) {
if (reinitTriggers.some(function (t) { return !t.firstChange; })) {
_this.initPlyr(true);
}
}
else {
_this.updatePlyrSource(player);
}
}));
};
PlyrComponent.prototype.ngOnDestroy = function () {
this.destroyPlayer();
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
};
PlyrComponent.prototype.ngAfterViewInit = function () {
this.initPlyr();
};
PlyrComponent.prototype.initPlyr = function (force) {
var _this = this;
if (force === void 0) { force = false; }
if (force || !this.player) {
this.ngZone.runOutsideAngular(function () {
_this.destroyPlayer();
_this.driver = _this.plyrDriver || new DefaultPlyrDriver();
_this.ensureVideoElement();
var newPlayer = _this.driver.create({
videoElement: _this.videoElement,
options: _this.plyrOptions,
});
_this.updatePlyrSource(newPlayer);
_this.playerChange.next(newPlayer);
});
}
};
PlyrComponent.prototype.updatePlyrSource = function (plyr) {
this.driver.updateSource({
videoElement: this.videoElement,
plyr: plyr,
source: {
type: this.plyrType,
title: this.plyrTitle,
sources: this.plyrSources,
poster: this.plyrPoster,
tracks: this.plyrTracks,
},
});
};
// see https://stackoverflow.com/a/53704102/1990451
PlyrComponent.prototype.createLazyEvent = function (name) {
var _this = this;
return this.plyrInit.pipe(switchMap(function () { return new Observable(function (observer) { return _this.on(name, function (data) { return _this.ngZone.run(function () { return observer.next(data); }); }); }); }));
};
PlyrComponent.prototype.destroyPlayer = function () {
var _this = this;
if (this.player) {
Array.from(this.events.keys()).forEach(function (name) { return _this.off(name); });
this.driver.destroy({
plyr: this.player,
});
this.videoElement = null;
}
};
Object.defineProperty(PlyrComponent.prototype, "hostElement", {
get: function () {
return this.elementRef.nativeElement;
},
enumerable: true,
configurable: true
});
// this method is required because the plyr inserts clone of the original element on destroy
// so we catch the clone element right here and reuse it
PlyrComponent.prototype.ensureVideoElement = function () {
var videoElement = this.hostElement.querySelector('video');
if (videoElement) {
this.videoElement = videoElement;
}
else {
this.videoElement = this.renderer.createElement('video');
this.videoElement.controls = true;
if (this.plyrCrossOrigin) {
this.videoElement.setAttribute('crossorigin', '');
}
if (this.plyrPlaysInline) {
this.videoElement.setAttribute('playsinline', '');
}
this.renderer.appendChild(this.hostElement, this.videoElement);
}
};
PlyrComponent.prototype.on = function (name, handler) {
this.events.set(name, handler);
this.player.on(name, handler);
};
PlyrComponent.prototype.off = function (name) {
this.player.off(name, this.events.get(name));
this.events.delete(name);
};
PlyrComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NgZone },
{ type: Renderer2 }
]; };
__decorate([
Input(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrDriver", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], PlyrComponent.prototype, "plyrType", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], PlyrComponent.prototype, "plyrTitle", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], PlyrComponent.prototype, "plyrPoster", void 0);
__decorate([
Input(),
__metadata("design:type", Array)
], PlyrComponent.prototype, "plyrSources", void 0);
__decorate([
Input(),
__metadata("design:type", Array)
], PlyrComponent.prototype, "plyrTracks", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrOptions", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], PlyrComponent.prototype, "plyrCrossOrigin", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], PlyrComponent.prototype, "plyrPlaysInline", void 0);
__decorate([
ViewChild('v'),
__metadata("design:type", ElementRef)
], PlyrComponent.prototype, "vr", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrInit", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrProgress", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrPlaying", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrPlay", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrPause", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrTimeUpdate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrVolumeChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrSeeking", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrSeeked", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrRateChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrEnded", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrEnterFullScreen", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrExitFullScreen", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrCaptionsEnabled", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrCaptionsDisabled", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrLanguageChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrControlsHidden", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrControlsShown", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrReady", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrLoadStart", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrLoadedData", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrLoadedMetadata", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrQualityChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrCanPlay", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrCanPlayThrough", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrStalled", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrWaiting", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrEmptied", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrCueChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrError", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], PlyrComponent.prototype, "plyrStateChange", void 0);
PlyrComponent = __decorate([
Component({
selector: 'plyr, [plyr]',
template: "",
exportAs: 'plyr',
styles: [""]
}),
__metadata("design:paramtypes", [ElementRef,
NgZone,
Renderer2])
], PlyrComponent);
return PlyrComponent;
}());
export { PlyrComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx5ci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx5ci8iLCJzb3VyY2VzIjpbImxpYi9wbHlyL3BseXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEssT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBU3ZFO0lBMkVFLHVCQUNVLFVBQXNDLEVBQ3RDLE1BQWMsRUFDZCxRQUFtQjtRQUZuQixlQUFVLEdBQVYsVUFBVSxDQUE0QjtRQUN0QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTVFckIsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTyxJQUFJLENBQUMsQ0FBQztRQU0vQyxXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUlsQixhQUFRLEdBQW1CLE9BQU8sQ0FBQztRQWtCNUMsa0JBQWtCO1FBQ1IsYUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLEVBQVIsQ0FBUSxDQUFDLENBQXVCLENBQUM7UUFFOUYsd0JBQXdCO1FBQ2QsaUJBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUs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QUFhO1FBTnpCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFlBQW9DO1lBRXBDLFFBQVEsRUFBRSxNQUFNOztTQUNqQixDQUFDO3lDQTZFc0IsVUFBVTtZQUNkLE1BQU07WUFDSixTQUFTO09BOUVsQixhQUFhLENBb016QjtJQUFELG9CQUFDO0NBQUEsQUFwTUQsSUFvTUM7U0FwTVksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBQbHlyIGZyb20gJ3BseXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZmlyc3QsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERlZmF1bHRQbHlyRHJpdmVyIH0gZnJvbSAnLi4vcGx5ci1kcml2ZXIvZGVmYXVsdC1wbHlyLWRyaXZlcic7XG5pbXBvcnQgeyBQbHlyRHJpdmVyIH0gZnJvbSAnLi4vcGx5ci1kcml2ZXIvcGx5ci1kcml2ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwbHlyLCBbcGx5cl0nLCAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gIHRlbXBsYXRlVXJsOiAnLi9wbHlyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGx5ci5jb21wb25lbnQuY3NzJ10sXG4gIGV4cG9ydEFzOiAncGx5cidcbn0pXG5leHBvcnQgY2xhc3MgUGx5ckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHBsYXllckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGx5cj4obnVsbCk7XG5cbiAgZ2V0IHBsYXllcigpOiBQbHlyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJDaGFuZ2UuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXZlbnRzID0gbmV3IE1hcCgpO1xuXG4gIEBJbnB1dCgpIHBseXJEcml2ZXI6IFBseXJEcml2ZXI7XG5cbiAgQElucHV0KCkgcGx5clR5cGU6IFBseXIuTWVkaWFUeXBlID0gJ3ZpZGVvJztcblxuICBASW5wdXQoKSBwbHlyVGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKSBwbHlyUG9zdGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGx5clNvdXJjZXM6IFBseXIuU291cmNlW107XG5cbiAgQElucHV0KCkgcGx5clRyYWNrczogUGx5ci5UcmFja1tdO1xuXG4gIEBJbnB1dCgpIHBseXJPcHRpb25zOiBQbHlyLk9wdGlvbnM7XG5cbiAgQElucHV0KCkgcGx5ckNyb3NzT3JpZ2luOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHBseXJQbGF5c0lubGluZTogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCd2JykgcHJpdmF0ZSB2cjogRWxlbWVudFJlZjtcblxuICAvLyBuZ3gtcGx5ciBldmVudHNcbiAgQE91dHB1dCgpIHBseXJJbml0ID0gdGhpcy5wbGF5ZXJDaGFuZ2UucGlwZShmaWx0ZXIocGxheWVyID0+ICEhcGxheWVyKSkgYXMgRXZlbnRFbWl0dGVyPFBseXI+O1xuXG4gIC8vIHN0YW5kYXJkIG1lZGlhIGV2ZW50c1xuICBAT3V0cHV0KCkgcGx5clByb2dyZXNzID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ3Byb2dyZXNzJyk7XG4gIEBPdXRwdXQoKSBwbHlyUGxheWluZyA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdwbGF5aW5nJyk7XG4gIEBPdXRwdXQoKSBwbHlyUGxheSA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdwbGF5Jyk7XG4gIEBPdXRwdXQoKSBwbHlyUGF1c2UgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgncGF1c2UnKTtcbiAgQE91dHB1dCgpIHBseXJUaW1lVXBkYXRlID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ3RpbWV1cGRhdGUnKTtcbiAgQE91dHB1dCgpIHBseXJWb2x1bWVDaGFuZ2UgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgndm9sdW1lY2hhbmdlJyk7XG4gIEBPdXRwdXQoKSBwbHlyU2Vla2luZyA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdzZWVraW5nJyk7XG4gIEBPdXRwdXQoKSBwbHlyU2Vla2VkID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ3NlZWtlZCcpO1xuICBAT3V0cHV0KCkgcGx5clJhdGVDaGFuZ2UgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgncmF0ZWNoYW5nZScpO1xuICBAT3V0cHV0KCkgcGx5ckVuZGVkID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2VuZGVkJyk7XG4gIEBPdXRwdXQoKSBwbHlyRW50ZXJGdWxsU2NyZWVuID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2VudGVyZnVsbHNjcmVlbicpO1xuICBAT3V0cHV0KCkgcGx5ckV4aXRGdWxsU2NyZWVuID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2V4aXRmdWxsc2NyZWVuJyk7XG4gIEBPdXRwdXQoKSBwbHlyQ2FwdGlvbnNFbmFibGVkID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2NhcHRpb25zZW5hYmxlZCcpO1xuICBAT3V0cHV0KCkgcGx5ckNhcHRpb25zRGlzYWJsZWQgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgnY2FwdGlvbnNkaXNhYmxlZCcpO1xuICBAT3V0cHV0KCkgcGx5ckxhbmd1YWdlQ2hhbmdlID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2xhbmd1YWdlY2hhbmdlJyk7XG4gIEBPdXRwdXQoKSBwbHlyQ29udHJvbHNIaWRkZW4gPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgnY29udHJvbHNoaWRkZW4nKTtcbiAgQE91dHB1dCgpIHBseXJDb250cm9sc1Nob3duID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2NvbnRyb2xzc2hvd24nKTtcbiAgQE91dHB1dCgpIHBseXJSZWFkeSA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdyZWFkeScpO1xuXG4gIC8vIEhUTUw1IGV2ZW50c1xuICBAT3V0cHV0KCkgcGx5ckxvYWRTdGFydCA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdsb2Fkc3RhcnQnKTtcbiAgQE91dHB1dCgpIHBseXJMb2FkZWREYXRhID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2xvYWRlZGRhdGEnKTtcbiAgQE91dHB1dCgpIHBseXJMb2FkZWRNZXRhZGF0YSA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdsb2FkZWRtZXRhZGF0YScpO1xuICBAT3V0cHV0KCkgcGx5clF1YWxpdHlDaGFuZ2UgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgncXVhbGl0eWNoYW5nZScpO1xuICBAT3V0cHV0KCkgcGx5ckNhblBsYXkgPSB0aGlzLmNyZWF0ZUxhenlFdmVudCgnY2FucGxheScpO1xuICBAT3V0cHV0KCkgcGx5ckNhblBsYXlUaHJvdWdoID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2NhbnBsYXl0aHJvdWdoJyk7XG4gIEBPdXRwdXQoKSBwbHlyU3RhbGxlZCA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdzdGFsbGVkJyk7XG4gIEBPdXRwdXQoKSBwbHlyV2FpdGluZyA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCd3YWl0aW5nJyk7XG4gIEBPdXRwdXQoKSBwbHlyRW1wdGllZCA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdlbXB0aWVkJyk7XG4gIEBPdXRwdXQoKSBwbHlyQ3VlQ2hhbmdlID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2N1ZWNoYW5nZScpO1xuICBAT3V0cHV0KCkgcGx5ckVycm9yID0gdGhpcy5jcmVhdGVMYXp5RXZlbnQoJ2Vycm9yJyk7XG5cbiAgLy8gWW91VHViZSBldmVudHNcbiAgQE91dHB1dCgpIHBseXJTdGF0ZUNoYW5nZSA9IHRoaXMuY3JlYXRlTGF6eUV2ZW50KCdzdGF0ZWNoYW5nZScpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIGRyaXZlcjogUGx5ckRyaXZlcjtcblxuICBwcml2YXRlIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+LFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3AgaW4ga2V5b2YgUGx5ckNvbXBvbmVudF0/OiBTaW1wbGVDaGFuZ2U7IH0pIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnBseXJJbml0LnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChwbGF5ZXI6IFBseXIpID0+IHtcbiAgICAgIGNvbnN0IHJlaW5pdFRyaWdnZXJzID0gW2NoYW5nZXMucGx5ck9wdGlvbnMsIGNoYW5nZXMucGx5clBsYXlzSW5saW5lLCBjaGFuZ2VzLnBseXJDcm9zc09yaWdpbl0uZmlsdGVyKHQgPT4gISF0KTtcblxuICAgICAgaWYgKHJlaW5pdFRyaWdnZXJzLmxlbmd0aCkge1xuICAgICAgICBpZiAocmVpbml0VHJpZ2dlcnMuc29tZSh0ID0+ICF0LmZpcnN0Q2hhbmdlKSkge1xuICAgICAgICAgIHRoaXMuaW5pdFBseXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGx5clNvdXJjZShwbGF5ZXIpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveVBsYXllcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmluaXRQbHlyKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRQbHlyKGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoZm9yY2UgfHwgIXRoaXMucGxheWVyKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveVBsYXllcigpO1xuXG4gICAgICAgIHRoaXMuZHJpdmVyID0gdGhpcy5wbHlyRHJpdmVyIHx8IG5ldyBEZWZhdWx0UGx5ckRyaXZlcigpO1xuXG4gICAgICAgIHRoaXMuZW5zdXJlVmlkZW9FbGVtZW50KCk7XG5cbiAgICAgICAgY29uc3QgbmV3UGxheWVyID0gdGhpcy5kcml2ZXIuY3JlYXRlKHtcbiAgICAgICAgICB2aWRlb0VsZW1lbnQ6IHRoaXMudmlkZW9FbGVtZW50LFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMucGx5ck9wdGlvbnMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUGx5clNvdXJjZShuZXdQbGF5ZXIpO1xuXG4gICAgICAgIHRoaXMucGxheWVyQ2hhbmdlLm5leHQobmV3UGxheWVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGx5clNvdXJjZShwbHlyOiBQbHlyKSB7XG4gICAgdGhpcy5kcml2ZXIudXBkYXRlU291cmNlKHtcbiAgICAgIHZpZGVvRWxlbWVudDogdGhpcy52aWRlb0VsZW1lbnQsXG4gICAgICBwbHlyLFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHR5cGU6IHRoaXMucGx5clR5cGUsXG4gICAgICAgIHRpdGxlOiB0aGlzLnBseXJUaXRsZSxcbiAgICAgICAgc291cmNlczogdGhpcy5wbHlyU291cmNlcyxcbiAgICAgICAgcG9zdGVyOiB0aGlzLnBseXJQb3N0ZXIsXG4gICAgICAgIHRyYWNrczogdGhpcy5wbHlyVHJhY2tzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTM3MDQxMDIvMTk5MDQ1MVxuICBwcml2YXRlIGNyZWF0ZUxhenlFdmVudDxUIGV4dGVuZHMgUGx5ci5QbHlyRXZlbnQ+KG5hbWU6IFBseXIuU3RhbmRhcmRFdmVudCB8IFBseXIuSHRtbDVFdmVudCB8IFBseXIuWW91dHViZUV2ZW50KTogRXZlbnRFbWl0dGVyPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5wbHlySW5pdC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHRoaXMub24obmFtZSwgKGRhdGE6IFQpID0+IHRoaXMubmdab25lLnJ1bigoKSA9PiBvYnNlcnZlci5uZXh0KGRhdGEpKSkpKVxuICAgICkgYXMgRXZlbnRFbWl0dGVyPFQ+O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95UGxheWVyKCkge1xuICAgIGlmICh0aGlzLnBsYXllcikge1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLmV2ZW50cy5rZXlzKCkpLmZvckVhY2gobmFtZSA9PiB0aGlzLm9mZihuYW1lKSk7XG5cbiAgICAgIHRoaXMuZHJpdmVyLmRlc3Ryb3koe1xuICAgICAgICBwbHlyOiB0aGlzLnBsYXllcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaG9zdEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgLy8gdGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgcGx5ciBpbnNlcnRzIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50IG9uIGRlc3Ryb3lcbiAgLy8gc28gd2UgY2F0Y2ggdGhlIGNsb25lIGVsZW1lbnQgcmlnaHQgaGVyZSBhbmQgcmV1c2UgaXRcbiAgcHJpdmF0ZSBlbnN1cmVWaWRlb0VsZW1lbnQoKSB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5ob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpO1xuXG4gICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy52aWRlb0VsZW1lbnQgPSB2aWRlb0VsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlkZW9FbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgdGhpcy52aWRlb0VsZW1lbnQuY29udHJvbHMgPSB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5wbHlyQ3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsICcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGx5clBsYXlzSW5saW5lKSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5ob3N0RWxlbWVudCwgdGhpcy52aWRlb0VsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb24obmFtZTogc3RyaW5nLCBoYW5kbGVyOiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50cy5zZXQobmFtZSwgaGFuZGxlcik7XG4gICAgdGhpcy5wbGF5ZXIub24obmFtZSBhcyBhbnksIGhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBvZmYobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wbGF5ZXIub2ZmKG5hbWUgYXMgYW55LCB0aGlzLmV2ZW50cy5nZXQobmFtZSkpO1xuICAgIHRoaXMuZXZlbnRzLmRlbGV0ZShuYW1lKTtcbiAgfVxuXG59XG4iXX0=