carbon-components-angular
Version:
Next generation components
383 lines (375 loc) • 31.9 kB
JavaScript
import { Component, Input, HostBinding, TemplateRef, ViewChild, ContentChild } from "@angular/core";
import { PasswordInput } from "./password.directive";
import { BaseIconButton } from "carbon-components-angular/button";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "carbon-components-angular/icon";
import * as i3 from "carbon-components-angular/tooltip";
/**
* Get started with importing the module:
*
* ```typescript
* import { InputModule } from 'carbon-components-angular';
* ```
*
* ```html
* <cds-password-label>
* Label
* <input cdsPassword>
* </cds-password-label>
* ```
*
* [See demo](../../?path=/story/components-input--basic)
*/
/**
* Represents the Password Input Label Component.
*/
export class PasswordInputLabelComponent extends BaseIconButton {
/**
* Constructor for PasswordInputLabelComponent.
* @param changeDetectorRef - Reference to ChangeDetectorRef.
*/
constructor(changeDetectorRef) {
super();
this.changeDetectorRef = changeDetectorRef;
/**
* ID for the input item associated with the label.
*/
this.labelInputID = "cds-password-input-" + PasswordInputLabelComponent.labelCounter++;
/**
* Type for input field, either password or text.
*/
this.inputType = "password";
/**
* Flag for checking if password is visible.
*/
this.passwordIsVisible = false;
/**
* Flag for disabled label.
*/
this.disabled = false;
/**
* Flag for loading (skeleton) label.
*/
this.skeleton = false;
/**
* Flag for an invalid label component.
*/
this.invalid = false;
/**
* Flag for showing a warning.
*/
this.warn = false;
/**
* Tooltip text for hiding password.
*/
this.hidePasswordLabel = "Hide password";
/**
* Tooltip text for showing password.
*/
this.showPasswordLabel = "Show password";
/**
* Experimental: enable fluid state
*/
this.fluid = false;
/**
* Binding for applying class to host element.
*/
this.labelClass = true;
this.passwordInputWrapper = true;
this.textInputWrapper = true;
}
get isReadonly() {
return this.wrapper?.nativeElement.querySelector("input")?.readOnly ?? false;
}
get fluidClass() {
return this.fluid && !this.skeleton;
}
get fluidSkeletonClass() {
return this.fluid && this.skeleton;
}
/**
* Lifecycle hook called after the view has been initialized to set the ID of the input element
*/
ngAfterViewInit() {
if (this.wrapper) {
const inputElement = this.wrapper.nativeElement.querySelector("input");
if (inputElement) {
if (inputElement.id) {
this.labelInputID = inputElement.id;
this.changeDetectorRef.detectChanges();
}
inputElement.setAttribute("id", this.labelInputID);
return;
}
}
}
/**
* Function to check if a value is a TemplateRef.
* @param value - Value to check.
* @returns Whether the value is a TemplateRef.
*/
isTemplate(value) {
return value instanceof TemplateRef;
}
/**
* Handler for toggling password visibility.
*/
handleTogglePasswordVisibility() {
this.inputType = this.inputType === "password" ? "text" : "password";
this.textInput.type = this.inputType;
this.passwordIsVisible = this.inputType === "text";
}
}
/**
* Counter for generating unique labelInputID.
*/
PasswordInputLabelComponent.labelCounter = 0;
PasswordInputLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PasswordInputLabelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
PasswordInputLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PasswordInputLabelComponent, selector: "cds-password-label, ibm-password-label", inputs: { labelInputID: "labelInputID", disabled: "disabled", skeleton: "skeleton", labelTemplate: "labelTemplate", passwordInputTemplate: "passwordInputTemplate", helperText: "helperText", invalidText: "invalidText", invalid: "invalid", warn: "warn", warnText: "warnText", ariaLabel: "ariaLabel", hidePasswordLabel: "hidePasswordLabel", showPasswordLabel: "showPasswordLabel", fluid: "fluid" }, host: { properties: { "class.cds--form-item": "this.labelClass", "class.cds--password-input-wrapper": "this.passwordInputWrapper", "class.cds--text-input-wrapper": "this.textInputWrapper", "class.cds--text-input-wrapper--readonly": "this.isReadonly", "class.cds--text-input--fluid": "this.fluidClass", "class.cds--text-input--fluid__skeleton": "this.fluidSkeletonClass" } }, queries: [{ propertyName: "textInput", first: true, predicate: PasswordInput, descendants: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
<ng-container *ngIf="skeleton">
<span class="cds--label cds--skeleton"></span>
<div class="cds--text-input cds--skeleton"></div>
</ng-container>
<label
*ngIf="!skeleton"
[for]="labelInputID"
[attr.aria-label]="ariaLabel"
class="cds--label"
[ngClass]="{
'cds--label--disabled': disabled
}">
<ng-template *ngIf="labelTemplate; else labelContent" [ngTemplateOutlet]="labelTemplate"></ng-template>
<ng-template #labelContent>
<ng-content></ng-content>
</ng-template>
</label>
<div *ngIf="!skeleton" class="cds--text-input__field-outer-wrapper">
<div
class="cds--text-input__field-wrapper"
[ngClass]="{
'cds--text-input__field-wrapper--warning': warn
}"
[attr.data-invalid]="invalid ? true : null"
#wrapper>
<svg
*ngIf="!warn && invalid"
cdsIcon="warning--filled"
size="16"
class="cds--text-input__invalid-icon">
</svg>
<svg
*ngIf="!invalid && warn"
cdsIcon="warning--alt--filled"
size="16"
class="cds--text-input__invalid-icon cds--text-input__invalid-icon--warning">
</svg>
<ng-content select="[cdsPassword], [ibmPassword]"></ng-content>
<cds-tooltip
*ngIf="!skeleton"
[description]="passwordIsVisible ? hidePasswordLabel : showPasswordLabel"
[disabled]="disabled"
[caret]="caret"
[dropShadow]="dropShadow"
[highContrast]="highContrast"
[isOpen]="isOpen"
[align]="align"
[autoAlign]="autoAlign"
[enterDelayMs]="enterDelayMs"
[leaveDelayMs]="leaveDelayMs"
class="cds--toggle-password-tooltip">
<div class="cds--tooltip-trigger__wrapper">
<button
class="cds--text-input--password__visibility__toggle cds--btn cds--tooltip__trigger cds--tooltip--a11y"
[disabled]="disabled"
type="button"
(click)="handleTogglePasswordVisibility($event)">
<svg *ngIf="passwordIsVisible" cdsIcon="view--off" class="cds--icon-visibility-off" size="16"></svg>
<svg *ngIf="!passwordIsVisible" cdsIcon="view" class="cds--icon-visibility-on" size="16"></svg>
</button>
</div>
</cds-tooltip>
<ng-container *ngIf="fluid">
<hr class="cds--text-input__divider" />
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
<ng-container *ngIf="!fluid">
<div
*ngIf="!skeleton && helperText && !invalid && !warn"
class="cds--form__helper-text"
[ngClass]="{ 'cds--form__helper-text--disabled': disabled }">
<ng-container *ngIf="!isTemplate(helperText)">{{ helperText }}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3.Tooltip, selector: "cds-tooltip, ibm-tooltip", inputs: ["id", "enterDelayMs", "leaveDelayMs", "disabled", "description", "templateContext"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PasswordInputLabelComponent, decorators: [{
type: Component,
args: [{
selector: "cds-password-label, ibm-password-label",
template: `
<ng-container *ngIf="skeleton">
<span class="cds--label cds--skeleton"></span>
<div class="cds--text-input cds--skeleton"></div>
</ng-container>
<label
*ngIf="!skeleton"
[for]="labelInputID"
[attr.aria-label]="ariaLabel"
class="cds--label"
[ngClass]="{
'cds--label--disabled': disabled
}">
<ng-template *ngIf="labelTemplate; else labelContent" [ngTemplateOutlet]="labelTemplate"></ng-template>
<ng-template #labelContent>
<ng-content></ng-content>
</ng-template>
</label>
<div *ngIf="!skeleton" class="cds--text-input__field-outer-wrapper">
<div
class="cds--text-input__field-wrapper"
[ngClass]="{
'cds--text-input__field-wrapper--warning': warn
}"
[attr.data-invalid]="invalid ? true : null"
#wrapper>
<svg
*ngIf="!warn && invalid"
cdsIcon="warning--filled"
size="16"
class="cds--text-input__invalid-icon">
</svg>
<svg
*ngIf="!invalid && warn"
cdsIcon="warning--alt--filled"
size="16"
class="cds--text-input__invalid-icon cds--text-input__invalid-icon--warning">
</svg>
<ng-content select="[cdsPassword], [ibmPassword]"></ng-content>
<cds-tooltip
*ngIf="!skeleton"
[description]="passwordIsVisible ? hidePasswordLabel : showPasswordLabel"
[disabled]="disabled"
[caret]="caret"
[dropShadow]="dropShadow"
[highContrast]="highContrast"
[isOpen]="isOpen"
[align]="align"
[autoAlign]="autoAlign"
[enterDelayMs]="enterDelayMs"
[leaveDelayMs]="leaveDelayMs"
class="cds--toggle-password-tooltip">
<div class="cds--tooltip-trigger__wrapper">
<button
class="cds--text-input--password__visibility__toggle cds--btn cds--tooltip__trigger cds--tooltip--a11y"
[disabled]="disabled"
type="button"
(click)="handleTogglePasswordVisibility($event)">
<svg *ngIf="passwordIsVisible" cdsIcon="view--off" class="cds--icon-visibility-off" size="16"></svg>
<svg *ngIf="!passwordIsVisible" cdsIcon="view" class="cds--icon-visibility-on" size="16"></svg>
</button>
</div>
</cds-tooltip>
<ng-container *ngIf="fluid">
<hr class="cds--text-input__divider" />
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
<ng-container *ngIf="!fluid">
<div
*ngIf="!skeleton && helperText && !invalid && !warn"
class="cds--form__helper-text"
[ngClass]="{ 'cds--form__helper-text--disabled': disabled }">
<ng-container *ngIf="!isTemplate(helperText)">{{ helperText }}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</ng-container>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { textInput: [{
type: ContentChild,
args: [PasswordInput]
}], labelInputID: [{
type: Input
}], disabled: [{
type: Input
}], skeleton: [{
type: Input
}], labelTemplate: [{
type: Input
}], passwordInputTemplate: [{
type: Input
}], helperText: [{
type: Input
}], invalidText: [{
type: Input
}], invalid: [{
type: Input
}], warn: [{
type: Input
}], warnText: [{
type: Input
}], ariaLabel: [{
type: Input
}], hidePasswordLabel: [{
type: Input
}], showPasswordLabel: [{
type: Input
}], fluid: [{
type: Input
}], wrapper: [{
type: ViewChild,
args: ["wrapper", { static: true }]
}], labelClass: [{
type: HostBinding,
args: ["class.cds--form-item"]
}], passwordInputWrapper: [{
type: HostBinding,
args: ["class.cds--password-input-wrapper"]
}], textInputWrapper: [{
type: HostBinding,
args: ["class.cds--text-input-wrapper"]
}], isReadonly: [{
type: HostBinding,
args: ["class.cds--text-input-wrapper--readonly"]
}], fluidClass: [{
type: HostBinding,
args: ["class.cds--text-input--fluid"]
}], fluidSkeletonClass: [{
type: HostBinding,
args: ["class.cds--text-input--fluid__skeleton"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtaW5wdXQtbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lucHV0L3Bhc3N3b3JkLWlucHV0LWxhYmVsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFHTCxXQUFXLEVBQ1gsV0FBVyxFQUNYLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7QUFFbEU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBc0dIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDJCQUE0QixTQUFRLGNBQWM7SUErRzlEOzs7T0FHRztJQUNILFlBQXNCLGlCQUFvQztRQUN6RCxLQUFLLEVBQUUsQ0FBQztRQURhLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzRzFEOztXQUVHO1FBQ00saUJBQVksR0FBRyxxQkFBcUIsR0FBRywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUzRjs7V0FFRztRQUNILGNBQVMsR0FBd0IsVUFBVSxDQUFDO1FBRTVDOztVQUVFO1FBQ0Ysc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFzQjFCOztXQUVHO1FBQ00sWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV6Qjs7V0FFRztRQUNNLFNBQUksR0FBRyxLQUFLLENBQUM7UUFZdEI7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFFN0M7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFFN0M7O1dBRUc7UUFDTSxVQUFLLEdBQUcsS0FBSyxD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YixLQUFLO2dCQUtrQyxPQUFPO3NCQUE5QyxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBS0QsVUFBVTtzQkFBOUMsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBQ2Usb0JBQW9CO3NCQUFyRSxXQUFXO3VCQUFDLG1DQUFtQztnQkFDRixnQkFBZ0I7c0JBQTdELFdBQVc7dUJBQUMsK0JBQStCO2dCQUNnQixVQUFVO3NCQUFyRSxXQUFXO3VCQUFDLHlDQUF5QztnQkFJTCxVQUFVO3NCQUExRCxXQUFXO3VCQUFDLDhCQUE4QjtnQkFJZ0Isa0JBQWtCO3NCQUE1RSxXQUFXO3VCQUFDLHdDQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SW5wdXQsXG5cdEFmdGVyVmlld0luaXQsXG5cdEVsZW1lbnRSZWYsXG5cdEhvc3RCaW5kaW5nLFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkLFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29udGVudENoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQYXNzd29yZElucHV0IH0gZnJvbSBcIi4vcGFzc3dvcmQuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBCYXNlSWNvbkJ1dHRvbiB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2J1dHRvblwiO1xuXG4vKipcbiAqIEdldCBzdGFydGVkIHdpdGggaW1wb3J0aW5nIHRoZSBtb2R1bGU6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSW5wdXRNb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIGBgYGh0bWxcbiAqIDxjZHMtcGFzc3dvcmQtbGFiZWw+XG4gKiBcdExhYmVsXG4gKlx0PGlucHV0IGNkc1Bhc3N3b3JkPlxuICogPC9jZHMtcGFzc3dvcmQtbGFiZWw+XG4gKiBgYGBcbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLWlucHV0LS1iYXNpYylcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1wYXNzd29yZC1sYWJlbCwgaWJtLXBhc3N3b3JkLWxhYmVsXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uXCI+XG5cdFx0XHQ8c3BhbiBjbGFzcz1cImNkcy0tbGFiZWwgY2RzLS1za2VsZXRvblwiPjwvc3Bhbj5cblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXQgY2RzLS1za2VsZXRvblwiPjwvZGl2PlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxsYWJlbFxuXHRcdFx0Km5nSWY9XCIhc2tlbGV0b25cIlxuXHRcdFx0W2Zvcl09XCJsYWJlbElucHV0SURcIlxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuXHRcdFx0Y2xhc3M9XCJjZHMtLWxhYmVsXCJcblx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0J2Nkcy0tbGFiZWwtLWRpc2FibGVkJzogZGlzYWJsZWRcblx0XHRcdH1cIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImxhYmVsVGVtcGxhdGU7IGVsc2UgbGFiZWxDb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8bmctdGVtcGxhdGUgI2xhYmVsQ29udGVudD5cblx0XHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2xhYmVsPlxuXG5cdFx0PGRpdiAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC1vdXRlci13cmFwcGVyXCI+XG5cdFx0XHQ8ZGl2XG5cdFx0XHRjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXItLXdhcm5pbmcnOiB3YXJuXG5cdFx0XHR9XCJcblx0XHRcdFthdHRyLmRhdGEtaW52YWxpZF09XCJpbnZhbGlkID8gdHJ1ZSA6IG51bGxcIlxuXHRcdFx0I3dyYXBwZXI+XG5cdFx0XHRcdDxzdmdcblx0XHRcdFx0XHQqbmdJZj1cIiF3YXJuICYmIGludmFsaWRcIlxuXHRcdFx0XHRcdGNkc0ljb249XCJ3YXJuaW5nLS1maWxsZWRcIlxuXHRcdFx0XHRcdHNpemU9XCIxNlwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ludmFsaWQtaWNvblwiPlxuXHRcdFx0XHQ8L3N2Zz5cblx0XHRcdFx0PHN2Z1xuXHRcdFx0XHRcdCpuZ0lmPVwiIWludmFsaWQgJiYgd2FyblwiXG5cdFx0XHRcdFx0Y2RzSWNvbj1cIndhcm5pbmctLWFsdC0tZmlsbGVkXCJcblx0XHRcdFx0XHRzaXplPVwiMTZcIlxuXHRcdFx0XHRcdGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19pbnZhbGlkLWljb24gY2RzLS10ZXh0LWlucHV0X19pbnZhbGlkLWljb24tLXdhcm5pbmdcIj5cblx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIltjZHNQYXNzd29yZF0sIFtpYm1QYXNzd29yZF1cIj48L25nLWNvbnRlbnQ+XG5cdFx0XHRcdDxjZHMtdG9vbHRpcFxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uXCJcblx0XHRcdFx0XHRbZGVzY3JpcHRpb25dPVwicGFzc3dvcmRJc1Zpc2libGUgPyBoaWRlUGFzc3dvcmRMYWJlbCA6IHNob3dQYXNzd29yZExhYmVsXCJcblx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuXHRcdFx0XHRcdFtjYXJldF09XCJjYXJldFwiXG5cdFx0XHRcdFx0W2Ryb3BTaGFkb3ddPVwiZHJvcFNoYWRvd1wiXG5cdFx0XHRcdFx0W2hpZ2hDb250cmFzdF09XCJoaWdoQ29udHJhc3RcIlxuXHRcdFx0XHRcdFtpc09wZW5dPVwiaXNPcGVuXCJcblx0XHRcdFx0XHRbYWxpZ25dPVwiYWxpZ25cIlxuXHRcdFx0XHRcdFthdXRvQWxpZ25dPVwiYXV0b0FsaWduXCJcblx0XHRcdFx0XHRbZW50ZXJEZWxheU1zXT1cImVudGVyRGVsYXlNc1wiXG5cdFx0XHRcdFx0W2xlYXZlRGVsYXlNc109XCJsZWF2ZURlbGF5TXNcIlxuXHRcdFx0XHRcdGNsYXNzPVwiY2RzLS10b2dnbGUtcGFzc3dvcmQtdG9vbHRpcFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tdG9vbHRpcC10cmlnZ2VyX193cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxidXR0b25cblx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImNkcy0tdGV4dC1pbnB1dC0tcGFzc3dvcmRfX3Zpc2liaWxpdHlfX3RvZ2dsZSBjZHMtLWJ0biBjZHMtLXRvb2x0aXBfX3RyaWdnZXIgY2RzLS10b29sdGlwLS1hMTF5XCJcblx0XHRcdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuXHRcdFx0XHRcdFx0XHRcdHR5cGU9XCJidXR0b25cIlxuXHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJoYW5kbGVUb2dnbGVQYXNzd29yZFZpc2liaWxpdHkoJGV2ZW50KVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxzdmcgKm5nSWY9XCJwYXNzd29yZElzVmlzaWJsZVwiIGNkc0ljb249XCJ2aWV3LS1vZmZcIiBjbGFzcz1cImNkcy0taWNvbi12aXNpYmlsaXR5LW9mZlwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuXHRcdFx0XHRcdFx0XHRcdDxzdmcgKm5nSWY9XCIhcGFzc3dvcmRJc1Zpc2libGVcIiBjZHNJY29uPVwidmlld1wiIGNsYXNzPVwiY2RzLS1pY29uLXZpc2liaWxpdHktb25cIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9jZHMtdG9vbHRpcD5cblxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmx1aWRcIj5cblx0XHRcdFx0XHQ8aHIgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2RpdmlkZXJcIiAvPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhd2FybiAmJiBpbnZhbGlkXCIgY2xhc3M9XCJjZHMtLWZvcm0tcmVxdWlyZW1lbnRcIj5cblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIj57eyBpbnZhbGlkVGV4dCB9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdJZj1cIiFpbnZhbGlkICYmIHdhcm5cIiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKHdhcm5UZXh0KVwiPnt7IHdhcm5UZXh0IH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKHdhcm5UZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndhcm5UZXh0XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmx1aWRcIj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmIGhlbHBlclRleHQgJiYgIWludmFsaWQgJiYgIXdhcm5cIlxuXHRcdFx0XHRcdGNsYXNzPVwiY2RzLS1mb3JtX19oZWxwZXItdGV4dFwiXG5cdFx0XHRcdFx0W25nQ2xhc3NdPVwieyAnY2RzLS1mb3JtX19oZWxwZXItdGV4dC0tZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3sgaGVscGVyVGV4dCB9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaGVscGVyVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWxwZXJUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0PGRpdiAqbmdJZj1cIiF3YXJuICYmIGludmFsaWRcIiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIj57eyBpbnZhbGlkVGV4dCB9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW52YWxpZFRleHRcIj48L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIWludmFsaWQgJiYgd2FyblwiIGNsYXNzPVwiY2RzLS1mb3JtLXJlcXVpcmVtZW50XCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKHdhcm5UZXh0KVwiPnt7IHdhcm5UZXh0IH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZSh3YXJuVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ3YXJuVGV4dFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0PC9kaXY+XG4gICAgYFxufSlcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgUGFzc3dvcmQgSW5wdXQgTGFiZWwgQ29tcG9uZW50LlxuICovXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRJbnB1dExhYmVsQ29tcG9uZW50IGV4dGVuZHMgQmFzZUljb25CdXR0b24gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblx0LyoqXG5cdCAqIENvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGxhYmVsSW5wdXRJRC5cblx0ICovXG5cdHN0YXRpYyBsYWJlbENvdW50ZXIgPSAwO1xuXG5cdEBDb250ZW50Q2hpbGQoUGFzc3dvcmRJbnB1dCkgdGV4dElucHV0OiBQYXNzd29yZElucHV0O1xuXG5cdC8qKlxuXHQgKiBJRCBmb3IgdGhlIGlucHV0IGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsYWJlbC5cblx0ICovXG5cdEBJbnB1dCgpIGxhYmVsSW5wdXRJRCA9IFwiY2RzLXBhc3N3b3JkLWlucHV0LVwiICsgUGFzc3dvcmRJbnB1dExhYmVsQ29tcG9uZW50LmxhYmVsQ291bnRlcisrO1xuXG5cdC8qKlxuXHQgKiBUeXBlIGZvciBpbnB1dCBmaWVsZCwgZWl0aGVyIHBhc3N3b3JkIG9yIHRleHQuXG5cdCAqL1xuXHRpbnB1dFR5cGU6IFwicGFzc3dvcmRcIiB8IFwidGV4dFwiID0gXCJwYXNzd29yZFwiO1xuXG5cdC8qKlxuXHQqIEZsYWcgZm9yIGNoZWNraW5nIGlmIHBhc3N3b3JkIGlzIHZpc2libGUuXG5cdCovXG5cdHBhc3N3b3JkSXNWaXNpYmxlID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEZsYWcgZm9yIGRpc2FibGVkIGxhYmVsLlxuXHQgKi9cblx0QElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuXHQvKipcblx0ICogRmxhZyBmb3IgbG9hZGluZyAoc2tlbGV0b24pIGxhYmVsLlxuXHQgKi9cblx0QElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcblxuXHQvKipcblx0ICogVGVtcGxhdGUgZm9yIGxhYmVsIGNvbnRlbnQuXG5cdCAqL1xuXHRASW5wdXQoKSBsYWJlbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKlxuXHQgKiBUZW1wbGF0ZSBmb3IgcGFzc3dvcmQgaW5wdXQuXG5cdCAqL1xuXHRASW5wdXQoKSBwYXNzd29yZElucHV0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIE9wdGlvbmFsIGhlbHBlciB0ZXh0IHVuZGVyIHRoZSBsYWJlbC5cblx0ICovXG5cdEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGludmFsaWQgdGV4dC5cblx0ICovXG5cdEBJbnB1dCgpIGludmFsaWRUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKlxuXHQgKiBGbGFnIGZvciBhbiBpbnZhbGlkIGxhYmVsIGNvbXBvbmVudC5cblx0ICovXG5cdEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcblxuXHQvKipcblx0ICogRmxhZyBmb3Igc2hvd2luZyBhIHdhcm5pbmcuXG5cdCAqL1xuXHRASW5wdXQoKSB3YXJuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFdhcm5pbmcgdGV4dC5cblx0ICovXG5cdEBJbnB1dCgpIHdhcm5UZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKlxuXHQgKiBBcmlhIGxhYmVsIGZvciBsYWJlbC5cblx0ICovXG5cdEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUb29sdGlwIHRleHQgZm9yIGhpZGluZyBwYXNzd29yZC5cblx0ICovXG5cdEBJbnB1dCgpIGhpZGVQYXNzd29yZExhYmVsID0gXCJIaWRlIHBhc3N3b3JkXCI7XG5cblx0LyoqXG5cdCAqIFRvb2x0aXAgdGV4dCBmb3Igc2hvd2luZyBwYXNzd29yZC5cblx0ICovXG5cdEBJbnB1dCgpIHNob3dQYXNzd29yZExhYmVsID0gXCJTaG93IHBhc3N3b3JkXCI7XG5cblx0LyoqXG5cdCAqIEV4cGVyaW1lbnRhbDogZW5hYmxlIGZsdWlkIHN0YXRlXG5cdCAqL1xuXHRASW5wdXQoKSBmbHVpZCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHdyYXBwZXIgZWxlbWVudC5cblx0ICovXG5cdEBWaWV3Q2hpbGQoXCJ3cmFwcGVyXCIsIHsgc3RhdGljOiB0cnVlIH0pIHdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG5cdC8qKlxuXHQgKiBCaW5kaW5nIGZvciBhcHBseWluZyBjbGFzcyB0byBob3N0IGVsZW1lbnQuXG5cdCAqL1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWZvcm0taXRlbVwiKSBsYWJlbENsYXNzID0gdHJ1ZTtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1wYXNzd29yZC1pbnB1dC13cmFwcGVyXCIpIHBhc3N3b3JkSW5wdXRXcmFwcGVyID0gdHJ1ZTtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10ZXh0LWlucHV0LXdyYXBwZXJcIikgdGV4dElucHV0V3JhcHBlciA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGV4dC1pbnB1dC13cmFwcGVyLS1yZWFkb25seVwiKSBnZXQgaXNSZWFkb25seSgpIHtcblx0XHRyZXR1cm4gdGhpcy53cmFwcGVyPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKT8ucmVhZE9ubHkgPz8gZmFsc2U7XG5cdH1cblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRleHQtaW5wdXQtLWZsdWlkXCIpIGdldCBmbHVpZENsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLmZsdWlkICYmICF0aGlzLnNrZWxldG9uO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10ZXh0LWlucHV0LS1mbHVpZF9fc2tlbGV0b25cIikgZ2V0IGZsdWlkU2tlbGV0b25DbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy5mbHVpZCAmJiB0aGlzLnNrZWxldG9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yIGZvciBQYXNzd29yZElucHV0TGFiZWxDb21wb25lbnQuXG5cdCAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiAtIFJlZmVyZW5jZSB0byBDaGFuZ2VEZXRlY3RvclJlZi5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpZmVjeWNsZSBob29rIGNhbGxlZCBhZnRlciB0aGUgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBzZXQgdGhlIElEIG9mIHRoZSBpbnB1dCBlbGVtZW50XG5cdCAqL1xuXHRuZ0FmdGVyVmlld0luaXQoKSB7XG5cdFx0aWYgKHRoaXMud3JhcHBlcikge1xuXHRcdFx0Y29uc3QgaW5wdXRFbGVtZW50ID1cblx0XHRcdFx0dGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0XCIpO1xuXHRcdFx0aWYgKGlucHV0RWxlbWVudCkge1xuXHRcdFx0XHRpZiAoaW5wdXRFbGVtZW50LmlkKSB7XG5cdFx0XHRcdFx0dGhpcy5sYWJlbElucHV0SUQgPSBpbnB1dEVsZW1lbnQuaWQ7XG5cdFx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMubGFiZWxJbnB1dElEKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgVGVtcGxhdGVSZWYuXG5cdCAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVmLlxuXHQgKi9cblx0cHVibGljIGlzVGVtcGxhdGUodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciB0b2dnbGluZyBwYXNzd29yZCB2aXNpYmlsaXR5LlxuXHQgKi9cblx0cHVibGljIGhhbmRsZVRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpIHtcblx0XHR0aGlzLmlucHV0VHlwZSA9IHRoaXMuaW5wdXRUeXBlID09PSBcInBhc3N3b3JkXCIgPyBcInRleHRcIiA6IFwicGFzc3dvcmRcIjtcblx0XHR0aGlzLnRleHRJbnB1dC50eXBlID0gdGhpcy5pbnB1dFR5cGU7XG5cdFx0dGhpcy5wYXNzd29yZElzVmlzaWJsZSA9IHRoaXMuaW5wdXRUeXBlID09PSBcInRleHRcIjtcblx0fVxufVxuIl19