igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
466 lines • 35.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { CommonModule } from '@angular/common';
import { Component, ContentChild, ContentChildren, ElementRef, HostBinding, HostListener, Input, NgModule, QueryList, Inject, Optional } from '@angular/core';
import { IgxHintDirective } from '../directives/hint/hint.directive';
import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive';
import { IgxLabelDirective } from '../directives/label/label.directive';
import { IgxPrefixDirective, IgxPrefixModule } from '../directives/prefix/prefix.directive';
import { IgxSuffixDirective, IgxSuffixModule } from '../directives/suffix/suffix.directive';
import { DisplayDensity, DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity';
import { IgxInputGroupBase } from './input-group.common';
/** @type {?} */
let NEXT_ID = 0;
/** @enum {number} */
const IgxInputGroupType = {
LINE: 0,
BOX: 1,
BORDER: 2,
SEARCH: 3,
};
IgxInputGroupType[IgxInputGroupType.LINE] = 'LINE';
IgxInputGroupType[IgxInputGroupType.BOX] = 'BOX';
IgxInputGroupType[IgxInputGroupType.BORDER] = 'BORDER';
IgxInputGroupType[IgxInputGroupType.SEARCH] = 'SEARCH';
export class IgxInputGroupComponent extends DisplayDensityBase {
/**
* @param {?} _element
* @param {?} _displayDensityOptions
*/
constructor(_element, _displayDensityOptions) {
super(_displayDensityOptions);
this._element = _element;
this._displayDensityOptions = _displayDensityOptions;
this._type = IgxInputGroupType.LINE;
this._filled = false;
this._supressInputAutofocus = false;
/**
* An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated.
* ```html
* <igx-input-group [id]="'igx-input-group-55'"></igx-input-group>
* ```
*/
this.id = `igx-input-group-${NEXT_ID++}`;
/**
* Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`.
* By default applied the class is applied.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* this.inputGroup.defaultClass = false;
* ```
* }
*/
this.defaultClass = true;
/**
* @hidden
*/
this.hasPlaceholder = false;
/**
* @hidden
*/
this.isRequired = false;
/**
* @hidden
*/
this.isFocused = false;
/**
* @hidden
*/
this.isBox = false;
/**
* @hidden
*/
this.isBorder = false;
/**
* @hidden
*/
this.isSearch = false;
/**
* An \@Input property that disables the `IgxInputGroupComponent`.
* ```html
* <igx-input-group [disabled]="'true'"></igx-input-group>
* ```
*/
this.disabled = false;
/**
* @hidden
*/
this.hasWarning = false;
this.element = _element;
}
/**
* @hidden
* @return {?}
*/
get validClass() {
return this.input.valid === IgxInputState.VALID;
}
/**
* @hidden
* @return {?}
*/
get invalidClass() {
return this.input.valid === IgxInputState.INVALID;
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
onClick(event) {
if (!this._supressInputAutofocus) {
this.input.focus();
}
}
/**
* An \@Input property that sets how the input will be styled.
* The allowed values are `line`, `box`, `border` and `search`. The default is `line`.
* ```html
* <igx-input-group [type]="'search'">
* ```
* @param {?} value
* @return {?}
*/
set type(value) {
/** @type {?} */
const type = ((/** @type {?} */ (IgxInputGroupType)))[value.toUpperCase()];
if (type !== undefined) {
this.isBox = this.isBorder = this.isSearch = false;
switch (type) {
case IgxInputGroupType.BOX:
this.isBox = true;
break;
case IgxInputGroupType.BORDER:
this.isBorder = true;
break;
case IgxInputGroupType.SEARCH:
this.isSearch = true;
break;
default: break;
}
this._type = type;
}
}
/**
* Returns whether the input element of the input group will be automatically focused on click.
* ```typescript
* let supressInputAutofocus = this.inputGroup.supressInputAutofocus;
* ```
* @return {?}
*/
get supressInputAutofocus() {
return this._supressInputAutofocus;
}
/**
* Sets whether the input element of the input group will be automatically focused on click.
* ```html
* <igx-input-group [supressInputAutofocus]="true"></igx-input-group>
* ```
* @param {?} value
* @return {?}
*/
set supressInputAutofocus(value) {
this._supressInputAutofocus = value;
}
/**
* @hidden
* @return {?}
*/
get isFilled() {
return this._filled || (this.input && this.input.value);
}
/**
* @hidden
* @return {?}
*/
get isDisplayDensityCosy() {
return this.displayDensity === DisplayDensity.cosy;
}
/**
* @hidden
* @return {?}
*/
get isDisplayDensityComfortable() {
return this.displayDensity === DisplayDensity.comfortable;
}
/**
* @hidden
* @return {?}
*/
get isDisplayDensityCompact() {
return this.displayDensity === DisplayDensity.compact;
}
/**
* Returns the type of the `IgxInputGroupComponent`. How the input is styled.
* Values are `line` - 0, `box` - 1, `border` - 2 and `search` - 3. The default is `line`.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputType = this.inputGroup.type;
* }
* ```
* @return {?}
*/
get type() {
return this._type.toString();
}
/**
* Returns whether the `IgxInputGroupComponent` has hints.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputHints = this.inputGroup.hasHints;
* }
* ```
* @return {?}
*/
get hasHints() {
return this.hints.length > 0;
}
/**
* Returns whether the `IgxInputGroupComponent` has border.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputBroder = this.inputGroup.hasBorder;
* }
* ```
* @return {?}
*/
get hasBorder() {
return this._type === IgxInputGroupType.LINE ||
this._type === IgxInputGroupType.BOX;
}
/**
* Returns whether the `IgxInputGroupComponent` type is line.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeLine = this.inputGroup.isTypeLine;
* }
* ```
* @return {?}
*/
get isTypeLine() {
return this._type === IgxInputGroupType.LINE;
}
/**
* Returns whether the `IgxInputGroupComponent` type is box.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeBox = this.inputGroup.isTypeBox;
* }
* ```
* @return {?}
*/
get isTypeBox() {
return this._type === IgxInputGroupType.BOX;
}
/**
* Returns whether the `IgxInputGroupComponent` type is border.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeBorder = this.inputGroup.isTypeBorder;
* }
* ```
* @return {?}
*/
get isTypeBorder() {
return this._type === IgxInputGroupType.BORDER;
}
/**
* Returns whether the `IgxInputGroupComponent` type is search.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeSearch = this.inputGroup.isTypeSearch;
* }
* ```
* @return {?}
*/
get isTypeSearch() {
return this._type === IgxInputGroupType.SEARCH;
}
/**
* @return {?}
*/
get filled() {
return this._filled;
}
/**
* @param {?} val
* @return {?}
*/
set filled(val) {
this._filled = val;
}
}
IgxInputGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'igx-input-group',
template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n<div class=\"igx-input-group__hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n</div>\n<ng-template #bundle>\n <div class=\"igx-input-group__bundle\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n <div class=\"igx-input-group__bundle-main\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n <ng-content select=\"[igxInput]\"></ng-content>\n </div>\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </div>\n <div class=\"igx-input-group__border\" *ngIf=\"hasBorder\"></div>\n</ng-template>\n",
providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent }]
}] }
];
/** @nocollapse */
IgxInputGroupComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
];
IgxInputGroupComponent.propDecorators = {
id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
defaultClass: [{ type: HostBinding, args: ['class.igx-input-group',] }],
hasPlaceholder: [{ type: HostBinding, args: ['class.igx-input-group--placeholder',] }],
isRequired: [{ type: HostBinding, args: ['class.igx-input-group--required',] }],
isFocused: [{ type: HostBinding, args: ['class.igx-input-group--focused',] }],
isBox: [{ type: HostBinding, args: ['class.igx-input-group--box',] }],
isBorder: [{ type: HostBinding, args: ['class.igx-input-group--border',] }],
isSearch: [{ type: HostBinding, args: ['class.igx-input-group--search',] }],
disabled: [{ type: HostBinding, args: ['class.igx-input-group--disabled',] }, { type: Input }],
validClass: [{ type: HostBinding, args: ['class.igx-input-group--valid',] }],
invalidClass: [{ type: HostBinding, args: ['class.igx-input-group--invalid',] }],
hasWarning: [{ type: HostBinding, args: ['class.igx-input-group--warning',] }],
hints: [{ type: ContentChildren, args: [IgxHintDirective, { read: IgxHintDirective },] }],
input: [{ type: ContentChild, args: [IgxInputDirective, { read: IgxInputDirective },] }],
onClick: [{ type: HostListener, args: ['click', ['$event'],] }],
type: [{ type: Input, args: ['type',] }],
supressInputAutofocus: [{ type: Input }],
isFilled: [{ type: HostBinding, args: ['class.igx-input-group--filled',] }],
isDisplayDensityCosy: [{ type: HostBinding, args: ['class.igx-input-group--cosy',] }],
isDisplayDensityComfortable: [{ type: HostBinding, args: ['class.igx-input-group--comfortable',] }],
isDisplayDensityCompact: [{ type: HostBinding, args: ['class.igx-input-group--compact',] }]
};
if (false) {
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._type;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._filled;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._supressInputAutofocus;
/**
* An ElementRef property of the `IgxInputGroupComponent`.
* @type {?}
*/
IgxInputGroupComponent.prototype.element;
/**
* An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated.
* ```html
* <igx-input-group [id]="'igx-input-group-55'"></igx-input-group>
* ```
* @type {?}
*/
IgxInputGroupComponent.prototype.id;
/**
* Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`.
* By default applied the class is applied.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* this.inputGroup.defaultClass = false;
* ```
* }
* @type {?}
*/
IgxInputGroupComponent.prototype.defaultClass;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.hasPlaceholder;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isRequired;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isFocused;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isBox;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isBorder;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isSearch;
/**
* An \@Input property that disables the `IgxInputGroupComponent`.
* ```html
* <igx-input-group [disabled]="'true'"></igx-input-group>
* ```
* @type {?}
*/
IgxInputGroupComponent.prototype.disabled;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.hasWarning;
/**
* @hidden
* @type {?}
* @protected
*/
IgxInputGroupComponent.prototype.hints;
/**
* @hidden
* @type {?}
* @protected
*/
IgxInputGroupComponent.prototype.input;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._element;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._displayDensityOptions;
}
/**
* @hidden
*/
export class IgxInputGroupModule {
}
IgxInputGroupModule.decorators = [
{ type: NgModule, args: [{
declarations: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective],
exports: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective, IgxPrefixDirective, IgxSuffixDirective],
imports: [CommonModule, IgxPrefixModule, IgxSuffixModule]
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RixPQUFPLEVBQUUsY0FBYyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztJQUVyRCxPQUFPLEdBQUcsQ0FBQzs7O0lBR1gsT0FBSTtJQUNKLE1BQUc7SUFDSCxTQUFNO0lBQ04sU0FBTTs7Ozs7O0FBUVYsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjs7Ozs7SUE4TjFELFlBQW9CLFFBQW9CLEVBQ2Esc0JBQThDO1FBQy9GLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRmQsYUFBUSxH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LDRDQUMwQjs7Ozs7SUFLMUIsMkNBQ3lCOzs7OztJQU16Qix1Q0FDcUI7Ozs7O0lBS3JCLDBDQUN3Qjs7Ozs7SUFLeEIsMENBQ3dCOzs7Ozs7OztJQVF4QiwwQ0FFd0I7Ozs7O0lBcUJ4Qiw0Q0FDMEI7Ozs7OztJQUsxQix1Q0FDNkM7Ozs7OztJQUs3Qyx1Q0FDbUM7Ozs7O0lBNkd2QiwwQ0FBNEI7Ozs7O0lBQ3BDLHdEQUErRjs7Ozs7QUEyR3ZHLE1BQU0sT0FBTyxtQkFBbUI7OztZQUwvQixRQUFRLFNBQUM7Z0JBQ04sWUFBWSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzlGLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixFQUFHLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDO2dCQUNsSSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQzthQUM1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE5nTW9kdWxlLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBJbmplY3QsXG4gICAgT3B0aW9uYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hIaW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9oaW50L2hpbnQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0RGlyZWN0aXZlLCBJZ3hJbnB1dFN0YXRlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4TGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2xhYmVsL2xhYmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUsIElneFByZWZpeE1vZHVsZX0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hTdWZmaXhEaXJlY3RpdmUsIElneFN1ZmZpeE1vZHVsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHksIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cEJhc2UgfSBmcm9tICcuL2lucHV0LWdyb3VwLmNvbW1vbic7XG5cbmxldCBORVhUX0lEID0gMDtcblxuZW51bSBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgTElORSxcbiAgICBCT1gsXG4gICAgQk9SREVSLFxuICAgIFNFQVJDSFxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1pbnB1dC1ncm91cCcsXG4gICAgdGVtcGxhdGVVcmw6ICdpbnB1dC1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBJZ3hJbnB1dEdyb3VwQmFzZSwgdXNlRXhpc3Rpbmc6IElneElucHV0R3JvdXBDb21wb25lbnQgfV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4SW5wdXRHcm91cENvbXBvbmVudCBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIElneElucHV0R3JvdXBCYXNlIHtcbiAgICBwcml2YXRlIF90eXBlID0gSWd4SW5wdXRHcm91cFR5cGUuTElORTtcbiAgICBwcml2YXRlIF9maWxsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zdXByZXNzSW5wdXRBdXRvZm9jdXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEVsZW1lbnRSZWYgcHJvcGVydHkgb2YgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIGBpZGAgYXR0cmlidXRlLiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1pbnB1dC1ncm91cCBbaWRdPVwiJ2lneC1pbnB1dC1ncm91cC01NSdcIj48L2lneC1pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1pbnB1dC1ncm91cC0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgdGhhdCBlbmFibGVzL2Rpc2FibGVzIHRoZSBhdXRvZ2VuZXJhdGVkIGNsYXNzIG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuXG4gICAgICogQnkgZGVmYXVsdCBhcHBsaWVkIHRoZSBjbGFzcyBpcyBhcHBsaWVkLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKnRoaXMuaW5wdXRHcm91cC5kZWZhdWx0Q2xhc3MgPSBmYWxzZTtcbiAgICAgKmBgYFxuICAgICAqfVxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwJylcbiAgICBwdWJsaWMgZGVmYXVsdENsYXNzID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tcGxhY2Vob2xkZXInKVxuICAgIHB1YmxpYyBoYXNQbGFjZWhvbGRlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1yZXF1aXJlZCcpXG4gICAgcHVibGljIGlzUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZm9jdXNlZCcpXG4gICAgcHVibGljIGlzRm9jdXNlZCA9IGZhbHNlO1xuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWJveCcpXG4gICAgcHVibGljIGlzQm94ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWJvcmRlcicpXG4gICAgcHVibGljIGlzQm9yZGVyID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXNlYXJjaCcpXG4gICAgcHVibGljIGlzU2VhcmNoID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkaXNhYmxlcyB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj48L2lneC1pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZGlzYWJsZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXZhbGlkJylcbiAgICBwdWJsaWMgZ2V0IHZhbGlkQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnZhbGlkID09PSBJZ3hJbnB1dFN0YXRlLlZBTElEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0taW52YWxpZCcpXG4gICAgcHVibGljIGdldCBpbnZhbGlkQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnZhbGlkID09PSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS13YXJuaW5nJylcbiAgICBwdWJsaWMgaGFzV2FybmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4SGludERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hIaW50RGlyZWN0aXZlIH0pXG4gICAgcHJvdGVjdGVkIGhpbnRzOiBRdWVyeUxpc3Q8SWd4SGludERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hJbnB1dERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBpbnB1dDogSWd4SW5wdXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdXByZXNzSW5wdXRBdXRvZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgaG93IHRoZSBpbnB1dCB3aWxsIGJlIHN0eWxlZC5cbiAgICAgKiBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlIGBsaW5lYCwgYGJveGAsIGBib3JkZXJgIGFuZCBgc2VhcmNoYC4gVGhlIGRlZmF1bHQgaXMgYGxpbmVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKjxpZ3gtaW5wdXQtZ3JvdXAgW3R5cGVdPVwiJ3NlYXJjaCdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3R5cGUnKVxuICAgIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdHlwZTogSWd4SW5wdXRHcm91cFR5cGUgPSAoSWd4SW5wdXRHcm91cFR5cGUgYXMgYW55KVt2YWx1ZS50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc0JveCA9IHRoaXMuaXNCb3JkZXIgPSB0aGlzLmlzU2VhcmNoID0gZmFsc2U7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkJPWDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0JveCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuQk9SREVSOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBJZ3hJbnB1dEdyb3VwVHlwZS5TRUFSQ0g6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIGlucHV0IGdyb3VwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb2N1c2VkIG9uIGNsaWNrLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc3VwcmVzc0lucHV0QXV0b2ZvY3VzID0gdGhpcy5pbnB1dEdyb3VwLnN1cHJlc3NJbnB1dEF1dG9mb2N1cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc3VwcmVzc0lucHV0QXV0b2ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VwcmVzc0lucHV0QXV0b2ZvY3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgaW5wdXQgZWxlbWVudCBvZiB0aGUgaW5wdXQgZ3JvdXAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvY3VzZWQgb24gY2xpY2suXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaW5wdXQtZ3JvdXAgW3N1cHJlc3NJbnB1dEF1dG9mb2N1c109XCJ0cnVlXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzdXByZXNzSW5wdXRBdXRvZm9jdXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc3VwcmVzc0lucHV0QXV0b2ZvY3VzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWZpbGxlZCcpXG4gICAgZ2V0IGlzRmlsbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsbGVkIHx8ICh0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQudmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1jb3N5JylcbiAgICBnZXQgaXNEaXNwbGF5RGVuc2l0eUNvc3koKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1jb21mb3J0YWJsZScpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb21mb3J0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbWZvcnRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1jb21wYWN0JylcbiAgICBnZXQgaXNEaXNwbGF5RGVuc2l0eUNvbXBhY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YC4gSG93IHRoZSBpbnB1dCBpcyBzdHlsZWQuXG4gICAgICogVmFsdWVzIGFyZSBgbGluZWAgLSAwLCBgYm94YCAtIDEsIGBib3JkZXJgIC0gMiAgYW5kIGBzZWFyY2hgIC0gMy4gVGhlIGRlZmF1bHQgaXMgYGxpbmVgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlucHV0VHlwZSA9IHRoaXMuaW5wdXRHcm91cC50eXBlO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJpdmF0ZSBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBfZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCBoYXMgaGludHMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaW5wdXRIaW50cyA9IHRoaXMuaW5wdXRHcm91cC5oYXNIaW50cztcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaGFzSGludHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgaGFzIGJvcmRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpbnB1dEJyb2RlciA9IHRoaXMuaW5wdXRHcm91cC5oYXNCb3JkZXI7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGhhc0JvcmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkxJTkUgfHxcbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkJPWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIGxpbmUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUxpbmUgPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlTGluZTtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzVHlwZUxpbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAgdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuTElORTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIGJveC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlQm94ID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUJveDtcbiAgICAgKn1cbiAgICAgKmBgYFxuICAgICAqL1xuICAgIGdldCBpc1R5cGVCb3goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBib3JkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUJvcmRlciA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVCb3JkZXI7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZUJvcmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkJPUkRFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIHNlYXJjaC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlU2VhcmNoID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZVNlYXJjaDtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLlNFQVJDSDtcbiAgICB9XG5cbiAgICBnZXQgZmlsbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsbGVkO1xuICAgIH1cblxuICAgIHNldCBmaWxsZWQodmFsKSB7XG4gICAgICAgIHRoaXMuX2ZpbGxlZCA9IHZhbDtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneElucHV0R3JvdXBDb21wb25lbnQsIElneEhpbnREaXJlY3RpdmUsIElneElucHV0RGlyZWN0aXZlLCBJZ3hMYWJlbERpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneElucHV0R3JvdXBDb21wb25lbnQsICBJZ3hIaW50RGlyZWN0aXZlLCBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4TGFiZWxEaXJlY3RpdmUsIElneFByZWZpeERpcmVjdGl2ZSwgSWd4U3VmZml4RGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJZ3hQcmVmaXhNb2R1bGUsIElneFN1ZmZpeE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4SW5wdXRHcm91cE1vZHVsZSB7IH1cbiJdfQ==