angular-google-charts
Version:
A wrapper for the Google Charts library written with Angular
112 lines • 16 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { generateRandomId } from '../../helpers/id.helper';
import { ScriptLoaderService } from '../../services/script-loader.service';
import { FilterType } from '../../types/control-type';
import * as i0 from "@angular/core";
import * as i1 from "../../services/script-loader.service";
export class ControlWrapperComponent {
constructor(loaderService) {
this.loaderService = loaderService;
/**
* Emits when an error occurs when attempting to render the control.
*/
this.error = new EventEmitter();
/**
* The control is ready to accept user interaction and for external method calls.
*
* Alternatively, you can listen for a ready event on the dashboard holding the control
* and call control methods only after the event was fired.
*/
this.ready = new EventEmitter();
/**
* Emits when the user interacts with the control, affecting its state.
* For example, a `stateChange` event will be emitted whenever you move the thumbs of a range slider control.
*
* To retrieve an updated control state after the event fired, call `ControlWrapper.getState()`.
*/
this.stateChange = new EventEmitter();
/**
* A generated id assigned to this components DOM element.
*/
this.id = generateRandomId();
this.wrapperReadySubject = new ReplaySubject(1);
}
/**
* Emits after the `ControlWrapper` was created.
*/
get wrapperReady$() {
return this.wrapperReadySubject.asObservable();
}
get controlWrapper() {
if (!this._controlWrapper) {
throw new Error(`Cannot access the control wrapper before it being initialized.`);
}
return this._controlWrapper;
}
ngOnInit() {
this.loaderService.loadChartPackages('controls').subscribe(() => {
this.createControlWrapper();
});
}
ngOnChanges(changes) {
if (!this._controlWrapper) {
return;
}
if (changes.type) {
this._controlWrapper.setControlType(this.type);
}
if (changes.options) {
this._controlWrapper.setOptions(this.options || {});
}
if (changes.state) {
this._controlWrapper.setState(this.state || {});
}
}
createControlWrapper() {
this._controlWrapper = new google.visualization.ControlWrapper({
containerId: this.id,
controlType: this.type,
state: this.state,
options: this.options
});
this.addEventListeners();
this.wrapperReadySubject.next(this._controlWrapper);
}
addEventListeners() {
google.visualization.events.removeAllListeners(this._controlWrapper);
google.visualization.events.addListener(this._controlWrapper, 'ready', (event) => this.ready.emit(event));
google.visualization.events.addListener(this._controlWrapper, 'error', (event) => this.error.emit(event));
google.visualization.events.addListener(this._controlWrapper, 'statechange', (event) => this.stateChange.emit(event));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ControlWrapperComponent, deps: [{ token: i1.ScriptLoaderService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ControlWrapperComponent, selector: "control-wrapper", inputs: { for: "for", type: "type", options: "options", state: "state" }, outputs: { error: "error", ready: "ready", stateChange: "stateChange" }, host: { properties: { "id": "this.id" }, classAttribute: "control-wrapper" }, exportAs: ["controlWrapper"], usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ControlWrapperComponent, decorators: [{
type: Component,
args: [{
selector: 'control-wrapper',
template: '',
host: { class: 'control-wrapper' },
exportAs: 'controlWrapper',
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], ctorParameters: function () { return [{ type: i1.ScriptLoaderService }]; }, propDecorators: { for: [{
type: Input
}], type: [{
type: Input
}], options: [{
type: Input
}], state: [{
type: Input
}], error: [{
type: Output
}], ready: [{
type: Output
}], stateChange: [{
type: Output
}], id: [{
type: HostBinding,
args: ['id']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZ29vZ2xlLWNoYXJ0cy9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC13cmFwcGVyL2NvbnRyb2wtd3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFXdEQsTUFBTSxPQUFPLHVCQUF1QjtJQW1GbEMsWUFBb0IsYUFBa0M7UUFBbEMsa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBakN0RDs7V0FFRztRQUVJLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUVuRDs7Ozs7V0FLRztRQUVJLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUVuRDs7Ozs7V0FLRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVqRDs7V0FFRztRQUVhLE9BQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBR2hDLHdCQUFtQixHQUFHLElBQUksYUFBYSxDQUFzQyxDQUFDLENBQUMsQ0FBQztJQUUvQixDQUFDO0lBRTFEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1NBQ25GO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzlELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO1lBQzdELFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVyRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFzQixFQUFFLEVBQUUsQ0FDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3ZCLENBQUM7UUFDRixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFzQixFQUFFLEVBQUUsQ0FDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3ZCLENBQUM7UUFDRixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUM5RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7K0dBcEpVLHVCQUF1QjttR0FBdkIsdUJBQXVCLDJVQUx4QixFQUFFOzs0RkFLRCx1QkFBdUI7a0JBUG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLEVBQUU7b0JBQ1osSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO29CQUNsQyxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7MEdBTVEsR0FBRztzQkFEVCxLQUFLO2dCQWNDLElBQUk7c0JBRFYsS0FBSztnQkFjQyxPQUFPO3NCQURiLEtBQUs7Z0JBa0JDLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxLQUFLO3NCQURYLE1BQU07Z0JBVUEsS0FBSztzQkFEWCxNQUFNO2dCQVVBLFdBQVc7c0JBRGpCLE1BQU07Z0JBT1MsRUFBRTtzQkFEakIsV0FBVzt1QkFBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2lkLmhlbHBlcic7XG5pbXBvcnQgeyBTY3JpcHRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9jb250cm9sLXR5cGUnO1xuaW1wb3J0IHsgQ2hhcnRFcnJvckV2ZW50LCBDaGFydFJlYWR5RXZlbnQgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuaW1wb3J0IHsgQ2hhcnRCYXNlIH0gZnJvbSAnLi4vY2hhcnQtYmFzZS9jaGFydC1iYXNlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbnRyb2wtd3JhcHBlcicsXG4gIHRlbXBsYXRlOiAnJyxcbiAgaG9zdDogeyBjbGFzczogJ2NvbnRyb2wtd3JhcHBlcicgfSxcbiAgZXhwb3J0QXM6ICdjb250cm9sV3JhcHBlcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvbnRyb2xXcmFwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQ2hhcnRzIGNvbnRyb2xsZWQgYnkgdGhpcyBjb250cm9sIHdyYXBwZXIuIENhbiBiZSBhIHNpbmdsZSBjaGFydCBvciBhbiBhcnJheSBvZiBjaGFydHMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZm9yITogQ2hhcnRCYXNlIHwgQ2hhcnRCYXNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjb250cm9sLlxuICAgKiBUaGUgYGdvb2dsZS52aXN1YWxpemF0aW9uYCBwYWNrYWdlIG5hbWUgY2FuIGJlIG9taXR0ZWQgZm9yIEdvb2dsZSBjb250cm9scy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgaHRtbFxuICAgKiA8Y29udHJvbC13cmFwcGVyIHR5cGU9XCJDYXRlZ29yeUZpbHRlclwiPjwvY29udHJvbC13cmFwcGVyPlxuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0eXBlITogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb250cm9sLlxuICAgKiBZb3UgY2FuIHVzZSBlaXRoZXIgSmF2YVNjcmlwdCBsaXRlcmFsIG5vdGF0aW9uLCBvciBwcm92aWRlIGEgaGFuZGxlIHRvIHRoZSBvYmplY3QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYGh0bWxcbiAgICogPGNvbnRyb2wtd3JhcHBlciBbb3B0aW9uc109XCJ7J2ZpbHRlckNvbHVtbkxhYmVsJzogJ0FnZScsICdtaW5WYWx1ZSc6IDEwLCAnbWF4VmFsdWUnOiA4MH1cIj48L2NvbnRyb2wtd3JhcHBlcj5cbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgb3B0aW9ucz86IG9iamVjdDtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sLlxuICAgKiBUaGUgc3RhdGUgY29sbGVjdHMgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCB0aGUgdXNlciBvcGVyYXRpbmcgdGhlIGNvbnRyb2wgY2FuIGFmZmVjdC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGEgcmFuZ2Ugc2xpZGVyIHN0YXRlIGNhbiBiZSBkZXNjcmliZWQgaW4gdGVybSBvZiB0aGUgcG9zaXRpb25zIHRoYXQgdGhlIGxvdyBhbmQgaGlnaCB0aHVtYlxuICAgKiBvZiB0aGUgc2xpZGVyIG9jY3VweS5cbiAgICogWW91IGNhbiB1c2UgZWl0aGVyIEphdmFzY3JpcHQgbGl0ZXJhbCBub3RhdGlvbiwgb3IgcHJvdmlkZSBhIGhhbmRsZSB0byB0aGUgb2JqZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYGBgaHRtbFxuICAgKiA8Y29udHJvbC13cmFwcGVyIFtzdGF0ZV09XCJ7J2xvd1ZhbHVlJzogMjAsICdoaWdoVmFsdWUnOiA1MH1cIj48L2NvbnRyb2wtd3JhcHBlcj5cbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3RhdGU/OiBvYmplY3Q7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoZW4gYXR0ZW1wdGluZyB0byByZW5kZXIgdGhlIGNvbnRyb2wuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFydEVycm9yRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cm9sIGlzIHJlYWR5IHRvIGFjY2VwdCB1c2VyIGludGVyYWN0aW9uIGFuZCBmb3IgZXh0ZXJuYWwgbWV0aG9kIGNhbGxzLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxpc3RlbiBmb3IgYSByZWFkeSBldmVudCBvbiB0aGUgZGFzaGJvYXJkIGhvbGRpbmcgdGhlIGNvbnRyb2xcbiAgICogYW5kIGNhbGwgY29udHJvbCBtZXRob2RzIG9ubHkgYWZ0ZXIgdGhlIGV2ZW50IHdhcyBmaXJlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXJ0UmVhZHlFdmVudD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgY29udHJvbCwgYWZmZWN0aW5nIGl0cyBzdGF0ZS5cbiAgICogRm9yIGV4YW1wbGUsIGEgYHN0YXRlQ2hhbmdlYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQgd2hlbmV2ZXIgeW91IG1vdmUgdGhlIHRodW1icyBvZiBhIHJhbmdlIHNsaWRlciBjb250cm9sLlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBhbiB1cGRhdGVkIGNvbnRyb2wgc3RhdGUgYWZ0ZXIgdGhlIGV2ZW50IGZpcmVkLCBjYWxsIGBDb250cm9sV3JhcHBlci5nZXRTdGF0ZSgpYC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgLyoqXG4gICAqIEEgZ2VuZXJhdGVkIGlkIGFzc2lnbmVkIHRvIHRoaXMgY29tcG9uZW50cyBET00gZWxlbWVudC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnaWQnKVxuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG5cbiAgcHJpdmF0ZSBfY29udHJvbFdyYXBwZXI/OiBnb29nbGUudmlzdWFsaXphdGlvbi5Db250cm9sV3JhcHBlcjtcbiAgcHJpdmF0ZSB3cmFwcGVyUmVhZHlTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Z29vZ2xlLnZpc3VhbGl6YXRpb24uQ29udHJvbFdyYXBwZXI+KDEpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9hZGVyU2VydmljZTogU2NyaXB0TG9hZGVyU2VydmljZSkge31cblxuICAvKipcbiAgICogRW1pdHMgYWZ0ZXIgdGhlIGBDb250cm9sV3JhcHBlcmAgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdyYXBwZXJSZWFkeSQoKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlclJlYWR5U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udHJvbFdyYXBwZXIoKTogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29udHJvbFdyYXBwZXIge1xuICAgIGlmICghdGhpcy5fY29udHJvbFdyYXBwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjY2VzcyB0aGUgY29udHJvbCB3cmFwcGVyIGJlZm9yZSBpdCBiZWluZyBpbml0aWFsaXplZC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbFdyYXBwZXI7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmxvYWRDaGFydFBhY2thZ2VzKCdjb250cm9scycpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNyZWF0ZUNvbnRyb2xXcmFwcGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29udHJvbFdyYXBwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy50eXBlKSB7XG4gICAgICB0aGlzLl9jb250cm9sV3JhcHBlci5zZXRDb250cm9sVHlwZSh0aGlzLnR5cGUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2xXcmFwcGVyLnNldE9wdGlvbnModGhpcy5vcHRpb25zIHx8IHt9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5zdGF0ZSkge1xuICAgICAgdGhpcy5fY29udHJvbFdyYXBwZXIuc2V0U3RhdGUodGhpcy5zdGF0ZSB8fCB7fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250cm9sV3JhcHBlcigpIHtcbiAgICB0aGlzLl9jb250cm9sV3JhcHBlciA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db250cm9sV3JhcHBlcih7XG4gICAgICBjb250YWluZXJJZDogdGhpcy5pZCxcbiAgICAgIGNvbnRyb2xUeXBlOiB0aGlzLnR5cGUsXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9uc1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMud3JhcHBlclJlYWR5U3ViamVjdC5uZXh0KHRoaXMuX2NvbnRyb2xXcmFwcGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZ29vZ2xlLnZpc3VhbGl6YXRpb24uZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycyh0aGlzLl9jb250cm9sV3JhcHBlcik7XG5cbiAgICBnb29nbGUudmlzdWFsaXphdGlvbi5ldmVudHMuYWRkTGlzdGVuZXIodGhpcy5fY29udHJvbFdyYXBwZXIsICdyZWFkeScsIChldmVudDogQ2hhcnRSZWFkeUV2ZW50KSA9PlxuICAgICAgdGhpcy5yZWFkeS5lbWl0KGV2ZW50KVxuICAgICk7XG4gICAgZ29vZ2xlLnZpc3VhbGl6YXRpb24uZXZlbnRzLmFkZExpc3RlbmVyKHRoaXMuX2NvbnRyb2xXcmFwcGVyLCAnZXJyb3InLCAoZXZlbnQ6IENoYXJ0RXJyb3JFdmVudCkgPT5cbiAgICAgIHRoaXMuZXJyb3IuZW1pdChldmVudClcbiAgICApO1xuICAgIGdvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcih0aGlzLl9jb250cm9sV3JhcHBlciwgJ3N0YXRlY2hhbmdlJywgKGV2ZW50OiB1bmtub3duKSA9PlxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==