UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

372 lines (370 loc) 26.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, HostBinding, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef, ViewContainerRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Overlay } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; export class CalendarDayPicker { /** * Creates an instance of `CalendarDayPicker`. * @param {?} _overlay * @param {?} _viewContainerRef */ constructor(_overlay, _viewContainerRef) { this._overlay = _overlay; this._viewContainerRef = _viewContainerRef; this._selectedDays = []; this.baseClass = true; this.containerClass = true; /** * Set to `true` for a disabled color input. */ this.disabled = false; /** * Set to `true` for a loading color input component. */ this.skeleton = false; /** * Set to `true` for an invalid color input component. */ this.invalid = false; /** * Set to `true` for a valid color input component. */ this.valid = false; /** * The unique id for the color input component. */ this.id = `calendar-day-picker-${CalendarDayPicker.calendarDayPickerCount}`; /** * Sets the value attribute on the `input` element. */ this.value = ''; /** * Sets the placeholder on the `input` element. */ this.placeholder = ''; /** * Emits event notifying other classes when a change in state occurs in the input. */ // tslint:disable-next-line: no-output-native this.change = new EventEmitter(); /** * Called when number input is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = (/** * @return {?} */ () => { }); /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (/** * @param {?} _ * @return {?} */ (_) => { }); CalendarDayPicker.calendarDayPickerCount++; } /** * This is the initial value set to the component * @param {?} value The input value. * @return {?} */ writeValue(value) { this.value = value || ''; if (value) { this._selectedDays = JSON.parse('[' + value + ']'); } } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ 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 number input is touched. * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Sets the disabled state through the model * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * Creates a class of `NumberChange` to emit the change in the `Number`. * @return {?} */ emitChangeEvent() { this.change.emit(this.value); this.propagateChange(this.value); } /** * @param {?} days * @return {?} */ onInputChange(days) { this.value = JSON.parse('[' + days + ']'); this.emitChangeEvent(); } /** * @param {?} days * @return {?} */ onDaysChange(days) { this.value = days.toString(); this._selectedDays = days; this.emitChangeEvent(); } /** * Opens the color picker dialog * @return {?} */ openCalendarDayOverlay() { if (!this._overlayRef) { /** @type {?} */ const positionStrategy = this._overlay .position() .flexibleConnectedTo(this.origin) .withPositions([{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 8, }]); this._overlayRef = this._overlay.create({ hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', positionStrategy, }); this._overlayRef.backdropClick().subscribe((/** * @return {?} */ () => this._overlayRef.detach())); this._portal = new TemplatePortal(this.dialog, this._viewContainerRef); } this._overlayRef.attach(this._portal); } /** * Closes the calendar day dialog * @return {?} */ closeCalendarDayOverlay() { this._overlayRef.detach(); } /** * Checks if it is a template * @param {?} value * @return {?} */ isTemplate(value) { return value instanceof TemplateRef; } } /** * Variable used for creating unique ids for color input components. */ CalendarDayPicker.calendarDayPickerCount = 0; CalendarDayPicker.decorators = [ { type: Component, args: [{ selector: 'suka-calendar-day-picker', template: ` <label *ngIf="skeleton && label" class="label skeleton"></label> <label *ngIf="!skeleton && label" [for]="id" class="label"> <ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container> <ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template> </label> <div *ngIf="!skeleton && helperText" class="form__helper-text"> <ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container> <ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template> </div> <div [attr.data-invalid]="(invalid ? true : null)" [attr.data-valid]="(valid ? true : null)" class="calendar-day-picker" [ngClass]="{ 'calendar-day-picker--nolabel': !label, 'calendar-day-picker--helpertext': helperText, 'skeleton' : skeleton, 'calendar-day-picker--disabled': disabled }"> <div class="calendar-day-picker__input-wrapper"> <input #origin type="text" [id]="id" [placeholder]="placeholder" [value]="value" [disabled]="disabled" [required]="required" (focus)="openCalendarDayOverlay()" (change)="onInputChange($event)"/> <suka-icon *ngIf="!skeleton && invalid" icon="alert-circle" class="calendar-day-picker__invalid"></suka-icon> <suka-icon *ngIf="!skeleton && valid" icon="check" class="calendar-day-picker__valid"></suka-icon> </div> <div *ngIf="invalid" class="form-requirement"> <ng-container *ngIf="!isTemplate(invalidText)">{{invalidText}}</ng-container> <ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template> </div> </div> <ng-template #calendarDayOverlay> <suka-calendar-day-overlay [days]="_selectedDays" (daysChange)="onDaysChange($event)" > </suka-calendar-day-overlay> </ng-template> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: CalendarDayPicker, multi: true } ] }] } ]; /** @nocollapse */ CalendarDayPicker.ctorParameters = () => [ { type: Overlay }, { type: ViewContainerRef } ]; CalendarDayPicker.propDecorators = { baseClass: [{ type: HostBinding, args: ['class.calendar-day-picker',] }], containerClass: [{ type: HostBinding, args: ['class.form-item',] }], disabled: [{ type: Input }], skeleton: [{ type: Input }], invalid: [{ type: Input }], valid: [{ type: Input }], id: [{ type: Input }], required: [{ type: Input }], value: [{ type: Input }], placeholder: [{ type: Input }], label: [{ type: Input }], helperText: [{ type: Input }], invalidText: [{ type: Input }], change: [{ type: Output }], origin: [{ type: ViewChild, args: ['origin', { static: false },] }], dialog: [{ type: ViewChild, args: ['calendarDayOverlay', { static: false },] }] }; if (false) { /** * Variable used for creating unique ids for color input components. * @type {?} */ CalendarDayPicker.calendarDayPickerCount; /** * @type {?} * @private */ CalendarDayPicker.prototype._overlayRef; /** * @type {?} * @private */ CalendarDayPicker.prototype._portal; /** @type {?} */ CalendarDayPicker.prototype._selectedDays; /** @type {?} */ CalendarDayPicker.prototype.baseClass; /** @type {?} */ CalendarDayPicker.prototype.containerClass; /** * Set to `true` for a disabled color input. * @type {?} */ CalendarDayPicker.prototype.disabled; /** * Set to `true` for a loading color input component. * @type {?} */ CalendarDayPicker.prototype.skeleton; /** * Set to `true` for an invalid color input component. * @type {?} */ CalendarDayPicker.prototype.invalid; /** * Set to `true` for a valid color input component. * @type {?} */ CalendarDayPicker.prototype.valid; /** * The unique id for the color input component. * @type {?} */ CalendarDayPicker.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ CalendarDayPicker.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ CalendarDayPicker.prototype.value; /** * Sets the placeholder on the `input` element. * @type {?} */ CalendarDayPicker.prototype.placeholder; /** * Sets the text inside the `label` tag. * @type {?} */ CalendarDayPicker.prototype.label; /** * Sets the optional helper text. * @type {?} */ CalendarDayPicker.prototype.helperText; /** * Sets the invalid text. * @type {?} */ CalendarDayPicker.prototype.invalidText; /** * Emits event notifying other classes when a change in state occurs in the input. * @type {?} */ CalendarDayPicker.prototype.change; /** @type {?} */ CalendarDayPicker.prototype.origin; /** @type {?} */ CalendarDayPicker.prototype.dialog; /** * Called when number input is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ CalendarDayPicker.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ CalendarDayPicker.prototype.propagateChange; /** * @type {?} * @private */ CalendarDayPicker.prototype._overlay; /** * @type {?} * @private */ CalendarDayPicker.prototype._viewContainerRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXItZGF5LXBpY2tlci9jYWxlbmRhci1kYXktcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVLLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkRyRCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUFxRTVCLFlBQ1UsUUFBaUIsRUFDakIsaUJBQW1DO1FBRG5DLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQS9EN0Msa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFFYSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTNCLG1CQUFjLEdBQUcsSUFBSSxDQUFDOzs7O1FBSTdDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixZQUFPLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWhCLFVBQUssR0FBRyxLQUFLLENBQUM7Ozs7UUFJZCxPQUFFLEdBQUcsdUJBQXVCLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7Ozs7UUFRdkUsVUFBSyxHQUFHLEVBQUUsQ0FBQzs7OztRQUlYLGdCQUFXLEdBQUcsRUFBRSxDQUFDOzs7OztRQWlCaEIsV0FBTSxHQUFHLElBQUksWUFB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QXNDOztJQUV0QyxtQ0FBMkQ7O0lBQzNELG1DQUE2RTs7Ozs7SUFpRDdFLHNDQUFpQzs7Ozs7SUFLakMsNENBQWtDOzs7OztJQWhEaEMscUNBQXlCOzs7OztJQUN6Qiw4Q0FBMkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1jYWxlbmRhci1kYXktcGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgKm5nSWY9XCJza2VsZXRvbiAmJiBsYWJlbFwiIGNsYXNzPVwibGFiZWwgc2tlbGV0b25cIj48L2xhYmVsPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFza2VsZXRvbiAmJiBsYWJlbFwiIFtmb3JdPVwiaWRcIiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUobGFiZWwpXCI+e3tsYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGxhYmVsKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgKm5nSWY9XCIhc2tlbGV0b24gJiYgaGVscGVyVGV4dFwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShoZWxwZXJUZXh0KVwiPnt7aGVscGVyVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgW2F0dHIuZGF0YS1pbnZhbGlkXT1cIihpbnZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIFthdHRyLmRhdGEtdmFsaWRdPVwiKHZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIGNsYXNzPVwiY2FsZW5kYXItZGF5LXBpY2tlclwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdjYWxlbmRhci1kYXktcGlja2VyLS1ub2xhYmVsJzogIWxhYmVsLFxuICAgICAgICAnY2FsZW5kYXItZGF5LXBpY2tlci0taGVscGVydGV4dCc6IGhlbHBlclRleHQsXG4gICAgICAgICdza2VsZXRvbicgOiBza2VsZXRvbixcbiAgICAgICAgJ2NhbGVuZGFyLWRheS1waWNrZXItLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXktcGlja2VyX19pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNvcmlnaW5cbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIChmb2N1cyk9XCJvcGVuQ2FsZW5kYXJEYXlPdmVybGF5KClcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCIvPlxuXG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgaW52YWxpZFwiIGljb249XCJhbGVydC1jaXJjbGVcIiBjbGFzcz1cImNhbGVuZGFyLWRheS1waWNrZXJfX2ludmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgICAgPHN1a2EtaWNvbiAqbmdJZj1cIiFza2VsZXRvbiAmJiB2YWxpZFwiIGljb249XCJjaGVja1wiIGNsYXNzPVwiY2FsZW5kYXItZGF5LXBpY2tlcl9fdmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiPnt7aW52YWxpZFRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImludmFsaWRUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNjYWxlbmRhckRheU92ZXJsYXk+XG4gICAgICA8c3VrYS1jYWxlbmRhci1kYXktb3ZlcmxheVxuICAgICAgICBbZGF5c109XCJfc2VsZWN0ZWREYXlzXCJcbiAgICAgICAgKGRheXNDaGFuZ2UpPVwib25EYXlzQ2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgPC9zdWthLWNhbGVuZGFyLWRheS1vdmVybGF5PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IENhbGVuZGFyRGF5UGlja2VyLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJEYXlQaWNrZXIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBjb2xvciBpbnB1dCBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIGNhbGVuZGFyRGF5UGlja2VyQ291bnQgPSAwO1xuICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsPGFueT47XG5cbiAgX3NlbGVjdGVkRGF5czogbnVtYmVyW10gPSBbXTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNhbGVuZGFyLWRheS1waWNrZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgY29udGFpbmVyQ2xhc3MgPSB0cnVlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBjb2xvciBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgY29sb3IgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGFuIGludmFsaWQgY29sb3IgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSB2YWxpZCBjb2xvciBpbnB1dCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGNvbG9yIGlucHV0IGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYGNhbGVuZGFyLWRheS1waWNrZXItJHtDYWxlbmRhckRheVBpY2tlci5jYWxlbmRhckRheVBpY2tlckNvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIHBsYWNlaG9sZGVyIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICAvKipcbiAgICogU2V0cyB0aGUgdGV4dCBpbnNpZGUgdGhlIGBsYWJlbGAgdGFnLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25hbCBoZWxwZXIgdGV4dC5cbiAgICovXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnZhbGlkIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIHdoZW4gYSBjaGFuZ2UgaW4gc3RhdGUgb2NjdXJzIGluIHRoZSBpbnB1dC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ29yaWdpbicsIHsgc3RhdGljOiBmYWxzZSB9KSBvcmlnaW46IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NhbGVuZGFyRGF5T3ZlcmxheScsIHsgc3RhdGljOiBmYWxzZSB9KSBkaWFsb2c6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENhbGVuZGFyRGF5UGlja2VyYC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICBDYWxlbmRhckRheVBpY2tlci5jYWxlbmRhckRheVBpY2tlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSB8fCAnJztcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWREYXlzID0gSlNPTi5wYXJzZSgnWycgKyB2YWx1ZSArICddJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgbnVtYmVyIGlucHV0IGlzIHRvdWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgdGhyb3VnaCB0aGUgbW9kZWxcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIG51bWJlciBpbnB1dCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsYXNzIG9mIGBOdW1iZXJDaGFuZ2VgIHRvIGVtaXQgdGhlIGNoYW5nZSBpbiB0aGUgYE51bWJlcmAuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2UoZGF5czogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IEpTT04ucGFyc2UoJ1snICsgZGF5cyArICddJyk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIG9uRGF5c0NoYW5nZShkYXlzOiBudW1iZXJbXSkge1xuICAgIHRoaXMudmFsdWUgPSBkYXlzLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXlzID0gZGF5cztcbiAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBjb2xvciBwaWNrZXIgZGlhbG9nXG4gICAqL1xuICBvcGVuQ2FsZW5kYXJEYXlPdmVybGF5KCkge1xuICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX292ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5vcmlnaW4pXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFt7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogOCxcbiAgICAgICAgfV0pO1xuXG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSk7XG4gICAgICB0aGlzLl9wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kaWFsb2csIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xuXG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNhbGVuZGFyIGRheSBkaWFsb2dcbiAgICovXG4gIGNsb3NlQ2FsZW5kYXJEYXlPdmVybGF5KCkge1xuICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cbn1cbiJdfQ==