UNPKG

fundamental-ngx

Version:

SAP Fundamentals, implemented in Angular

232 lines 24.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ComponentFactoryResolver, Injectable, ApplicationRef, Injector } from '@angular/core'; import { ModalComponent } from '../modal.component'; import { ModalBackdrop } from '../modal-utils/modal-backdrop'; import { ModalContainer } from '../modal-utils/modal-container'; import { ModalConfig } from '../modal-utils/modal-config'; import { ModalRef } from '../modal-utils/modal-ref'; import { ModalInjector } from '../modal-utils/modal-injector'; /** * Service used to dynamically generate a modal. */ export class ModalService { /** * @hidden * @param {?} componentFactoryResolver * @param {?} appRef * @param {?} injector */ constructor(componentFactoryResolver, appRef, injector) { this.componentFactoryResolver = componentFactoryResolver; this.appRef = appRef; this.injector = injector; this.modals = []; } /** * Status of the modal service. * Returns true if there are open modals, false otherwise. * @return {?} */ hasOpenModals() { return this.modals && this.modals.length > 0; } /** * Dismisses all currently open modals. * @return {?} */ dismissAll() { this.modals.forEach((/** * @param {?} item * @return {?} */ item => { this.destroyModalComponent(item.modalRef); })); } /** * Opens a modal component with a content of type TemplateRef or a component type. * @param {?} contentType Content of the modal component. * @param {?=} modalConfig Configuration of the modal component. * @return {?} */ open(contentType, modalConfig = new ModalConfig()) { // Get default values from model modalConfig = Object.assign(new ModalConfig(), modalConfig); // Setup injectable data /** @type {?} */ const configMap = new WeakMap(); /** @type {?} */ const modalRef = new ModalRef(); modalRef.data = (modalConfig ? modalConfig.data : undefined); configMap.set(ModalRef, modalRef); // Prepare container /** @type {?} */ const containerFactory = this.componentFactoryResolver.resolveComponentFactory(ModalContainer); /** @type {?} */ const containerRef = containerFactory.create(this.injector); this.appRef.attachView(containerRef.hostView); // Prepare modal /** @type {?} */ const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); /** @type {?} */ const componentRef = componentFactory.create(new ModalInjector(this.injector, configMap)); this.appRef.attachView(componentRef.hostView); // Prepare backdrop /** @type {?} */ let backdropRef; if (modalConfig.hasBackdrop) { /** @type {?} */ const backdropFactory = this.componentFactoryResolver.resolveComponentFactory(ModalBackdrop); backdropRef = backdropFactory.create(new ModalInjector(this.injector, configMap)); this.appRef.attachView(backdropRef.hostView); } // Subscribe to close of modalRef /** @type {?} */ const refSub = modalRef.afterClosed.subscribe((/** * @return {?} */ () => { this.destroyModalComponent(componentRef); refSub.unsubscribe(); }), (/** * @return {?} */ () => { this.destroyModalComponent(componentRef); refSub.unsubscribe(); })); // Assign component attributes /** @type {?} */ const configObj = Object.assign({}, modalConfig); Object.keys(configObj).forEach((/** * @param {?} key * @return {?} */ key => { if (key !== 'data') { componentRef.instance[key] = configObj[key]; if (modalConfig.hasBackdrop) { backdropRef.instance[key] = configObj[key]; } } })); componentRef.instance.childComponentType = contentType; // Sizing this.setModalSize(componentRef, configObj); // Positioning this.setModalPosition(componentRef, configObj.position); // Render container /** @type {?} */ const containerEl = (/** @type {?} */ (((/** @type {?} */ (containerRef.hostView))).rootNodes[0])); if (modalConfig.container !== 'body') { modalConfig.container.appendChild(containerEl); } else { document.body.appendChild(containerEl); } // Render backdrop if (modalConfig.hasBackdrop) { /** @type {?} */ const domBackdrop = (/** @type {?} */ (((/** @type {?} */ (backdropRef.hostView))).rootNodes[0])); containerRef.location.nativeElement.appendChild(domBackdrop); } // Render modal /** @type {?} */ const domElement = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0])); containerRef.location.nativeElement.appendChild(domElement); this.modals.push({ modalRef: componentRef, backdropRef: backdropRef, containerRef: containerRef }); return modalRef; } /** * @private * @param {?} modal * @return {?} */ destroyModalComponent(modal) { /** @type {?} */ const arrayRef = this.modals.find((/** * @param {?} item * @return {?} */ (item) => item.modalRef === modal)); /** @type {?} */ const indexOf = this.modals.indexOf(arrayRef); this.appRef.detachView(arrayRef.modalRef.hostView); this.appRef.detachView(arrayRef.containerRef.hostView); arrayRef.containerRef.destroy(); arrayRef.modalRef.destroy(); if (arrayRef.backdropRef) { this.appRef.detachView(arrayRef.backdropRef.hostView); arrayRef.backdropRef.destroy(); } this.modals[indexOf] = null; this.modals = this.modals.filter((/** * @param {?} item * @return {?} */ item => item !== null && item !== undefined)); } /** * @private * @param {?} componentRef * @param {?} configObj * @return {?} */ setModalSize(componentRef, configObj) { componentRef.location.nativeElement.style.minWidth = configObj.minWidth; componentRef.location.nativeElement.style.minHeight = configObj.minHeight; componentRef.location.nativeElement.style.maxWidth = configObj.maxWidth; componentRef.location.nativeElement.style.maxHeight = configObj.maxHeight; componentRef.location.nativeElement.style.width = configObj.width; componentRef.location.nativeElement.style.height = configObj.height; } /** * @private * @param {?} componentRef * @param {?} position * @return {?} */ setModalPosition(componentRef, position) { if (position) { componentRef.location.nativeElement.style.top = position.top; componentRef.location.nativeElement.style.bottom = position.bottom; componentRef.location.nativeElement.style.right = position.right; componentRef.location.nativeElement.style.left = position.left; } } } ModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ModalService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: ApplicationRef }, { type: Injector } ]; if (false) { /** * @type {?} * @private */ ModalService.prototype.modals; /** * @type {?} * @private */ ModalService.prototype.componentFactoryResolver; /** * @type {?} * @private */ ModalService.prototype.appRef; /** * @type {?} * @private */ ModalService.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbC9tb2RhbC1zZXJ2aWNlL21vZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBS1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUFPOUQsTUFBTSxPQUFPLFlBQVk7Ozs7Ozs7SUFRckIsWUFBb0Isd0JBQWtELEVBQ2xELE1BQXNCLEVBQ3RCLFFBQWtCO1FBRmxCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVQ5QixXQUFNLEdBSVIsRUFBRSxDQUFDO0lBS2dDLENBQUM7Ozs7OztJQU1uQyxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7Ozs7SUFLTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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QUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQzFFLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNsRSxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDeEUsQ0FBQzs7Ozs7OztJQUVPLGdCQUFnQixDQUFDLFlBQTBDLEVBQUUsUUFBdUI7UUFDeEYsSUFBSSxRQUFRLEVBQUU7WUFDVixZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDN0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ25FLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRSxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDbEU7SUFDTCxDQUFDOzs7WUFuSkosVUFBVTs7OztZQXBCUCx3QkFBd0I7WUFFeEIsY0FBYztZQUNkLFFBQVE7Ozs7Ozs7SUFtQlIsOEJBSVM7Ozs7O0lBR0csZ0RBQTBEOzs7OztJQUMxRCw4QkFBOEI7Ozs7O0lBQzlCLGdDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEluamVjdGFibGUsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgRW1iZWRkZWRWaWV3UmVmLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBUeXBlLFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9kYWxCYWNrZHJvcCB9IGZyb20gJy4uL21vZGFsLXV0aWxzL21vZGFsLWJhY2tkcm9wJztcbmltcG9ydCB7IE1vZGFsQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29udGFpbmVyJztcbmltcG9ydCB7IE1vZGFsQ29uZmlnIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29uZmlnJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1vZGFsSW5qZWN0b3IgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1pbmplY3Rvcic7XG5pbXBvcnQgeyBNb2RhbFBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtcG9zaXRpb24nO1xuXG4vKipcbiAqIFNlcnZpY2UgdXNlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBhIG1vZGFsLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG1vZGFsczoge1xuICAgICAgICBtb2RhbFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50PixcbiAgICAgICAgYmFja2Ryb3BSZWY/OiBDb21wb25lbnRSZWY8TW9kYWxCYWNrZHJvcD4sXG4gICAgICAgIGNvbnRhaW5lclJlZj86IENvbXBvbmVudFJlZjxNb2RhbENvbnRhaW5lcj5cbiAgICB9W10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgICAvKipcbiAgICAgKiBTdGF0dXMgb2YgdGhlIG1vZGFsIHNlcnZpY2UuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvcGVuIG1vZGFscywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNPcGVuTW9kYWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbHMgJiYgdGhpcy5tb2RhbHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNtaXNzZXMgYWxsIGN1cnJlbnRseSBvcGVuIG1vZGFscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzbWlzc0FsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RhbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vZGFsQ29tcG9uZW50KGl0ZW0ubW9kYWxSZWYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIG1vZGFsIGNvbXBvbmVudCB3aXRoIGEgY29udGVudCBvZiB0eXBlIFRlbXBsYXRlUmVmIG9yIGEgY29tcG9uZW50IHR5cGUuXG4gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgb2YgdGhlIG1vZGFsIGNvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0gbW9kYWxDb25maWcgQ29uZmlndXJhdGlvbiBvZiB0aGUgbW9kYWwgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKGNvbnRlbnRUeXBlOiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxhbnk+LCBtb2RhbENvbmZpZzogTW9kYWxDb25maWcgPSBuZXcgTW9kYWxDb25maWcoKSk6IE1vZGFsUmVmIHtcblxuICAgICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXMgZnJvbSBtb2RlbFxuICAgICAgICBtb2RhbENvbmZpZyA9IE9iamVjdC5hc3NpZ24obmV3IE1vZGFsQ29uZmlnKCksIG1vZGFsQ29uZmlnKTtcblxuICAgICAgICAvLyBTZXR1cCBpbmplY3RhYmxlIGRhdGFcbiAgICAgICAgY29uc3QgY29uZmlnTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSBuZXcgTW9kYWxSZWYoKTtcbiAgICAgICAgbW9kYWxSZWYuZGF0YSA9IChtb2RhbENvbmZpZyA/IG1vZGFsQ29uZmlnLmRhdGEgOiB1bmRlZmluZWQpO1xuICAgICAgICBjb25maWdNYXAuc2V0KE1vZGFsUmVmLCBtb2RhbFJlZik7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBjb250YWluZXJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsQ29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gY29udGFpbmVyRmFjdG9yeS5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAvLyBQcmVwYXJlIG1vZGFsXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNb2RhbENvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKG5ldyBNb2RhbEluamVjdG9yKHRoaXMuaW5qZWN0b3IsIGNvbmZpZ01hcCkpO1xuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBiYWNrZHJvcFxuICAgICAgICBsZXQgYmFja2Ryb3BSZWY7XG4gICAgICAgIGlmIChtb2RhbENvbmZpZy5oYXNCYWNrZHJvcCkge1xuICAgICAgICAgICAgY29uc3QgYmFja2Ryb3BGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTW9kYWxCYWNrZHJvcCk7XG4gICAgICAgICAgICBiYWNrZHJvcFJlZiA9IGJhY2tkcm9wRmFjdG9yeS5jcmVhdGUobmV3IE1vZGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY29uZmlnTWFwKSk7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGJhY2tkcm9wUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjbG9zZSBvZiBtb2RhbFJlZlxuICAgICAgICBjb25zdCByZWZTdWIgPSBtb2RhbFJlZi5hZnRlckNsb3NlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95TW9kYWxDb21wb25lbnQoY29tcG9uZW50UmVmKTtcbiAgICAgICAgICAgIHJlZlN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNb2RhbENvbXBvbmVudChjb21wb25lbnRSZWYpO1xuICAgICAgICAgICAgcmVmU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzc2lnbiBjb21wb25lbnQgYXR0cmlidXRlc1xuICAgICAgICBjb25zdCBjb25maWdPYmogPSBPYmplY3QuYXNzaWduKHt9LCBtb2RhbENvbmZpZyk7XG4gICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZ09iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0gPSBjb25maWdPYmpba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChtb2RhbENvbmZpZy5oYXNCYWNrZHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcFJlZi5pbnN0YW5jZVtrZXldID0gY29uZmlnT2JqW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNoaWxkQ29tcG9uZW50VHlwZSA9IGNvbnRlbnRUeXBlO1xuXG4gICAgICAgIC8vIFNpemluZ1xuICAgICAgICB0aGlzLnNldE1vZGFsU2l6ZShjb21wb25lbnRSZWYsIGNvbmZpZ09iaik7XG5cbiAgICAgICAgLy8gUG9zaXRpb25pbmdcbiAgICAgICAgdGhpcy5zZXRNb2RhbFBvc2l0aW9uKGNvbXBvbmVudFJlZiwgY29uZmlnT2JqLnBvc2l0aW9uKTtcblxuICAgICAgICAvLyBSZW5kZXIgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gKGNvbnRhaW5lclJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAobW9kYWxDb25maWcuY29udGFpbmVyICE9PSAnYm9keScpIHtcbiAgICAgICAgICAgIG1vZGFsQ29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbmRlciBiYWNrZHJvcFxuICAgICAgICBpZiAobW9kYWxDb25maWcuaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbUJhY2tkcm9wID0gKGJhY2tkcm9wUmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChkb21CYWNrZHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW5kZXIgbW9kYWxcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5tb2RhbHMucHVzaCh7bW9kYWxSZWY6IGNvbXBvbmVudFJlZiwgYmFja2Ryb3BSZWY6IGJhY2tkcm9wUmVmLCBjb250YWluZXJSZWY6IGNvbnRhaW5lclJlZn0pO1xuICAgICAgICByZXR1cm4gbW9kYWxSZWY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95TW9kYWxDb21wb25lbnQobW9kYWw6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXJyYXlSZWYgPSB0aGlzLm1vZGFscy5maW5kKChpdGVtKSA9PiBpdGVtLm1vZGFsUmVmID09PSBtb2RhbCk7XG4gICAgICAgIGNvbnN0IGluZGV4T2YgPSB0aGlzLm1vZGFscy5pbmRleE9mKGFycmF5UmVmKTtcbiAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhhcnJheVJlZi5tb2RhbFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoYXJyYXlSZWYuY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgYXJyYXlSZWYuY29udGFpbmVyUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgYXJyYXlSZWYubW9kYWxSZWYuZGVzdHJveSgpO1xuXG4gICAgICAgIGlmIChhcnJheVJlZi5iYWNrZHJvcFJlZikge1xuICAgICAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhhcnJheVJlZi5iYWNrZHJvcFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICBhcnJheVJlZi5iYWNrZHJvcFJlZi5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGFsc1tpbmRleE9mXSA9IG51bGw7XG4gICAgICAgIHRoaXMubW9kYWxzID0gdGhpcy5tb2RhbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TW9kYWxTaXplKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50PiwgY29uZmlnT2JqOiBNb2RhbENvbmZpZyk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGNvbmZpZ09iai5taW5XaWR0aDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gY29uZmlnT2JqLm1pbkhlaWdodDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBjb25maWdPYmoubWF4V2lkdGg7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLm1heEhlaWdodCA9IGNvbmZpZ09iai5tYXhIZWlnaHQ7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gY29uZmlnT2JqLndpZHRoO1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWdPYmouaGVpZ2h0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TW9kYWxQb3NpdGlvbihjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudD4sIHBvc2l0aW9uOiBNb2RhbFBvc2l0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gcG9zaXRpb24udG9wO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm90dG9tID0gcG9zaXRpb24uYm90dG9tO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSBwb3NpdGlvbi5yaWdodDtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBwb3NpdGlvbi5sZWZ0O1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=