You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
38 KiB
280 lines
38 KiB
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import { LiveAnnouncer } from '@angular/cdk/a11y';
|
|
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
|
|
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
|
|
import { Inject, Injectable, InjectionToken, Injector, Optional, SkipSelf, TemplateRef, } from '@angular/core';
|
|
import { takeUntil } from 'rxjs/operators';
|
|
import { SimpleSnackBar } from './simple-snack-bar';
|
|
import { MAT_SNACK_BAR_DATA, MatSnackBarConfig } from './snack-bar-config';
|
|
import { MatSnackBarContainer } from './snack-bar-container';
|
|
import { MatSnackBarModule } from './snack-bar-module';
|
|
import { MatSnackBarRef } from './snack-bar-ref';
|
|
import * as i0 from "@angular/core";
|
|
import * as i1 from "@angular/cdk/overlay";
|
|
import * as i2 from "@angular/cdk/a11y";
|
|
import * as i3 from "@angular/cdk/layout";
|
|
import * as i4 from "./snack-bar-module";
|
|
/** Injection token that can be used to specify default snack bar. */
|
|
import * as ɵngcc0 from '@angular/core';
|
|
import * as ɵngcc1 from '@angular/cdk/overlay';
|
|
import * as ɵngcc2 from '@angular/cdk/a11y';
|
|
import * as ɵngcc3 from '@angular/cdk/layout';
|
|
import * as ɵngcc4 from './snack-bar-config';
|
|
export const MAT_SNACK_BAR_DEFAULT_OPTIONS = new InjectionToken('mat-snack-bar-default-options', {
|
|
providedIn: 'root',
|
|
factory: MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY,
|
|
});
|
|
/** @docs-private */
|
|
export function MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY() {
|
|
return new MatSnackBarConfig();
|
|
}
|
|
/**
|
|
* Service to dispatch Material Design snack bar messages.
|
|
*/
|
|
export class MatSnackBar {
|
|
constructor(_overlay, _live, _injector, _breakpointObserver, _parentSnackBar, _defaultConfig) {
|
|
this._overlay = _overlay;
|
|
this._live = _live;
|
|
this._injector = _injector;
|
|
this._breakpointObserver = _breakpointObserver;
|
|
this._parentSnackBar = _parentSnackBar;
|
|
this._defaultConfig = _defaultConfig;
|
|
/**
|
|
* Reference to the current snack bar in the view *at this level* (in the Angular injector tree).
|
|
* If there is a parent snack-bar service, all operations should delegate to that parent
|
|
* via `_openedSnackBarRef`.
|
|
*/
|
|
this._snackBarRefAtThisLevel = null;
|
|
/** The component that should be rendered as the snack bar's simple component. */
|
|
this.simpleSnackBarComponent = SimpleSnackBar;
|
|
/** The container component that attaches the provided template or component. */
|
|
this.snackBarContainerComponent = MatSnackBarContainer;
|
|
/** The CSS class to apply for handset mode. */
|
|
this.handsetCssClass = 'mat-snack-bar-handset';
|
|
}
|
|
/** Reference to the currently opened snackbar at *any* level. */
|
|
get _openedSnackBarRef() {
|
|
const parent = this._parentSnackBar;
|
|
return parent ? parent._openedSnackBarRef : this._snackBarRefAtThisLevel;
|
|
}
|
|
set _openedSnackBarRef(value) {
|
|
if (this._parentSnackBar) {
|
|
this._parentSnackBar._openedSnackBarRef = value;
|
|
}
|
|
else {
|
|
this._snackBarRefAtThisLevel = value;
|
|
}
|
|
}
|
|
/**
|
|
* Creates and dispatches a snack bar with a custom component for the content, removing any
|
|
* currently opened snack bars.
|
|
*
|
|
* @param component Component to be instantiated.
|
|
* @param config Extra configuration for the snack bar.
|
|
*/
|
|
openFromComponent(component, config) {
|
|
return this._attach(component, config);
|
|
}
|
|
/**
|
|
* Creates and dispatches a snack bar with a custom template for the content, removing any
|
|
* currently opened snack bars.
|
|
*
|
|
* @param template Template to be instantiated.
|
|
* @param config Extra configuration for the snack bar.
|
|
*/
|
|
openFromTemplate(template, config) {
|
|
return this._attach(template, config);
|
|
}
|
|
/**
|
|
* Opens a snackbar with a message and an optional action.
|
|
* @param message The message to show in the snackbar.
|
|
* @param action The label for the snackbar action.
|
|
* @param config Additional configuration options for the snackbar.
|
|
*/
|
|
open(message, action = '', config) {
|
|
const _config = Object.assign(Object.assign({}, this._defaultConfig), config);
|
|
// Since the user doesn't have access to the component, we can
|
|
// override the data to pass in our own message and action.
|
|
_config.data = { message, action };
|
|
// Since the snack bar has `role="alert"`, we don't
|
|
// want to announce the same message twice.
|
|
if (_config.announcementMessage === message) {
|
|
_config.announcementMessage = undefined;
|
|
}
|
|
return this.openFromComponent(this.simpleSnackBarComponent, _config);
|
|
}
|
|
/**
|
|
* Dismisses the currently-visible snack bar.
|
|
*/
|
|
dismiss() {
|
|
if (this._openedSnackBarRef) {
|
|
this._openedSnackBarRef.dismiss();
|
|
}
|
|
}
|
|
ngOnDestroy() {
|
|
// Only dismiss the snack bar at the current level on destroy.
|
|
if (this._snackBarRefAtThisLevel) {
|
|
this._snackBarRefAtThisLevel.dismiss();
|
|
}
|
|
}
|
|
/**
|
|
* Attaches the snack bar container component to the overlay.
|
|
*/
|
|
_attachSnackBarContainer(overlayRef, config) {
|
|
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
const injector = Injector.create({
|
|
parent: userInjector || this._injector,
|
|
providers: [{ provide: MatSnackBarConfig, useValue: config }]
|
|
});
|
|
const containerPortal = new ComponentPortal(this.snackBarContainerComponent, config.viewContainerRef, injector);
|
|
const containerRef = overlayRef.attach(containerPortal);
|
|
containerRef.instance.snackBarConfig = config;
|
|
return containerRef.instance;
|
|
}
|
|
/**
|
|
* Places a new component or a template as the content of the snack bar container.
|
|
*/
|
|
_attach(content, userConfig) {
|
|
const config = Object.assign(Object.assign(Object.assign({}, new MatSnackBarConfig()), this._defaultConfig), userConfig);
|
|
const overlayRef = this._createOverlay(config);
|
|
const container = this._attachSnackBarContainer(overlayRef, config);
|
|
const snackBarRef = new MatSnackBarRef(container, overlayRef);
|
|
if (content instanceof TemplateRef) {
|
|
const portal = new TemplatePortal(content, null, {
|
|
$implicit: config.data,
|
|
snackBarRef
|
|
});
|
|
snackBarRef.instance = container.attachTemplatePortal(portal);
|
|
}
|
|
else {
|
|
const injector = this._createInjector(config, snackBarRef);
|
|
const portal = new ComponentPortal(content, undefined, injector);
|
|
const contentRef = container.attachComponentPortal(portal);
|
|
// We can't pass this via the injector, because the injector is created earlier.
|
|
snackBarRef.instance = contentRef.instance;
|
|
}
|
|
// Subscribe to the breakpoint observer and attach the mat-snack-bar-handset class as
|
|
// appropriate. This class is applied to the overlay element because the overlay must expand to
|
|
// fill the width of the screen for full width snackbars.
|
|
this._breakpointObserver.observe(Breakpoints.HandsetPortrait).pipe(takeUntil(overlayRef.detachments())).subscribe(state => {
|
|
const classList = overlayRef.overlayElement.classList;
|
|
state.matches ? classList.add(this.handsetCssClass) : classList.remove(this.handsetCssClass);
|
|
});
|
|
if (config.announcementMessage) {
|
|
// Wait until the snack bar contents have been announced then deliver this message.
|
|
container._onAnnounce.subscribe(() => {
|
|
this._live.announce(config.announcementMessage, config.politeness);
|
|
});
|
|
}
|
|
this._animateSnackBar(snackBarRef, config);
|
|
this._openedSnackBarRef = snackBarRef;
|
|
return this._openedSnackBarRef;
|
|
}
|
|
/** Animates the old snack bar out and the new one in. */
|
|
_animateSnackBar(snackBarRef, config) {
|
|
// When the snackbar is dismissed, clear the reference to it.
|
|
snackBarRef.afterDismissed().subscribe(() => {
|
|
// Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.
|
|
if (this._openedSnackBarRef == snackBarRef) {
|
|
this._openedSnackBarRef = null;
|
|
}
|
|
if (config.announcementMessage) {
|
|
this._live.clear();
|
|
}
|
|
});
|
|
if (this._openedSnackBarRef) {
|
|
// If a snack bar is already in view, dismiss it and enter the
|
|
// new snack bar after exit animation is complete.
|
|
this._openedSnackBarRef.afterDismissed().subscribe(() => {
|
|
snackBarRef.containerInstance.enter();
|
|
});
|
|
this._openedSnackBarRef.dismiss();
|
|
}
|
|
else {
|
|
// If no snack bar is in view, enter the new snack bar.
|
|
snackBarRef.containerInstance.enter();
|
|
}
|
|
// If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.
|
|
if (config.duration && config.duration > 0) {
|
|
snackBarRef.afterOpened().subscribe(() => snackBarRef._dismissAfter(config.duration));
|
|
}
|
|
}
|
|
/**
|
|
* Creates a new overlay and places it in the correct location.
|
|
* @param config The user-specified snack bar config.
|
|
*/
|
|
_createOverlay(config) {
|
|
const overlayConfig = new OverlayConfig();
|
|
overlayConfig.direction = config.direction;
|
|
let positionStrategy = this._overlay.position().global();
|
|
// Set horizontal position.
|
|
const isRtl = config.direction === 'rtl';
|
|
const isLeft = (config.horizontalPosition === 'left' ||
|
|
(config.horizontalPosition === 'start' && !isRtl) ||
|
|
(config.horizontalPosition === 'end' && isRtl));
|
|
const isRight = !isLeft && config.horizontalPosition !== 'center';
|
|
if (isLeft) {
|
|
positionStrategy.left('0');
|
|
}
|
|
else if (isRight) {
|
|
positionStrategy.right('0');
|
|
}
|
|
else {
|
|
positionStrategy.centerHorizontally();
|
|
}
|
|
// Set horizontal position.
|
|
if (config.verticalPosition === 'top') {
|
|
positionStrategy.top('0');
|
|
}
|
|
else {
|
|
positionStrategy.bottom('0');
|
|
}
|
|
overlayConfig.positionStrategy = positionStrategy;
|
|
return this._overlay.create(overlayConfig);
|
|
}
|
|
/**
|
|
* Creates an injector to be used inside of a snack bar component.
|
|
* @param config Config that was used to create the snack bar.
|
|
* @param snackBarRef Reference to the snack bar.
|
|
*/
|
|
_createInjector(config, snackBarRef) {
|
|
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
return Injector.create({
|
|
parent: userInjector || this._injector,
|
|
providers: [
|
|
{ provide: MatSnackBarRef, useValue: snackBarRef },
|
|
{ provide: MAT_SNACK_BAR_DATA, useValue: config.data }
|
|
]
|
|
});
|
|
}
|
|
}
|
|
MatSnackBar.ɵfac = function MatSnackBar_Factory(t) { return new (t || MatSnackBar)(ɵngcc0.ɵɵinject(ɵngcc1.Overlay), ɵngcc0.ɵɵinject(ɵngcc2.LiveAnnouncer), ɵngcc0.ɵɵinject(ɵngcc0.Injector), ɵngcc0.ɵɵinject(ɵngcc3.BreakpointObserver), ɵngcc0.ɵɵinject(MatSnackBar, 12), ɵngcc0.ɵɵinject(MAT_SNACK_BAR_DEFAULT_OPTIONS)); };
|
|
MatSnackBar.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatSnackBar_Factory() { return new MatSnackBar(i0.ɵɵinject(i1.Overlay), i0.ɵɵinject(i2.LiveAnnouncer), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i3.BreakpointObserver), i0.ɵɵinject(MatSnackBar, 12), i0.ɵɵinject(MAT_SNACK_BAR_DEFAULT_OPTIONS)); }, token: MatSnackBar, providedIn: i4.MatSnackBarModule });
|
|
MatSnackBar.ctorParameters = () => [
|
|
{ type: Overlay },
|
|
{ type: LiveAnnouncer },
|
|
{ type: Injector },
|
|
{ type: BreakpointObserver },
|
|
{ type: MatSnackBar, decorators: [{ type: Optional }, { type: SkipSelf }] },
|
|
{ type: MatSnackBarConfig, decorators: [{ type: Inject, args: [MAT_SNACK_BAR_DEFAULT_OPTIONS,] }] }
|
|
];
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSnackBar, [{
|
|
type: Injectable,
|
|
args: [{ providedIn: MatSnackBarModule }]
|
|
}], function () { return [{ type: ɵngcc1.Overlay }, { type: ɵngcc2.LiveAnnouncer }, { type: ɵngcc0.Injector }, { type: ɵngcc3.BreakpointObserver }, { type: MatSnackBar, decorators: [{
|
|
type: Optional
|
|
}, {
|
|
type: SkipSelf
|
|
}] }, { type: ɵngcc4.MatSnackBarConfig, decorators: [{
|
|
type: Inject,
|
|
args: [MAT_SNACK_BAR_DEFAULT_OPTIONS]
|
|
}] }]; }, null); })();
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hY2stYmFyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc25hY2stYmFyL3NuYWNrLWJhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBRUgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBYSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxlQUFlLEVBQWlCLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25GLE9BQU8sRUFHTCxNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBbUIsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFDLG9CQUFvQixFQUFxQixNQUFNLHVCQUF1QixDQUFDO0FBQy9FLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQztBQUVtQztBQUMxQjtBQUNKO0FBQTJDO0FBRmhELHFFQUFxRTs7Ozs7O0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUN0QyxJQUFJLGNBQWMsQ0FBb0IsK0JBQStCLEVBQUU7QUFDM0UsSUFBTSxVQUFVLEVBQUUsTUFBTTtBQUN4QixJQUFNLE9BQU8s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dEMsTUFBTSxTQUFDLDZCQUE2QjtBQUFROzs7Ozs7Ozs7OztrQ0FBRTtBQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7TGl2ZUFubm91bmNlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRzfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcbmltcG9ydCB7T3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWwsIENvbXBvbmVudFR5cGUsIFRlbXBsYXRlUG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgT3B0aW9uYWwsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgT25EZXN0cm95LCBUeXBlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1RleHRPbmx5U25hY2tCYXIsIFNpbXBsZVNuYWNrQmFyfSBmcm9tICcuL3NpbXBsZS1zbmFjay1iYXInO1xuaW1wb3J0IHtNQVRfU05BQ0tfQkFSX0RBVEEsIE1hdFNuYWNrQmFyQ29uZmlnfSBmcm9tICcuL3NuYWNrLWJhci1jb25maWcnO1xuaW1wb3J0IHtNYXRTbmFja0JhckNvbnRhaW5lciwgX1NuYWNrQmFyQ29udGFpbmVyfSBmcm9tICcuL3NuYWNrLWJhci1jb250YWluZXInO1xuaW1wb3J0IHtNYXRTbmFja0Jhck1vZHVsZX0gZnJvbSAnLi9zbmFjay1iYXItbW9kdWxlJztcbmltcG9ydCB7TWF0U25hY2tCYXJSZWZ9IGZyb20gJy4vc25hY2stYmFyLXJlZic7XG5cblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBzbmFjayBiYXIuICovXG5leHBvcnQgY29uc3QgTUFUX1NOQUNLX0JBUl9ERUZBVUxUX09QVElPTlMgPVxuICAgIG5ldyBJbmplY3Rpb25Ub2tlbjxNYXRTbmFja0JhckNvbmZpZz4oJ21hdC1zbmFjay1iYXItZGVmYXVsdC1vcHRpb25zJywge1xuICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgICAgZmFjdG9yeTogTUFUX1NOQUNLX0JBUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSxcbiAgICB9KTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBNQVRfU05BQ0tfQkFSX0RFRkFVTFRfT1BUSU9OU19GQUNUT1JZKCk6IE1hdFNuYWNrQmFyQ29uZmlnIHtcbiAgcmV0dXJuIG5ldyBNYXRTbmFja0JhckNvbmZpZygpO1xufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gZGlzcGF0Y2ggTWF0ZXJpYWwgRGVzaWduIHNuYWNrIGJhciBtZXNzYWdlcy5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IE1hdFNuYWNrQmFyTW9kdWxlfSlcbmV4cG9ydCBjbGFzcyBNYXRTbmFja0JhciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc25hY2sgYmFyIGluIHRoZSB2aWV3ICphdCB0aGlzIGxldmVsKiAoaW4gdGhlIEFuZ3VsYXIgaW5qZWN0b3IgdHJlZSkuXG4gICAqIElmIHRoZXJlIGlzIGEgcGFyZW50IHNuYWNrLWJhciBzZXJ2aWNlLCBhbGwgb3BlcmF0aW9ucyBzaG91bGQgZGVsZWdhdGUgdG8gdGhhdCBwYXJlbnRcbiAgICogdmlhIGBfb3BlbmVkU25hY2tCYXJSZWZgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc25hY2tCYXJSZWZBdFRoaXNMZXZlbDogTWF0U25hY2tCYXJSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgY29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIHRoZSBzbmFjayBiYXIncyBzaW1wbGUgY29tcG9uZW50LiAqL1xuICBwcm90ZWN0ZWQgc2ltcGxlU25hY2tCYXJDb21wb25lbnQ6IFR5cGU8VGV4dE9ubHlTbmFja0Jhcj4gPSBTaW1wbGVTbmFja0JhcjtcblxuICAvKiogVGhlIGNvbnRhaW5lciBjb21wb25lbnQgdGhhdCBhdHRhY2hlcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgb3IgY29tcG9uZW50LiAqL1xuICBwcm90ZWN0ZWQgc25hY2tCYXJDb250YWluZXJDb21wb25lbnQ6IFR5cGU8X1NuYWNrQmFyQ29udGFpbmVyPiA9IE1hdFNuYWNrQmFyQ29udGFpbmVyO1xuXG4gIC8qKiBUaGUgQ1NTIGNsYXNzIHRvIGFwcGx5IGZvciBoYW5kc2V0IG1vZGUuICovXG4gIHByb3RlY3RlZCBoYW5kc2V0Q3NzQ2xhc3MgPSAnbWF0LXNuYWNrLWJhci1oYW5kc2V0JztcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHkgb3BlbmVkIHNuYWNrYmFyIGF0ICphbnkqIGxldmVsLiAqL1xuICBnZXQgX29wZW5lZFNuYWNrQmFyUmVmKCk6IE1hdFNuYWNrQmFyUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnRTbmFja0JhcjtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Ll9vcGVuZWRTbmFja0JhclJlZiA6IHRoaXMuX3NuYWNrQmFyUmVmQXRUaGlzTGV2ZWw7XG4gIH1cblxuICBzZXQgX29wZW5lZFNuYWNrQmFyUmVmKHZhbHVlOiBNYXRTbmFja0JhclJlZjxhbnk+IHwgbnVsbCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnRTbmFja0Jhcikge1xuICAgICAgdGhpcy5fcGFyZW50U25hY2tCYXIuX29wZW5lZFNuYWNrQmFyUmVmID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NuYWNrQmFyUmVmQXRUaGlzTGV2ZWwgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICBwcml2YXRlIF9saXZlOiBMaXZlQW5ub3VuY2VyLFxuICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgcHJpdmF0ZSBfYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwcml2YXRlIF9wYXJlbnRTbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgICBASW5qZWN0KE1BVF9TTkFDS19CQVJfREVGQVVMVF9PUFRJT05TKSBwcml2YXRlIF9kZWZhdWx0Q29uZmlnOiBNYXRTbmFja0JhckNvbmZpZykge31cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZGlzcGF0Y2hlcyBhIHNuYWNrIGJhciB3aXRoIGEgY3VzdG9tIGNvbXBvbmVudCBmb3IgdGhlIGNvbnRlbnQsIHJlbW92aW5nIGFueVxuICAgKiBjdXJyZW50bHkgb3BlbmVkIHNuYWNrIGJhcnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIGluc3RhbnRpYXRlZC5cbiAgICogQHBhcmFtIGNvbmZpZyBFeHRyYSBjb25maWd1cmF0aW9uIGZvciB0aGUgc25hY2sgYmFyLlxuICAgKi9cbiAgb3BlbkZyb21Db21wb25lbnQ8VD4oY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LCBjb25maWc/OiBNYXRTbmFja0JhckNvbmZpZyk6XG4gICAgICBNYXRTbmFja0JhclJlZjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGFjaChjb21wb25lbnQsIGNvbmZpZykgYXMgTWF0U25hY2tCYXJSZWY8VD47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZGlzcGF0Y2hlcyBhIHNuYWNrIGJhciB3aXRoIGEgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgY29udGVudCwgcmVtb3ZpbmcgYW55XG4gICAqIGN1cnJlbnRseSBvcGVuZWQgc25hY2sgYmFycy5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlIFRlbXBsYXRlIHRvIGJlIGluc3RhbnRpYXRlZC5cbiAgICogQHBhcmFtIGNvbmZpZyBFeHRyYSBjb25maWd1cmF0aW9uIGZvciB0aGUgc25hY2sgYmFyLlxuICAgKi9cbiAgb3BlbkZyb21UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiwgY29uZmlnPzogTWF0U25hY2tCYXJDb25maWcpOlxuICAgICAgTWF0U25hY2tCYXJSZWY8RW1iZWRkZWRWaWV3UmVmPGFueT4+IHtcbiAgICByZXR1cm4gdGhpcy5fYXR0YWNoKHRlbXBsYXRlLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgc25hY2tiYXIgd2l0aCBhIG1lc3NhZ2UgYW5kIGFuIG9wdGlvbmFsIGFjdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgc25hY2tiYXIuXG4gICAqIEBwYXJhbSBhY3Rpb24gVGhlIGxhYmVsIGZvciB0aGUgc25hY2tiYXIgYWN0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc25hY2tiYXIuXG4gICAqL1xuICBvcGVuKG1lc3NhZ2U6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcgPSAnJywgY29uZmlnPzogTWF0U25hY2tCYXJDb25maWcpOlxuICAgICAgTWF0U25hY2tCYXJSZWY8VGV4dE9ubHlTbmFja0Jhcj4ge1xuICAgIGNvbnN0IF9jb25maWcgPSB7Li4udGhpcy5fZGVmYXVsdENvbmZpZywgLi4uY29uZmlnfTtcblxuICAgIC8vIFNpbmNlIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbXBvbmVudCwgd2UgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIGRhdGEgdG8gcGFzcyBpbiBvdXIgb3duIG1lc3NhZ2UgYW5kIGFjdGlvbi5cbiAgICBfY29uZmlnLmRhdGEgPSB7bWVzc2FnZSwgYWN0aW9ufTtcblxuICAgIC8vIFNpbmNlIHRoZSBzbmFjayBiYXIgaGFzIGByb2xlPVwiYWxlcnRcImAsIHdlIGRvbid0XG4gICAgLy8gd2FudCB0byBhbm5vdW5jZSB0aGUgc2FtZSBtZXNzYWdlIHR3aWNlLlxuICAgIGlmIChfY29uZmlnLmFubm91bmNlbWVudE1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcbiAgICAgIF9jb25maWcuYW5ub3VuY2VtZW50TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcGVuRnJvbUNvbXBvbmVudCh0aGlzLnNpbXBsZVNuYWNrQmFyQ29tcG9uZW50LCBfY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIGN1cnJlbnRseS12aXNpYmxlIHNuYWNrIGJhci5cbiAgICovXG4gIGRpc21pc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gT25seSBkaXNtaXNzIHRoZSBzbmFjayBiYXIgYXQgdGhlIGN1cnJlbnQgbGV2ZWwgb24gZGVzdHJveS5cbiAgICBpZiAodGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbCkge1xuICAgICAgdGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbC5kaXNtaXNzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIHRoZSBzbmFjayBiYXIgY29udGFpbmVyIGNvbXBvbmVudCB0byB0aGUgb3ZlcmxheS5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaFNuYWNrQmFyQ29udGFpbmVyKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBNYXRTbmFja0JhckNvbmZpZyk6IF9TbmFja0JhckNvbnRhaW5lciB7XG5cbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPSBjb25maWcgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3I7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiB1c2VySW5qZWN0b3IgfHwgdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogTWF0U25hY2tCYXJDb25maWcsIHVzZVZhbHVlOiBjb25maWd9XVxuICAgIH0pO1xuXG4gICAgY29uc3QgY29udGFpbmVyUG9ydGFsID1cbiAgICAgICAgbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLnNuYWNrQmFyQ29udGFpbmVyQ29tcG9uZW50LCBjb25maWcudmlld0NvbnRhaW5lclJlZiwgaW5qZWN0b3IpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlZjogQ29tcG9uZW50UmVmPF9TbmFja0JhckNvbnRhaW5lcj4gPVxuICAgICAgICBvdmVybGF5UmVmLmF0dGFjaChjb250YWluZXJQb3J0YWwpO1xuICAgIGNvbnRhaW5lclJlZi5pbnN0YW5jZS5zbmFja0JhckNvbmZpZyA9IGNvbmZpZztcbiAgICByZXR1cm4gY29udGFpbmVyUmVmLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYWNlcyBhIG5ldyBjb21wb25lbnQgb3IgYSB0ZW1wbGF0ZSBhcyB0aGUgY29udGVudCBvZiB0aGUgc25hY2sgYmFyIGNvbnRhaW5lci5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaDxUPihjb250ZW50OiBDb21wb25lbnRUeXBlPFQ+IHwgVGVtcGxhdGVSZWY8VD4sIHVzZXJDb25maWc/OiBNYXRTbmFja0JhckNvbmZpZyk6XG4gICAgICBNYXRTbmFja0JhclJlZjxUIHwgRW1iZWRkZWRWaWV3UmVmPGFueT4+IHtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5uZXcgTWF0U25hY2tCYXJDb25maWcoKSwgLi4udGhpcy5fZGVmYXVsdENvbmZpZywgLi4udXNlckNvbmZpZ307XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoY29uZmlnKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9hdHRhY2hTbmFja0JhckNvbnRhaW5lcihvdmVybGF5UmVmLCBjb25maWcpO1xuICAgIGNvbnN0IHNuYWNrQmFyUmVmID0gbmV3IE1hdFNuYWNrQmFyUmVmPFQgfCBFbWJlZGRlZFZpZXdSZWY8YW55Pj4oY29udGFpbmVyLCBvdmVybGF5UmVmKTtcblxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChjb250ZW50LCBudWxsISwge1xuICAgICAgICAkaW1wbGljaXQ6IGNvbmZpZy5kYXRhLFxuICAgICAgICBzbmFja0JhclJlZlxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBzbmFja0JhclJlZi5pbnN0YW5jZSA9IGNvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuX2NyZWF0ZUluamVjdG9yKGNvbmZpZywgc25hY2tCYXJSZWYpO1xuICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChjb250ZW50LCB1bmRlZmluZWQsIGluamVjdG9yKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRSZWYgPSBjb250YWluZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KHBvcnRhbCk7XG5cbiAgICAgIC8vIFdlIGNhbid0IHBhc3MgdGhpcyB2aWEgdGhlIGluamVjdG9yLCBiZWNhdXNlIHRoZSBpbmplY3RvciBpcyBjcmVhdGVkIGVhcmxpZXIuXG4gICAgICBzbmFja0JhclJlZi5pbnN0YW5jZSA9IGNvbnRlbnRSZWYuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBicmVha3BvaW50IG9ic2VydmVyIGFuZCBhdHRhY2ggdGhlIG1hdC1zbmFjay1iYXItaGFuZHNldCBjbGFzcyBhc1xuICAgIC8vIGFwcHJvcHJpYXRlLiBUaGlzIGNsYXNzIGlzIGFwcGxpZWQgdG8gdGhlIG92ZXJsYXkgZWxlbWVudCBiZWNhdXNlIHRoZSBvdmVybGF5IG11c3QgZXhwYW5kIHRvXG4gICAgLy8gZmlsbCB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbiBmb3IgZnVsbCB3aWR0aCBzbmFja2JhcnMuXG4gICAgdGhpcy5fYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoQnJlYWtwb2ludHMuSGFuZHNldFBvcnRyYWl0KS5waXBlKFxuICAgICAgICB0YWtlVW50aWwob3ZlcmxheVJlZi5kZXRhY2htZW50cygpKVxuICAgICkuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgc3RhdGUubWF0Y2hlcyA/IGNsYXNzTGlzdC5hZGQodGhpcy5oYW5kc2V0Q3NzQ2xhc3MpIDogY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmhhbmRzZXRDc3NDbGFzcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoY29uZmlnLmFubm91bmNlbWVudE1lc3NhZ2UpIHtcbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIHNuYWNrIGJhciBjb250ZW50cyBoYXZlIGJlZW4gYW5ub3VuY2VkIHRoZW4gZGVsaXZlciB0aGlzIG1lc3NhZ2UuXG4gICAgICBjb250YWluZXIuX29uQW5ub3VuY2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbGl2ZS5hbm5vdW5jZShjb25maWcuYW5ub3VuY2VtZW50TWVzc2FnZSEsIGNvbmZpZy5wb2xpdGVuZXNzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2FuaW1hdGVTbmFja0JhcihzbmFja0JhclJlZiwgY29uZmlnKTtcbiAgICB0aGlzLl9vcGVuZWRTbmFja0JhclJlZiA9IHNuYWNrQmFyUmVmO1xuICAgIHJldHVybiB0aGlzLl9vcGVuZWRTbmFja0JhclJlZjtcbiAgfVxuXG4gIC8qKiBBbmltYXRlcyB0aGUgb2xkIHNuYWNrIGJhciBvdXQgYW5kIHRoZSBuZXcgb25lIGluLiAqL1xuICBwcml2YXRlIF9hbmltYXRlU25hY2tCYXIoc25hY2tCYXJSZWY6IE1hdFNuYWNrQmFyUmVmPGFueT4sIGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcpIHtcbiAgICAvLyBXaGVuIHRoZSBzbmFja2JhciBpcyBkaXNtaXNzZWQsIGNsZWFyIHRoZSByZWZlcmVuY2UgdG8gaXQuXG4gICAgc25hY2tCYXJSZWYuYWZ0ZXJEaXNtaXNzZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgdGhlIHNuYWNrYmFyIHJlZiBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIGJ5IGEgbmV3ZXIgc25hY2tiYXIuXG4gICAgICBpZiAodGhpcy5fb3BlbmVkU25hY2tCYXJSZWYgPT0gc25hY2tCYXJSZWYpIHtcbiAgICAgICAgdGhpcy5fb3BlbmVkU25hY2tCYXJSZWYgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLmFubm91bmNlbWVudE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fbGl2ZS5jbGVhcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmKSB7XG4gICAgICAvLyBJZiBhIHNuYWNrIGJhciBpcyBhbHJlYWR5IGluIHZpZXcsIGRpc21pc3MgaXQgYW5kIGVudGVyIHRoZVxuICAgICAgLy8gbmV3IHNuYWNrIGJhciBhZnRlciBleGl0IGFuaW1hdGlvbiBpcyBjb21wbGV0ZS5cbiAgICAgIHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgc25hY2tCYXJSZWYuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb3BlbmVkU25hY2tCYXJSZWYuZGlzbWlzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBubyBzbmFjayBiYXIgaXMgaW4gdmlldywgZW50ZXIgdGhlIG5ldyBzbmFjayBiYXIuXG4gICAgICBzbmFja0JhclJlZi5jb250YWluZXJJbnN0YW5jZS5lbnRlcigpO1xuICAgIH1cblxuICAgIC8vIElmIGEgZGlzbWlzcyB0aW1lb3V0IGlzIHByb3ZpZGVkLCBzZXQgdXAgZGlzbWlzcyBiYXNlZCBvbiBhZnRlciB0aGUgc25hY2tiYXIgaXMgb3BlbmVkLlxuICAgIGlmIChjb25maWcuZHVyYXRpb24gJiYgY29uZmlnLmR1cmF0aW9uID4gMCkge1xuICAgICAgc25hY2tCYXJSZWYuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCkgPT4gc25hY2tCYXJSZWYuX2Rpc21pc3NBZnRlcihjb25maWcuZHVyYXRpb24hKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgb3ZlcmxheSBhbmQgcGxhY2VzIGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSB1c2VyLXNwZWNpZmllZCBzbmFjayBiYXIgY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheShjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnKTogT3ZlcmxheVJlZiB7XG4gICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKCk7XG4gICAgb3ZlcmxheUNvbmZpZy5kaXJlY3Rpb24gPSBjb25maWcuZGlyZWN0aW9uO1xuXG4gICAgbGV0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCk7XG4gICAgLy8gU2V0IGhvcml6b250YWwgcG9zaXRpb24uXG4gICAgY29uc3QgaXNSdGwgPSBjb25maWcuZGlyZWN0aW9uID09PSAncnRsJztcbiAgICBjb25zdCBpc0xlZnQgPSAoXG4gICAgICAgIGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdsZWZ0JyB8fFxuICAgICAgICAoY29uZmlnLmhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3N0YXJ0JyAmJiAhaXNSdGwpIHx8XG4gICAgICAgIChjb25maWcuaG9yaXpvbnRhbFBvc2l0aW9uID09PSAnZW5kJyAmJiBpc1J0bCkpO1xuICAgIGNvbnN0IGlzUmlnaHQgPSAhaXNMZWZ0ICYmIGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gIT09ICdjZW50ZXInO1xuICAgIGlmIChpc0xlZnQpIHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3kubGVmdCgnMCcpO1xuICAgIH0gZWxzZSBpZiAoaXNSaWdodCkge1xuICAgICAgcG9zaXRpb25TdHJhdGVneS5yaWdodCgnMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LmNlbnRlckhvcml6b250YWxseSgpO1xuICAgIH1cbiAgICAvLyBTZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi5cbiAgICBpZiAoY29uZmlnLnZlcnRpY2FsUG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LnRvcCgnMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LmJvdHRvbSgnMCcpO1xuICAgIH1cblxuICAgIG92ZXJsYXlDb25maWcucG9zaXRpb25TdHJhdGVneSA9IHBvc2l0aW9uU3RyYXRlZ3k7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5qZWN0b3IgdG8gYmUgdXNlZCBpbnNpZGUgb2YgYSBzbmFjayBiYXIgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZyB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgc25hY2sgYmFyLlxuICAgKiBAcGFyYW0gc25hY2tCYXJSZWYgUmVmZXJlbmNlIHRvIHRoZSBzbmFjayBiYXIuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVJbmplY3RvcjxUPihjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnLCBzbmFja0JhclJlZjogTWF0U25hY2tCYXJSZWY8VD4pOiBJbmplY3RvciB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID0gY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xuXG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7cHJvdmlkZTogTWF0U25hY2tCYXJSZWYsIHVzZVZhbHVlOiBzbmFja0JhclJlZn0sXG4gICAgICAgIHtwcm92aWRlOiBNQVRfU05BQ0tfQkFSX0RBVEEsIHVzZVZhbHVlOiBjb25maWcuZGF0YX1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuIl19
|