@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
444 lines • 36.2 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { CommonModule } from '@angular/common';
import { Component, Directive, HostBinding, Optional, Inject, Input, NgModule } from '@angular/core';
import { IgxButtonModule } from '../directives/button/button.directive';
let NEXT_ID = 0;
/**
* IgxCardMedia is container for the card media section.
* Use it to wrap images and videos.
*/
let IgxCardMediaDirective = class IgxCardMediaDirective {
constructor() {
/**
* @hidden
*/
this.cssClass = 'igx-card__media';
/**
* An @Input property that sets the `width` and `min-width` style property
* of the media container. If not provided it will be set to `auto`.
* ```html
* <igx-card-media width="300px"></igx-card-media>
* ```
*/
this.width = 'auto';
/**
* An @Input property that sets the `height` style property of the media container.
* If not provided it will be set to `auto`.
* ```html
* <igx-card-media height="50%"></igx-card-media>
* ```
*/
this.height = 'auto';
/**
* An @Input property that sets the `role` attribute of the media container.
*/
this.role = 'img';
}
};
__decorate([
HostBinding('class.igx-card__media'),
__metadata("design:type", Object)
], IgxCardMediaDirective.prototype, "cssClass", void 0);
__decorate([
HostBinding('style.width'),
HostBinding('style.min-width'),
Input(),
__metadata("design:type", Object)
], IgxCardMediaDirective.prototype, "width", void 0);
__decorate([
HostBinding('style.height'),
Input(),
__metadata("design:type", Object)
], IgxCardMediaDirective.prototype, "height", void 0);
__decorate([
HostBinding('attr.role'),
Input(),
__metadata("design:type", Object)
], IgxCardMediaDirective.prototype, "role", void 0);
IgxCardMediaDirective = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: 'igx-card-media'
})
], IgxCardMediaDirective);
export { IgxCardMediaDirective };
/**
* IgxCardHeader is container for the card header
*/
let IgxCardHeaderComponent = class IgxCardHeaderComponent {
constructor() {
/**
* @hidden
*/
this.cssClass = 'igx-card-header';
/**
* An @Input property that sets the layout style of the header.
* By default the header elements(thumbnail and title/subtitle) are aligned horizontally.
* ```html
* <igx-card-header [vertical]="true"></igx-card-header>
* ```
*/
this.vertical = false;
/**
* An @Input property that sets the value of the `role` attribute of the card header.
* By default the value is set to `header`.
* ```html
* <igx-card-header role="header"></igx-card-header>
* ```
*/
this.role = 'header';
}
};
__decorate([
HostBinding('class.igx-card-header'),
__metadata("design:type", Object)
], IgxCardHeaderComponent.prototype, "cssClass", void 0);
__decorate([
HostBinding('class.igx-card-header--vertical'),
Input(),
__metadata("design:type", Object)
], IgxCardHeaderComponent.prototype, "vertical", void 0);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxCardHeaderComponent.prototype, "role", void 0);
IgxCardHeaderComponent = __decorate([
Component({
selector: 'igx-card-header',
template: "<div class=\"igx-card-header__thumbnail\">\n <ng-content select=\"igx-avatar, igx-card-media, [igxCardThumbnail]\"></ng-content>\n</div>\n\n<div class=\"igx-card-header__titles\">\n <ng-content select=\"\n [igxCardHeaderTitle],\n [igxCardHeaderSubtitle],\n .igx-card-header__title,\n .igx-card-header__subtitle\">\n </ng-content>\n</div>\n\n<ng-content></ng-content>\n"
})
], IgxCardHeaderComponent);
export { IgxCardHeaderComponent };
/**
* IgxCardThumbnail is container for the card thumbnail section.
* Use it to wrap anything you want to be used as a thumbnail.
*/
let IgxCardThumbnailDirective = class IgxCardThumbnailDirective {
};
IgxCardThumbnailDirective = __decorate([
Directive({
selector: '[igxCardThumbnail]'
})
], IgxCardThumbnailDirective);
export { IgxCardThumbnailDirective };
/**
* igxCardHeaderTitle is used to denote the header title in a card.
* Use it to tag text nodes.
*/
let IgxCardHeaderTitleDirective = class IgxCardHeaderTitleDirective {
constructor() {
/**
* @hidden
*/
this.cssClass = 'igx-card__header__title';
}
};
__decorate([
HostBinding('class.igx-card-header__title'),
__metadata("design:type", Object)
], IgxCardHeaderTitleDirective.prototype, "cssClass", void 0);
IgxCardHeaderTitleDirective = __decorate([
Directive({
selector: '[igxCardHeaderTitle]'
})
], IgxCardHeaderTitleDirective);
export { IgxCardHeaderTitleDirective };
/**
* igxCardHeaderSubtitle is used to denote the header subtitle in a card.
* Use it to tag text nodes.
*/
let IgxCardHeaderSubtitleDirective = class IgxCardHeaderSubtitleDirective {
constructor() {
/**
* @hidden
*/
this.cssClass = 'igx-card-header__subtitle';
}
};
__decorate([
HostBinding('class.igx-card-header__subtitle'),
__metadata("design:type", Object)
], IgxCardHeaderSubtitleDirective.prototype, "cssClass", void 0);
IgxCardHeaderSubtitleDirective = __decorate([
Directive({
selector: '[igxCardHeaderSubtitle]'
})
], IgxCardHeaderSubtitleDirective);
export { IgxCardHeaderSubtitleDirective };
/**
* IgxCardContent is container for the card content.
*/
let IgxCardContentDirective = class IgxCardContentDirective {
constructor() {
/**
* @hidden
*/
this.cssClass = 'igx-card-content';
}
};
__decorate([
HostBinding('class.igx-card-content'),
__metadata("design:type", Object)
], IgxCardContentDirective.prototype, "cssClass", void 0);
IgxCardContentDirective = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: 'igx-card-content'
})
], IgxCardContentDirective);
export { IgxCardContentDirective };
/**
* IgxCardFooter is container for the card footer
*/
let IgxCardFooterDirective = class IgxCardFooterDirective {
constructor() {
/**
* An @Input property that sets the value of the `role` attribute of the card footer.
* By default the value is set to `footer`.
* ```html
* <igx-card-footer role="footer"></igx-card-footer>
* ```
*/
this.role = 'footer';
}
};
__decorate([
HostBinding('attr.role'),
Input(),
__metadata("design:type", Object)
], IgxCardFooterDirective.prototype, "role", void 0);
IgxCardFooterDirective = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: 'igx-card-footer'
})
], IgxCardFooterDirective);
export { IgxCardFooterDirective };
/**
* **Ignite UI for Angular Card** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card.html)
*
* The Ignite UI Card serves as a container that allows custom content to be organized in an appealing way. There are
* five sections in a card that you can use to organize your content. These are header, media, content, actions, and footer.
*
* Example:
* ```html
* <igx-card>
* <igx-card-header>
* <h3 igxCardHeaderTitle>{{title}}</h3>
* <h5 igxCardHeaderSubtitle>{{subtitle}}</h5>
* </igx-card-header>
* <igx-card-actions>
* <button igxButton igxRipple>Share</button>
* <button igxButton igxRipple>Play Album</button>
* </igx-card-actions>
* </igx-card>
* ```
*/
export var IgxCardType;
(function (IgxCardType) {
IgxCardType["DEFAULT"] = "default";
IgxCardType["OUTLINED"] = "outlined";
})(IgxCardType || (IgxCardType = {}));
let IgxCardComponent = class IgxCardComponent {
constructor() {
/**
* Sets/gets the `id` of the card.
* If not set, `id` will have value `"igx-card-0"`;
* ```html
* <igx-card id = "my-first-card"></igx-card>
* ```
* ```typescript
* let cardId = this.card.id;
* ```
* @memberof IgxCardComponent
*/
this.id = `igx-card-${NEXT_ID++}`;
/**
* An @Input property that sets the value of the `role` attribute of the card.
* By default the value is set to `group`.
* ```html
* <igx-card role="group"></igx-card>
* ```
*/
this.role = 'group';
/**
* An @Input property that sets the value of the `type` attribute of the card.
* By default the value is set to `default`. You can make the card use the
* outlined style by setting the value to `outlined`.
* ```html
* <igx-card type="outlined"></igx-card>
* ```
*/
this.type = IgxCardType.DEFAULT;
/**
* An @Input property that sets the value of the `horizontal` attribute of the card.
* Setting this to `true` will make the different card sections align horizontally,
* essentially flipping the card to the side.
* ```html
* <igx-card [horizontal]="true"></igx-card>
* ```
*/
this.horizontal = false;
}
/**
* A getter which will return true if the card type is `outlined`.
*/
get isOutlinedCard() {
return this.type === IgxCardType.OUTLINED;
}
};
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxCardComponent.prototype, "id", void 0);
__decorate([
HostBinding('attr.role'),
Input(),
__metadata("design:type", Object)
], IgxCardComponent.prototype, "role", void 0);
__decorate([
HostBinding('class.igx-card'),
Input(),
__metadata("design:type", String)
], IgxCardComponent.prototype, "type", void 0);
__decorate([
HostBinding('class.igx-card--outlined'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxCardComponent.prototype, "isOutlinedCard", null);
__decorate([
HostBinding('class.igx-card--horizontal'),
Input(),
__metadata("design:type", Object)
], IgxCardComponent.prototype, "horizontal", void 0);
IgxCardComponent = __decorate([
Component({
selector: 'igx-card',
template: "<ng-container select='igx-card-media'></ng-container>\n\n<ng-container select='igx-card-header'></ng-container>\n<ng-container select='igx-card-content'>\n <ng-content></ng-content>\n</ng-container>\n\n<ng-container select='igx-card-actions'></ng-container>\n"
})
], IgxCardComponent);
export { IgxCardComponent };
export var IgxCardActionsLayout;
(function (IgxCardActionsLayout) {
IgxCardActionsLayout["DEFAULT"] = "default";
IgxCardActionsLayout["JUSTIFY"] = "justify";
})(IgxCardActionsLayout || (IgxCardActionsLayout = {}));
/**
* IgxCardActions is container for the card actions.
*/
let IgxCardActionsComponent = class IgxCardActionsComponent {
constructor(card) {
this.card = card;
this.isVerticalSet = false;
/**
* An @Input property that sets the layout style of the actions.
* By default icons and icon buttons, as well as regular buttons
* are split into two containers, which are then positioned on both ends
* of the card-actions area.
* You can justify the elements in those groups so they are positioned equally
* from one another taking up all the space available along the card actions axis.
* ```html
* <igx-card-actions layout="justify"></igx-card-actions>
* ```
*/
this.layout = 'default';
/**
* An @Input property that sets order of the buttons the actions area.
* By default all icons/icon buttons are placed at the end of the action
* area. Any regular buttons(flat, raised) will appear before the icons/icon buttons
* placed in the actions area.
* If you want to reverse their positions so that icons appear first, use the `reverse`
* attribute.
* ```html
* <igx-card-actions [reverse]="true"></igx-card-actions>
* ```
*/
this.reverse = false;
}
/**
* A getter that returns `true` when the layout has been
* set to `justify`.
*/
get isJustifyLayout() {
return this.layout === IgxCardActionsLayout.JUSTIFY;
}
ngOnChanges(changes) {
for (const prop in changes) {
if (prop === 'vertical') {
this.isVerticalSet = true;
}
}
}
ngOnInit() {
this.vertical = !this.isVerticalSet && this.card.horizontal;
}
};
IgxCardActionsComponent.ctorParameters = () => [
{ type: IgxCardComponent, decorators: [{ type: Optional }, { type: Inject, args: [IgxCardComponent,] }] }
];
__decorate([
HostBinding('class.igx-card-actions'),
Input(),
__metadata("design:type", String)
], IgxCardActionsComponent.prototype, "layout", void 0);
__decorate([
HostBinding('class.igx-card-actions--vertical'),
Input(),
__metadata("design:type", Boolean)
], IgxCardActionsComponent.prototype, "vertical", void 0);
__decorate([
HostBinding('class.igx-card-actions--justify'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxCardActionsComponent.prototype, "isJustifyLayout", null);
__decorate([
HostBinding('class.igx-card-actions--reverse'),
Input(),
__metadata("design:type", Object)
], IgxCardActionsComponent.prototype, "reverse", void 0);
IgxCardActionsComponent = __decorate([
Component({
// tslint:disable-next-line:directive-selector
selector: 'igx-card-actions',
template: "<div class=\"igx-card-actions__icons\">\n <ng-content select=\"igx-icon, [igxButton='icon']\"></ng-content>\n</div>\n\n<div #buttons class=\"igx-card-actions__buttons\">\n <ng-content select=\"[igxButton]\"></ng-content>\n</div>\n\n\n<ng-content></ng-content>\n"
}),
__param(0, Optional()), __param(0, Inject(IgxCardComponent)),
__metadata("design:paramtypes", [IgxCardComponent])
], IgxCardActionsComponent);
export { IgxCardActionsComponent };
/**
* @hidden
*/
let IgxCardModule = class IgxCardModule {
};
IgxCardModule = __decorate([
NgModule({
declarations: [
IgxCardComponent,
IgxCardHeaderComponent,
IgxCardMediaDirective,
IgxCardContentDirective,
IgxCardActionsComponent,
IgxCardFooterDirective,
IgxCardHeaderTitleDirective,
IgxCardHeaderSubtitleDirective,
IgxCardThumbnailDirective,
],
exports: [
IgxCardComponent,
IgxCardHeaderComponent,
IgxCardMediaDirective,
IgxCardContentDirective,
IgxCardActionsComponent,
IgxCardFooterDirective,
IgxCardHeaderTitleDirective,
IgxCardHeaderSubtitleDirective,
IgxCardThumbnailDirective,
],
imports: [CommonModule, IgxButtonModule]
})
], IgxCardModule);
export { IgxCardModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NhcmQvY2FyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUlYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7OztHQUdHO0FBS0gsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFBbEM7UUFDSTs7V0FFRztRQUVJLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUVwQzs7Ozs7O1dBTUc7UUFJSSxVQUFLLEdBQUcsTUFBTSxDQUFDO1FBRXRCOzs7Ozs7V0FNRztRQUdJLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFdkI7O1dBRUc7UUFHSSxTQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7Q0FBQSxDQUFBO0FBL0JHO0lBREMsV0FBVyxDQUFDLHVCQUF1QixDQUFDOzt1REFDRDtBQVlwQztJQUhDLFdBQVcsQ0FBQyxhQUFhLENBQUM7SUFDMUIsV0FBVyxDQUFDLGlCQUFpQixDQUFDO0lBQzlCLEtBQUssRUFBRTs7b0RBQ2M7QUFXdEI7SUFGQyxXQUFXLENBQUMsY0FBYyxDQUFDO0lBQzNCLEtBQUssRUFBRTs7cURBQ2U7QUFPdkI7SUFGQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ3hCLEtBQUssRUFBRTs7bURBQ1k7QUFuQ1gscUJBQXFCO0lBSmpDLFNBQVMsQ0FBQztRQUNQLDhDQUE4QztRQUM5QyxRQUFRLEVBQUUsZ0JBQWdCO0tBQzdCLENBQUM7R0FD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QWMsZ0JBQWdCO0dBSHRFLHVCQUF1QixDQStEbkM7U0EvRFksdUJBQXVCO0FBaUVwQzs7R0FFRztBQTBCSCxJQUFhLGFBQWEsR0FBMUIsTUFBYSxhQUFhO0NBQUksQ0FBQTtBQUFqQixhQUFhO0lBekJ6QixRQUFRLENBQUM7UUFDTixZQUFZLEVBQUU7WUFDVixnQkFBZ0I7WUFDaEIsc0JBQXNCO1lBQ3RCLHFCQUFxQjtZQUNyQix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBQ3ZCLHNCQUFzQjtZQUN0QiwyQkFBMkI7WUFDM0IsOEJBQThCO1lBQzlCLHlCQUF5QjtTQUM1QjtRQUNELE9BQU8sRUFBRTtZQUNMLGdCQUFnQjtZQUNoQixzQkFBc0I7WUFDdEIscUJBQXFCO1lBQ3JCLHVCQUF1QjtZQUN2Qix1QkFBdUI7WUFDdkIsc0JBQXNCO1lBQ3RCLDJCQUEyQjtZQUMzQiw4QkFBOEI7WUFDOUIseUJBQXlCO1NBQzVCO1FBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztLQUMzQyxDQUFDO0dBQ1csYUFBYSxDQUFJO1NBQWpCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIE9wdGlvbmFsLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkluaXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG4vKipcbiAqIElneENhcmRNZWRpYSBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIG1lZGlhIHNlY3Rpb24uXG4gKiBVc2UgaXQgdG8gd3JhcCBpbWFnZXMgYW5kIHZpZGVvcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtbWVkaWEnXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRNZWRpYURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmRfX21lZGlhJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcmRfX21lZGlhJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGB3aWR0aGAgYW5kIGBtaW4td2lkdGhgIHN0eWxlIHByb3BlcnR5XG4gICAgICogb2YgdGhlIG1lZGlhIGNvbnRhaW5lci4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLW1lZGlhIHdpZHRoPVwiMzAwcHhcIj48L2lneC1jYXJkLW1lZGlhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWluLXdpZHRoJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aWR0aCA9ICdhdXRvJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGBoZWlnaHRgIHN0eWxlIHByb3BlcnR5IG9mIHRoZSBtZWRpYSBjb250YWluZXIuXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLW1lZGlhIGhlaWdodD1cIjUwJVwiPjwvaWd4LWNhcmQtbWVkaWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlaWdodCA9ICdhdXRvJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIG1lZGlhIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm9sZSA9ICdpbWcnO1xufVxuXG4vKipcbiAqIElneENhcmRIZWFkZXIgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBoZWFkZXJcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtY2FyZC1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRIZWFkZXJDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcicpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jYXJkLWhlYWRlcic7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBsYXlvdXQgc3R5bGUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBoZWFkZXIgZWxlbWVudHModGh1bWJuYWlsIGFuZCB0aXRsZS9zdWJ0aXRsZSkgYXJlIGFsaWduZWQgaG9yaXpvbnRhbGx5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtaGVhZGVyIFt2ZXJ0aWNhbF09XCJ0cnVlXCI+PC9pZ3gtY2FyZC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1oZWFkZXItLXZlcnRpY2FsJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2ZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQgaGVhZGVyLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgaGVhZGVyYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWhlYWRlciByb2xlPVwiaGVhZGVyXCI+PC9pZ3gtY2FyZC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ2hlYWRlcic7XG59XG5cbi8qKlxuICogSWd4Q2FyZFRodW1ibmFpbCBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIHRodW1ibmFpbCBzZWN0aW9uLlxuICogVXNlIGl0IHRvIHdyYXAgYW55dGhpbmcgeW91IHdhbnQgdG8gYmUgdXNlZCBhcyBhIHRodW1ibmFpbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4Q2FyZFRodW1ibmFpbF0nXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRUaHVtYm5haWxEaXJlY3RpdmUgeyB9XG5cbi8qKlxuICogaWd4Q2FyZEhlYWRlclRpdGxlIGlzIHVzZWQgdG8gZGVub3RlIHRoZSBoZWFkZXIgdGl0bGUgaW4gYSBjYXJkLlxuICogVXNlIGl0IHRvIHRhZyB0ZXh0IG5vZGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYXJkSGVhZGVyVGl0bGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkSGVhZGVyVGl0bGVEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcl9fdGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZF9faGVhZGVyX190aXRsZSc7XG59XG5cbi8qKlxuICogaWd4Q2FyZEhlYWRlclN1YnRpdGxlIGlzIHVzZWQgdG8gZGVub3RlIHRoZSBoZWFkZXIgc3VidGl0bGUgaW4gYSBjYXJkLlxuICogVXNlIGl0IHRvIHRhZyB0ZXh0IG5vZGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYXJkSGVhZGVyU3VidGl0bGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkSGVhZGVyU3VidGl0bGVEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcl9fc3VidGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZC1oZWFkZXJfX3N1YnRpdGxlJztcbn1cbi8qKlxuICogSWd4Q2FyZENvbnRlbnQgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBjb250ZW50LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdpZ3gtY2FyZC1jb250ZW50J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtY29udGVudCcpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jYXJkLWNvbnRlbnQnO1xufVxuXG4vKipcbiAqIElneENhcmRGb290ZXIgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBmb290ZXJcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtZm9vdGVyJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkRm9vdGVyRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2FyZCBmb290ZXIuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgc2V0IHRvIGBmb290ZXJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtZm9vdGVyIHJvbGU9XCJmb290ZXJcIj48L2lneC1jYXJkLWZvb3Rlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm9sZSA9ICdmb290ZXInO1xufVxuXG4vKipcbiAqICoqSWduaXRlIFVJIGZvciBBbmd1bGFyIENhcmQqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvY2FyZC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgQ2FyZCBzZXJ2ZXMgYXMgYSBjb250YWluZXIgdGhhdCBhbGxvd3MgY3VzdG9tIGNvbnRlbnQgdG8gYmUgb3JnYW5pemVkIGluIGFuIGFwcGVhbGluZyB3YXkuIFRoZXJlIGFyZVxuICogZml2ZSBzZWN0aW9ucyBpbiBhIGNhcmQgdGhhdCB5b3UgY2FuIHVzZSB0byBvcmdhbml6ZSB5b3VyIGNvbnRlbnQuIFRoZXNlIGFyZSBoZWFkZXIsIG1lZGlhLCBjb250ZW50LCBhY3Rpb25zLCBhbmQgZm9vdGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LWNhcmQ+XG4gKiAgIDxpZ3gtY2FyZC1oZWFkZXI+XG4gKiAgICAgPGgzIGlneENhcmRIZWFkZXJUaXRsZT57e3RpdGxlfX08L2gzPlxuICogICAgIDxoNSBpZ3hDYXJkSGVhZGVyU3VidGl0bGU+e3tzdWJ0aXRsZX19PC9oNT5cbiAqICAgPC9pZ3gtY2FyZC1oZWFkZXI+XG4gKiAgIDxpZ3gtY2FyZC1hY3Rpb25zPlxuICogICAgICAgPGJ1dHRvbiBpZ3hCdXR0b24gaWd4UmlwcGxlPlNoYXJlPC9idXR0b24+XG4gKiAgICAgICA8YnV0dG9uIGlneEJ1dHRvbiBpZ3hSaXBwbGU+UGxheSBBbGJ1bTwvYnV0dG9uPlxuICogICA8L2lneC1jYXJkLWFjdGlvbnM+XG4gKiA8L2lneC1jYXJkPlxuICogYGBgXG4gKi9cblxuZXhwb3J0IGVudW0gSWd4Q2FyZFR5cGUge1xuICAgIERFRkFVTFQgPSAnZGVmYXVsdCcsXG4gICAgT1VUTElORUQgPSAnb3V0bGluZWQnXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBjYXJkLlxuICAgICAqIElmIG5vdCBzZXQsIGBpZGAgd2lsbCBoYXZlIHZhbHVlIGBcImlneC1jYXJkLTBcImA7XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCBpZCA9IFwibXktZmlyc3QtY2FyZFwiPjwvaWd4LWNhcmQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjYXJkSWQgPSAgdGhpcy5jYXJkLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJkQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtY2FyZC0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgc2V0IHRvIGBncm91cGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCByb2xlPVwiZ3JvdXBcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb2xlID0gJ2dyb3VwJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgYXR0cmlidXRlIG9mIHRoZSBjYXJkLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgZGVmYXVsdGAuIFlvdSBjYW4gbWFrZSB0aGUgY2FyZCB1c2UgdGhlXG4gICAgICogb3V0bGluZWQgc3R5bGUgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYG91dGxpbmVkYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkIHR5cGU9XCJvdXRsaW5lZFwiPjwvaWd4LWNhcmQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHlwZTogSWd4Q2FyZFR5cGUgfCBzdHJpbmcgPSBJZ3hDYXJkVHlwZS5ERUZBVUxUO1xuXG4gICAgLyoqXG4gICAgICogQSBnZXR0ZXIgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FyZCB0eXBlIGlzIGBvdXRsaW5lZGAuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC0tb3V0bGluZWQnKVxuICAgIGdldCBpc091dGxpbmVkQ2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gSWd4Q2FyZFR5cGUuT1VUTElORUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBob3Jpem9udGFsYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQuXG4gICAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCB3aWxsIG1ha2UgdGhlIGRpZmZlcmVudCBjYXJkIHNlY3Rpb25zIGFsaWduIGhvcml6b250YWxseSxcbiAgICAgKiBlc3NlbnRpYWxseSBmbGlwcGluZyB0aGUgY2FyZCB0byB0aGUgc2lkZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkIFtob3Jpem9udGFsXT1cInRydWVcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtLWhvcml6b250YWwnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhvcml6b250YWwgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGVudW0gSWd4Q2FyZEFjdGlvbnNMYXlvdXQge1xuICAgIERFRkFVTFQgPSAnZGVmYXVsdCcsXG4gICAgSlVTVElGWSA9ICdqdXN0aWZ5Jyxcbn1cblxuLyoqXG4gKiBJZ3hDYXJkQWN0aW9ucyBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIGFjdGlvbnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJkLWFjdGlvbnMnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC1hY3Rpb25zLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkQWN0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIGlzVmVydGljYWxTZXQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoSWd4Q2FyZENvbXBvbmVudCkgcHVibGljIGNhcmQ6IElneENhcmRDb21wb25lbnQpIHsgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgbGF5b3V0IHN0eWxlIG9mIHRoZSBhY3Rpb25zLlxuICAgICAqIEJ5IGRlZmF1bHQgaWNvbnMgYW5kIGljb24gYnV0dG9ucywgYXMgd2VsbCBhcyByZWd1bGFyIGJ1dHRvbnNcbiAgICAgKiBhcmUgc3BsaXQgaW50byB0d28gY29udGFpbmVycywgd2hpY2ggYXJlIHRoZW4gcG9zaXRpb25lZCBvbiBib3RoIGVuZHNcbiAgICAgKiBvZiB0aGUgY2FyZC1hY3Rpb25zIGFyZWEuXG4gICAgICogWW91IGNhbiBqdXN0aWZ5IHRoZSBlbGVtZW50cyBpbiB0aG9zZSBncm91cHMgc28gdGhleSBhcmUgcG9zaXRpb25lZCBlcXVhbGx5XG4gICAgICogZnJvbSBvbmUgYW5vdGhlciB0YWtpbmcgdXAgYWxsIHRoZSBzcGFjZSBhdmFpbGFibGUgYWxvbmcgdGhlIGNhcmQgYWN0aW9ucyBheGlzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtYWN0aW9ucyBsYXlvdXQ9XCJqdXN0aWZ5XCI+PC9pZ3gtY2FyZC1hY3Rpb25zPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtYWN0aW9ucycpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGF5b3V0OiBJZ3hDYXJkQWN0aW9uc0xheW91dCB8IHN0cmluZyA9ICdkZWZhdWx0JztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZlcnRpY2FsIGF0dHJpYnV0ZSBvZiB0aGUgYWN0aW9ucy5cbiAgICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAgdGhlIGFjdGlvbnMgd2lsbCBiZSBsYXllZCBvdXQgdmVydGljYWxseS5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMtLXZlcnRpY2FsJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2ZXJ0aWNhbDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgbGF5b3V0IGhhcyBiZWVuXG4gICAgICogc2V0IHRvIGBqdXN0aWZ5YC5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMtLWp1c3RpZnknKVxuICAgIGdldCBpc0p1c3RpZnlMYXlvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dCA9PT0gSWd4Q2FyZEFjdGlvbnNMYXlvdXQuSlVTVElGWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIG9yZGVyIG9mIHRoZSBidXR0b25zIHRoZSBhY3Rpb25zIGFyZWEuXG4gICAgICogQnkgZGVmYXVsdCBhbGwgaWNvbnMvaWNvbiBidXR0b25zIGFyZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYWN0aW9uXG4gICAgICogYXJlYS4gQW55IHJlZ3VsYXIgYnV0dG9ucyhmbGF0LCByYWlzZWQpIHdpbGwgYXBwZWFyIGJlZm9yZSB0aGUgaWNvbnMvaWNvbiBidXR0b25zXG4gICAgICogcGxhY2VkIGluIHRoZSBhY3Rpb25zIGFyZWEuXG4gICAgICogSWYgeW91IHdhbnQgdG8gcmV2ZXJzZSB0aGVpciBwb3NpdGlvbnMgc28gdGhhdCBpY29ucyBhcHBlYXIgZmlyc3QsIHVzZSB0aGUgYHJldmVyc2VgXG4gICAgICogYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtYWN0aW9ucyBbcmV2ZXJzZV09XCJ0cnVlXCI+PC9pZ3gtY2FyZC1hY3Rpb25zPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtYWN0aW9ucy0tcmV2ZXJzZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmVydGljYWxTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudmVydGljYWwgPSAhdGhpcy5pc1ZlcnRpY2FsU2V0ICYmIHRoaXMuY2FyZC5ob3Jpem9udGFsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIElneENhcmRDb21wb25lbnQsXG4gICAgICAgIElneENhcmRIZWFkZXJDb21wb25lbnQsXG4gICAgICAgIElneENhcmRNZWRpYURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZENvbnRlbnREaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRBY3Rpb25zQ29tcG9uZW50LFxuICAgICAgICBJZ3hDYXJkRm9vdGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkSGVhZGVyVGl0bGVEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRIZWFkZXJTdWJ0aXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZFRodW1ibmFpbERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgSWd4Q2FyZENvbXBvbmVudCxcbiAgICAgICAgSWd4Q2FyZEhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgSWd4Q2FyZE1lZGlhRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkQ29udGVudERpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZEFjdGlvbnNDb21wb25lbnQsXG4gICAgICAgIElneENhcmRGb290ZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRIZWFkZXJUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZEhlYWRlclN1YnRpdGxlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkVGh1bWJuYWlsRGlyZWN0aXZlLFxuICAgIF0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWd4QnV0dG9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkTW9kdWxlIHsgfVxuIl19