UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

149 lines 20.4 kB
import { EventEmitter, Inject, Injectable, InjectionToken, Optional, Output } from '@angular/core'; import { Observable } from 'rxjs'; import { filter, mapTo } from 'rxjs/operators'; import { getDataTransfer, transferHasFiles } from './drag-drop-utils'; import { DragStateTrackerFactory } from './drag-state-tracker.service'; import { matchesMimeType } from './matches-mime-type'; import * as i0 from "@angular/core"; import * as i1 from "./drag-state-tracker.service"; /** * A token that can be used to inject a mock into the service * @internal */ export const PAGE_FILE_DRAG_EVENT_TARGET = new InjectionToken('PAGE_FILE_DRAG_EVENT_TARGET'); /** * A helper service that listens for dragenter/dragleave/drop events on the window * and tracks when files are dragged into or out of the active tab. * * When files are accidentally dropped on the tab outside of a drop zone, the drop * can be cancelled to prevent the browser from opening/downloading the file. * See {@link gtxPreventFileDrop} for details. */ export class PageFileDragHandler { constructor(eventTarget, dragState) { /** * Fires when a drop event is prevented. */ this.dropPrevented = new EventEmitter(); this._filesDragged = []; this._eventsBound = false; this._componentsWantingToPreventFileDrop = new Set(); this._preventAccidentalFileDrop = false; this.preventAccidentalDrop = (event) => { let dataTransfer = getDataTransfer(event); if (this._preventAccidentalFileDrop && !event.defaultPrevented && transferHasFiles(dataTransfer)) { event.preventDefault(); dataTransfer.effectAllowed = 'none'; dataTransfer.dropEffect = 'none'; if (event.type === 'drop') { this.dropPrevented.emit(undefined); } } }; if (eventTarget) { this._eventTarget = eventTarget; } else if (typeof window === 'object') { this._eventTarget = window; } else { throw new Error('No event target for PageFileDragHandler.'); } this.filesDragged$ = dragState.trackElement(this._eventTarget); this.dragEnter = this.filesDragged$.pipe(filter(list => list.length > 0)); this.dragStop = this.filesDragged$.pipe(filter(list => list.length === 0), mapTo(false)); this.bindEvents(); } /** * Returns true if a file is dragged over the current page/tab. * @example * class Component { * constructor(private pageDragStatus: PageFileDragStatusService) {} * } * * <ul *ngIf="pageDragStatus.filesDragged"> ... </ul> */ get filesDragged() { return this._filesDragged; } /** * Returns true if files are dragged over the current tab and any file matches the specified mime type. * @example * class Component { * constructor(private pageDragStatus: PageFileDragStatusService) {} * } * * <ul *ngIf="pageDragStatus.anyDraggedFileIs('image/*')"> ... </ul> */ anyDraggedFileIs(allowedTypes) { return !!(this._filesDragged.length && this._filesDragged.some(file => matchesMimeType(file.type, allowedTypes))); } /** * Returns true if files are dragged over the current page and all files match the specified mime type. * @example * class Component { * constructor(private pageDragStatus: PageFileDragStatusService) {} * } * * <ul *ngIf="pageDragStatus.allDraggedFilesAre('image/*')"> ... </ul> */ allDraggedFilesAre(allowedTypes) { return !!(this._filesDragged.length && this._filesDragged.every(file => matchesMimeType(file.type, allowedTypes))); } destroy() { this.unbindEvents(); if (this._subscription) { this._subscription.unsubscribe(); this._subscription = undefined; } this._componentsWantingToPreventFileDrop = new Set(); this._preventAccidentalFileDrop = false; } /** @internal */ bindEvents() { if (this._eventsBound) { return; } this._subscription = this.filesDragged$.subscribe(dragged => this._filesDragged = dragged); this._eventTarget.addEventListener('dragenter', this.preventAccidentalDrop, false); this._eventTarget.addEventListener('dragover', this.preventAccidentalDrop, false); this._eventTarget.addEventListener('drop', this.preventAccidentalDrop, false); this._eventsBound = true; } /** @internal */ unbindEvents() { this._eventTarget.removeEventListener('dragenter', this.preventAccidentalDrop, false); this._eventTarget.removeEventListener('dragover', this.preventAccidentalDrop, false); this._eventTarget.removeEventListener('drop', this.preventAccidentalDrop, false); this._eventsBound = false; } /** @internal */ preventFileDropOnPageFor(directive, prevent) { if (prevent) { this._componentsWantingToPreventFileDrop.add(directive); } else { this._componentsWantingToPreventFileDrop.delete(directive); } this._preventAccidentalFileDrop = this._componentsWantingToPreventFileDrop.size > 0; } } /** @nocollapse */ PageFileDragHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: PageFileDragHandler, deps: [{ token: PAGE_FILE_DRAG_EVENT_TARGET, optional: true }, { token: i1.DragStateTrackerFactory }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ PageFileDragHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: PageFileDragHandler }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: PageFileDragHandler, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PAGE_FILE_DRAG_EVENT_TARGET] }] }, { type: i1.DragStateTrackerFactory }]; }, propDecorators: { filesDragged$: [{ type: Output }], dragEnter: [{ type: Output }], dragStop: [{ type: Output }], dropPrevented: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1maWxlLWRyYWctaGFuZGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZmlsZS1kcm9wLWFyZWEvcGFnZS1maWxlLWRyYWctaGFuZGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUMsVUFBVSxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyx1QkFBdUIsRUFBZ0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7OztBQUVwRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRTdGOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sbUJBQW1CO0lBK0U1QixZQUE2RCxXQUFnQixFQUNqRSxTQUFrQztRQXhEOUM7O1dBRUc7UUFDTyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFHM0Msa0JBQWEsR0FBa0IsRUFBRSxDQUFDO1FBR2xDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHdDQUFtQyxHQUFHLElBQUksR0FBRyxFQUFPLENBQUM7UUFDckQsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBd0duQywwQkFBcUIsR0FBRyxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLFlBQVksR0FBRyxlQUFl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bUNBQW1DLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN4RixDQUFDOzttSUF6SVEsbUJBQW1CLGtCQStFSSwyQkFBMkI7dUlBL0VsRCxtQkFBbUI7MkZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBZ0ZNLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMkJBQTJCO2tGQXBFakQsYUFBYTtzQkFBdEIsTUFBTTtnQkFNRyxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFFBQVE7c0JBQWpCLE1BQU07Z0JBS0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwsIE91dHB1dCwgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwVG99IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtnZXREYXRhVHJhbnNmZXIsIHRyYW5zZmVySGFzRmlsZXN9IGZyb20gJy4vZHJhZy1kcm9wLXV0aWxzJztcbmltcG9ydCB7RHJhZ1N0YXRlVHJhY2tlckZhY3RvcnksIEZpbGVEcmFnU3RhdGV9IGZyb20gJy4vZHJhZy1zdGF0ZS10cmFja2VyLnNlcnZpY2UnO1xuaW1wb3J0IHttYXRjaGVzTWltZVR5cGV9IGZyb20gJy4vbWF0Y2hlcy1taW1lLXR5cGUnO1xuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYSBtb2NrIGludG8gdGhlIHNlcnZpY2VcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUEFHRV9GSUxFX0RSQUdfRVZFTlRfVEFSR0VUID0gbmV3IEluamVjdGlvblRva2VuKCdQQUdFX0ZJTEVfRFJBR19FVkVOVF9UQVJHRVQnKTtcblxuLyoqXG4gKiBBIGhlbHBlciBzZXJ2aWNlIHRoYXQgbGlzdGVucyBmb3IgZHJhZ2VudGVyL2RyYWdsZWF2ZS9kcm9wIGV2ZW50cyBvbiB0aGUgd2luZG93XG4gKiBhbmQgdHJhY2tzIHdoZW4gZmlsZXMgYXJlIGRyYWdnZWQgaW50byBvciBvdXQgb2YgdGhlIGFjdGl2ZSB0YWIuXG4gKlxuICogV2hlbiBmaWxlcyBhcmUgYWNjaWRlbnRhbGx5IGRyb3BwZWQgb24gdGhlIHRhYiBvdXRzaWRlIG9mIGEgZHJvcCB6b25lLCB0aGUgZHJvcFxuICogY2FuIGJlIGNhbmNlbGxlZCB0byBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gb3BlbmluZy9kb3dubG9hZGluZyB0aGUgZmlsZS5cbiAqIFNlZSB7QGxpbmsgZ3R4UHJldmVudEZpbGVEcm9wfSBmb3IgZGV0YWlscy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlRHJhZ0hhbmRsZXIge1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpbGUgaXMgZHJhZ2dlZCBpbnRvIHRoZSBjdXJyZW50IHRhYiwgZHJhZ2dlZCBvdXQgb3IgZHJvcHBlZC5cbiAgICAgKiBAZXhtYW1wbGVcbiAgICAgKiAgIGNsYXNzIENvbXBvbmVudCB7XG4gICAgICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnZURyYWc6IFBhZ2VGaWxlRHJhZ1N0YXR1c1NlcnZpY2UpIHsgfVxuICAgICAqICAgfVxuICAgICAqXG4gICAgICogICA8dWwgKm5nSWY9XCJwYWdlRHJhZy5maWxlc0RyYWdnZWQkIHwgYXN5bmNcIj4gLi4uIDwvdWw+XG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVzRHJhZ2dlZCQ6IE9ic2VydmFibGU8RmlsZURyYWdTdGF0ZT47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIGxpc3Qgd2hlbiBhIGZpbGUgaXMgZHJhZ2dlZCBpbnRvIHRoZSBjdXJyZW50IHRhYi5cbiAgICAgKiBUaGUgbGlzdCBjb250YWlucyBgeyBcInR5cGVcIjogc3RyaW5nIH1gIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBkcmFnRW50ZXI6IE9ic2VydmFibGU8RmlsZURyYWdTdGF0ZT47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBmYWxzZSB3aGVuIGEgZmlsZSBpcyBkcmFnZ2VkIG91dCBvZiB0aGUgY3VycmVudCB0YWIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGRyYWdTdG9wOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRyb3AgZXZlbnQgaXMgcHJldmVudGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBkcm9wUHJldmVudGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG5cbiAgICBwcml2YXRlIF9maWxlc0RyYWdnZWQ6IEZpbGVEcmFnU3RhdGUgPSBbXTtcbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIF9ldmVudFRhcmdldDogRXZlbnRUYXJnZXQ7XG4gICAgcHJpdmF0ZSBfZXZlbnRzQm91bmQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb21wb25lbnRzV2FudGluZ1RvUHJldmVudEZpbGVEcm9wID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfcHJldmVudEFjY2lkZW50YWxGaWxlRHJvcCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGEgZmlsZSBpcyBkcmFnZ2VkIG92ZXIgdGhlIGN1cnJlbnQgcGFnZS90YWIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIGNsYXNzIENvbXBvbmVudCB7XG4gICAgICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnZURyYWdTdGF0dXM6IFBhZ2VGaWxlRHJhZ1N0YXR1c1NlcnZpY2UpIHt9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIDx1bCAqbmdJZj1cInBhZ2VEcmFnU3RhdHVzLmZpbGVzRHJhZ2dlZFwiPiAuLi4gPC91bD5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbGVzRHJhZ2dlZCgpOiBGaWxlRHJhZ1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzRHJhZ2dlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgZmlsZXMgYXJlIGRyYWdnZWQgb3ZlciB0aGUgY3VycmVudCB0YWIgYW5kIGFueSBmaWxlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtaW1lIHR5cGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIGNsYXNzIENvbXBvbmVudCB7XG4gICAgICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnZURyYWdTdGF0dXM6IFBhZ2VGaWxlRHJhZ1N0YXR1c1NlcnZpY2UpIHt9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIDx1bCAqbmdJZj1cInBhZ2VEcmFnU3RhdHVzLmFueURyYWdnZWRGaWxlSXMoJ2ltYWdlLyonKVwiPiAuLi4gPC91bD5cbiAgICAgKi9cbiAgICBwdWJsaWMgYW55RHJhZ2dlZEZpbGVJcyhhbGxvd2VkVHlwZXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEodGhpcy5fZmlsZXNEcmFnZ2VkLmxlbmd0aCAmJiB0aGlzLl9maWxlc0RyYWdnZWQuc29tZShmaWxlID0+XG4gICAgICAgICAgICBtYXRjaGVzTWltZVR5cGUoZmlsZS50eXBlLCBhbGxvd2VkVHlwZXMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGZpbGVzIGFyZSBkcmFnZ2VkIG92ZXIgdGhlIGN1cnJlbnQgcGFnZSBhbmQgYWxsIGZpbGVzIG1hdGNoIHRoZSBzcGVjaWZpZWQgbWltZSB0eXBlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBjbGFzcyBDb21wb25lbnQge1xuICAgICAqICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhZ2VEcmFnU3RhdHVzOiBQYWdlRmlsZURyYWdTdGF0dXNTZXJ2aWNlKSB7fVxuICAgICAqICAgfVxuICAgICAqXG4gICAgICogICA8dWwgKm5nSWY9XCJwYWdlRHJhZ1N0YXR1cy5hbGxEcmFnZ2VkRmlsZXNBcmUoJ2ltYWdlLyonKVwiPiAuLi4gPC91bD5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsRHJhZ2dlZEZpbGVzQXJlKGFsbG93ZWRUeXBlczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLl9maWxlc0RyYWdnZWQubGVuZ3RoICYmIHRoaXMuX2ZpbGVzRHJhZ2dlZC5ldmVyeShmaWxlID0+XG4gICAgICAgICAgICBtYXRjaGVzTWltZVR5cGUoZmlsZS50eXBlLCBhbGxvd2VkVHlwZXMpKSk7XG4gICAgfVxuXG5cbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFBBR0VfRklMRV9EUkFHX0VWRU5UX1RBUkdFVCkgZXZlbnRUYXJnZXQ6IGFueSxcbiAgICAgICAgICAgICAgICBkcmFnU3RhdGU6IERyYWdTdGF0ZVRyYWNrZXJGYWN0b3J5KSB7XG5cbiAgICAgICAgaWYgKGV2ZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudFRhcmdldCA9IHdpbmRvdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZXZlbnQgdGFyZ2V0IGZvciBQYWdlRmlsZURyYWdIYW5kbGVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxlc0RyYWdnZWQkID0gZHJhZ1N0YXRlLnRyYWNrRWxlbWVudCh0aGlzLl9ldmVudFRhcmdldCk7XG4gICAgICAgIHRoaXMuZHJhZ0VudGVyID0gdGhpcy5maWxlc0RyYWdnZWQkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIobGlzdCA9PiBsaXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZHJhZ1N0b3AgPSB0aGlzLmZpbGVzRHJhZ2dlZCQucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihsaXN0ID0+IGxpc3QubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgIG1hcFRvKGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb21wb25lbnRzV2FudGluZ1RvUHJldmVudEZpbGVEcm9wID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgdGhpcy5fcHJldmVudEFjY2lkZW50YWxGaWxlRHJvcCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fZXZlbnRzQm91bmQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuZmlsZXNEcmFnZ2VkJC5zdWJzY3JpYmUoZHJhZ2dlZCA9PiB0aGlzLl9maWxlc0RyYWdnZWQgPSBkcmFnZ2VkKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5wcmV2ZW50QWNjaWRlbnRhbERyb3AsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLnByZXZlbnRBY2NpZGVudGFsRHJvcCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5wcmV2ZW50QWNjaWRlbnRhbERyb3AsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQm91bmQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB1bmJpbmRFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMucHJldmVudEFjY2lkZW50YWxEcm9wLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5wcmV2ZW50QWNjaWRlbnRhbERyb3AsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMucHJldmVudEFjY2lkZW50YWxEcm9wLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0JvdW5kID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByZXZlbnRGaWxlRHJvcE9uUGFnZUZvcihkaXJlY3RpdmU6IGFueSwgcHJldmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAocHJldmVudCkge1xuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50c1dhbnRpbmdUb1ByZXZlbnRGaWxlRHJvcC5hZGQoZGlyZWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNXYW50aW5nVG9QcmV2ZW50RmlsZURyb3AuZGVsZXRlKGRpcmVjdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldmVudEFjY2lkZW50YWxGaWxlRHJvcCA9IHRoaXMuX2NvbXBvbmVudHNXYW50aW5nVG9QcmV2ZW50RmlsZURyb3Auc2l6ZSA+IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmV2ZW50QWNjaWRlbnRhbERyb3AgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBsZXQgZGF0YVRyYW5zZmVyID0gZ2V0RGF0YVRyYW5zZmVyKGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZlbnRBY2NpZGVudGFsRmlsZURyb3AgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgdHJhbnNmZXJIYXNGaWxlcyhkYXRhVHJhbnNmZXIpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbm9uZSc7XG4gICAgICAgICAgICBkYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAnZHJvcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BQcmV2ZW50ZWQuZW1pdCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=