UNPKG

carbon-components-angular

Version:
347 lines 30.1 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, HostListener } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * Defines the set of states for a checkbox component. */ export var CheckboxState; (function (CheckboxState) { CheckboxState[CheckboxState["Init"] = 0] = "Init"; CheckboxState[CheckboxState["Indeterminate"] = 1] = "Indeterminate"; CheckboxState[CheckboxState["Checked"] = 2] = "Checked"; CheckboxState[CheckboxState["Unchecked"] = 3] = "Unchecked"; })(CheckboxState || (CheckboxState = {})); /** * Get started with importing the module: * * ```typescript * import { CheckboxModule } from 'carbon-components-angular'; * ``` * * [See demo](../../?path=/story/components-checkbox--basic) */ export class Checkbox { /** * Creates an instance of `Checkbox`. */ constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; /** * Set to `true` for a disabled checkbox. */ this.disabled = false; /** * Set to `true` for a loading checkbox. */ this.skeleton = false; /** * Set to `true` to hide the checkbox labels. */ this.hideLabel = false; /** * The unique id for the checkbox component. */ this.id = `checkbox-${Checkbox.checkboxCount}`; /** * Emits click event. */ this.click = new EventEmitter(); /** * Emits an event when the value of the checkbox changes. * * Allows double biding with the `checked` Input. */ this.checkedChange = new EventEmitter(); /** * Emits event notifying other classes when a change in state occurs specifically * on an indeterminate checkbox. */ this.indeterminateChange = new EventEmitter(); /** * Set to `true` if the input checkbox is selected (or checked). */ this._checked = false; /** * Set to `true` if the input checkbox is in state indeterminate. */ this._indeterminate = false; /** * Keeps a reference to the checkboxes current state, as defined in `CheckboxState`. */ this.currentCheckboxState = CheckboxState.Init; /** * Called when checkbox is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = () => { }; /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (_) => { }; Checkbox.checkboxCount++; } /** * Set the checkbox's indeterminate state to match the parameter and transition the view to reflect the change. * * Allows double binding with the `indeterminateChange` Output. */ set indeterminate(indeterminate) { if (indeterminate === this._indeterminate) { return; } this._indeterminate = indeterminate; if (this._indeterminate) { this.transitionCheckboxState(CheckboxState.Indeterminate); } else { this.transitionCheckboxState(this.checked ? CheckboxState.Checked : CheckboxState.Unchecked); } if (this.inputCheckbox && this.inputCheckbox.nativeElement) { this.inputCheckbox.nativeElement.indeterminate = indeterminate; } this.changeDetectorRef.markForCheck(); this.indeterminateChange.emit(this._indeterminate); } /** * Reflects whether the checkbox state is indeterminate. */ get indeterminate() { return this._indeterminate; } /** * Sets the `checked` state. `true` for checked, `false` for unchecked * * Allows double binding with the `checkedChange` Output. */ set checked(checked) { this.setChecked(checked, false); } /** * Returns value `true` if state is selected for the checkbox. */ get checked() { return this._checked; } /** * Toggle the selected state of the checkbox. */ toggle() { // Flip checked and reset indeterminate this.setChecked(!this.checked, true); } /** * Writes a value from `ngModel` to the component. * * In this case the value is the `checked` property. * * @param value boolean, corresponds to the `checked` property. */ writeValue(value) { // Set checked and reset indeterminate this.setChecked(!!value, true); } /** * Sets a method in order to propagate changes back to the form. */ registerOnChange(fn) { this.propagateChange = fn; } /** * Registers a callback to be triggered when the control has been touched. * @param fn Callback to be triggered when the checkbox is touched. */ registerOnTouched(fn) { this.onTouched = fn; } /** * `ControlValueAccessor` method to programmatically disable the checkbox. * * ex: `this.formGroup.get("myCheckbox").disable();` * * @param isDisabled `true` to disable the checkbox */ setDisabledState(isDisabled) { this.disabled = isDisabled; this.changeDetectorRef.markForCheck(); } focusOut() { this.onTouched(); } /** * Executes on the event of a change within `Checkbox` to block propagation. */ onChange(event) { event.stopPropagation(); } /** * Handles click events on the `Checkbox` and emits changes to other classes. */ onClick(event) { if (this.click.observers.length) { // Disable default checkbox activation behavior which flips checked and resets indeterminate. // This allows the parent component to control the checked/indeterminate properties. event.preventDefault(); this.click.emit(); return; } if (!this.disabled) { this.toggle(); this.transitionCheckboxState(this._checked ? CheckboxState.Checked : CheckboxState.Unchecked); this.emitChangeEvent(); } } /** * Handles changes between checkbox states. */ transitionCheckboxState(newState) { this.currentCheckboxState = newState; } /** * Creates instance of `CheckboxChange` used to propagate the change event. */ emitChangeEvent() { this.checkedChange.emit(this.checked); this.propagateChange(this.checked); } /** * Updates the checkbox if it is in the indeterminate state. */ ngAfterViewInit() { if (this.indeterminate && this.inputCheckbox && this.inputCheckbox.nativeElement) { this.inputCheckbox.nativeElement.indeterminate = true; } } /** * Sets checked state and optionally resets indeterminate state. */ setChecked(checked, resetIndeterminate) { if (checked === this._checked) { return; } this._checked = checked; // Reset indeterminate if requested if (resetIndeterminate && this._indeterminate) { this._indeterminate = false; Promise.resolve().then(() => { this.indeterminateChange.emit(this._indeterminate); }); } this.changeDetectorRef.markForCheck(); } } /** * Variable used for creating unique ids for checkbox components. */ Checkbox.checkboxCount = 0; Checkbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Checkbox, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); Checkbox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: { disabled: "disabled", skeleton: "skeleton", hideLabel: "hideLabel", name: "name", id: "id", required: "required", value: "value", ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", indeterminate: "indeterminate", checked: "checked" }, outputs: { click: "click", checkedChange: "checkedChange", indeterminateChange: "indeterminateChange" }, host: { listeners: { "focusout": "focusOut()" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Checkbox, multi: true } ], viewQueries: [{ propertyName: "inputCheckbox", first: true, predicate: ["inputCheckbox"], descendants: true }], ngImport: i0, template: ` <div class="cds--form-item cds--checkbox-wrapper"> <input #inputCheckbox class="cds--checkbox" type="checkbox" [id]="id + '_input'" [value]="value" [name]="name" [required]="required" [checked]="checked" [disabled]="disabled" [attr.aria-labelledby]="ariaLabelledby" (change)="onChange($event)" (click)="onClick($event)"> <label [for]="id + '_input'" [attr.aria-label]="ariaLabel" class="cds--checkbox-label" [ngClass]="{ 'cds--skeleton' : skeleton }"> <span [ngClass]="{'cds--visually-hidden' : hideLabel}" class="cds--checkbox-label-text"> <ng-content></ng-content> </span> </label> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Checkbox, decorators: [{ type: Component, args: [{ selector: "cds-checkbox, ibm-checkbox", template: ` <div class="cds--form-item cds--checkbox-wrapper"> <input #inputCheckbox class="cds--checkbox" type="checkbox" [id]="id + '_input'" [value]="value" [name]="name" [required]="required" [checked]="checked" [disabled]="disabled" [attr.aria-labelledby]="ariaLabelledby" (change)="onChange($event)" (click)="onClick($event)"> <label [for]="id + '_input'" [attr.aria-label]="ariaLabel" class="cds--checkbox-label" [ngClass]="{ 'cds--skeleton' : skeleton }"> <span [ngClass]="{'cds--visually-hidden' : hideLabel}" class="cds--checkbox-label-text"> <ng-content></ng-content> </span> </label> </div> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Checkbox, multi: true } ], changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{ type: Input }], skeleton: [{ type: Input }], hideLabel: [{ type: Input }], name: [{ type: Input }], id: [{ type: Input }], required: [{ type: Input }], value: [{ type: Input }], ariaLabel: [{ type: Input }], ariaLabelledby: [{ type: Input }], indeterminate: [{ type: Input }], checked: [{ type: Input }], click: [{ type: Output }], checkedChange: [{ type: Output }], indeterminateChange: [{ type: Output }], inputCheckbox: [{ type: ViewChild, args: ["inputCheckbox"] }], focusOut: [{ type: HostListener, args: ["focusout"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3pFOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksYUFLWDtBQUxELFdBQVksYUFBYTtJQUN4QixpREFBSSxDQUFBO0lBQ0osbUVBQWEsQ0FBQTtJQUNiLHVEQUFPLENBQUE7SUFDUCwyREFBUyxDQUFBO0FBQ1YsQ0FBQyxFQUxXLGFBQWEsS0FBYixhQUFhLFFBS3hCO0FBRUQ7Ozs7Ozs7O0dBUUc7QUF3Q0gsTUFBTSxPQUFPLFFBQVE7SUEwSHBCOztPQUVHO0lBQ0gsWUFBc0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF2SDFEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBSzNCOztXQUVHO1FBQ00sT0FBRSxHQUFHLFlBQVksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBNERuRDs7V0FFRztRQUNPLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTNDOzs7O1dBSUc7UUFDTyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdEQ7OztXQUdHO1FBQ08sd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUU1RDs7V0FFRztRQUNILGFBQVEsR0FBRyxLQUFLLENBQUM7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SztnQkFnQ08sT0FBTztzQkFBbkIsS0FBSztnQkFjSSxLQUFLO3NCQUFkLE1BQU07Z0JBT0csYUFBYTtzQkFBdEIsTUFBTTtnQkFNRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBbUJxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBeUQxQixRQUFRO3NCQURQLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFmdGVyVmlld0luaXQsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRFdmVudEVtaXR0ZXIsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdFZpZXdDaGlsZCxcblx0SG9zdExpc3RlbmVyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IENoZWNrYm94VmFsdWUgfSBmcm9tIFwiLi9jaGVja2JveC50eXBlc1wiO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIHNldCBvZiBzdGF0ZXMgZm9yIGEgY2hlY2tib3ggY29tcG9uZW50LlxuICovXG5leHBvcnQgZW51bSBDaGVja2JveFN0YXRlIHtcblx0SW5pdCxcblx0SW5kZXRlcm1pbmF0ZSxcblx0Q2hlY2tlZCxcblx0VW5jaGVja2VkXG59XG5cbi8qKlxuICogR2V0IHN0YXJ0ZWQgd2l0aCBpbXBvcnRpbmcgdGhlIG1vZHVsZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuICogYGBgXG4gKlxuICogW1NlZSBkZW1vXSguLi8uLi8/cGF0aD0vc3RvcnkvY29tcG9uZW50cy1jaGVja2JveC0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtY2hlY2tib3gsIGlibS1jaGVja2JveFwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLWZvcm0taXRlbSBjZHMtLWNoZWNrYm94LXdyYXBwZXJcIj5cblx0XHRcdDxpbnB1dFxuXHRcdFx0XHQjaW5wdXRDaGVja2JveFxuXHRcdFx0XHRjbGFzcz1cImNkcy0tY2hlY2tib3hcIlxuXHRcdFx0XHR0eXBlPVwiY2hlY2tib3hcIlxuXHRcdFx0XHRbaWRdPVwiaWQgKyAnX2lucHV0J1wiXG5cdFx0XHRcdFt2YWx1ZV09XCJ2YWx1ZVwiXG5cdFx0XHRcdFtuYW1lXT1cIm5hbWVcIlxuXHRcdFx0XHRbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuXHRcdFx0XHRbY2hlY2tlZF09XCJjaGVja2VkXCJcblx0XHRcdFx0W2Rpc2FibGVkXT1cImRpc2FibGVkXCJcblx0XHRcdFx0W2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5XCJcblx0XHRcdFx0KGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcblx0XHRcdFx0KGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxuXHRcdFx0PGxhYmVsXG5cdFx0XHRcdFtmb3JdPVwiaWQgKyAnX2lucHV0J1wiXG5cdFx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94LWxhYmVsXCJcblx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdCdjZHMtLXNrZWxldG9uJyA6IHNrZWxldG9uXG5cdFx0XHRcdH1cIj5cblx0XHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwieydjZHMtLXZpc3VhbGx5LWhpZGRlbicgOiBoaWRlTGFiZWx9XCIgY2xhc3M9XCJjZHMtLWNoZWNrYm94LWxhYmVsLXRleHRcIj5cblx0XHRcdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cdFx0XHRcdDwvc3Bhbj5cblx0XHRcdDwvbGFiZWw+XG5cdFx0PC9kaXY+XG5cdGAsXG5cdHByb3ZpZGVyczogW1xuXHRcdHtcblx0XHRcdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuXHRcdFx0dXNlRXhpc3Rpbmc6IENoZWNrYm94LFxuXHRcdFx0bXVsdGk6IHRydWVcblx0XHR9XG5cdF0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrYm94IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQge1xuXHQvKipcblx0ICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgY2hlY2tib3ggY29tcG9uZW50cy5cblx0ICovXG5cdHN0YXRpYyBjaGVja2JveENvdW50ID0gMDtcblxuXHQvKipcblx0ICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBjaGVja2JveC5cblx0ICovXG5cdEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgY2hlY2tib3guXG5cdCAqL1xuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBjaGVja2JveCBsYWJlbHMuXG5cdCAqL1xuXHRASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcblx0LyoqXG5cdCAqIFNldHMgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG5cdCAqL1xuXHRASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgY2hlY2tib3ggY29tcG9uZW50LlxuXHQgKi9cblx0QElucHV0KCkgaWQgPSBgY2hlY2tib3gtJHtDaGVja2JveC5jaGVja2JveENvdW50fWA7XG5cdC8qKlxuXHQgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG5cdCAqL1xuXHRASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgdmFsdWU6IENoZWNrYm94VmFsdWU7XG5cdEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nO1xuXHRASW5wdXQoKSBhcmlhTGFiZWxsZWRieTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGNoZWNrYm94J3MgaW5kZXRlcm1pbmF0ZSBzdGF0ZSB0byBtYXRjaCB0aGUgcGFyYW1ldGVyIGFuZCB0cmFuc2l0aW9uIHRoZSB2aWV3IHRvIHJlZmxlY3QgdGhlIGNoYW5nZS5cblx0ICpcblx0ICogQWxsb3dzIGRvdWJsZSBiaW5kaW5nIHdpdGggdGhlIGBpbmRldGVybWluYXRlQ2hhbmdlYCBPdXRwdXQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG5cdFx0aWYgKGluZGV0ZXJtaW5hdGUgPT09IHRoaXMuX2luZGV0ZXJtaW5hdGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcblxuXHRcdGlmICh0aGlzLl9pbmRldGVybWluYXRlKSB7XG5cdFx0XHR0aGlzLnRyYW5zaXRpb25DaGVja2JveFN0YXRlKENoZWNrYm94U3RhdGUuSW5kZXRlcm1pbmF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudHJhbnNpdGlvbkNoZWNrYm94U3RhdGUodGhpcy5jaGVja2VkID8gQ2hlY2tib3hTdGF0ZS5DaGVja2VkIDogQ2hlY2tib3hTdGF0ZS5VbmNoZWNrZWQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmlucHV0Q2hlY2tib3ggJiYgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdHRoaXMuaW5wdXRDaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuXHRcdH1cblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXHRcdHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZS5lbWl0KHRoaXMuX2luZGV0ZXJtaW5hdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZmxlY3RzIHdoZXRoZXIgdGhlIGNoZWNrYm94IHN0YXRlIGlzIGluZGV0ZXJtaW5hdGUuXG5cdCAqL1xuXHRnZXQgaW5kZXRlcm1pbmF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBgY2hlY2tlZGAgc3RhdGUuIGB0cnVlYCBmb3IgY2hlY2tlZCwgYGZhbHNlYCBmb3IgdW5jaGVja2VkXG5cdCAqXG5cdCAqIEFsbG93cyBkb3VibGUgYmluZGluZyB3aXRoIHRoZSBgY2hlY2tlZENoYW5nZWAgT3V0cHV0LlxuXHQgKi9cblx0QElucHV0KCkgc2V0IGNoZWNrZWQgKGNoZWNrZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLnNldENoZWNrZWQoY2hlY2tlZCwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdmFsdWUgYHRydWVgIGlmIHN0YXRlIGlzIHNlbGVjdGVkIGZvciB0aGUgY2hlY2tib3guXG5cdCAqL1xuXHRnZXQgY2hlY2tlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fY2hlY2tlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbWl0cyBjbGljayBldmVudC5cblx0ICovXG5cdEBPdXRwdXQoKSBjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuXHQvKipcblx0ICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNoZWNrYm94IGNoYW5nZXMuXG5cdCAqXG5cdCAqIEFsbG93cyBkb3VibGUgYmlkaW5nIHdpdGggdGhlIGBjaGVja2VkYCBJbnB1dC5cblx0ICovXG5cdEBPdXRwdXQoKSBjaGVja2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBzcGVjaWZpY2FsbHlcblx0ICogb24gYW4gaW5kZXRlcm1pbmF0ZSBjaGVja2JveC5cblx0ICovXG5cdEBPdXRwdXQoKSBpbmRldGVybWluYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIGlmIHRoZSBpbnB1dCBjaGVja2JveCBpcyBzZWxlY3RlZCAob3IgY2hlY2tlZCkuXG5cdCAqL1xuXHRfY2hlY2tlZCA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0IHRvIGB0cnVlYCBpZiB0aGUgaW5wdXQgY2hlY2tib3ggaXMgaW4gc3RhdGUgaW5kZXRlcm1pbmF0ZS5cblx0ICovXG5cdF9pbmRldGVybWluYXRlID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBjaGVja2JveGVzIGN1cnJlbnQgc3RhdGUsIGFzIGRlZmluZWQgaW4gYENoZWNrYm94U3RhdGVgLlxuXHQgKi9cblx0Y3VycmVudENoZWNrYm94U3RhdGUgPSBDaGVja2JveFN0YXRlLkluaXQ7XG5cblx0LyoqXG5cdCAqIE1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmlldyBET00gZWxlbWVudCBvZiB0aGUgYENoZWNrYm94YC5cblx0ICovXG5cdEBWaWV3Q2hpbGQoXCJpbnB1dENoZWNrYm94XCIpIGlucHV0Q2hlY2tib3g6IEVsZW1lbnRSZWY7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENoZWNrYm94YC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRDaGVja2JveC5jaGVja2JveENvdW50Kys7XG5cdH1cblxuXHQvKipcblx0ICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgY2hlY2tib3guXG5cdCAqL1xuXHRwdWJsaWMgdG9nZ2xlKCkge1xuXHRcdC8vIEZsaXAgY2hlY2tlZCBhbmQgcmVzZXQgaW5kZXRlcm1pbmF0ZVxuXHRcdHRoaXMuc2V0Q2hlY2tlZCghdGhpcy5jaGVja2VkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXcml0ZXMgYSB2YWx1ZSBmcm9tIGBuZ01vZGVsYCB0byB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBJbiB0aGlzIGNhc2UgdGhlIHZhbHVlIGlzIHRoZSBgY2hlY2tlZGAgcHJvcGVydHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBib29sZWFuLCBjb3JyZXNwb25kcyB0byB0aGUgYGNoZWNrZWRgIHByb3BlcnR5LlxuXHQgKi9cblx0cHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuXHRcdC8vIFNldCBjaGVja2VkIGFuZCByZXNldCBpbmRldGVybWluYXRlXG5cdFx0dGhpcy5zZXRDaGVja2VkKCEhdmFsdWUsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cblx0ICovXG5cdHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcblx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG5cdCAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hlY2tib3ggaXMgdG91Y2hlZC5cblx0ICovXG5cdHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG5cdFx0dGhpcy5vblRvdWNoZWQgPSBmbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIG1ldGhvZCB0byBwcm9ncmFtbWF0aWNhbGx5IGRpc2FibGUgdGhlIGNoZWNrYm94LlxuXHQgKlxuXHQgKiBleDogYHRoaXMuZm9ybUdyb3VwLmdldChcIm15Q2hlY2tib3hcIikuZGlzYWJsZSgpO2Bcblx0ICpcblx0ICogQHBhcmFtIGlzRGlzYWJsZWQgYHRydWVgIHRvIGRpc2FibGUgdGhlIGNoZWNrYm94XG5cdCAqL1xuXHRzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImZvY3Vzb3V0XCIpXG5cdGZvY3VzT3V0KCkge1xuXHRcdHRoaXMub25Ub3VjaGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgb24gdGhlIGV2ZW50IG9mIGEgY2hhbmdlIHdpdGhpbiBgQ2hlY2tib3hgIHRvIGJsb2NrIHByb3BhZ2F0aW9uLlxuXHQgKi9cblx0b25DaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIGBDaGVja2JveGAgYW5kIGVtaXRzIGNoYW5nZXMgdG8gb3RoZXIgY2xhc3Nlcy5cblx0ICovXG5cdG9uQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG5cdFx0aWYgKHRoaXMuY2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCkge1xuXHRcdFx0Ly8gRGlzYWJsZSBkZWZhdWx0IGNoZWNrYm94IGFjdGl2YXRpb24gYmVoYXZpb3Igd2hpY2ggZmxpcHMgY2hlY2tlZCBhbmQgcmVzZXRzIGluZGV0ZXJtaW5hdGUuXG5cdFx0XHQvLyBUaGlzIGFsbG93cyB0aGUgcGFyZW50IGNvbXBvbmVudCB0byBjb250cm9sIHRoZSBjaGVja2VkL2luZGV0ZXJtaW5hdGUgcHJvcGVydGllcy5cblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR0aGlzLmNsaWNrLmVtaXQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLmRpc2FibGVkKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZSgpO1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZSh0aGlzLl9jaGVja2VkID8gQ2hlY2tib3hTdGF0ZS5DaGVja2VkIDogQ2hlY2tib3hTdGF0ZS5VbmNoZWNrZWQpO1xuXHRcdFx0dGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcblx0XHR9XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBjaGVja2JveCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG5cdCAqL1xuXHRvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGNoYW5nZXMgYmV0d2VlbiBjaGVja2JveCBzdGF0ZXMuXG5cdCAqL1xuXHR0cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZShuZXdTdGF0ZTogQ2hlY2tib3hTdGF0ZSkge1xuXHRcdHRoaXMuY3VycmVudENoZWNrYm94U3RhdGUgPSBuZXdTdGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBDaGVja2JveENoYW5nZWAgdXNlZCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBldmVudC5cblx0ICovXG5cdGVtaXRDaGFuZ2VFdmVudCgpIHtcblx0XHR0aGlzLmNoZWNrZWRDaGFuZ2UuZW1pdCh0aGlzLmNoZWNrZWQpO1xuXHRcdHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuY2hlY2tlZCk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgY2hlY2tib3ggaWYgaXQgaXMgaW4gdGhlIGluZGV0ZXJtaW5hdGUgc3RhdGUuXG5cdCAqL1xuXHRuZ0FmdGVyVmlld0luaXQoKSB7XG5cdFx0aWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSAmJiB0aGlzLmlucHV0Q2hlY2tib3ggJiYgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdHRoaXMuaW5wdXRDaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2Qgc2V0IGluIGByZWdpc3Rlck9uQ2hhbmdlYCB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuXHQgKi9cblx0cHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cblx0LyoqXG5cdCAqIFNldHMgY2hlY2tlZCBzdGF0ZSBhbmQgb3B0aW9uYWxseSByZXNldHMgaW5kZXRlcm1pbmF0ZSBzdGF0ZS5cblx0ICovXG5cdHByaXZhdGUgc2V0Q2hlY2tlZChjaGVja2VkOiBib29sZWFuLCByZXNldEluZGV0ZXJtaW5hdGU6IGJvb2xlYW4pIHtcblx0XHRpZiAoY2hlY2tlZCA9PT0gdGhpcy5fY2hlY2tlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLl9jaGVja2VkID0gY2hlY2tlZDtcblx0XHQvLyBSZXNldCBpbmRldGVybWluYXRlIGlmIHJlcXVlc3RlZFxuXHRcdGlmIChyZXNldEluZGV0ZXJtaW5hdGUgJiYgdGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuXHRcdFx0dGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZS5lbWl0KHRoaXMuX2luZGV0ZXJtaW5hdGUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG5cdH1cbn1cbiJdfQ==