UNPKG

gentics-ui-core

Version:

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

155 lines 19.5 kB
import { Injectable, EventEmitter, ComponentFactoryResolver } from '@angular/core'; import { Toast } from './toast.component'; import { OverlayHostService } from '../overlay-host/overlay-host.service'; import * as i0 from "@angular/core"; import * as i1 from "../overlay-host/overlay-host.service"; const defaultOptions = { message: '', type: 'default', delay: 3000, dismissOnClick: true }; /** * A toast notification service. Depends on the [`<gtx-overlay-host>`](#/overlay-host) being present in the app. * * ```typescript * let dismiss = this.notification.show({ * message: 'Content Saved', * type: 'success', * delay: 3000 * }); * * // to manually dismiss the toast * dismiss(); * ``` * * ## `INotificationOptions` * * The `show()` method takes an `INotificationOptions` object as its argument: * * | Property | Type | Default | Description | * | -------- | ------------------------------ | ------- | ----------- | * | **message** | `string` | '' | The message to display | * | **type** | `'default'`,`'error'`,`'success'`,`'warning'` | 'default' | The style of toast | * | **delay** | `number` | 3000 | ms before toast is dismissed. 0 == no dismiss | * | **dismissOnClick** | `boolean` | true | If true, the toast can be dismissed by click or swipe| * | **action.label** | `string` | | Optional action label | * | **action.onClick** | `Function` | | Callback if action label is clicked | * */ export class Notification { constructor(componentFactoryResolver, overlayHostService) { this.componentFactoryResolver = componentFactoryResolver; this.open$ = new EventEmitter(); this.openToasts = []; /* * Spacing between stacked toasts */ this.verticalMargin = 10; overlayHostService.getHostView().then(view => { this.hostViewContainer = view; }); } /** * Show a toast notification. Returns an object with a dismiss() method, which will * dismiss the toast when invoked. */ show(options) { let mergedOptions = Object.assign({}, defaultOptions, options); let toast = this.createToast(mergedOptions); return { dismiss: () => toast.dismissFn() }; } /** * Used internally by the [OverlayHost](#/overlay-host) to clean up. */ destroyAllToasts() { this.openToasts.forEach((o) => { if (typeof o.toast.dismissFn === 'function') { o.toast.dismissFn(); } }); this.openToasts = []; } /** * Dispose of the Toast component and remove its reference from the * openToasts array. */ destroyToast(componentRef) { let toast = componentRef.instance; let index = this.getToastIndex(toast); if (-1 < index) { let timer = this.openToasts[index].dismissTimer; if (timer) { clearTimeout(timer); } this.openToasts.splice(index, 1); } toast.startDismiss(); setTimeout(() => { componentRef.destroy(); this.positionOpenToasts(); }, 200); } /** * Dynamically create and load a new Toast component next to the * NotificationHost component in the DOM. */ createToast(options) { let toastFactory = this.componentFactoryResolver.resolveComponentFactory(Toast); let ref = this.hostViewContainer.createComponent(toastFactory); let toast = ref.instance; let dismissTimer; toast.message = options.message; toast.type = options.type; toast.dismissOnClick = options.dismissOnClick; toast.dismissFn = () => this.destroyToast(ref); if (options.action && options.action.label) { toast.actionLabel = options.action.label; } if (options.action && options.action.onClick) { toast.actionOnClick = options.action.onClick; } if (0 < options.delay) { dismissTimer = setTimeout(() => toast.dismissFn(), options.delay); } this.openToasts.unshift({ toast, dismissTimer }); this.positionOpenToasts(); return toast; } positionOpenToasts() { setTimeout(() => { this.openToasts.forEach((o) => { o.toast.position.top = this.getToastTop(o.toast); }); }); } /** * Calculates the value of the "top" offset for this toast by adding up * the heights of the other toasts which are open above this one. */ getToastTop(toast) { let index = this.getToastIndex(toast); return this.openToasts .filter((o, i) => i < index) .reduce((top, o) => { return top += o.toast.getHeight() + this.verticalMargin; }, 0); } /** * Returns the index of the toast object in the openToasts array. */ getToastIndex(toast) { return this.openToasts.map((o) => o.toast).indexOf(toast); } } /** @nocollapse */ Notification.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.OverlayHostService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ Notification.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Notification, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.OverlayHostService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFVBQVUsRUFDVixZQUFZLEVBQ1osd0JBQXdCLEVBRTNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQzs7O0FBaUJ4RSxNQUFNLGNBQWMsR0FBeUI7SUFDekMsT0FBTyxFQUFFLEVBQUU7SUFDWCxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxJQUFJO0lBQ1gsY0FBYyxFQUFFLElBQUk7Q0FDdkIsQ0FBQztBQU9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQVVyQixZQUFvQix3QkFBa0QsRUFDMUQsa0JBQXNDO1FBRDlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFSdEUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRXpDLGVBQVUsR0FBaUIsRUFBRSxDQUFDO1FBQ3RDOztXQUVHO1FBQ0ssbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFJaEMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLE9BQTZCO1FBQ3JDLElBQUksYUFBYSxHQUF5QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYs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ICAgSW5qZWN0YWJsZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RvYXN0LCBUb2FzdFR5cGV9IGZyb20gJy4vdG9hc3QuY29tcG9uZW50JztcbmltcG9ydCB7T3ZlcmxheUhvc3RTZXJ2aWNlfSBmcm9tICcuLi9vdmVybGF5LWhvc3Qvb3ZlcmxheS1ob3N0LnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElOb3RpZmljYXRpb25PcHRpb25zIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdHlwZT86IFRvYXN0VHlwZXxzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5vdGlmaWNhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzbWlzc2VkIGFmdGVyIHRoaXMgZGVsYXkuXG4gICAgICogVG8gdHVybiBvZmYgYXV0by1kaXNtaXNzYWwsIHNldCB0aGlzIHRvIDAuXG4gICAgICovXG4gICAgZGVsYXk/OiBudW1iZXI7XG4gICAgZGlzbWlzc09uQ2xpY2s/OiBib29sZWFuO1xuICAgIGFjdGlvbj86IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgb25DbGljaz86IEZ1bmN0aW9uO1xuICAgIH07XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBJTm90aWZpY2F0aW9uT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgZGVsYXk6IDMwMDAsXG4gICAgZGlzbWlzc09uQ2xpY2s6IHRydWVcbn07XG5cbmludGVyZmFjZSBJT3BlblRvYXN0IHtcbiAgICB0b2FzdDogVG9hc3Q7XG4gICAgZGlzbWlzc1RpbWVyOiBhbnk7XG59XG5cbi8qKlxuICogQSB0b2FzdCBub3RpZmljYXRpb24gc2VydmljZS4gRGVwZW5kcyBvbiB0aGUgW2A8Z3R4LW92ZXJsYXktaG9zdD5gXSgjL292ZXJsYXktaG9zdCkgYmVpbmcgcHJlc2VudCBpbiB0aGUgYXBwLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGxldCBkaXNtaXNzID0gdGhpcy5ub3RpZmljYXRpb24uc2hvdyh7XG4gKiAgICAgbWVzc2FnZTogJ0NvbnRlbnQgU2F2ZWQnLFxuICogICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAqICAgICBkZWxheTogMzAwMFxuICogfSk7XG4gKlxuICogLy8gdG8gbWFudWFsbHkgZGlzbWlzcyB0aGUgdG9hc3RcbiAqIGRpc21pc3MoKTtcbiAqIGBgYFxuICpcbiAqICMjIGBJTm90aWZpY2F0aW9uT3B0aW9uc2BcbiAqXG4gKiBUaGUgYHNob3coKWAgbWV0aG9kIHRha2VzIGFuIGBJTm90aWZpY2F0aW9uT3B0aW9uc2Agb2JqZWN0IGFzIGl0cyBhcmd1bWVudDpcbiAqXG4gKiB8IFByb3BlcnR5ICAgICAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgICB8IERlc2NyaXB0aW9uIHxcbiAqIHwgLS0tLS0tLS0gICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIHwgLS0tLS0tLSAgIHwgLS0tLS0tLS0tLS0gfFxuICogfCAqKm1lc3NhZ2UqKiAgICAgICAgfCBgc3RyaW5nYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnJyAgICAgICAgfCBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IHxcbiAqIHwgKip0eXBlKiogICAgICAgICAgIHwgYCdkZWZhdWx0J2AsYCdlcnJvcidgLGAnc3VjY2VzcydgLGAnd2FybmluZydgIHwgJ2RlZmF1bHQnIHwgVGhlIHN0eWxlIG9mIHRvYXN0IHxcbiAqIHwgKipkZWxheSoqICAgICAgICAgIHwgYG51bWJlcmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzAwMCAgICAgIHwgbXMgYmVmb3JlIHRvYXN0IGlzIGRpc21pc3NlZC4gMCA9PSBubyBkaXNtaXNzIHxcbiAqIHwgKipkaXNtaXNzT25DbGljayoqIHwgYGJvb2xlYW5gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZSAgICAgIHwgSWYgdHJ1ZSwgdGhlIHRvYXN0IGNhbiBiZSBkaXNtaXNzZWQgYnkgY2xpY2sgb3Igc3dpcGV8XG4gKiB8ICoqYWN0aW9uLmxhYmVsKiogICB8IGBzdHJpbmdgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IE9wdGlvbmFsIGFjdGlvbiBsYWJlbCB8XG4gKiB8ICoqYWN0aW9uLm9uQ2xpY2sqKiB8IGBGdW5jdGlvbmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IENhbGxiYWNrIGlmIGFjdGlvbiBsYWJlbCBpcyBjbGlja2VkIHxcbiAqXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuXG4gICAgb3BlbiQgPSBuZXcgRXZlbnRFbWl0dGVyPElOb3RpZmljYXRpb25PcHRpb25zPigpO1xuICAgIHByaXZhdGUgaG9zdFZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gICAgcHJpdmF0ZSBvcGVuVG9hc3RzOiBJT3BlblRvYXN0W10gPSBbXTtcbiAgICAvKlxuICAgICAqIFNwYWNpbmcgYmV0d2VlbiBzdGFja2VkIHRvYXN0c1xuICAgICAqL1xuICAgIHByaXZhdGUgdmVydGljYWxNYXJnaW46IG51bWJlciA9IDEwO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5SG9zdFNlcnZpY2U6IE92ZXJsYXlIb3N0U2VydmljZSkge1xuICAgICAgICBvdmVybGF5SG9zdFNlcnZpY2UuZ2V0SG9zdFZpZXcoKS50aGVuKHZpZXcgPT4ge1xuICAgICAgICAgICAgdGhpcy5ob3N0Vmlld0NvbnRhaW5lciA9IHZpZXc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYSB0b2FzdCBub3RpZmljYXRpb24uIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkaXNtaXNzKCkgbWV0aG9kLCB3aGljaCB3aWxsXG4gICAgICogZGlzbWlzcyB0aGUgdG9hc3Qgd2hlbiBpbnZva2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KG9wdGlvbnM6IElOb3RpZmljYXRpb25PcHRpb25zKTogeyBkaXNtaXNzOiAoKSA9PiB2b2lkIH0ge1xuICAgICAgICBsZXQgbWVyZ2VkT3B0aW9uczogSU5vdGlmaWNhdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGxldCB0b2FzdCA9IHRoaXMuY3JlYXRlVG9hc3QobWVyZ2VkT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNtaXNzOiAoKTogdm9pZCA9PiB0b2FzdC5kaXNtaXNzRm4oKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgW092ZXJsYXlIb3N0XSgjL292ZXJsYXktaG9zdCkgdG8gY2xlYW4gdXAuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3lBbGxUb2FzdHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlblRvYXN0cy5mb3JFYWNoKChvOiBJT3BlblRvYXN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG8udG9hc3QuZGlzbWlzc0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgby50b2FzdC5kaXNtaXNzRm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3BlblRvYXN0cyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgdGhlIFRvYXN0IGNvbXBvbmVudCBhbmQgcmVtb3ZlIGl0cyByZWZlcmVuY2UgZnJvbSB0aGVcbiAgICAgKiBvcGVuVG9hc3RzIGFycmF5LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVzdHJveVRvYXN0KGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRvYXN0Pik6IHZvaWQge1xuICAgICAgICBsZXQgdG9hc3Q6IFRvYXN0ID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFRvYXN0SW5kZXgodG9hc3QpO1xuICAgICAgICBpZiAoLTEgPCBpbmRleCkge1xuICAgICAgICAgICAgbGV0IHRpbWVyOiBhbnkgPSB0aGlzLm9wZW5Ub2FzdHNbaW5kZXhdLmRpc21pc3NUaW1lcjtcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wZW5Ub2FzdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0b2FzdC5zdGFydERpc21pc3MoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbk9wZW5Ub2FzdHMoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEeW5hbWljYWxseSBjcmVhdGUgYW5kIGxvYWQgYSBuZXcgVG9hc3QgY29tcG9uZW50IG5leHQgdG8gdGhlXG4gICAgICogTm90aWZpY2F0aW9uSG9zdCBjb21wb25lbnQgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVRvYXN0KG9wdGlvbnM6IElOb3RpZmljYXRpb25PcHRpb25zKTogVG9hc3Qge1xuICAgICAgICBsZXQgdG9hc3RGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoVG9hc3QpO1xuICAgICAgICBsZXQgcmVmID0gdGhpcy5ob3N0Vmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodG9hc3RGYWN0b3J5KTtcbiAgICAgICAgbGV0IHRvYXN0OiBUb2FzdCA9IHJlZi5pbnN0YW5jZTtcblxuICAgICAgICBsZXQgZGlzbWlzc1RpbWVyOiBhbnk7XG4gICAgICAgIHRvYXN0Lm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgICAgIHRvYXN0LnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRvYXN0LmRpc21pc3NPbkNsaWNrID0gb3B0aW9ucy5kaXNtaXNzT25DbGljaztcbiAgICAgICAgdG9hc3QuZGlzbWlzc0ZuID0gKCkgPT4gdGhpcy5kZXN0cm95VG9hc3QocmVmKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hY3Rpb24gJiYgb3B0aW9ucy5hY3Rpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHRvYXN0LmFjdGlvbkxhYmVsID0gb3B0aW9ucy5hY3Rpb24ubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYWN0aW9uICYmIG9wdGlvbnMuYWN0aW9uLm9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRvYXN0LmFjdGlvbk9uQ2xpY2sgPSBvcHRpb25zLmFjdGlvbi5vbkNsaWNrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKDAgPCBvcHRpb25zLmRlbGF5KSB7XG4gICAgICAgICAgICBkaXNtaXNzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LmRpc21pc3NGbigpLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlblRvYXN0cy51bnNoaWZ0KHtcbiAgICAgICAgICAgIHRvYXN0LFxuICAgICAgICAgICAgZGlzbWlzc1RpbWVyXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc2l0aW9uT3BlblRvYXN0cygpO1xuICAgICAgICByZXR1cm4gdG9hc3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3NpdGlvbk9wZW5Ub2FzdHMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGVuVG9hc3RzLmZvckVhY2goKG86IElPcGVuVG9hc3QpID0+IHtcbiAgICAgICAgICAgICAgICBvLnRvYXN0LnBvc2l0aW9uLnRvcCA9IHRoaXMuZ2V0VG9hc3RUb3Aoby50b2FzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWUgb2YgdGhlIFwidG9wXCIgb2Zmc2V0IGZvciB0aGlzIHRvYXN0IGJ5IGFkZGluZyB1cFxuICAgICAqIHRoZSBoZWlnaHRzIG9mIHRoZSBvdGhlciB0b2FzdHMgd2hpY2ggYXJlIG9wZW4gYWJvdmUgdGhpcyBvbmUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRUb2FzdFRvcCh0b2FzdDogVG9hc3QpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFRvYXN0SW5kZXgodG9hc3QpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Ub2FzdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKG86IElPcGVuVG9hc3QsIGk6IG51bWJlcikgPT4gaSA8IGluZGV4KVxuICAgICAgICAgICAgLnJlZHVjZSgodG9wOiBudW1iZXIsIG86IElPcGVuVG9hc3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9wICs9IG8udG9hc3QuZ2V0SGVpZ2h0KCkgKyB0aGlzLnZlcnRpY2FsTWFyZ2luO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRvYXN0IG9iamVjdCBpbiB0aGUgb3BlblRvYXN0cyBhcnJheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvYXN0SW5kZXgodG9hc3Q6IFRvYXN0KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlblRvYXN0cy5tYXAoKG86IElPcGVuVG9hc3QpID0+IG8udG9hc3QpLmluZGV4T2YodG9hc3QpO1xuICAgIH1cbn1cbiJdfQ==