@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
253 lines • 33 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable */
import { Component, Output, EventEmitter, Input, Host, Optional, ChangeDetectionStrategy, ViewChild } from '@angular/core';
import { ClrLoadingState } from '@clr/angular';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../form-section/form-section.component";
import * as i3 from "@angular/common";
import * as i4 from "@clr/angular";
const _c0 = ["editButton"];
function VdkFormSectionContainerComponent_button_3_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 8, 9);
i0.ɵɵlistener("click", function VdkFormSectionContainerComponent_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(); return ctx_r5.clickEdit(); });
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵattribute("aria-label", ctx_r0.editBtnAriaLabel);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx_r0.editBtn, " ");
} }
function VdkFormSectionContainerComponent_div_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 10);
i0.ɵɵprojection(1, 1);
i0.ɵɵelementEnd();
} }
function VdkFormSectionContainerComponent_div_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 10);
i0.ɵɵprojection(1, 2);
i0.ɵɵelementEnd();
} }
function VdkFormSectionContainerComponent_span_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r3.saveBtn);
} }
const _c1 = [[["", 8, "section-title"]], [["", 8, "form-section-readonly"]], [["", 8, "form-section-edit"]]];
const _c2 = [".section-title", ".form-section-readonly", ".form-section-edit"];
export var FORM_STATE;
(function (FORM_STATE) {
FORM_STATE[FORM_STATE["VIEW"] = 0] = "VIEW";
FORM_STATE[FORM_STATE["CAN_EDIT"] = 1] = "CAN_EDIT";
FORM_STATE[FORM_STATE["EDIT"] = 2] = "EDIT";
FORM_STATE[FORM_STATE["ERROR"] = 3] = "ERROR";
FORM_STATE[FORM_STATE["SUBMIT"] = 4] = "SUBMIT";
})(FORM_STATE || (FORM_STATE = {}));
export class VdkFormState {
constructor(_state, _sectionsToInclude, _emittingSection) {
this.state = _state;
this.sectionsToInclude = _sectionsToInclude ? _sectionsToInclude : [];
this.emittingSection = _emittingSection;
}
}
export class VdkFormSectionContainerComponent {
constructor(cspForm, cdr) {
this.cspForm = cspForm;
this.cdr = cdr;
this.FORM_STATE = FORM_STATE; //used in the template
this._sectionState = FORM_STATE.CAN_EDIT;
this.ClrLoadingState = ClrLoadingState;
this.stopInitialFocus = true;
this.canEditSection = true; //set to false if the section is readonly
this.editBtn = 'Edit'; //Edit button text
this.cancelBtn = 'Cancel'; //Cancel button text
this.saveBtn = 'Save'; //Save button text
this.editBtnAriaLabel = 'Edit'; //Edit button text
this.cancelBtnAriaLabel = 'Cancel'; //Cancel button text
this.saveBtnAriaLabel = 'Save'; //Save button text
this.formStateChange = new EventEmitter();
this.sectionStateChange = new EventEmitter();
//Events that are used when no formGroup is found in parent component
this.submitForm = new EventEmitter();
this.disableForm = new EventEmitter();
this.enableForm = new EventEmitter();
}
set formState(_formState) {
if (!_formState) {
return;
}
if ((_formState.emittingSection && _formState.emittingSection !== this.sectionName) ||
(!_formState.emittingSection && _formState.sectionsToInclude.length === 0) ||
_formState.sectionsToInclude.some((name) => name === this.sectionName)) {
//on ERROR set EDIT state only on submitted section
//to the rest of sections restore CAN_EDIT state
if (_formState.state === FORM_STATE.ERROR) {
if (this._sectionState === FORM_STATE.SUBMIT) {
this._sectionState = FORM_STATE.EDIT;
//put it in a microtask(make it asynchronous) to not violate detection run
//and avoid error for Expression changed after check
Promise.resolve(null).then(() => {
if (this.cspForm) {
this.cspForm.form.enable();
}
else {
this.enableForm.emit();
}
});
}
else {
this._sectionState = FORM_STATE.CAN_EDIT;
}
}
else {
this.changeSectionState(_formState.state);
}
}
}
showEditBtn() {
return this._sectionState === FORM_STATE.CAN_EDIT && this.canEditSection;
}
showSaveBtn() {
return this._sectionState === FORM_STATE.EDIT;
}
clickEdit() {
this.formStateChange.emit(new VdkFormState(FORM_STATE.CAN_EDIT, [], this.sectionName));
if (this.cspForm) {
this.cspForm.form.enable();
}
else {
this.enableForm.emit();
}
this.changeSectionState(FORM_STATE.EDIT);
}
clickCancel() {
this.changeSectionState(FORM_STATE.CAN_EDIT);
}
// @ts-ignore
clickSave() {
this.formStateChange.emit(new VdkFormState(FORM_STATE.VIEW, [], this.sectionName));
this.changeSectionState(FORM_STATE.SUBMIT);
if (this.cspForm) {
this.cspForm.form.disable();
this.cspForm.onSubmit(this.cspForm.value);
this.cspForm.form.markAsPristine();
// cancel submitting the form since cspForm.onSubmit has been called above.
// solves a specific issue in Firefox where onSubmit was called twice.
return false;
}
else {
this.disableForm.emit();
this.submitForm.emit();
}
}
changeSectionState(_sectionState) {
if (_sectionState !== this._sectionState) {
this.sectionStateChange.emit(new VdkFormState(_sectionState, [], this.sectionName));
this._sectionState = _sectionState;
}
}
focusEdit() {
if (this.editButtonEl && this._sectionState === FORM_STATE.CAN_EDIT && !this.stopInitialFocus) {
this.editButtonEl.nativeElement.focus();
}
if (this.stopInitialFocus) {
this.stopInitialFocus = false;
}
}
}
VdkFormSectionContainerComponent.ɵfac = function VdkFormSectionContainerComponent_Factory(t) { return new (t || VdkFormSectionContainerComponent)(i0.ɵɵdirectiveInject(i1.FormGroupDirective, 9), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
VdkFormSectionContainerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VdkFormSectionContainerComponent, selectors: [["vdk-form-section-container"]], viewQuery: function VdkFormSectionContainerComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.editButtonEl = _t.first);
} }, inputs: { canEditSection: "canEditSection", isSubmitEnabled: "isSubmitEnabled", sectionName: "sectionName", editBtn: "editBtn", cancelBtn: "cancelBtn", saveBtn: "saveBtn", editBtnAriaLabel: "editBtnAriaLabel", cancelBtnAriaLabel: "cancelBtnAriaLabel", saveBtnAriaLabel: "saveBtnAriaLabel", formState: "formState" }, outputs: { formStateChange: "formStateChange", sectionStateChange: "sectionStateChange", submitForm: "submitForm", disableForm: "disableForm", enableForm: "enableForm" }, ngContentSelectors: _c2, decls: 12, vars: 11, consts: [[3, "focused", "animationDone"], [1, "form-section-header"], ["class", "btn btn-link btn-sm csp-edit-button", "type", "button", 3, "click", 4, "ngIf"], ["class", "form-section-content", 4, "ngIf"], [1, "form-section-footer"], ["type", "submit", 1, "btn", "btn-sm", "btn-primary", "csp-save-button", 3, "disabled", "clrLoading", "click"], [4, "ngIf"], ["type", "button", 1, "btn", "btn-sm", "btn-link", "csp-cancel-button", 3, "disabled", "click"], ["type", "button", 1, "btn", "btn-link", "btn-sm", "csp-edit-button", 3, "click"], ["editButton", ""], [1, "form-section-content"]], template: function VdkFormSectionContainerComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵprojectionDef(_c1);
i0.ɵɵelementStart(0, "vdk-form-section", 0);
i0.ɵɵlistener("animationDone", function VdkFormSectionContainerComponent_Template_vdk_form_section_animationDone_0_listener() { return ctx.focusEdit(); });
i0.ɵɵelementStart(1, "div", 1);
i0.ɵɵprojection(2);
i0.ɵɵtemplate(3, VdkFormSectionContainerComponent_button_3_Template, 3, 2, "button", 2);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, VdkFormSectionContainerComponent_div_4_Template, 2, 0, "div", 3);
i0.ɵɵtemplate(5, VdkFormSectionContainerComponent_div_5_Template, 2, 0, "div", 3);
i0.ɵɵelementStart(6, "div", 4)(7, "button", 5);
i0.ɵɵlistener("click", function VdkFormSectionContainerComponent_Template_button_click_7_listener() { return ctx.clickSave(); });
i0.ɵɵtemplate(8, VdkFormSectionContainerComponent_span_8_Template, 2, 1, "span", 6);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(9, "button", 7);
i0.ɵɵlistener("click", function VdkFormSectionContainerComponent_Template_button_click_9_listener() { return ctx.clickCancel(); });
i0.ɵɵelementStart(10, "span");
i0.ɵɵtext(11);
i0.ɵɵelementEnd()()()();
} if (rf & 2) {
i0.ɵɵproperty("focused", ctx._sectionState === ctx.FORM_STATE.EDIT || ctx._sectionState === ctx.FORM_STATE.SUBMIT);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx.showEditBtn());
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx._sectionState === ctx.FORM_STATE.CAN_EDIT || ctx._sectionState === ctx.FORM_STATE.VIEW);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx._sectionState === ctx.FORM_STATE.EDIT || ctx._sectionState === ctx.FORM_STATE.SUBMIT);
i0.ɵɵadvance(2);
i0.ɵɵproperty("disabled", !ctx.isSubmitEnabled || ctx._sectionState === ctx.FORM_STATE.SUBMIT)("clrLoading", ctx._sectionState === ctx.FORM_STATE.SUBMIT ? ctx.ClrLoadingState.LOADING : ctx.ClrLoadingState.DEFAULT);
i0.ɵɵattribute("aria-label", ctx.saveBtnAriaLabel);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.showSaveBtn());
i0.ɵɵadvance(1);
i0.ɵɵproperty("disabled", ctx._sectionState === ctx.FORM_STATE.SUBMIT);
i0.ɵɵattribute("aria-label", ctx.cancelBtnAriaLabel);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx.cancelBtn);
} }, directives: [i2.VdkFormSectionComponent, i3.NgIf, i4.ClrLoadingButton, i4.ClrLoading], styles: ["[_nghost-%COMP%] .section-title{display:inline-block}.csp-edit-button[_ngcontent-%COMP%]{margin:0;cursor:pointer}"], changeDetection: 0 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VdkFormSectionContainerComponent, [{
type: Component,
args: [{ selector: 'vdk-form-section-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<!-- eslint-disable -->\n\n<vdk-form-section\n [focused]=\"_sectionState === FORM_STATE.EDIT || _sectionState === FORM_STATE.SUBMIT\"\n (animationDone)=\"focusEdit()\"\n>\n <div class=\"form-section-header\">\n <ng-content select=\".section-title\"> </ng-content>\n\n <button\n *ngIf=\"showEditBtn()\"\n class=\"btn btn-link btn-sm csp-edit-button\"\n type=\"button\"\n [attr.aria-label]=\"editBtnAriaLabel\"\n #editButton\n (click)=\"clickEdit()\"\n >\n {{editBtn}}\n </button>\n </div>\n\n <div\n class=\"form-section-content\"\n *ngIf=\"_sectionState === FORM_STATE.CAN_EDIT || _sectionState === FORM_STATE.VIEW\"\n >\n <ng-content select=\".form-section-readonly\"> </ng-content>\n </div>\n\n <div\n class=\"form-section-content\"\n *ngIf=\"this._sectionState === FORM_STATE.EDIT || this._sectionState === FORM_STATE.SUBMIT\"\n >\n <ng-content select=\".form-section-edit\"> </ng-content>\n </div>\n\n <div class=\"form-section-footer\">\n <button\n (click)=\"clickSave()\"\n type=\"submit\"\n [attr.aria-label]=\"saveBtnAriaLabel\"\n class=\"btn btn-sm btn-primary csp-save-button\"\n [disabled]=\"!isSubmitEnabled || _sectionState === FORM_STATE.SUBMIT \"\n [clrLoading]=\"_sectionState === FORM_STATE.SUBMIT ? ClrLoadingState.LOADING : ClrLoadingState.DEFAULT\"\n >\n <span *ngIf=\"showSaveBtn()\">{{saveBtn}}</span>\n </button>\n <button\n class=\"btn btn-sm btn-link csp-cancel-button\"\n type=\"button\"\n [attr.aria-label]=\"cancelBtnAriaLabel\"\n (click)=\"clickCancel()\"\n [disabled]=\"_sectionState === FORM_STATE.SUBMIT\"\n >\n <span>{{cancelBtn}}</span>\n </button>\n </div>\n</vdk-form-section>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */:host ::ng-deep .section-title{display:inline-block}.csp-edit-button{margin:0;cursor:pointer}\n"] }]
}], function () { return [{ type: i1.FormGroupDirective, decorators: [{
type: Optional
}, {
type: Host
}] }, { type: i0.ChangeDetectorRef }]; }, { canEditSection: [{
type: Input
}], isSubmitEnabled: [{
type: Input
}], sectionName: [{
type: Input
}], editBtn: [{
type: Input
}], cancelBtn: [{
type: Input
}], saveBtn: [{
type: Input
}], editBtnAriaLabel: [{
type: Input
}], cancelBtnAriaLabel: [{
type: Input
}], saveBtnAriaLabel: [{
type: Input
}], formState: [{
type: Input,
args: ['formState']
}], formStateChange: [{
type: Output
}], sectionStateChange: [{
type: Output
}], submitForm: [{
type: Output
}], disableForm: [{
type: Output
}], enableForm: [{
type: Output
}], editButtonEl: [{
type: ViewChild,
args: ['editButton']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWN0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21tb25zL25neC1jb21wb25lbnRzL2Zvcm0tc2VjdGlvbi1jb250YWluZXIvZm9ybS1zZWN0aW9uLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21tb25zL25neC1jb21wb25lbnRzL2Zvcm0tc2VjdGlvbi1jb250YWluZXIvZm9ybS1zZWN0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxvQkFBb0I7QUFFcEIsT0FBTyxFQUNILFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUNaLEtBQUssRUFDTCxJQUFJLEVBQ0osUUFBUSxFQUNSLHVCQUF1QixFQUV2QixTQUFTLEVBRVosTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7O0lDTnZDLG9DQU9DO0lBREcsZ0xBQVMsa0JBQVcsSUFBQztJQUVyQixZQUNKO0lBQUEsaUJBQVM7OztJQUxMLHFEQUFvQztJQUlwQyxlQUNKO0lBREksK0NBQ0o7OztJQUdKLCtCQUdDO0lBQ0cscUJBQTBEO0lBQzlELGlCQUFNOzs7SUFFTiwrQkFHQztJQUNHLHFCQUFzRDtJQUMxRCxpQkFBTTs7O0lBV0UsNEJBQTRCO0lBQUEsWUFBVztJQUFBLGlCQUFPOzs7SUFBbEIsZUFBVztJQUFYLG9DQUFXOzs7O0FEM0JuRCxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ2xCLDJDQUFJLENBQUE7SUFDSixtREFBUSxDQUFBO0lBQ1IsMkNBQUksQ0FBQTtJQUNKLDZDQUFLLENBQUE7SUFDTCwrQ0FB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KiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgSG9zdCxcbiAgICBPcHRpb25hbCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENsckxvYWRpbmdTdGF0ZSB9IGZyb20gJ0BjbHIvYW5ndWxhcic7XG5cbmV4cG9ydCBlbnVtIEZPUk1fU1RBVEUge1xuICAgIFZJRVcsXG4gICAgQ0FOX0VESVQsXG4gICAgRURJVCxcbiAgICBFUlJPUixcbiAgICBTVUJNSVRcbn1cbmV4cG9ydCBjbGFzcyBWZGtGb3JtU3RhdGUge1xuICAgIHN0YXRlOiBGT1JNX1NUQVRFO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwuIFRoZSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lIGlkZW50aWZpZXIgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzdGF0ZSBjaGFuZ2UuXG4gICAgICovXG4gICAgZW1pdHRpbmdTZWN0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbC5cbiAgICAgKiBBbGwgdGhlIHNlY3Rpb25zIGluIHRoZSBhcnJheSB3aWxsIGNoYW5nZSBpdHMgc3RhdGUuXG4gICAgICogQWxsIHRoZSBvdGhlcnMgd2lsbCBiZSBleGNsdWRlZCBpZiB0aGlzIGFycmF5IGlzIG5vdCBlbXB0eS5cbiAgICAgKi9cbiAgICBzZWN0aW9uc1RvSW5jbHVkZTogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3Rvcihfc3RhdGU6IEZPUk1fU1RBVEUsIF9zZWN0aW9uc1RvSW5jbHVkZT86IHN0cmluZ1tdLCBfZW1pdHRpbmdTZWN0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBfc3RhdGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnNUb0luY2x1ZGUgPSBfc2VjdGlvbnNUb0luY2x1ZGUgPyBfc2VjdGlvbnNUb0luY2x1ZGUgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0dGluZ1NlY3Rpb24gPSBfZW1pdHRpbmdTZWN0aW9uO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd2ZGstZm9ybS1zZWN0aW9uLWNvbnRhaW5lcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tc2VjdGlvbi1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydmb3JtLXNlY3Rpb24tY29udGFpbmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVmRrRm9ybVNlY3Rpb25Db250YWluZXJDb21wb25lbnQge1xuICAgIEZPUk1fU1RBVEUgPSBGT1JNX1NUQVRFOyAvL3VzZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgX3NlY3Rpb25TdGF0ZTogRk9STV9TVEFURSA9IEZPUk1fU1RBVEUuQ0FOX0VESVQ7XG4gICAgQ2xyTG9hZGluZ1N0YXRlID0gQ2xyTG9hZGluZ1N0YXRlO1xuICAgIHN0b3BJbml0aWFsRm9jdXMgPSB0cnVlO1xuXG4gICAgQElucHV0KCkgY2FuRWRpdFNlY3Rpb24gPSB0cnVlOyAvL3NldCB0byBmYWxzZSBpZiB0aGUgc2VjdGlvbiBpcyByZWFkb25seVxuICAgIEBJbnB1dCgpIGlzU3VibWl0RW5hYmxlZDogYm9vbGVhbjsgLy9jb250cm9scyB0aGUgU3VibWl0KFNhdmUpIGJ1dHRvbiBzdGF0ZVxuICAgIEBJbnB1dCgpIHNlY3Rpb25OYW1lOiBzdHJpbmc7IC8vdW5pcXVlIHNlY3Rpb24gaWRlbnRpZmllclxuICAgIEBJbnB1dCgpIGVkaXRCdG4gPSAnRWRpdCc7IC8vRWRpdCBidXR0b24gdGV4dFxuICAgIEBJbnB1dCgpIGNhbmNlbEJ0biA9ICdDYW5jZWwnOyAvL0NhbmNlbCBidXR0b24gdGV4dFxuICAgIEBJbnB1dCgpIHNhdmVCdG4gPSAnU2F2ZSc7IC8vU2F2ZSBidXR0b24gdGV4dFxuICAgIEBJbnB1dCgpIGVkaXRCdG5BcmlhTGFiZWwgPSAnRWRpdCc7IC8vRWRpdCBidXR0b24gdGV4dFxuICAgIEBJbnB1dCgpIGNhbmNlbEJ0bkFyaWFMYWJlbCA9ICdDYW5jZWwnOyAvL0NhbmNlbCBidXR0b24gdGV4dFxuICAgIEBJbnB1dCgpIHNhdmVCdG5BcmlhTGFiZWwgPSAnU2F2ZSc7IC8vU2F2ZSBidXR0b24gdGV4dFxuXG4gICAgQElucHV0KCdmb3JtU3RhdGUnKSBzZXQgZm9ybVN0YXRlKF9mb3JtU3RhdGU6IFZka0Zvcm1TdGF0ZSkge1xuICAgICAgICBpZiAoIV9mb3JtU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChfZm9ybVN0YXRlLmVtaXR0aW5nU2VjdGlvbiAmJiBfZm9ybVN0YXRlLmVtaXR0aW5nU2VjdGlvbiAhPT0gdGhpcy5zZWN0aW9uTmFtZSkgfHxcbiAgICAgICAgICAgICghX2Zvcm1TdGF0ZS5lbWl0dGluZ1NlY3Rpb24gJiYgX2Zvcm1TdGF0ZS5zZWN0aW9uc1RvSW5jbHVkZS5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgICBfZm9ybVN0YXRlLnNlY3Rpb25zVG9JbmNsdWRlLnNvbWUoKG5hbWUpID0+IG5hbWUgPT09IHRoaXMuc2VjdGlvbk5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy9vbiBFUlJPUiBzZXQgRURJVCBzdGF0ZSBvbmx5IG9uIHN1Ym1pdHRlZCBzZWN0aW9uXG4gICAgICAgICAgICAvL3RvIHRoZSByZXN0IG9mIHNlY3Rpb25zIHJlc3RvcmUgQ0FOX0VESVQgc3RhdGVcbiAgICAgICAgICAgIGlmIChfZm9ybVN0YXRlLnN0YXRlID09PSBGT1JNX1NUQVRFLkVSUk9SKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlY3Rpb25TdGF0ZSA9PT0gRk9STV9TVEFURS5TVUJNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VjdGlvblN0YXRlID0gRk9STV9TVEFURS5FRElUO1xuICAgICAgICAgICAgICAgICAgICAvL3B1dCBpdCBpbiBhIG1pY3JvdGFzayhtYWtlIGl0IGFzeW5jaHJvbm91cykgdG8gbm90IHZpb2xhdGUgZGV0ZWN0aW9uIHJ1blxuICAgICAgICAgICAgICAgICAgICAvL2FuZCBhdm9pZCBlcnJvciBmb3IgRXhwcmVzc2lvbiBjaGFuZ2VkIGFmdGVyIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNzcEZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNzcEZvcm0uZm9ybS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVGb3JtLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VjdGlvblN0YXRlID0gRk9STV9TVEFURS5DQU5fRURJVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VjdGlvblN0YXRlKF9mb3JtU3RhdGUuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGZvcm1TdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgc2VjdGlvblN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLy9FdmVudHMgdGhhdCBhcmUgdXNlZCB3aGVuIG5vIGZvcm1Hcm91cCBpcyBmb3VuZCBpbiBwYXJlbnQgY29tcG9uZW50XG4gICAgQE91dHB1dCgpIHN1Ym1pdEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGRpc2FibGVGb3JtID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBlbmFibGVGb3JtID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnZWRpdEJ1dHRvbicpIGVkaXRCdXR0b25FbDogRWxlbWVudFJlZjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgY3NwRm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHt9XG5cbiAgICBzaG93RWRpdEJ0bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25TdGF0ZSA9PT0gRk9STV9TVEFURS5DQU5fRURJVCAmJiB0aGlzLmNhbkVkaXRTZWN0aW9uO1xuICAgIH1cblxuICAgIHNob3dTYXZlQnRuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VjdGlvblN0YXRlID09PSBGT1JNX1NUQVRFLkVESVQ7XG4gICAgfVxuXG4gICAgY2xpY2tFZGl0KCkge1xuICAgICAgICB0aGlzLmZvcm1TdGF0ZUNoYW5nZS5lbWl0KG5ldyBWZGtGb3JtU3RhdGUoRk9STV9TVEFURS5DQU5fRURJVCwgW10sIHRoaXMuc2VjdGlvbk5hbWUpKTtcbiAgICAgICAgaWYgKHRoaXMuY3NwRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5jc3BGb3JtLmZvcm0uZW5hYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUZvcm0uZW1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlU2VjdGlvblN0YXRlKEZPUk1fU1RBVEUuRURJVCk7XG4gICAgfVxuXG4gICAgY2xpY2tDYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlU2VjdGlvblN0YXRlKEZPUk1fU1RBVEUuQ0FOX0VESVQpO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjbGlja1NhdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHRoaXMuZm9ybVN0YXRlQ2hhbmdlLmVtaXQobmV3IFZka0Zvcm1TdGF0ZShGT1JNX1NUQVRFLlZJRVcsIFtdLCB0aGlzLnNlY3Rpb25OYW1lKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlU2VjdGlvblN0YXRlKEZPUk1fU1RBVEUuU1VCTUlUKTtcbiAgICAgICAgaWYgKHRoaXMuY3NwRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5jc3BGb3JtLmZvcm0uZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5jc3BGb3JtLm9uU3VibWl0KHRoaXMuY3NwRm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNzcEZvcm0uZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgLy8gY2FuY2VsIHN1Ym1pdHRpbmcgdGhlIGZvcm0gc2luY2UgY3NwRm9ybS5vblN1Ym1pdCBoYXMgYmVlbiBjYWxsZWQgYWJvdmUuXG4gICAgICAgICAgICAvLyBzb2x2ZXMgYSBzcGVjaWZpYyBpc3N1ZSBpbiBGaXJlZm94IHdoZXJlIG9uU3VibWl0IHdhcyBjYWxsZWQgdHdpY2UuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVGb3JtLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybS5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGFuZ2VTZWN0aW9uU3RhdGUoX3NlY3Rpb25TdGF0ZTogRk9STV9TVEFURSkge1xuICAgICAgICBpZiAoX3NlY3Rpb25TdGF0ZSAhPT0gdGhpcy5fc2VjdGlvblN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25TdGF0ZUNoYW5nZS5lbWl0KG5ldyBWZGtGb3JtU3RhdGUoX3NlY3Rpb25TdGF0ZSwgW10sIHRoaXMuc2VjdGlvbk5hbWUpKTtcbiAgICAgICAgICAgIHRoaXMuX3NlY3Rpb25TdGF0ZSA9IF9zZWN0aW9uU3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1c0VkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRCdXR0b25FbCAmJiB0aGlzLl9zZWN0aW9uU3RhdGUgPT09IEZPUk1fU1RBVEUuQ0FOX0VESVQgJiYgIXRoaXMuc3RvcEluaXRpYWxGb2N1cykge1xuICAgICAgICAgICAgdGhpcy5lZGl0QnV0dG9uRWwubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0b3BJbml0aWFsRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcEluaXRpYWxGb2N1cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPCEtLVxuICAgfiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gICB+IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gIC0tPlxuXG48IS0tIGVzbGludC1kaXNhYmxlIC0tPlxuXG48dmRrLWZvcm0tc2VjdGlvblxuICAgIFtmb2N1c2VkXT1cIl9zZWN0aW9uU3RhdGUgPT09IEZPUk1fU1RBVEUuRURJVCB8fCBfc2VjdGlvblN0YXRlID09PSBGT1JNX1NUQVRFLlNVQk1JVFwiXG4gICAgKGFuaW1hdGlvbkRvbmUpPVwiZm9jdXNFZGl0KClcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5zZWN0aW9uLXRpdGxlXCI+IDwvbmctY29udGVudD5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dFZGl0QnRuKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIGNzcC1lZGl0LWJ1dHRvblwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZWRpdEJ0bkFyaWFMYWJlbFwiXG4gICAgICAgICAgICAjZWRpdEJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrRWRpdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3tlZGl0QnRufX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1zZWN0aW9uLWNvbnRlbnRcIlxuICAgICAgICAqbmdJZj1cIl9zZWN0aW9uU3RhdGUgPT09IEZPUk1fU1RBVEUuQ0FOX0VESVQgfHwgX3NlY3Rpb25TdGF0ZSA9PT0gRk9STV9TVEFURS5WSUVXXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5mb3JtLXNlY3Rpb24tcmVhZG9ubHlcIj4gPC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZvcm0tc2VjdGlvbi1jb250ZW50XCJcbiAgICAgICAgKm5nSWY9XCJ0aGlzLl9zZWN0aW9uU3RhdGUgPT09IEZPUk1fU1RBVEUuRURJVCB8fCB0aGlzLl9zZWN0aW9uU3RhdGUgPT09IEZPUk1fU1RBVEUuU1VCTUlUXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5mb3JtLXNlY3Rpb24tZWRpdFwiPiA8L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tTYXZlKClcIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNhdmVCdG5BcmlhTGFiZWxcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IGNzcC1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzU3VibWl0RW5hYmxlZCB8fCBfc2VjdGlvblN0YXRlID09PSBGT1JNX1NUQVRFLlNVQk1JVCBcIlxuICAgICAgICAgICAgW2NsckxvYWRpbmddPVwiX3NlY3Rpb25TdGF0ZSA9PT0gRk9STV9TVEFURS5TVUJNSVQgPyBDbHJMb2FkaW5nU3RhdGUuTE9BRElORyA6IENsckxvYWRpbmdTdGF0ZS5ERUZBVUxUXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93U2F2ZUJ0bigpXCI+e3tzYXZlQnRufX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmsgY3NwLWNhbmNlbC1idXR0b25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbmNlbEJ0bkFyaWFMYWJlbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tDYW5jZWwoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiX3NlY3Rpb25TdGF0ZSA9PT0gRk9STV9TVEFURS5TVUJNSVRcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3Bhbj57e2NhbmNlbEJ0bn19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvdmRrLWZvcm0tc2VjdGlvbj5cbiJdfQ==