@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
209 lines • 30.4 kB
JavaScript
import { Component, Injector, ViewChild } from '@angular/core';
import { DateTime } from '@microsoft/windows-admin-center-sdk/core/base/date/date-time';
import { DateType } from '@microsoft/windows-admin-center-sdk/core/base/date/date-type';
import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager';
import { Globalization } from '@microsoft/windows-admin-center-sdk/core/data/globalization';
import { DropdownComponent } from '../../../dropdown/dropdown.component';
import { ClockFormFieldComponent } from '../clock/clock-form-field.component';
import { DateLikeFormFieldComponent } from '../date-like/date-like-form-field.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../../../dropdown/dropdown.component";
import * as i3 from "../clock/clock-form-field.component";
import * as i4 from "../../validation-alert/validation-alert.component";
import * as i5 from "../form-field-accessor.directive";
import * as i6 from "../form-field-validator.directive";
import * as i7 from "../../form-field-layout/form-field-layout.component";
const _c0 = ["dropDown"];
const _c1 = ["clock"];
const _c2 = ["type", "time"];
/**
* Time Form Field Component
*/
export class TimeFormFieldComponent extends DateLikeFormFieldComponent {
/**
* Initializes a new instance of the @see TimeFormFieldComponent class.
* @param injector The angular injection service. required by @see SmeInjectableBase decorator in the @see BaseComponent class
*/
constructor(injector) {
super(injector);
this.displayValueValid = false;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'TimeFormFieldComponent';
}
/**
* Handles toggled state changes
*/
onDropdownToggled(expanded) {
if (expanded) {
this.clock.focus();
}
else {
this.focus();
}
}
/**
* Handles keydown events on the dropdown toggle
*/
onToggleKeydown(event) {
switch (event.keyCode) {
case KeyCode.Enter: {
if (this.dropDown.isOpen) {
this.clock.onAcceptClicked(event);
return;
}
this.dropDown.onToggleClick(event, true);
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault();
return;
}
case KeyCode.DownArrow: {
if (event.altKey) {
this.dropDown.onToggleClick(event, true);
}
return;
}
default: {
return;
}
}
}
onDateInputKeydown(event) {
switch (event.keyCode) {
case KeyCode.Enter: {
this.commitDisplayValue();
// handle all keys
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault();
return;
}
default: {
return;
}
}
}
/**
* Handles value changes from the date input
*/
commitDisplayValue() {
const displayDate = new Date(`01/01/2000 ${this.displayValue}`);
this.displayValueValid = !isNaN(displayDate.getTime());
this.expectValueChange = true;
this.markAsDirty();
if (this.displayValueValid) {
const valueAsDate = DateType.convert(this.value, DateType.Date);
DateTime.copyTime(displayDate, valueAsDate);
const dateType = MsftSme.isNullOrUndefined(this.dateType) ? this.detectedDateType : this.dateType;
this.value = DateType.convert(valueAsDate, dateType);
}
else {
this.ngModel.control.updateValueAndValidity();
}
}
/**
* Occurs every time the value of the control changes, in the UI or programmatically.
* @param value the value of the form control
*/
onValueChanged(value) {
super.onValueChanged(value);
if (!this.expectValueChange) {
if (!value) {
this.displayValue = '';
}
else {
const valueAsDate = DateType.convert(value, DateType.Date);
this.displayValue = valueAsDate.toLocaleTimeString(Globalization.localeId);
}
if (!this.displayValueValid) {
this.displayValueValid = true;
this.ngModel.control.updateValueAndValidity();
}
}
this.expectValueChange = false;
}
/**
* Performs validation that is internal to this control
* @param c The form control attached to this instance
*/
validate(c) {
if (!this.displayValueValid) {
return {
invalidDisplayValue: {
message: this.strings.MsftSmeShell.Angular.Form.Time.InvalidTime
}
};
}
return this.validateAsTime(c) || super.validate(c);
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
detailsSpan: '',
dropDownContent: ''
};
}
}
/** @nocollapse */ TimeFormFieldComponent.ɵfac = function TimeFormFieldComponent_Factory(t) { return new (t || TimeFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ TimeFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TimeFormFieldComponent, selectors: [["sme-form-field", "type", "time"]], viewQuery: function TimeFormFieldComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
i0.ɵɵviewQuery(_c1, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dropDown = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.clock = _t.first);
} }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c2, decls: 15, vars: 23, consts: [[3, "formField"], [1, "sme-arrange-stack-h", "sme-focus-zone", "sme-form-field-editor"], [1, "sme-combobox", 3, "autoToggle", "disabled", "autoWidth", "toggled"], ["dropDown", ""], [1, "sme-combobox-header", "sme-dropdown-toggle", 3, "keydown"], ["dropdownHeader", ""], ["type", "text", "role", "combobox", "spellcheck", "false", "autocapitalize", "off", "autocomplete", "off", 3, "ngModel", "placeholder", "ngModelChange"], ["textInput", ""], ["type", "button", "tabindex", "-1", "role", "presentation", "aria-hidden", "true", 1, "sme-button-trigger", "sme-button-auto-width", 3, "click"], ["dropDownButton", ""], [1, "sme-icon", "sme-icon-recent"], [1, "sme-dropdown-content", "sme-dropdown-interaction-enabled", 3, "id"], ["type", "clock", "orientation", "vertical", 3, "ngModel", "required", "hideHeader", "showConfirmation", "ngModelChange", "accepted", "cleared"], ["clock", ""], [3, "alert"]], template: function TimeFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
const _r5 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "sme-dropdown", 2, 3);
i0.ɵɵlistener("toggled", function TimeFormFieldComponent_Template_sme_dropdown_toggled_2_listener($event) { return ctx.onDropdownToggled($event); });
i0.ɵɵelementStart(4, "div", 4, 5);
i0.ɵɵlistener("keydown", function TimeFormFieldComponent_Template_div_keydown_4_listener($event) { return ctx.onToggleKeydown($event); });
i0.ɵɵelementStart(6, "input", 6, 7);
i0.ɵɵlistener("ngModelChange", function TimeFormFieldComponent_Template_input_ngModelChange_6_listener($event) { return ctx.displayValue = $event; })("ngModelChange", function TimeFormFieldComponent_Template_input_ngModelChange_6_listener() { return ctx.commitDisplayValue(); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "button", 8, 9);
i0.ɵɵlistener("click", function TimeFormFieldComponent_Template_button_click_8_listener($event) { i0.ɵɵrestoreView(_r5); const _r0 = i0.ɵɵreference(3); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); });
i0.ɵɵelement(10, "span", 10);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(11, "div", 11)(12, "sme-form-field", 12, 13);
i0.ɵɵlistener("ngModelChange", function TimeFormFieldComponent_Template_sme_form_field_ngModelChange_12_listener($event) { return ctx.value = $event; })("accepted", function TimeFormFieldComponent_Template_sme_form_field_accepted_12_listener($event) { i0.ɵɵrestoreView(_r5); const _r0 = i0.ɵɵreference(3); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); })("cleared", function TimeFormFieldComponent_Template_sme_form_field_cleared_12_listener($event) { i0.ɵɵrestoreView(_r5); const _r0 = i0.ɵɵreference(3); return i0.ɵɵresetView(_r0.onToggleClick($event, true)); });
i0.ɵɵelementEnd()()()();
i0.ɵɵelement(14, "sme-validation-alert", 14);
i0.ɵɵelementEnd();
} if (rf & 2) {
const _r0 = i0.ɵɵreference(3);
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(2);
i0.ɵɵproperty("autoToggle", false)("disabled", ctx.disabled)("autoWidth", true);
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngModel", ctx.displayValue)("placeholder", ctx.placeholder);
i0.ɵɵattribute("aria-required", ctx.required)("aria-controls", ctx.idBag.dropDownContent)("aria-label", ctx.label)("disabled", ctx.loadingOrDisabled ? true : null)("aria-owns", ctx.idBag.dropDownContent)("aria-expanded", _r0.isOpen)("aria-autocomplete", "none");
i0.ɵɵadvance(2);
i0.ɵɵclassProp("sme-toggled", _r0.isOpen);
i0.ɵɵattribute("disabled", ctx.loadingOrDisabled ? true : null)("aria-pressed", _r0.isOpen);
i0.ɵɵadvance(3);
i0.ɵɵproperty("id", ctx.idBag.dropDownContent);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngModel", ctx.value)("required", true)("hideHeader", true)("showConfirmation", true);
i0.ɵɵadvance(2);
i0.ɵɵproperty("alert", ctx.alert);
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.RequiredValidator, i1.NgModel, i2.DropdownComponent, i3.ClockFormFieldComponent, i4.ValidationAlertComponent, i5.FormFieldAccessorDirective, i6.FormFieldValidatorDirective, i7.FormFieldLayoutComponent], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TimeFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="time"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <div class=\"sme-arrange-stack-h sme-focus-zone sme-form-field-editor\">\r\n <sme-dropdown #dropDown [autoToggle]=\"false\" class=\"sme-combobox\" [disabled]=\"disabled\" [autoWidth]=\"true\"\r\n (toggled)=\"onDropdownToggled($event)\">\r\n <div #dropdownHeader class=\"sme-combobox-header sme-dropdown-toggle\" (keydown)=\"onToggleKeydown($event)\">\r\n <input #textInput type=\"text\" role=\"combobox\" [attr.aria-required]='required' [(ngModel)]=\"displayValue\"\r\n (ngModelChange)=\"commitDisplayValue()\" [attr.aria-controls]=\"idBag.dropDownContent\" [attr.aria-label]=\"label\"\r\n [attr.disabled]=\"loadingOrDisabled ? true : null\" \r\n [attr.aria-owns]=\"idBag.dropDownContent\" [attr.aria-expanded]=\"dropDown.isOpen\"\r\n [attr.aria-autocomplete]=\"'none'\" spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\"\r\n [placeholder]=\"placeholder\" />\r\n <button #dropDownButton type=\"button\" [attr.disabled]=\"loadingOrDisabled ? true : null\" tabindex=\"-1\"\r\n role=\"presentation\" aria-hidden=\"true\" [attr.aria-pressed]=\"dropDown.isOpen\"\r\n [class.sme-toggled]=\"dropDown.isOpen\" class=\"sme-button-trigger sme-button-auto-width\"\r\n (click)=\"dropDown.onToggleClick($event, true)\">\r\n <span class=\"sme-icon sme-icon-recent\"></span>\r\n </button>\r\n </div>\r\n <div class=\"sme-dropdown-content sme-dropdown-interaction-enabled\" [id]=\"idBag.dropDownContent\">\r\n <sme-form-field #clock type=\"clock\" [(ngModel)]=\"value\" [required]=\"true\" [hideHeader]=\"true\"\r\n (accepted)=\"dropDown.onToggleClick($event, true)\" (cleared)=\"dropDown.onToggleClick($event, true)\"\r\n [showConfirmation]=\"true\" orientation=\"vertical\">\r\n </sme-form-field>\r\n </div>\r\n </sme-dropdown>\r\n </div>\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { dropDown: [{
type: ViewChild,
args: ['dropDown']
}], clock: [{
type: ViewChild,
args: ['clock']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Zvcm0vZm9ybS1maWVsZC90aW1lL3RpbWUtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvdGltZS90aW1lLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN4RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRXpGOztHQUVHO0FBS0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLDBCQUEwQjtJQThCbEU7OztPQUdHO0lBQ0gsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBbkNEOztPQUVHO0lBQ0gsSUFBYyxhQUFhO1FBQ3ZCLE9BQU8sd0JBQXdCLENBQUM7SUFDcEMs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LGdEQUEwQyxhQUFBLHlCQUFBO1FBR3BDLG1IQUFXLDZCQUF5QixJQUFDO1FBQ3JDLGlDQUF5RztRQUFwQywwR0FBVywyQkFBdUIsSUFBQztRQUN0RyxtQ0FLZ0M7UUFMOEMscUpBQTBCLHFHQUNyRix3QkFBb0IsSUFEaUU7UUFBeEcsaUJBS2dDO1FBQ2hDLG9DQUdpRDtRQUEvQywrSkFBUyxlQUFBLDBCQUErQixJQUFJLENBQUMsQ0FBQSxJQUFDO1FBQzlDLDRCQUE4QztRQUNoRCxpQkFBUyxFQUFBO1FBRVgsZ0NBQWdHLDhCQUFBO1FBQzFELHdKQUFtQixpS0FDekMsZUFBQSwwQkFBK0IsSUFBSSxDQUFDLENBQUEsSUFESywrSkFDUSxlQUFBLDBCQUErQixJQUFJLENBQUMsQ0FBQSxJQUQ1QztRQUd2RCxpQkFBaUIsRUFBQSxFQUFBLEVBQUE7UUFJdkIsNENBQTZEO1FBQy9ELGlCQUF3Qjs7O1FBM0JELCtCQUFrQjtRQUViLGVBQW9CO1FBQXBCLGtDQUFvQiwwQkFBQSxtQkFBQTtRQUdzQyxlQUEwQjtRQUExQiwwQ0FBMEIsZ0NBQUE7UUFBMUQsNkNBQStCLDRDQUFBLHlCQUFBLGlEQUFBLHdDQUFBLDZCQUFBLDZCQUFBO1FBUTNFLGVBQXFDO1FBQXJDLHlDQUFxQztRQUZELCtEQUFpRCw0QkFBQTtRQU90QixlQUE0QjtRQUE1Qiw4Q0FBNEI7UUFDekQsZUFBbUI7UUFBbkIsbUNBQW1CLGtCQUFBLG9CQUFBLDBCQUFBO1FBT3ZDLGVBQWU7UUFBZixpQ0FBZTs7dUZEUDFCLHNCQUFzQjtjQUpsQyxTQUFTOzJCQUNJLDZCQUE2QjsyREFhaEMsUUFBUTtrQkFEZCxTQUFTO21CQUFDLFVBQVU7WUFJZCxLQUFLO2tCQURYLFNBQVM7bUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRGF0ZUxpa2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGF0ZS9kYXRlLWxpa2UnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kYXRlL2RhdGUtdGltZSc7XHJcbmltcG9ydCB7IERhdGVUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RhdGUvZGF0ZS10eXBlJztcclxuaW1wb3J0IHsgS2V5Q29kZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hY2Nlc3NpYmlsaXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBHbG9iYWxpemF0aW9uIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2dsb2JhbGl6YXRpb24nO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydHMgfSBmcm9tICcuLi8uLi92YWxpZGF0aW9uLWFsZXJ0L3ZhbGlkYXRpb24tYWxlcnQnO1xyXG5pbXBvcnQgeyBDbG9ja0Zvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Nsb2NrL2Nsb2NrLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGF0ZUxpa2VGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLWxpa2UvZGF0ZS1saWtlLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBUaW1lIEZvcm0gRmllbGQgQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWZvcm0tZmllbGRbdHlwZT1cInRpbWVcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbWVGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1RpbWVGb3JtRmllbGRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2Ryb3BEb3duJylcclxuICAgIHB1YmxpYyBkcm9wRG93bjogRHJvcGRvd25Db21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY2xvY2snKVxyXG4gICAgcHVibGljIGNsb2NrOiBDbG9ja0Zvcm1GaWVsZENvbXBvbmVudDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGVkaXRhYmxlIGRpc3BsYXkgdmFsdWUgb2YgdGhpcyBmaWVsZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpbmRpY2F0ZXMgaWYgdGhlIGRpc3BsYXkgdmFsdWUgaXMgdmFsaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3BsYXlWYWx1ZVZhbGlkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaW5kaWNhdGVzIGlmIGEgdmFsdWUgY2hhbmdlIGlzIGV4cGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBlY3RWYWx1ZUNoYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIFRpbWVGb3JtRmllbGRDb21wb25lbnQgY2xhc3MuXHJcbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgVGhlIGFuZ3VsYXIgaW5qZWN0aW9uIHNlcnZpY2UuIHJlcXVpcmVkIGJ5IEBzZWUgU21lSW5qZWN0YWJsZUJhc2UgZGVjb3JhdG9yIGluIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgY2xhc3NcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdG9nZ2xlZCBzdGF0ZSBjaGFuZ2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRyb3Bkb3duVG9nZ2xlZChleHBhbmRlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChleHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb2NrLmZvY3VzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGRyb3Bkb3duIHRvZ2dsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Ub2dnbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJvcERvd24uaXNPcGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9jay5vbkFjY2VwdENsaWNrZWQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcERvd24ub25Ub2dnbGVDbGljayhldmVudCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5vblRvZ2dsZUNsaWNrKGV2ZW50LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7IHJldHVybjsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25EYXRlSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21taXREaXNwbGF5VmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYWxsIGtleXNcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB2YWx1ZSBjaGFuZ2VzIGZyb20gdGhlIGRhdGUgaW5wdXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbW1pdERpc3BsYXlWYWx1ZSgpIHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5RGF0ZSA9IG5ldyBEYXRlKGAwMS8wMS8yMDAwICR7dGhpcy5kaXNwbGF5VmFsdWV9YCk7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWVWYWxpZCA9ICFpc05hTihkaXNwbGF5RGF0ZS5nZXRUaW1lKCkpO1xyXG4gICAgICAgIHRoaXMuZXhwZWN0VmFsdWVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcclxuICAgICAgICBpZiAodGhpcy5kaXNwbGF5VmFsdWVWYWxpZCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFzRGF0ZSA9IERhdGVUeXBlLmNvbnZlcnQodGhpcy52YWx1ZSwgRGF0ZVR5cGUuRGF0ZSk7XHJcbiAgICAgICAgICAgIERhdGVUaW1lLmNvcHlUaW1lKGRpc3BsYXlEYXRlLCB2YWx1ZUFzRGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVUeXBlID0gTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmRhdGVUeXBlKSA/IHRoaXMuZGV0ZWN0ZWREYXRlVHlwZSA6IHRoaXMuZGF0ZVR5cGU7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBEYXRlVHlwZS5jb252ZXJ0KHZhbHVlQXNEYXRlLCBkYXRlVHlwZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgZXZlcnkgdGltZSB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgY2hhbmdlcywgaW4gdGhlIFVJIG9yIHByb2dyYW1tYXRpY2FsbHkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBEYXRlTGlrZSkge1xyXG4gICAgICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICBpZiAoIXRoaXMuZXhwZWN0VmFsdWVDaGFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlQXNEYXRlID0gRGF0ZVR5cGUuY29udmVydCh2YWx1ZSwgRGF0ZVR5cGUuRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlQXNEYXRlLnRvTG9jYWxlVGltZVN0cmluZyhHbG9iYWxpemF0aW9uLmxvY2FsZUlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzcGxheVZhbHVlVmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheVZhbHVlVmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXhwZWN0VmFsdWVDaGFuZ2UgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIHZhbGlkYXRpb24gdGhhdCBpcyBpbnRlcm5hbCB0byB0aGlzIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBjIFRoZSBmb3JtIGNvbnRyb2wgYXR0YWNoZWQgdG8gdGhpcyBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGUoYzogRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uQWxlcnRzIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzcGxheVZhbHVlVmFsaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGludmFsaWREaXNwbGF5VmFsdWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5UaW1lLkludmFsaWRUaW1lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQXNUaW1lKGMpIHx8IHN1cGVyLnZhbGlkYXRlKGMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKiBpZCB2YWx1ZXMgd2lsbCBiZSBhc3NpZ25lZCBiZSB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IHN1cGVyIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGV0YWlsc1NwYW46ICcnLFxyXG4gICAgICAgICAgICBkcm9wRG93bkNvbnRlbnQ6ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWZvcm0tZmllbGQtbGF5b3V0IFtmb3JtRmllbGRdPVwidGhpc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1mb2N1cy16b25lIHNtZS1mb3JtLWZpZWxkLWVkaXRvclwiPlxyXG4gICAgPHNtZS1kcm9wZG93biAjZHJvcERvd24gW2F1dG9Ub2dnbGVdPVwiZmFsc2VcIiBjbGFzcz1cInNtZS1jb21ib2JveFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthdXRvV2lkdGhdPVwidHJ1ZVwiXHJcbiAgICAgICh0b2dnbGVkKT1cIm9uRHJvcGRvd25Ub2dnbGVkKCRldmVudClcIj5cclxuICAgICAgPGRpdiAjZHJvcGRvd25IZWFkZXIgY2xhc3M9XCJzbWUtY29tYm9ib3gtaGVhZGVyIHNtZS1kcm9wZG93bi10b2dnbGVcIiAoa2V5ZG93bik9XCJvblRvZ2dsZUtleWRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgIDxpbnB1dCAjdGV4dElucHV0IHR5cGU9XCJ0ZXh0XCIgcm9sZT1cImNvbWJvYm94XCIgW2F0dHIuYXJpYS1yZXF1aXJlZF09J3JlcXVpcmVkJyBbKG5nTW9kZWwpXT1cImRpc3BsYXlWYWx1ZVwiXHJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjb21taXREaXNwbGF5VmFsdWUoKVwiIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaWRCYWcuZHJvcERvd25Db250ZW50XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbFwiXHJcbiAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZCA/IHRydWUgOiBudWxsXCIgXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiaWRCYWcuZHJvcERvd25Db250ZW50XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJkcm9wRG93bi5pc09wZW5cIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiJ25vbmUnXCIgc3BlbGxjaGVjaz1cImZhbHNlXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgLz5cclxuICAgICAgICA8YnV0dG9uICNkcm9wRG93bkJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuZGlzYWJsZWRdPVwibG9hZGluZ09yRGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJkcm9wRG93bi5pc09wZW5cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10b2dnbGVkXT1cImRyb3BEb3duLmlzT3BlblwiIGNsYXNzPVwic21lLWJ1dHRvbi10cmlnZ2VyIHNtZS1idXR0b24tYXV0by13aWR0aFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZHJvcERvd24ub25Ub2dnbGVDbGljaygkZXZlbnQsIHRydWUpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXJlY2VudFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtZHJvcGRvd24tY29udGVudCBzbWUtZHJvcGRvd24taW50ZXJhY3Rpb24tZW5hYmxlZFwiIFtpZF09XCJpZEJhZy5kcm9wRG93bkNvbnRlbnRcIj5cclxuICAgICAgICA8c21lLWZvcm0tZmllbGQgI2Nsb2NrIHR5cGU9XCJjbG9ja1wiIFsobmdNb2RlbCldPVwidmFsdWVcIiBbcmVxdWlyZWRdPVwidHJ1ZVwiIFtoaWRlSGVhZGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgKGFjY2VwdGVkKT1cImRyb3BEb3duLm9uVG9nZ2xlQ2xpY2soJGV2ZW50LCB0cnVlKVwiIChjbGVhcmVkKT1cImRyb3BEb3duLm9uVG9nZ2xlQ2xpY2soJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgICBbc2hvd0NvbmZpcm1hdGlvbl09XCJ0cnVlXCIgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiPlxyXG4gICAgICAgIDwvc21lLWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zbWUtZHJvcGRvd24+XHJcbiAgPC9kaXY+XHJcbiAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0IFthbGVydF09XCJhbGVydFwiPjwvc21lLXZhbGlkYXRpb24tYWxlcnQ+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=