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.
264 lines
33 KiB
264 lines
33 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 { AriaDescriber } from '@angular/cdk/a11y';
|
|
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
import { Directive, ElementRef, Inject, Input, NgZone, Optional, Renderer2, } from '@angular/core';
|
|
import { mixinDisabled } from '@angular/material/core';
|
|
import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
|
|
import * as ɵngcc0 from '@angular/core';
|
|
import * as ɵngcc1 from '@angular/cdk/a11y';
|
|
let nextId = 0;
|
|
// Boilerplate for applying mixins to MatBadge.
|
|
/** @docs-private */
|
|
const _MatBadgeBase = mixinDisabled(class {
|
|
});
|
|
/** Directive to display a text badge. */
|
|
export class MatBadge extends _MatBadgeBase {
|
|
constructor(_ngZone, _elementRef, _ariaDescriber, _renderer, _animationMode) {
|
|
super();
|
|
this._ngZone = _ngZone;
|
|
this._elementRef = _elementRef;
|
|
this._ariaDescriber = _ariaDescriber;
|
|
this._renderer = _renderer;
|
|
this._animationMode = _animationMode;
|
|
/** Whether the badge has any content. */
|
|
this._hasContent = false;
|
|
this._color = 'primary';
|
|
this._overlap = true;
|
|
/**
|
|
* Position the badge should reside.
|
|
* Accepts any combination of 'above'|'below' and 'before'|'after'
|
|
*/
|
|
this.position = 'above after';
|
|
/** Size of the badge. Can be 'small', 'medium', or 'large'. */
|
|
this.size = 'medium';
|
|
/** Unique id for the badge */
|
|
this._id = nextId++;
|
|
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
const nativeElement = _elementRef.nativeElement;
|
|
if (nativeElement.nodeType !== nativeElement.ELEMENT_NODE) {
|
|
throw Error('matBadge must be attached to an element node.');
|
|
}
|
|
}
|
|
}
|
|
/** The color of the badge. Can be `primary`, `accent`, or `warn`. */
|
|
get color() { return this._color; }
|
|
set color(value) {
|
|
this._setColor(value);
|
|
this._color = value;
|
|
}
|
|
/** Whether the badge should overlap its contents or not */
|
|
get overlap() { return this._overlap; }
|
|
set overlap(val) {
|
|
this._overlap = coerceBooleanProperty(val);
|
|
}
|
|
/** Message used to describe the decorated element via aria-describedby */
|
|
get description() { return this._description; }
|
|
set description(newDescription) {
|
|
if (newDescription !== this._description) {
|
|
const badgeElement = this._badgeElement;
|
|
this._updateHostAriaDescription(newDescription, this._description);
|
|
this._description = newDescription;
|
|
if (badgeElement) {
|
|
newDescription ? badgeElement.setAttribute('aria-label', newDescription) :
|
|
badgeElement.removeAttribute('aria-label');
|
|
}
|
|
}
|
|
}
|
|
/** Whether the badge is hidden. */
|
|
get hidden() { return this._hidden; }
|
|
set hidden(val) {
|
|
this._hidden = coerceBooleanProperty(val);
|
|
}
|
|
/** Whether the badge is above the host or not */
|
|
isAbove() {
|
|
return this.position.indexOf('below') === -1;
|
|
}
|
|
/** Whether the badge is after the host or not */
|
|
isAfter() {
|
|
return this.position.indexOf('before') === -1;
|
|
}
|
|
ngOnChanges(changes) {
|
|
const contentChange = changes['content'];
|
|
if (contentChange) {
|
|
const value = contentChange.currentValue;
|
|
this._hasContent = value != null && `${value}`.trim().length > 0;
|
|
this._updateTextContent();
|
|
}
|
|
}
|
|
ngOnDestroy() {
|
|
const badgeElement = this._badgeElement;
|
|
if (badgeElement) {
|
|
if (this.description) {
|
|
this._ariaDescriber.removeDescription(badgeElement, this.description);
|
|
}
|
|
// When creating a badge through the Renderer, Angular will keep it in an index.
|
|
// We have to destroy it ourselves, otherwise it'll be retained in memory.
|
|
if (this._renderer.destroyNode) {
|
|
this._renderer.destroyNode(badgeElement);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Gets the element into which the badge's content is being rendered.
|
|
* Undefined if the element hasn't been created (e.g. if the badge doesn't have content).
|
|
*/
|
|
getBadgeElement() {
|
|
return this._badgeElement;
|
|
}
|
|
/** Injects a span element into the DOM with the content. */
|
|
_updateTextContent() {
|
|
if (!this._badgeElement) {
|
|
this._badgeElement = this._createBadgeElement();
|
|
}
|
|
else {
|
|
this._badgeElement.textContent = this._stringifyContent();
|
|
}
|
|
return this._badgeElement;
|
|
}
|
|
/** Creates the badge element */
|
|
_createBadgeElement() {
|
|
const badgeElement = this._renderer.createElement('span');
|
|
const activeClass = 'mat-badge-active';
|
|
const contentClass = 'mat-badge-content';
|
|
// Clear any existing badges which may have persisted from a server-side render.
|
|
this._clearExistingBadges(contentClass);
|
|
badgeElement.setAttribute('id', `mat-badge-content-${this._id}`);
|
|
badgeElement.classList.add(contentClass);
|
|
badgeElement.textContent = this._stringifyContent();
|
|
if (this._animationMode === 'NoopAnimations') {
|
|
badgeElement.classList.add('_mat-animation-noopable');
|
|
}
|
|
if (this.description) {
|
|
badgeElement.setAttribute('aria-label', this.description);
|
|
}
|
|
this._elementRef.nativeElement.appendChild(badgeElement);
|
|
// animate in after insertion
|
|
if (typeof requestAnimationFrame === 'function' && this._animationMode !== 'NoopAnimations') {
|
|
this._ngZone.runOutsideAngular(() => {
|
|
requestAnimationFrame(() => {
|
|
badgeElement.classList.add(activeClass);
|
|
});
|
|
});
|
|
}
|
|
else {
|
|
badgeElement.classList.add(activeClass);
|
|
}
|
|
return badgeElement;
|
|
}
|
|
/** Sets the aria-label property on the element */
|
|
_updateHostAriaDescription(newDescription, oldDescription) {
|
|
// ensure content available before setting label
|
|
const content = this._updateTextContent();
|
|
if (oldDescription) {
|
|
this._ariaDescriber.removeDescription(content, oldDescription);
|
|
}
|
|
if (newDescription) {
|
|
this._ariaDescriber.describe(content, newDescription);
|
|
}
|
|
}
|
|
/** Adds css theme class given the color to the component host */
|
|
_setColor(colorPalette) {
|
|
if (colorPalette !== this._color) {
|
|
const classList = this._elementRef.nativeElement.classList;
|
|
if (this._color) {
|
|
classList.remove(`mat-badge-${this._color}`);
|
|
}
|
|
if (colorPalette) {
|
|
classList.add(`mat-badge-${colorPalette}`);
|
|
}
|
|
}
|
|
}
|
|
/** Clears any existing badges that might be left over from server-side rendering. */
|
|
_clearExistingBadges(cssClass) {
|
|
const element = this._elementRef.nativeElement;
|
|
let childCount = element.children.length;
|
|
// Use a reverse while, because we'll be removing elements from the list as we're iterating.
|
|
while (childCount--) {
|
|
const currentChild = element.children[childCount];
|
|
if (currentChild.classList.contains(cssClass)) {
|
|
element.removeChild(currentChild);
|
|
}
|
|
}
|
|
}
|
|
/** Gets the string representation of the badge content. */
|
|
_stringifyContent() {
|
|
// Convert null and undefined to an empty string which is consistent
|
|
// with how Angular handles them in inside template interpolations.
|
|
const content = this.content;
|
|
return content == null ? '' : `${content}`;
|
|
}
|
|
}
|
|
MatBadge.ɵfac = function MatBadge_Factory(t) { return new (t || MatBadge)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.AriaDescriber), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Renderer2), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };
|
|
MatBadge.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatBadge, selectors: [["", "matBadge", ""]], hostAttrs: [1, "mat-badge"], hostVars: 20, hostBindings: function MatBadge_HostBindings(rf, ctx) { if (rf & 2) {
|
|
ɵngcc0.ɵɵclassProp("mat-badge-overlap", ctx.overlap)("mat-badge-above", ctx.isAbove())("mat-badge-below", !ctx.isAbove())("mat-badge-before", !ctx.isAfter())("mat-badge-after", ctx.isAfter())("mat-badge-small", ctx.size === "small")("mat-badge-medium", ctx.size === "medium")("mat-badge-large", ctx.size === "large")("mat-badge-hidden", ctx.hidden || !ctx._hasContent)("mat-badge-disabled", ctx.disabled);
|
|
} }, inputs: { disabled: ["matBadgeDisabled", "disabled"], position: ["matBadgePosition", "position"], size: ["matBadgeSize", "size"], color: ["matBadgeColor", "color"], overlap: ["matBadgeOverlap", "overlap"], description: ["matBadgeDescription", "description"], hidden: ["matBadgeHidden", "hidden"], content: ["matBadge", "content"] }, features: [ɵngcc0.ɵɵInheritDefinitionFeature, ɵngcc0.ɵɵNgOnChangesFeature] });
|
|
MatBadge.ctorParameters = () => [
|
|
{ type: NgZone },
|
|
{ type: ElementRef },
|
|
{ type: AriaDescriber },
|
|
{ type: Renderer2 },
|
|
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }
|
|
];
|
|
MatBadge.propDecorators = {
|
|
color: [{ type: Input, args: ['matBadgeColor',] }],
|
|
overlap: [{ type: Input, args: ['matBadgeOverlap',] }],
|
|
position: [{ type: Input, args: ['matBadgePosition',] }],
|
|
content: [{ type: Input, args: ['matBadge',] }],
|
|
description: [{ type: Input, args: ['matBadgeDescription',] }],
|
|
size: [{ type: Input, args: ['matBadgeSize',] }],
|
|
hidden: [{ type: Input, args: ['matBadgeHidden',] }]
|
|
};
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatBadge, [{
|
|
type: Directive,
|
|
args: [{
|
|
selector: '[matBadge]',
|
|
inputs: ['disabled: matBadgeDisabled'],
|
|
host: {
|
|
'class': 'mat-badge',
|
|
'[class.mat-badge-overlap]': 'overlap',
|
|
'[class.mat-badge-above]': 'isAbove()',
|
|
'[class.mat-badge-below]': '!isAbove()',
|
|
'[class.mat-badge-before]': '!isAfter()',
|
|
'[class.mat-badge-after]': 'isAfter()',
|
|
'[class.mat-badge-small]': 'size === "small"',
|
|
'[class.mat-badge-medium]': 'size === "medium"',
|
|
'[class.mat-badge-large]': 'size === "large"',
|
|
'[class.mat-badge-hidden]': 'hidden || !_hasContent',
|
|
'[class.mat-badge-disabled]': 'disabled'
|
|
}
|
|
}]
|
|
}], function () { return [{ type: ɵngcc0.NgZone }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.AriaDescriber }, { type: ɵngcc0.Renderer2 }, { type: String, decorators: [{
|
|
type: Optional
|
|
}, {
|
|
type: Inject,
|
|
args: [ANIMATION_MODULE_TYPE]
|
|
}] }]; }, { position: [{
|
|
type: Input,
|
|
args: ['matBadgePosition']
|
|
}], size: [{
|
|
type: Input,
|
|
args: ['matBadgeSize']
|
|
}], color: [{
|
|
type: Input,
|
|
args: ['matBadgeColor']
|
|
}], overlap: [{
|
|
type: Input,
|
|
args: ['matBadgeOverlap']
|
|
}], description: [{
|
|
type: Input,
|
|
args: ['matBadgeDescription']
|
|
}], hidden: [{
|
|
type: Input,
|
|
args: ['matBadgeHidden']
|
|
}], content: [{
|
|
type: Input,
|
|
args: ['matBadge']
|
|
}] }); })();
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9iYWRnZS9iYWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBRUgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBZSxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUdOLFFBQVEsRUFDUixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFhLGFBQWEsRUFBZSxNQUFNLHdCQUF3QixDQUFDO0FBQy9FLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDOzs7QUFHM0UsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWYsK0NBQStDO0FBQy9DLG9CQUFvQjtBQUNwQixNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFBUSxDQUFBLENBQUMsQ0FBQztBQVU5Qyx5Q0FBeUM7QUFrQnpDLE1BQU0sT0FBTyxRQUFTLFNBQVEsYUFBYTtBQUFHLElBK0Q1QyxZQUNZLE9BQWUsRUFDZixXQUFvQyxFQUNwQyxjQUE2QixFQUM3QixTQUFvQixFQUN1QixjQUF1QjtBQUNoRixRQUFNLEtBQUssRUFBRSxDQUFDO0FBQ2QsUUFOYyxZQUFPLEdBQVAsT0FBTyxDQUFRO0FBQUMsUUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO0FBQUMsUUFDckMsbUJBQWMsR0FBZCxjQUFjLENBQWU7QUFBQyxRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFXO0FBQUMsUUFDc0IsbUJBQWMsR0FBZCxjQUFjLENBQVM7QUFBQyxRQW5FL0UseUNBQXlDO0FBQzNDLFFBQUUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7QUFDdEIsUUFRVSxX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QyxTQUFTLFNBQUMsa0JBQ1QsUUFBUSxFQUFFLFlBQVksa0JBQ3RCLE1BQU0sRUFBRSxDQUFDLDRCQUE0QixDQUFDLGtCQUN0QyxJQUFJLEVBQUUsc0JBQ0osT0FBTyxFQUFFLFdBQVcsc0JBQ3BCLDJCQUEyQixFQUFFLFNBQVMsc0JBQ3RDO2VBQXlCLEVBQUUsV0FBVyxzQkFDdEMseUJBQXlCLEVBQUUsWUFBWSxzQkFDdkMsMEJBQTBCLEVBQUUsWUFBWSxzQkFDeEMseUJBQXlCLEVBQUUsV0FBVztZQUN0Qyx5QkFBeUIsRUFBRSxrQkFBa0Isc0JBQzdDLDBCQUEwQixFQUFFLG1CQUFtQixzQkFDL0MseUJBQXlCLEVBQUUsa0JBQWtCLHNCQUM3QywwQkFBMEIsRUFBRSx3QkFBd0Isc0JBQ3BELDRCQUE0QixFQUFFLFVBQVUsbUJBQ3pDLGVBQ0Y7b2FBQ0k7QUFBQztBQUFrQyxZQTNDdEMsTUFBTTtBQUNOLFlBSkEsVUFBVTtBQUNWLFlBTE0sYUFBYTtBQUFJLFlBV3ZCLFNBQVM7QUFDVCx5Q0EwR0ssUUFBUSxZQUFJLE1BQU0sU0FBQyxxQkFBcUI7QUFBUTtBQUFHO0FBQ3hELG9CQWhFQyxLQUFLLFNBQUMsZUFBZTtBQUNuQixzQkFRRixLQUFLLFNBQUMsaUJBQWlCO0FBQ3JCLHVCQVVGLEtBQUssU0FBQyxrQkFBa0I7QUFBTyxzQkFHL0IsS0FBSyxTQUFDLFVBQVU7QUFBTywwQkFHdkIsS0FBSyxTQUFDLHFCQUFxQjtBQUN6QixtQkFnQkYsS0FBSyxTQUFDLGNBQWM7QUFBTyxxQkFHM0IsS0FBSyxTQUFDLGdCQUFnQjtBQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFBRTtBQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7QXJpYURlc2NyaWJlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NhbkRpc2FibGUsIG1peGluRGlzYWJsZWQsIFRoZW1lUGFsZXR0ZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge0FOSU1BVElPTl9NT0RVTEVfVFlQRX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zJztcblxuXG5sZXQgbmV4dElkID0gMDtcblxuLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRCYWRnZS5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5jb25zdCBfTWF0QmFkZ2VCYXNlID0gbWl4aW5EaXNhYmxlZChjbGFzcyB7fSk7XG5cbi8qKiBBbGxvd2VkIHBvc2l0aW9uIG9wdGlvbnMgZm9yIG1hdEJhZGdlUG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIE1hdEJhZGdlUG9zaXRpb24gPVxuICAgICdhYm92ZSBhZnRlcicgfCAnYWJvdmUgYmVmb3JlJyB8ICdiZWxvdyBiZWZvcmUnIHwgJ2JlbG93IGFmdGVyJyB8XG4gICAgJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2Fib3ZlJyB8ICdiZWxvdyc7XG5cbi8qKiBBbGxvd2VkIHNpemUgb3B0aW9ucyBmb3IgbWF0QmFkZ2VTaXplICovXG5leHBvcnQgdHlwZSBNYXRCYWRnZVNpemUgPSAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuXG4vKiogRGlyZWN0aXZlIHRvIGRpc3BsYXkgYSB0ZXh0IGJhZGdlLiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW21hdEJhZGdlXScsXG4gIGlucHV0czogWydkaXNhYmxlZDogbWF0QmFkZ2VEaXNhYmxlZCddLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1iYWRnZScsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2Utb3ZlcmxhcF0nOiAnb3ZlcmxhcCcsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2UtYWJvdmVdJzogJ2lzQWJvdmUoKScsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2UtYmVsb3ddJzogJyFpc0Fib3ZlKCknLFxuICAgICdbY2xhc3MubWF0LWJhZGdlLWJlZm9yZV0nOiAnIWlzQWZ0ZXIoKScsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2UtYWZ0ZXJdJzogJ2lzQWZ0ZXIoKScsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2Utc21hbGxdJzogJ3NpemUgPT09IFwic21hbGxcIicsXG4gICAgJ1tjbGFzcy5tYXQtYmFkZ2UtbWVkaXVtXSc6ICdzaXplID09PSBcIm1lZGl1bVwiJyxcbiAgICAnW2NsYXNzLm1hdC1iYWRnZS1sYXJnZV0nOiAnc2l6ZSA9PT0gXCJsYXJnZVwiJyxcbiAgICAnW2NsYXNzLm1hdC1iYWRnZS1oaWRkZW5dJzogJ2hpZGRlbiB8fCAhX2hhc0NvbnRlbnQnLFxuICAgICdbY2xhc3MubWF0LWJhZGdlLWRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdEJhZGdlIGV4dGVuZHMgX01hdEJhZGdlQmFzZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBDYW5EaXNhYmxlIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGhhcyBhbnkgY29udGVudC4gKi9cbiAgX2hhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAvKiogVGhlIGNvbG9yIG9mIHRoZSBiYWRnZS4gQ2FuIGJlIGBwcmltYXJ5YCwgYGFjY2VudGAsIG9yIGB3YXJuYC4gKi9cbiAgQElucHV0KCdtYXRCYWRnZUNvbG9yJylcbiAgZ2V0IGNvbG9yKCk6IFRoZW1lUGFsZXR0ZSB7IHJldHVybiB0aGlzLl9jb2xvcjsgfVxuICBzZXQgY29sb3IodmFsdWU6IFRoZW1lUGFsZXR0ZSkge1xuICAgIHRoaXMuX3NldENvbG9yKHZhbHVlKTtcbiAgICB0aGlzLl9jb2xvciA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2NvbG9yOiBUaGVtZVBhbGV0dGUgPSAncHJpbWFyeSc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJhZGdlIHNob3VsZCBvdmVybGFwIGl0cyBjb250ZW50cyBvciBub3QgKi9cbiAgQElucHV0KCdtYXRCYWRnZU92ZXJsYXAnKVxuICBnZXQgb3ZlcmxhcCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX292ZXJsYXA7IH1cbiAgc2V0IG92ZXJsYXAodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fb3ZlcmxhcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICB9XG4gIHByaXZhdGUgX292ZXJsYXA6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiB0aGUgYmFkZ2Ugc2hvdWxkIHJlc2lkZS5cbiAgICogQWNjZXB0cyBhbnkgY29tYmluYXRpb24gb2YgJ2Fib3ZlJ3wnYmVsb3cnIGFuZCAnYmVmb3JlJ3wnYWZ0ZXInXG4gICAqL1xuICBASW5wdXQoJ21hdEJhZGdlUG9zaXRpb24nKSBwb3NpdGlvbjogTWF0QmFkZ2VQb3NpdGlvbiA9ICdhYm92ZSBhZnRlcic7XG5cbiAgLyoqIFRoZSBjb250ZW50IGZvciB0aGUgYmFkZ2UgKi9cbiAgQElucHV0KCdtYXRCYWRnZScpIGNvbnRlbnQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgLyoqIE1lc3NhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgZGVjb3JhdGVkIGVsZW1lbnQgdmlhIGFyaWEtZGVzY3JpYmVkYnkgKi9cbiAgQElucHV0KCdtYXRCYWRnZURlc2NyaXB0aW9uJylcbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjsgfVxuICBzZXQgZGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb246IHN0cmluZykge1xuICAgIGlmIChuZXdEZXNjcmlwdGlvbiAhPT0gdGhpcy5fZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGJhZGdlRWxlbWVudCA9IHRoaXMuX2JhZGdlRWxlbWVudDtcbiAgICAgIHRoaXMuX3VwZGF0ZUhvc3RBcmlhRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24sIHRoaXMuX2Rlc2NyaXB0aW9uKTtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247XG5cbiAgICAgIGlmIChiYWRnZUVsZW1lbnQpIHtcbiAgICAgICAgbmV3RGVzY3JpcHRpb24gPyBiYWRnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbmV3RGVzY3JpcHRpb24pIDpcbiAgICAgICAgICAgIGJhZGdlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKiogU2l6ZSBvZiB0aGUgYmFkZ2UuIENhbiBiZSAnc21hbGwnLCAnbWVkaXVtJywgb3IgJ2xhcmdlJy4gKi9cbiAgQElucHV0KCdtYXRCYWRnZVNpemUnKSBzaXplOiBNYXRCYWRnZVNpemUgPSAnbWVkaXVtJztcblxuICAvKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgaGlkZGVuLiAqL1xuICBASW5wdXQoJ21hdEJhZGdlSGlkZGVuJylcbiAgZ2V0IGhpZGRlbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hpZGRlbjsgfVxuICBzZXQgaGlkZGVuKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGRlbiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICB9XG4gIHByaXZhdGUgX2hpZGRlbjogYm9vbGVhbjtcblxuICAvKiogVW5pcXVlIGlkIGZvciB0aGUgYmFkZ2UgKi9cbiAgX2lkOiBudW1iZXIgPSBuZXh0SWQrKztcblxuICBwcml2YXRlIF9iYWRnZUVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgIHByaXZhdGUgX2FyaWFEZXNjcmliZXI6IEFyaWFEZXNjcmliZXIsXG4gICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIHByaXZhdGUgX2FuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIGlmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChuYXRpdmVFbGVtZW50Lm5vZGVUeXBlICE9PSBuYXRpdmVFbGVtZW50LkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdtYXRCYWRnZSBtdXN0IGJlIGF0dGFjaGVkIHRvIGFuIGVsZW1lbnQgbm9kZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAvKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgYWJvdmUgdGhlIGhvc3Qgb3Igbm90ICovXG4gIGlzQWJvdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24uaW5kZXhPZignYmVsb3cnKSA9PT0gLTE7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgYWZ0ZXIgdGhlIGhvc3Qgb3Igbm90ICovXG4gIGlzQWZ0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24uaW5kZXhPZignYmVmb3JlJykgPT09IC0xO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2UgPSBjaGFuZ2VzWydjb250ZW50J107XG5cbiAgICBpZiAoY29udGVudENoYW5nZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250ZW50Q2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuX2hhc0NvbnRlbnQgPSB2YWx1ZSAhPSBudWxsICYmIGAke3ZhbHVlfWAudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICB0aGlzLl91cGRhdGVUZXh0Q29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnN0IGJhZGdlRWxlbWVudCA9IHRoaXMuX2JhZGdlRWxlbWVudDtcblxuICAgIGlmIChiYWRnZUVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24oYmFkZ2VFbGVtZW50LCB0aGlzLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBjcmVhdGluZyBhIGJhZGdlIHRocm91Z2ggdGhlIFJlbmRlcmVyLCBBbmd1bGFyIHdpbGwga2VlcCBpdCBpbiBhbiBpbmRleC5cbiAgICAgIC8vIFdlIGhhdmUgdG8gZGVzdHJveSBpdCBvdXJzZWx2ZXMsIG90aGVyd2lzZSBpdCdsbCBiZSByZXRhaW5lZCBpbiBtZW1vcnkuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZXIuZGVzdHJveU5vZGUpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuZGVzdHJveU5vZGUoYmFkZ2VFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWxlbWVudCBpbnRvIHdoaWNoIHRoZSBiYWRnZSdzIGNvbnRlbnQgaXMgYmVpbmcgcmVuZGVyZWQuXG4gICAqIFVuZGVmaW5lZCBpZiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBjcmVhdGVkIChlLmcuIGlmIHRoZSBiYWRnZSBkb2Vzbid0IGhhdmUgY29udGVudCkuXG4gICAqL1xuICBnZXRCYWRnZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9iYWRnZUVsZW1lbnQ7XG4gIH1cblxuICAvKiogSW5qZWN0cyBhIHNwYW4gZWxlbWVudCBpbnRvIHRoZSBET00gd2l0aCB0aGUgY29udGVudC4gKi9cbiAgcHJpdmF0ZSBfdXBkYXRlVGV4dENvbnRlbnQoKTogSFRNTFNwYW5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuX2JhZGdlRWxlbWVudCkge1xuICAgICAgdGhpcy5fYmFkZ2VFbGVtZW50ID0gdGhpcy5fY3JlYXRlQmFkZ2VFbGVtZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JhZGdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX3N0cmluZ2lmeUNvbnRlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2JhZGdlRWxlbWVudDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBiYWRnZSBlbGVtZW50ICovXG4gIHByaXZhdGUgX2NyZWF0ZUJhZGdlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFkZ2VFbGVtZW50ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gJ21hdC1iYWRnZS1hY3RpdmUnO1xuICAgIGNvbnN0IGNvbnRlbnRDbGFzcyA9ICdtYXQtYmFkZ2UtY29udGVudCc7XG5cbiAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgYmFkZ2VzIHdoaWNoIG1heSBoYXZlIHBlcnNpc3RlZCBmcm9tIGEgc2VydmVyLXNpZGUgcmVuZGVyLlxuICAgIHRoaXMuX2NsZWFyRXhpc3RpbmdCYWRnZXMoY29udGVudENsYXNzKTtcbiAgICBiYWRnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGBtYXQtYmFkZ2UtY29udGVudC0ke3RoaXMuX2lkfWApO1xuICAgIGJhZGdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNvbnRlbnRDbGFzcyk7XG4gICAgYmFkZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5fc3RyaW5naWZ5Q29udGVudCgpO1xuXG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycpIHtcbiAgICAgIGJhZGdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdfbWF0LWFuaW1hdGlvbi1ub29wYWJsZScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBiYWRnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy5kZXNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGJhZGdlRWxlbWVudCk7XG5cbiAgICAvLyBhbmltYXRlIGluIGFmdGVyIGluc2VydGlvblxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX2FuaW1hdGlvbk1vZGUgIT09ICdOb29wQW5pbWF0aW9ucycpIHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgYmFkZ2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWRnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhZGdlRWxlbWVudDtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBhcmlhLWxhYmVsIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50ICovXG4gIHByaXZhdGUgX3VwZGF0ZUhvc3RBcmlhRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb246IHN0cmluZywgb2xkRGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGVuc3VyZSBjb250ZW50IGF2YWlsYWJsZSBiZWZvcmUgc2V0dGluZyBsYWJlbFxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl91cGRhdGVUZXh0Q29udGVudCgpO1xuXG4gICAgaWYgKG9sZERlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9hcmlhRGVzY3JpYmVyLnJlbW92ZURlc2NyaXB0aW9uKGNvbnRlbnQsIG9sZERlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAobmV3RGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2FyaWFEZXNjcmliZXIuZGVzY3JpYmUoY29udGVudCwgbmV3RGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBZGRzIGNzcyB0aGVtZSBjbGFzcyBnaXZlbiB0aGUgY29sb3IgdG8gdGhlIGNvbXBvbmVudCBob3N0ICovXG4gIHByaXZhdGUgX3NldENvbG9yKGNvbG9yUGFsZXR0ZTogVGhlbWVQYWxldHRlKSB7XG4gICAgaWYgKGNvbG9yUGFsZXR0ZSAhPT0gdGhpcy5fY29sb3IpIHtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICBpZiAodGhpcy5fY29sb3IpIHtcbiAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShgbWF0LWJhZGdlLSR7dGhpcy5fY29sb3J9YCk7XG4gICAgICB9XG4gICAgICBpZiAoY29sb3JQYWxldHRlKSB7XG4gICAgICAgIGNsYXNzTGlzdC5hZGQoYG1hdC1iYWRnZS0ke2NvbG9yUGFsZXR0ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQ2xlYXJzIGFueSBleGlzdGluZyBiYWRnZXMgdGhhdCBtaWdodCBiZSBsZWZ0IG92ZXIgZnJvbSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuICovXG4gIHByaXZhdGUgX2NsZWFyRXhpc3RpbmdCYWRnZXMoY3NzQ2xhc3M6IHN0cmluZykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgbGV0IGNoaWxkQ291bnQgPSBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aDtcblxuICAgIC8vIFVzZSBhIHJldmVyc2Ugd2hpbGUsIGJlY2F1c2Ugd2UnbGwgYmUgcmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgbGlzdCBhcyB3ZSdyZSBpdGVyYXRpbmcuXG4gICAgd2hpbGUgKGNoaWxkQ291bnQtLSkge1xuICAgICAgY29uc3QgY3VycmVudENoaWxkID0gZWxlbWVudC5jaGlsZHJlbltjaGlsZENvdW50XTtcblxuICAgICAgaWYgKGN1cnJlbnRDaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY3VycmVudENoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWRnZSBjb250ZW50LiAqL1xuICBwcml2YXRlIF9zdHJpbmdpZnlDb250ZW50KCk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydCBudWxsIGFuZCB1bmRlZmluZWQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoaWNoIGlzIGNvbnNpc3RlbnRcbiAgICAvLyB3aXRoIGhvdyBBbmd1bGFyIGhhbmRsZXMgdGhlbSBpbiBpbnNpZGUgdGVtcGxhdGUgaW50ZXJwb2xhdGlvbnMuXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICByZXR1cm4gY29udGVudCA9PSBudWxsID8gJycgOiBgJHtjb250ZW50fWA7XG4gIH1cblxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hpZGRlbjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfb3ZlcmxhcDogQm9vbGVhbklucHV0O1xufVxuIl19
|