theme-lib
Version:
This is a simple example Angular Library published to npm.
412 lines • 29.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ComponentFactoryResolver, Inject, Injectable } from '@angular/core';
import { NbComponentPortal, NbOverlayService, NbPositionBuilderService, NbPositionHelper, patch, } from '../cdk';
import { NbToastrContainerComponent } from './toastr-container.component';
import { NB_TOASTR_CONFIG, NbToastrConfig } from './toastr-config';
import { NbToastStatus } from './model';
export class NbToastContainer {
/**
* @param {?} position
* @param {?} containerRef
* @param {?} positionHelper
*/
constructor(position, containerRef, positionHelper) {
this.position = position;
this.containerRef = containerRef;
this.positionHelper = positionHelper;
this.toasts = [];
}
/**
* @param {?} toast
* @return {?}
*/
attach(toast) {
if (toast.config.preventDuplicates && this.isDuplicate(toast)) {
return;
}
/** @type {?} */
const toastComponent = this.attachToast(toast);
if (toast.config.destroyByClick) {
this.subscribeOnClick(toastComponent, toast);
}
if (toast.config.duration) {
this.setDestroyTimeout(toast);
}
this.prevToast = toast;
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
isDuplicate(toast) {
return this.prevToast
&& this.prevToast.message === toast.message
&& this.prevToast.title === toast.title;
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
attachToast(toast) {
if (this.positionHelper.isTopPosition(toast.config.position)) {
return this.attachToTop(toast);
}
else {
return this.attachToBottom(toast);
}
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
attachToTop(toast) {
this.toasts.unshift(toast);
this.updateContainer();
return this.containerRef.instance.toasts.first;
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
attachToBottom(toast) {
this.toasts.push(toast);
this.updateContainer();
return this.containerRef.instance.toasts.last;
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
setDestroyTimeout(toast) {
setTimeout(() => this.destroy(toast), toast.config.duration);
}
/**
* @protected
* @param {?} toastComponent
* @param {?} toast
* @return {?}
*/
subscribeOnClick(toastComponent, toast) {
toastComponent.destroy.subscribe(() => this.destroy(toast));
}
/**
* @protected
* @param {?} toast
* @return {?}
*/
destroy(toast) {
this.toasts = this.toasts.filter(t => t !== toast);
this.updateContainer();
}
/**
* @protected
* @return {?}
*/
updateContainer() {
patch(this.containerRef, { content: this.toasts, position: this.position });
}
}
if (false) {
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.toasts;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.prevToast;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.position;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.containerRef;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.positionHelper;
}
export class NbToastrContainerRegistry {
/**
* @param {?} overlay
* @param {?} positionBuilder
* @param {?} positionHelper
* @param {?} cfr
*/
constructor(overlay, positionBuilder, positionHelper, cfr) {
this.overlay = overlay;
this.positionBuilder = positionBuilder;
this.positionHelper = positionHelper;
this.cfr = cfr;
this.overlays = new Map();
}
/**
* @param {?} position
* @return {?}
*/
get(position) {
/** @type {?} */
const logicalPosition = this.positionHelper.toLogicalPosition(position);
if (!this.overlays.has(logicalPosition)) {
this.instantiateContainer(logicalPosition);
}
return this.overlays.get(logicalPosition);
}
/**
* @protected
* @param {?} position
* @return {?}
*/
instantiateContainer(position) {
/** @type {?} */
const container = this.createContainer(position);
this.overlays.set(position, container);
}
/**
* @protected
* @param {?} position
* @return {?}
*/
createContainer(position) {
/** @type {?} */
const positionStrategy = this.positionBuilder.global().position(position);
/** @type {?} */
const ref = this.overlay.create({ positionStrategy });
/** @type {?} */
const containerRef = ref.attach(new NbComponentPortal(NbToastrContainerComponent, null, null, this.cfr));
return new NbToastContainer(position, containerRef, this.positionHelper);
}
}
NbToastrContainerRegistry.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbToastrContainerRegistry.ctorParameters = () => [
{ type: NbOverlayService },
{ type: NbPositionBuilderService },
{ type: NbPositionHelper },
{ type: ComponentFactoryResolver }
];
if (false) {
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.overlays;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.overlay;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.positionHelper;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.cfr;
}
/*
* The `NbToastrService` provides a capability to build toast notifications.
*
* @stacked-example(Showcase, toastr/toastr-showcase.component)
*
* `NbToastrService.show(message, title, config)` accepts three params, title and config are optional.
*
* ### Installation
*
* Import `NbToastrModule.forRoot()` to your app module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbToastrModule.forRoot(config),
* ],
* })
* export class AppModule { }
* ```
*
* ### Usage
*
* Config accepts following options:
*
* `position` - determines where on the screen toast will be rendered.
* Default is `top-end`.
*
* @stacked-example(Position, toastr/toastr-positions.component)
*
* `status` - coloring and icon of the toast.
* Default is `primary`
*
* @stacked-example(Status, toastr/toastr-statuses.component)
*
* `duration` - the time after which the toast will be destroyed.
* `0` means endless toast, that may be destroyed by click only.
* Default is 3000 ms.
*
* @stacked-example(Duration, toastr/toastr-duration.component)
*
* `destroyByClick` - provides a capability to destroy toast by click.
* Default is true.
*
* @stacked-example(Destroy by click, toastr/toastr-destroy-by-click.component)
*
* `preventDuplicates` - don't create new toast if it has the same title and the same message with previous one.
* Default is false.
*
* @stacked-example(Prevent duplicates, toastr/toastr-prevent-duplicates.component)
*
* `hasIcon` - if true then render toast icon.
* `icon` - you can pass icon class that will be applied into the toast.
*
* @stacked-example(Has icon, toastr/toastr-icon.component)
* */
export class NbToastrService {
/**
* @param {?} globalConfig
* @param {?} containerRegistry
*/
constructor(globalConfig, containerRegistry) {
this.globalConfig = globalConfig;
this.containerRegistry = containerRegistry;
}
/*
* Shows toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} userConfig
* @return {?}
*/
show(message, title, userConfig) {
/** @type {?} */
const config = new NbToastrConfig(Object.assign({}, this.globalConfig, userConfig));
/** @type {?} */
const container = this.containerRegistry.get(config.position);
/** @type {?} */
const toast = { message, title, config };
container.attach(toast);
}
/*
* Shows success toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
success(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.SUCCESS }));
}
/*
* Shows info toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
info(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.INFO }));
}
/*
* Shows warning toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
warning(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.WARNING }));
}
/*
* Shows primary toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
primary(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.PRIMARY }));
}
/*
* Shows danger toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
danger(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.DANGER }));
}
/*
* Shows default toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
default(message, title, config) {
return this.show(message, title, Object.assign({}, config, { status: NbToastStatus.DEFAULT }));
}
}
NbToastrService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbToastrService.ctorParameters = () => [
{ type: NbToastrConfig, decorators: [{ type: Inject, args: [NB_TOASTR_CONFIG,] }] },
{ type: NbToastrContainerRegistry }
];
if (false) {
/**
* @type {?}
* @protected
*/
NbToastrService.prototype.globalConfig;
/**
* @type {?}
* @protected
*/
NbToastrService.prototype.containerRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy90b2FzdHIvdG9hc3RyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBTUEsT0FBTyxFQUFFLHdCQUF3QixFQUFnQixNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFDTCxpQkFBaUIsRUFHakIsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsS0FBSyxHQUNOLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSWpELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQUkzQixZQUFzQixRQUEwQixFQUMxQixZQUFzRCxFQUN0RCxjQUFnQztRQUZoQyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBMEM7UUFDdEQsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBTDVDLFdBQU0sR0FBYyxFQUFFLENBQUM7SUFNakMsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsS0FBYztRQUNuQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3RCxPQUFPO1NBQ1I7O2NBRUssY0FBYyxHQUFxQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVoRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENB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QyxPQUFPLEVBQUUsS0FBSyxvQkFBTyxNQUFNLElBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxPQUFPLElBQUcsQ0FBQztJQUNqRixDQUFDOzs7Ozs7Ozs7O0lBS0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFNLEVBQUUsTUFBZ0M7UUFDdkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLG9CQUFPLE1BQU0sSUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sSUFBRyxDQUFDO0lBQ2pGLENBQUM7Ozs7Ozs7Ozs7SUFLRCxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQU0sRUFBRSxNQUFnQztRQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssb0JBQU8sTUFBTSxJQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxJQUFHLENBQUM7SUFDaEYsQ0FBQzs7Ozs7Ozs7OztJQUtELE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBTSxFQUFFLE1BQWdDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxvQkFBTyxNQUFNLElBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxPQUFPLElBQUcsQ0FBQztJQUNqRixDQUFDOzs7WUF4REYsVUFBVTs7OztZQXJLZ0IsY0FBYyx1QkF1SzFCLE1BQU0sU0FBQyxnQkFBZ0I7WUFDSyx5QkFBeUI7Ozs7Ozs7SUFEdEQsdUNBQWdFOzs7OztJQUNoRSw0Q0FBc0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBOYkNvbXBvbmVudFBvcnRhbCxcclxuICBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbixcclxuICBOYkdsb2JhbFBvc2l0aW9uLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gIE5iUG9zaXRpb25IZWxwZXIsXHJcbiAgcGF0Y2gsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTmJUb2FzdHJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0ci1jb250YWluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTkJfVE9BU1RSX0NPTkZJRywgTmJUb2FzdHJDb25maWcgfSBmcm9tICcuL3RvYXN0ci1jb25maWcnO1xyXG5pbXBvcnQgeyBOYlRvYXN0LCBOYlRvYXN0U3RhdHVzIH0gZnJvbSAnLi9tb2RlbCc7XHJcbmltcG9ydCB7IE5iVG9hc3RDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0LmNvbXBvbmVudCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE5iVG9hc3RDb250YWluZXIge1xyXG4gIHByb3RlY3RlZCB0b2FzdHM6IE5iVG9hc3RbXSA9IFtdO1xyXG4gIHByb3RlY3RlZCBwcmV2VG9hc3Q6IE5iVG9hc3Q7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwb3NpdGlvbjogTmJHbG9iYWxQb3NpdGlvbixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8TmJUb2FzdHJDb250YWluZXJDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwb3NpdGlvbkhlbHBlcjogTmJQb3NpdGlvbkhlbHBlcikge1xyXG4gIH1cclxuXHJcbiAgYXR0YWNoKHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICBpZiAodG9hc3QuY29uZmlnLnByZXZlbnREdXBsaWNhdGVzICYmIHRoaXMuaXNEdXBsaWNhdGUodG9hc3QpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b2FzdENvbXBvbmVudDogTmJUb2FzdENvbXBvbmVudCA9IHRoaXMuYXR0YWNoVG9hc3QodG9hc3QpO1xyXG5cclxuICAgIGlmICh0b2FzdC5jb25maWcuZGVzdHJveUJ5Q2xpY2spIHtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVPbkNsaWNrKHRvYXN0Q29tcG9uZW50LCB0b2FzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRvYXN0LmNvbmZpZy5kdXJhdGlvbikge1xyXG4gICAgICB0aGlzLnNldERlc3Ryb3lUaW1lb3V0KHRvYXN0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXZUb2FzdCA9IHRvYXN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHVwbGljYXRlKHRvYXN0OiBOYlRvYXN0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmV2VG9hc3RcclxuICAgICAgJiYgdGhpcy5wcmV2VG9hc3QubWVzc2FnZSA9PT0gdG9hc3QubWVzc2FnZVxyXG4gICAgICAmJiB0aGlzLnByZXZUb2FzdC50aXRsZSA9PT0gdG9hc3QudGl0bGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9hc3QodG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIGlmICh0aGlzLnBvc2l0aW9uSGVscGVyLmlzVG9wUG9zaXRpb24odG9hc3QuY29uZmlnLnBvc2l0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb1RvcCh0b2FzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb0JvdHRvbSh0b2FzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9Ub3AodG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIHRoaXMudG9hc3RzLnVuc2hpZnQodG9hc3QpO1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXIoKTtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS50b2FzdHMuZmlyc3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9Cb3R0b20odG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIHRoaXMudG9hc3RzLnB1c2godG9hc3QpO1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXIoKTtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS50b2FzdHMubGFzdDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZXREZXN0cm95VGltZW91dCh0b2FzdDogTmJUb2FzdCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRlc3Ryb3kodG9hc3QpLCB0b2FzdC5jb25maWcuZHVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uQ2xpY2sodG9hc3RDb21wb25lbnQ6IE5iVG9hc3RDb21wb25lbnQsIHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICB0b2FzdENvbXBvbmVudC5kZXN0cm95LnN1YnNjcmliZSgoKSA9PiB0aGlzLmRlc3Ryb3kodG9hc3QpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZXN0cm95KHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICB0aGlzLnRvYXN0cyA9IHRoaXMudG9hc3RzLmZpbHRlcih0ID0+IHQgIT09IHRvYXN0KTtcclxuICAgIHRoaXMudXBkYXRlQ29udGFpbmVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29udGFpbmVyKCkge1xyXG4gICAgcGF0Y2godGhpcy5jb250YWluZXJSZWYsIHsgY29udGVudDogdGhpcy50b2FzdHMsIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5iVG9hc3RyQ29udGFpbmVyUmVnaXN0cnkge1xyXG4gIHByb3RlY3RlZCBvdmVybGF5czogTWFwPE5iR2xvYmFsUG9zaXRpb24sIE5iVG9hc3RDb250YWluZXI+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3ZlcmxheTogTmJPdmVybGF5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcG9zaXRpb25CdWlsZGVyOiBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uSGVscGVyOiBOYlBvc2l0aW9uSGVscGVyLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBvc2l0aW9uOiBOYkdsb2JhbFBvc2l0aW9uKTogTmJUb2FzdENvbnRhaW5lciB7XHJcbiAgICBjb25zdCBsb2dpY2FsUG9zaXRpb246IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbkhlbHBlci50b0xvZ2ljYWxQb3NpdGlvbihwb3NpdGlvbik7XHJcblxyXG4gICAgaWYgKCF0aGlzLm92ZXJsYXlzLmhhcyhsb2dpY2FsUG9zaXRpb24pKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFudGlhdGVDb250YWluZXIobG9naWNhbFBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5cy5nZXQobG9naWNhbFBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnN0YW50aWF0ZUNvbnRhaW5lcihwb3NpdGlvbjogTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24pIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlQ29udGFpbmVyKHBvc2l0aW9uKTtcclxuICAgIHRoaXMub3ZlcmxheXMuc2V0KHBvc2l0aW9uLCBjb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbnRhaW5lcihwb3NpdGlvbjogTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24pOiBOYlRvYXN0Q29udGFpbmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLnBvc2l0aW9uQnVpbGRlci5nbG9iYWwoKS5wb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICBjb25zdCByZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHsgcG9zaXRpb25TdHJhdGVneSB9KTtcclxuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IHJlZi5hdHRhY2gobmV3IE5iQ29tcG9uZW50UG9ydGFsKE5iVG9hc3RyQ29udGFpbmVyQ29tcG9uZW50LCBudWxsLCBudWxsLCB0aGlzLmNmcikpO1xyXG4gICAgcmV0dXJuIG5ldyBOYlRvYXN0Q29udGFpbmVyKHBvc2l0aW9uLCBjb250YWluZXJSZWYsIHRoaXMucG9zaXRpb25IZWxwZXIpO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVGhlIGBOYlRvYXN0clNlcnZpY2VgIHByb3ZpZGVzIGEgY2FwYWJpbGl0eSB0byBidWlsZCB0b2FzdCBub3RpZmljYXRpb25zLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB0b2FzdHIvdG9hc3RyLXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogYE5iVG9hc3RyU2VydmljZS5zaG93KG1lc3NhZ2UsIHRpdGxlLCBjb25maWcpYCBhY2NlcHRzIHRocmVlIHBhcmFtcywgdGl0bGUgYW5kIGNvbmZpZyBhcmUgb3B0aW9uYWwuXHJcbiAqXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYlRvYXN0ck1vZHVsZS5mb3JSb290KClgIHRvIHlvdXIgYXBwIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iVG9hc3RyTW9kdWxlLmZvclJvb3QoY29uZmlnKSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIENvbmZpZyBhY2NlcHRzIGZvbGxvd2luZyBvcHRpb25zOlxyXG4gKlxyXG4gKiBgcG9zaXRpb25gIC0gZGV0ZXJtaW5lcyB3aGVyZSBvbiB0aGUgc2NyZWVuIHRvYXN0IHdpbGwgYmUgcmVuZGVyZWQuXHJcbiAqIERlZmF1bHQgaXMgYHRvcC1lbmRgLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFBvc2l0aW9uLCB0b2FzdHIvdG9hc3RyLXBvc2l0aW9ucy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBzdGF0dXNgIC0gY29sb3JpbmcgYW5kIGljb24gb2YgdGhlIHRvYXN0LlxyXG4gKiBEZWZhdWx0IGlzIGBwcmltYXJ5YFxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFN0YXR1cywgdG9hc3RyL3RvYXN0ci1zdGF0dXNlcy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBkdXJhdGlvbmAgLSB0aGUgdGltZSBhZnRlciB3aGljaCB0aGUgdG9hc3Qgd2lsbCBiZSBkZXN0cm95ZWQuXHJcbiAqIGAwYCBtZWFucyBlbmRsZXNzIHRvYXN0LCB0aGF0IG1heSBiZSBkZXN0cm95ZWQgYnkgY2xpY2sgb25seS5cclxuICogRGVmYXVsdCBpcyAzMDAwIG1zLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKER1cmF0aW9uLCB0b2FzdHIvdG9hc3RyLWR1cmF0aW9uLmNvbXBvbmVudClcclxuICpcclxuICogYGRlc3Ryb3lCeUNsaWNrYCAtIHByb3ZpZGVzIGEgY2FwYWJpbGl0eSB0byBkZXN0cm95IHRvYXN0IGJ5IGNsaWNrLlxyXG4gKiBEZWZhdWx0IGlzIHRydWUuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRGVzdHJveSBieSBjbGljaywgdG9hc3RyL3RvYXN0ci1kZXN0cm95LWJ5LWNsaWNrLmNvbXBvbmVudClcclxuICpcclxuICogYHByZXZlbnREdXBsaWNhdGVzYCAtIGRvbid0IGNyZWF0ZSBuZXcgdG9hc3QgaWYgaXQgaGFzIHRoZSBzYW1lIHRpdGxlIGFuZCB0aGUgc2FtZSBtZXNzYWdlIHdpdGggcHJldmlvdXMgb25lLlxyXG4gKiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFByZXZlbnQgZHVwbGljYXRlcywgdG9hc3RyL3RvYXN0ci1wcmV2ZW50LWR1cGxpY2F0ZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBgaGFzSWNvbmAgLSBpZiB0cnVlIHRoZW4gcmVuZGVyIHRvYXN0IGljb24uXHJcbiAqIGBpY29uYCAtIHlvdSBjYW4gcGFzcyBpY29uIGNsYXNzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIGludG8gdGhlIHRvYXN0LlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEhhcyBpY29uLCB0b2FzdHIvdG9hc3RyLWljb24uY29tcG9uZW50KVxyXG4gKiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlRvYXN0clNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkJfVE9BU1RSX0NPTkZJRykgcHJvdGVjdGVkIGdsb2JhbENvbmZpZzogTmJUb2FzdHJDb25maWcsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNvbnRhaW5lclJlZ2lzdHJ5OiBOYlRvYXN0ckNvbnRhaW5lclJlZ2lzdHJ5KSB7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgc2hvdyhtZXNzYWdlLCB0aXRsZT8sIHVzZXJDb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgY29uc3QgY29uZmlnID0gbmV3IE5iVG9hc3RyQ29uZmlnKHsgLi4udGhpcy5nbG9iYWxDb25maWcsIC4uLnVzZXJDb25maWcgfSk7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZ2lzdHJ5LmdldChjb25maWcucG9zaXRpb24pO1xyXG4gICAgY29uc3QgdG9hc3QgPSB7IG1lc3NhZ2UsIHRpdGxlLCBjb25maWcgfTtcclxuICAgIGNvbnRhaW5lci5hdHRhY2godG9hc3QpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTaG93cyBzdWNjZXNzIHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgc3VjY2VzcyhtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLlNVQ0NFU1MgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIGluZm8gdG9hc3Qgd2l0aCBtZXNzYWdlLCB0aXRsZSBhbmQgdXNlciBjb25maWcuXHJcbiAgICogKi9cclxuICBpbmZvKG1lc3NhZ2UsIHRpdGxlPywgY29uZmlnPzogUGFydGlhbDxOYlRvYXN0ckNvbmZpZz4pIHtcclxuICAgIHJldHVybiB0aGlzLnNob3cobWVzc2FnZSwgdGl0bGUsIHsgLi4uY29uZmlnLCBzdGF0dXM6IE5iVG9hc3RTdGF0dXMuSU5GTyB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU2hvd3Mgd2FybmluZyB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIHdhcm5pbmcobWVzc2FnZSwgdGl0bGU/LCBjb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyhtZXNzYWdlLCB0aXRsZSwgeyAuLi5jb25maWcsIHN0YXR1czogTmJUb2FzdFN0YXR1cy5XQVJOSU5HIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTaG93cyBwcmltYXJ5IHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgcHJpbWFyeShtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLlBSSU1BUlkgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIGRhbmdlciB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIGRhbmdlcihtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLkRBTkdFUiB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU2hvd3MgZGVmYXVsdCB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIGRlZmF1bHQobWVzc2FnZSwgdGl0bGU/LCBjb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyhtZXNzYWdlLCB0aXRsZSwgeyAuLi5jb25maWcsIHN0YXR1czogTmJUb2FzdFN0YXR1cy5ERUZBVUxUIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=