UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

561 lines (560 loc) 46.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { TimePicker } from '../../../../../component/dataview/input/TimePicker.component'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { FormatterFactory } from '../../../../../service/FormatterFactory.service'; import { PhloxAppInfoService } from '../../../../../service/PhloxAppInfoService.service'; const /** @type {?} */ TYPE_NAME = "material-time-picker"; const /** @type {?} */ DEFAULT_BUTTON_ICON = 'access_time'; const /** @type {?} */ DEFAULT_BUTTON_POSITION = 'suffix'; export class MaterialTimePicker extends TimePicker { /** * @param {?} elementRef * @param {?} needFocusService * @param {?} formatterFactory * @param {?} phloxAppInfoService */ constructor(elementRef, needFocusService, formatterFactory, phloxAppInfoService) { super(elementRef, needFocusService, formatterFactory, phloxAppInfoService); this.buttonIcon = DEFAULT_BUTTON_ICON; this.buttonPosition = DEFAULT_BUTTON_POSITION; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); } /** * @return {?} */ getClassMatFocused() { return this.isReadOnly() ? { 'mat-focused': this.isClassFocused() } : {}; } /** * @param {?} $event * @return {?} */ doLostFocus($event) { // Super will always hide popup in doLostFocus(). super.doLostFocus($event); this._classFocused = false; } /** * @param {?} $event * @return {?} */ onClick($event) { this._btnIconClick = true; } /** * @param {?} event * @return {?} */ onFocus(event) { super.onFocus(event); this._classFocused = true; } /** * @param {?} $event * @return {?} */ onFocusing($event) { if (this._btnIconClick) { super.onFocusing($event); } } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { if (this._btnIconClick || this.isActive()) { this._btnIconClick = false; super.onLostFocusing($event); } } /** * @return {?} */ isClassFocused() { return this._classFocused; } /** * @return {?} */ getButtonIcon() { return (!this.buttonIcon ? DEFAULT_BUTTON_ICON : this.buttonIcon); ; } /** * @param {?} buttonIcon * @return {?} */ setButtonIcon(buttonIcon) { this.buttonIcon = buttonIcon; } /** * @return {?} */ getButtonPosition() { return (!this.buttonPosition ? DEFAULT_BUTTON_POSITION : this.buttonPosition); } /** * @param {?} buttonPosition * @return {?} */ setButtonPosition(buttonPosition) { this.buttonPosition = buttonPosition; } /** * @return {?} */ getLabel() { return this.label; } /** * @param {?} label * @return {?} */ setLabel(label) { this.label = label; } /** * @return {?} */ getDescription() { return this.description; } /** * @param {?} description * @return {?} */ setDescription(description) { this.description = description; } } MaterialTimePicker.TYPE_NAME = TYPE_NAME; MaterialTimePicker.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input material-time-picker" [style.width]="getWidth()" [style.height]="getHeight()"> <div class="time-picker-wrapper" [class.active]="isActive()"> <div class="time-picker-table"> <div> <div class="table-wrapper"> <mat-form-field [ngClass]="getClassMatFocused()"> <input matInput type="text" placeholder="{{getLabel() | phx_text}}" class="form-control" [class.focus]="isActive()" [disabled]="isDisabled()" [class.dirty]="isDataDirty()" [readonly]="isReadOnly()" [value]="formattedData | phx_text" (focus)="onFocusing($event)" (blur)="onLostFocusing($event)" (change)="onValueChanged($event)" [class.normal]="isNormal()" [class.success]="isSuccess()" [class.warning]="isWarning()" [class.error]="isError()"> <button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && !(isDisabled() || isReadOnly()))" (click)="onClick($event)" matSuffix mat-icon-button> <mat-icon>{{getButtonIcon()}}</mat-icon> </button> <button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && !(isDisabled() || isReadOnly()))" (click)="onClick($event)" matPrefix mat-icon-button> <mat-icon>{{getButtonIcon()}}</mat-icon> </button> <button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && (isDisabled() || isReadOnly()))" (click)="onClick($event)" disabled matSuffix mat-icon-button> <mat-icon>{{getButtonIcon()}}</mat-icon> </button> <button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && (isDisabled() || isReadOnly()))" (click)="onClick($event)" disabled matPrefix mat-icon-button> <mat-icon>{{getButtonIcon()}}</mat-icon> </button> </mat-form-field> <div class="time-picker-view" [class.show]="isActive()" [style.top]="getPopupPositionTop() ? getPopupPositionTop() + 'px' : undefined" [style.left]="getPopupPositionLeft() ? getPopupPositionLeft() + 'px' : undefined"> <div class="time-view-wrapper"> <div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()"> <div class="icon-arrow-up" (mousedown)="onUpArrow($event, HOUR)"></div> <div *ngFor="let hour of getRangeHour(); let i = index;" class="time-number" [class.selected]="_isCurrentHourTime(hour)" (mousedown)="onTimeClicked($event, hour, HOUR)"> {{hour | number:'2.0-0'}} </div> <div class="icon-arrow-down" (mousedown)="onDownArrow($event, HOUR)"></div> </div> <div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()"> <div class="icon-arrow-up" (mousedown)="onUpArrow($event, MIN)"></div> <div *ngFor="let min of getRangeMin(); let i = index;" class="time-number" [class.selected]="_isCurrentMinTime(min)" (mousedown)="onTimeClicked($event, min, MIN)"> {{min | number:'2.0-0'}} </div> <div class="icon-arrow-down" (mousedown)="onDownArrow($event, MIN)"></div> </div> <div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()"> <div class="icon-arrow-up" (mousedown)="onUpArrow($event, SEC)"></div> <div *ngFor="let sec of getRangeSec(); let i = index;" class="time-number" [class.selected]="_isCurrentSecTime(sec)" (mousedown)="onTimeClicked($event, sec, SEC)"> {{sec | number:'2.0-0'}} </div> <div class="icon-arrow-down" (mousedown)="onDownArrow($event, SEC)"></div> </div> </div> </div> </div> </div> <div> <div class="table-wrapper description-wrapper"> <div class="validation" [style.display]="getValidationResultMessage() ? undefined : 'none'" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getValidationResultMessage()" [ngIfElse]="validation_else"> {{getValidationResultMessage() | phx_text}} </ng-template> <ng-template #validation_else> <!-- We've to put whitespace if there is no validation msg to prevent empty dom --> <!-- since if validate msg's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> <div class="description" [style.display]="getValidationResultMessage() ? 'none' : undefined" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getDescription()" [ngIfElse]="description_else"> {{ getDescription() | phx_text }} </ng-template> <ng-template #description_else> <!-- We've to put whitespace if there is no description to prevent empty dom --> <!-- since if description's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> </div> </div> <div> <div class="table-wrapper help-wrapper"> <div class="help">{{getHelp() | phx_text}}</div> </div> </div> </div> </div> </div> ` },] }, ]; /** @nocollapse */ MaterialTimePicker.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, { type: FormatterFactory, }, { type: PhloxAppInfoService, }, ]; MaterialTimePicker.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "field": [{ type: Input },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "formatter": [{ type: Input, args: ['formatter',] },], "formatterName": [{ type: Input, args: ['formatterName',] },], "formatterOptions": [{ type: Input, args: ['formatterOptions',] },], "formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },], "dataPattern": [{ type: Input },], "range": [{ type: Input },], "hideSecond": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "label": [{ type: Input },], "description": [{ type: Input },], "buttonIcon": [{ type: Input },], "buttonPosition": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeViewShowEvent": [{ type: Output, args: ['phxBeforeViewShow',] },], "viewShowEvent": [{ type: Output, args: ['phxViewShow',] },], "beforeViewHideEvent": [{ type: Output, args: ['phxBeforeViewHide',] },], "viewHideEvent": [{ type: Output, args: ['phxViewHide',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTimePicker.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTimePicker.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "help", void 0); tslib_1.__decorate([ Option('formatter.instance'), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "formatter", void 0); tslib_1.__decorate([ Option('formatter.name'), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "formatterName", void 0); tslib_1.__decorate([ Option('formatter.options'), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "formatterOptions", void 0); tslib_1.__decorate([ Option('formatter.usePropertyValue'), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "formatterUsePropertyValue", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "dataPattern", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTimePicker.prototype, "range", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "hideSecond", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "height", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "label", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "description", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "buttonIcon", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "buttonPosition", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeViewShow'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeViewShowEvent", void 0); tslib_1.__decorate([ Option('viewShow'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "viewShowEvent", void 0); tslib_1.__decorate([ Option('beforeViewHide'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeViewHideEvent", void 0); tslib_1.__decorate([ Option('viewHide'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "viewHideEvent", void 0); function MaterialTimePicker_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialTimePicker.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialTimePicker.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialTimePicker.propDecorators; /** @type {?} */ MaterialTimePicker.TYPE_NAME; /** @type {?} */ MaterialTimePicker.prototype.dataParent; /** @type {?} */ MaterialTimePicker.prototype.ignoreParentData; /** @type {?} */ MaterialTimePicker.prototype.data; /** @type {?} */ MaterialTimePicker.prototype.ignoreParentDisabled; /** @type {?} */ MaterialTimePicker.prototype.delegateHistory; /** @type {?} */ MaterialTimePicker.prototype.onDisabled; /** @type {?} */ MaterialTimePicker.prototype.onEnabled; /** @type {?} */ MaterialTimePicker.prototype.loadingEnabled; /** @type {?} */ MaterialTimePicker.prototype.i18nKey; /** @type {?} */ MaterialTimePicker.prototype.bypass; /** @type {?} */ MaterialTimePicker.prototype.options; /** @type {?} */ MaterialTimePicker.prototype.disabled; /** @type {?} */ MaterialTimePicker.prototype.field; /** @type {?} */ MaterialTimePicker.prototype.name; /** @type {?} */ MaterialTimePicker.prototype.typeOfData; /** @type {?} */ MaterialTimePicker.prototype.readOnly; /** @type {?} */ MaterialTimePicker.prototype.help; /** @type {?} */ MaterialTimePicker.prototype.formatter; /** @type {?} */ MaterialTimePicker.prototype.formatterName; /** @type {?} */ MaterialTimePicker.prototype.formatterOptions; /** @type {?} */ MaterialTimePicker.prototype.formatterUsePropertyValue; /** @type {?} */ MaterialTimePicker.prototype.dataPattern; /** @type {?} */ MaterialTimePicker.prototype.range; /** @type {?} */ MaterialTimePicker.prototype.hideSecond; /** @type {?} */ MaterialTimePicker.prototype.width; /** @type {?} */ MaterialTimePicker.prototype.height; /** @type {?} */ MaterialTimePicker.prototype.label; /** @type {?} */ MaterialTimePicker.prototype.description; /** @type {?} */ MaterialTimePicker.prototype.buttonIcon; /** @type {?} */ MaterialTimePicker.prototype.buttonPosition; /** @type {?} */ MaterialTimePicker.prototype.loadEvent; /** @type {?} */ MaterialTimePicker.prototype.startValidateEvent; /** @type {?} */ MaterialTimePicker.prototype.endValidateEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.focusEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.lostFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeChangeEvent; /** @type {?} */ MaterialTimePicker.prototype.changeEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeViewShowEvent; /** @type {?} */ MaterialTimePicker.prototype.viewShowEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeViewHideEvent; /** @type {?} */ MaterialTimePicker.prototype.viewHideEvent; /** @type {?} */ MaterialTimePicker.prototype._classFocused; /** @type {?} */ MaterialTimePicker.prototype._btnIconClick; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxUaW1lUGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRpbWVQaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBRTFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRW5GLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFekYsdUJBQU0sU0FBUyxHQUFXLHNCQUFzQixDQUFDO0FBRWpELHVCQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztBQUMxQyx1QkFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUEyRnpDLE1BQU0seUJBQTBCLFNBQVEsVUFBVTs7Ozs7OztJQTJKaEQsWUFBWSxVQUFzQixFQUFFLGdCQUFrQyxFQUFFLGdCQUFrQyxFQUFFLG1CQUF3QztRQUNsSixLQUFLLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLHVCQUF1QixDQUFDO0tBQy9DOzs7O0lBRU0sUUFB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QUM7Ozs7SUFHNUIsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O0lBR3hCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQzs7OztJQUczQixNQUFNLENBQUMsNEJBQTRCLENBQUM7Ozs7SUFJcEMsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBSVIsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBR1IsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBTVIsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDTSxZQUFZOzs7SUFJaEMsTUFBTSxDQUFDLGVBQWUsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFekMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZOzs7SUFFakMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO3NDQUNNLFlBQVk7OztJQUUzQyxNQUFNLENBQUMsV0FBVyxDQUFDO3NDQUNNLFlBQVk7OztJQUVyQyxNQUFNLENBQUMsY0FBYyxDQUFDO3NDQUNNLFlBQVk7OztJQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNNLFlBQVk7OztJQUlsQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7c0NBQ00sWUFBWTs7O0lBRTFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7c0NBQ00sWUFBWTs7O0lBRXBDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFMUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L1RpbWVQaWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9QaGxveEFwcEluZm9TZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcIm1hdGVyaWFsLXRpbWUtcGlja2VyXCI7XHJcblxyXG5jb25zdCBERUZBVUxUX0JVVFRPTl9JQ09OID0gJ2FjY2Vzc190aW1lJztcclxuY29uc3QgREVGQVVMVF9CVVRUT05fUE9TSVRJT04gPSAnc3VmZml4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dCBtYXRlcmlhbC10aW1lLXBpY2tlclwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci13cmFwcGVyXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZSgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdGFibGVcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtuZ0NsYXNzXT1cImdldENsYXNzTWF0Rm9jdXNlZCgpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwie3tnZXRMYWJlbCgpIHwgcGh4X3RleHR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmZvY3VzXT1cImlzQWN0aXZlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmRpcnR5XT1cImlzRGF0YURpcnR5KClcIiBbcmVhZG9ubHldPVwiaXNSZWFkT25seSgpXCIgW3ZhbHVlXT1cImZvcm1hdHRlZERhdGEgfCBwaHhfdGV4dFwiIChmb2N1cyk9XCJvbkZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKClcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAncHJlZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRQcmVmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAoaXNEaXNhYmxlZCgpIHx8IGlzUmVhZE9ubHkoKSkpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiIGRpc2FibGVkIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICBcdFx0XHQ8bWF0LWljb24+e3tnZXRCdXR0b25JY29uKCl9fTwvbWF0LWljb24+XHJcbiAgICAgIFx0XHRcdFx0PC9idXR0b24+XHJcbiAgICAgIFx0XHRcdFx0PGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZ2V0QnV0dG9uSWNvbigpICYmIChmb3JtYXR0ZWREYXRhICYmIGdldEJ1dHRvblBvc2l0aW9uKCkgPT09ICdwcmVmaXgnICYmIChpc0Rpc2FibGVkKCkgfHwgaXNSZWFkT25seSgpKSlcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgZGlzYWJsZWQgbWF0UHJlZml4IG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICAgIFx0XHRcdDxtYXQtaWNvbj57e2dldEJ1dHRvbkljb24oKX19PC9tYXQtaWNvbj5cclxuICAgICAgXHRcdFx0XHQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdmlld1wiIFtjbGFzcy5zaG93XT1cImlzQWN0aXZlKClcIiBbc3R5bGUudG9wXT1cImdldFBvcHVwUG9zaXRpb25Ub3AoKSA/IGdldFBvcHVwUG9zaXRpb25Ub3AoKSArICdweCcgOiB1bmRlZmluZWRcIiBbc3R5bGUubGVmdF09XCJnZXRQb3B1cFBvc2l0aW9uTGVmdCgpID8gZ2V0UG9wdXBQb3NpdGlvbkxlZnQoKSArICdweCcgOiB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlldy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBob3VyIG9mIGdldFJhbmdlSG91cigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudEhvdXJUaW1lKGhvdXIpXCIgKG1vdXNlZG93bik9XCJvblRpbWVDbGlja2VkKCRldmVudCwgaG91ciwgSE9VUilcIj5cclxuICAgICAgICAgICAgICAgICAge3tob3VyIHwgbnVtYmVyOicyLjAtMCd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1hcnJvdy1kb3duXCIgKG1vdXNlZG93bik9XCJvbkRvd25BcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIE1JTilcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1pbiBvZiBnZXRSYW5nZU1pbigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudE1pblRpbWUobWluKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIG1pbiwgTUlOKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e21pbiB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBNSU4pXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIFNFQylcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlYyBvZiBnZXRSYW5nZVNlYygpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudFNlY1RpbWUoc2VjKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIHNlYywgU0VDKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3NlYyB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBTRUMpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGRlc2NyaXB0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKClcIiBbbmdJZkVsc2VdPVwidmFsaWRhdGlvbl9lbHNlXCI+XHJcbiAgICAgICAgICAgICAge3tnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpIHwgcGh4X3RleHR9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbGlkYXRpb25fZWxzZT5cclxuICAgICAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxyXG4gICAgICAgICAgICAgIHt7ICcmbmJzcDsnIH19XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyAnbm9uZScgOiB1bmRlZmluZWRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cclxuICAgICAgICAgICAgICB7eyBnZXREZXNjcmlwdGlvbigpIHwgcGh4X3RleHQgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxyXG4gICAgICAgICAgICAgIDwhLS0gV2UndmUgdG8gcHV0IHdoaXRlc3BhY2UgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24gdG8gcHJldmVudCBlbXB0eSBkb20gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSBzaW5jZSBpZiBkZXNjcmlwdGlvbidzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cclxuICAgICAgICAgICAgICA8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuICAgICAgICAgICAgICB7eyAnJm5ic3A7JyB9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGhlbHAtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHBcIj57e2dldEhlbHAoKSB8IHBoeF90ZXh0fX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbmBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRpbWVQaWNrZXIgZXh0ZW5kcyBUaW1lUGlja2VyIGltcGxlbWVudHMgT25Jbml0LCBJTmVlZEZvY3VzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdHlwZU9mRGF0YTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHJlYWRPbmx5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3XHJcbiAgQElucHV0KCdmb3JtYXR0ZXInKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlcjogSUZvcm1hdHRlcjtcclxuICBASW5wdXQoJ2Zvcm1hdHRlck5hbWUnKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyTmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZm9ybWF0dGVyT3B0aW9ucycpXHJcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxyXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJPcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KCdmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlJylcclxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlclVzZVByb3BlcnR5VmFsdWU6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRlVGltZVBpY2tlciBcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIFRpbWVQaWNrZXJcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByYW5nZTogbnVtYmVyO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhpZGVTZWNvbmQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuXHJcbiAgLy8gLS0tIHNlbGZcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgbGFiZWw6IHN0cmluZztcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBidXR0b25JY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgYnV0dG9uUG9zaXRpb246IHN0cmluZztcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcclxuICBAT3B0aW9uKCdmb2N1cycpXHJcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXJcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3U2hvdycpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3U2hvdycpXHJcbiAgQE9wdGlvbigndmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCB2aWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3SGlkZScpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3SGlkZScpXHJcbiAgQE9wdGlvbigndmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCB2aWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBfY2xhc3NGb2N1c2VkOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2J0bkljb25DbGljazogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5idXR0b25JY29uID0gREVGQVVMVF9CVVRUT05fSUNPTjtcclxuICAgIHRoaXMuYnV0dG9uUG9zaXRpb24gPSBERUZBVUxUX0JVVFRPTl9QT1NJVElPTjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfSBcclxuXHJcbiAgcHVibGljIGdldENsYXNzTWF0Rm9jdXNlZCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkT25seSgpID8geyAnbWF0LWZvY3VzZWQnOiB0aGlzLmlzQ2xhc3NGb2N1c2VkKCkgfSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIFN1cGVyIHdpbGwgYWx3YXlzIGhpZGUgcG9wdXAgaW4gZG9Mb3N0Rm9jdXMoKS5cclxuICAgIHN1cGVyLmRvTG9zdEZvY3VzKCRldmVudCk7XHJcbiAgICB0aGlzLl9jbGFzc0ZvY3VzZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2J0bkljb25DbGljayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBzdXBlci5vbkZvY3VzKGV2ZW50KTtcclxuICAgIHRoaXMuX2NsYXNzRm9jdXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2J0bkljb25DbGljaykge1xyXG4gICAgICBzdXBlci5vbkZvY3VzaW5nKCRldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9idG5JY29uQ2xpY2sgfHwgdGhpcy5pc0FjdGl2ZSgpKSB7XHJcbiAgICAgIHRoaXMuX2J0bkljb25DbGljayA9IGZhbHNlO1xyXG5cclxuICAgICAgc3VwZXIub25Mb3N0Rm9jdXNpbmcoJGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NsYXNzRm9jdXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGFzc0ZvY3VzZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QnV0dG9uSWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICghdGhpcy5idXR0b25JY29uID8gREVGQVVMVF9CVVRUT05fSUNPTiA6IHRoaXMuYnV0dG9uSWNvbik7O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJ1dHRvbkljb24oYnV0dG9uSWNvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvbkljb24gPSBidXR0b25JY29uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJ1dHRvblBvc2l0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKCF0aGlzLmJ1dHRvblBvc2l0aW9uID8gREVGQVVMVF9CVVRUT05fUE9TSVRJT04gOiB0aGlzLmJ1dHRvblBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRCdXR0b25Qb3NpdGlvbihidXR0b25Qb3NpdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvblBvc2l0aW9uID0gYnV0dG9uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xyXG4gIH1cclxufVxyXG4iXX0=