@cqa-lib/cqa-ui 1.1.542 → 1.1.543

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,122 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "../custom-input/custom-input.component";
5
+ import * as i3 from "../button/button.component";
6
+ import * as i4 from "@angular/common";
7
+ /**
8
+ * Generic single-input prompt modal. Used wherever a flow needs to ask the
9
+ * user for a single name (or short text) and confirm with a primary button.
10
+ *
11
+ * Examples: New Folder, Clone Suite, Rename, New Plan, etc.
12
+ *
13
+ * All copy is configurable through Inputs — see `title`, `description`,
14
+ * `label`, `placeholder`, `submitButtonText`, `cancelButtonText`. Defaults
15
+ * preserve the legacy "New Folder" wording for callers that haven't migrated.
16
+ */
17
+ export class NamePromptModalComponent {
18
+ constructor(cdr) {
19
+ this.cdr = cdr;
20
+ this.isOpen = false;
21
+ this.title = 'New Folder';
22
+ this.description = 'Rename any time by double-clicking';
23
+ this.label = 'Folder name';
24
+ this.placeholder = 'e.g. Checkout Flow, User Auth, Payment Tests';
25
+ /** Submit (primary) button text. Lets consumers reuse this modal for
26
+ * "Create folder", "Clone Suite", "Rename", etc. */
27
+ this.submitButtonText = 'Create folder';
28
+ /** Cancel (secondary) button text. Most consumers can leave the default. */
29
+ this.cancelButtonText = 'Cancel';
30
+ /** When true, locks the modal: spinner on the submit button, all dismiss
31
+ * paths (cancel, close X, backdrop, ESC) become no-ops, and submit() bails
32
+ * out so a fast Enter press can't double-fire while the parent is mid-API. */
33
+ this.isSubmitting = false;
34
+ this._name = '';
35
+ this.nameChange = new EventEmitter();
36
+ this.submitted = new EventEmitter();
37
+ this.cancelled = new EventEmitter();
38
+ this.nameTouched = false;
39
+ }
40
+ set name(value) {
41
+ this._name = value || '';
42
+ this.nameTouched = false;
43
+ this.cdr.markForCheck();
44
+ }
45
+ get name() {
46
+ return this._name;
47
+ }
48
+ onNameChange(value) {
49
+ this._name = value;
50
+ this.nameTouched = true;
51
+ this.nameChange.emit(value);
52
+ this.cdr.markForCheck();
53
+ }
54
+ get nameErrors() {
55
+ if (!this.nameTouched)
56
+ return [];
57
+ const trimmed = (this._name || '').trim();
58
+ if (!trimmed)
59
+ return [`${this.label} is required`];
60
+ return [];
61
+ }
62
+ get isValid() {
63
+ return (this._name || '').trim().length > 0;
64
+ }
65
+ submit() {
66
+ if (!this.isValid || this.isSubmitting)
67
+ return;
68
+ this.submitted.emit({ name: this._name.trim() });
69
+ }
70
+ onCancel() {
71
+ if (this.isSubmitting)
72
+ return;
73
+ this.cancelled.emit();
74
+ }
75
+ onClose() {
76
+ if (this.isSubmitting)
77
+ return;
78
+ this.cancelled.emit();
79
+ }
80
+ onBackdropClick() {
81
+ if (this.isSubmitting)
82
+ return;
83
+ this.cancelled.emit();
84
+ }
85
+ onEscape(event) {
86
+ event.stopPropagation();
87
+ if (this.isSubmitting)
88
+ return;
89
+ this.cancelled.emit();
90
+ }
91
+ }
92
+ NamePromptModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NamePromptModalComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
93
+ NamePromptModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NamePromptModalComponent, selector: "cqa-name-prompt-modal", inputs: { isOpen: "isOpen", title: "title", description: "description", label: "label", placeholder: "placeholder", submitButtonText: "submitButtonText", cancelButtonText: "cancelButtonText", isSubmitting: "isSubmitting", name: "name" }, outputs: { nameChange: "nameChange", submitted: "submitted", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n id=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 1000;\">\n <div class=\"cqa-fixed cqa-inset-0 cqa-bg-black/40\"\n (click)=\"onBackdropClick()\"></div>\n\n <div class=\"cqa-fixed cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-pointer-events-none\">\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[480px] cqa-bg-white cqa-rounded-2xl cqa-shadow-md cqa-border cqa-border-border-default cqa-pointer-events-auto\"\n (keydown.escape)=\"onEscape($event)\"\n tabindex=\"-1\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-p-6 cqa-pb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-title cqa-m-0\">{{ title }}</h2>\n <p *ngIf=\"description\"\n class=\"cqa-text-sm cqa-text-description cqa-m-0\">\n {{ description }}\n </p>\n </div>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-bg-transparent cqa-border-0 cqa-text-description hover:cqa-text-title\"\n [class.cqa-cursor-pointer]=\"!isSubmitting\"\n [class.cqa-cursor-not-allowed]=\"isSubmitting\"\n [class.cqa-opacity-50]=\"isSubmitting\"\n [disabled]=\"isSubmitting\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-text-[20px] cqa-leading-5 cqa-h-5 cqa-w-5\">close</mat-icon>\n </button>\n </div>\n\n <div class=\"cqa-px-6 cqa-pb-5\">\n <cqa-custom-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrors\"\n (valueChange)=\"onNameChange($event)\"\n (enterPressed)=\"submit()\">\n </cqa-custom-input>\n </div>\n\n <div class=\"cqa-border-t cqa-border-border-default cqa-px-6 cqa-py-4 cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <cqa-button variant=\"outlined\"\n [text]=\"cancelButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button variant=\"filled\"\n [text]=\"submitButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [loading]=\"isSubmitting\"\n [disabled]=\"!isValid || isSubmitting\"\n (clicked)=\"submit()\">\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NamePromptModalComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'cqa-name-prompt-modal', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n id=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 1000;\">\n <div class=\"cqa-fixed cqa-inset-0 cqa-bg-black/40\"\n (click)=\"onBackdropClick()\"></div>\n\n <div class=\"cqa-fixed cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-pointer-events-none\">\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[480px] cqa-bg-white cqa-rounded-2xl cqa-shadow-md cqa-border cqa-border-border-default cqa-pointer-events-auto\"\n (keydown.escape)=\"onEscape($event)\"\n tabindex=\"-1\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-p-6 cqa-pb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-title cqa-m-0\">{{ title }}</h2>\n <p *ngIf=\"description\"\n class=\"cqa-text-sm cqa-text-description cqa-m-0\">\n {{ description }}\n </p>\n </div>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-bg-transparent cqa-border-0 cqa-text-description hover:cqa-text-title\"\n [class.cqa-cursor-pointer]=\"!isSubmitting\"\n [class.cqa-cursor-not-allowed]=\"isSubmitting\"\n [class.cqa-opacity-50]=\"isSubmitting\"\n [disabled]=\"isSubmitting\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-text-[20px] cqa-leading-5 cqa-h-5 cqa-w-5\">close</mat-icon>\n </button>\n </div>\n\n <div class=\"cqa-px-6 cqa-pb-5\">\n <cqa-custom-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrors\"\n (valueChange)=\"onNameChange($event)\"\n (enterPressed)=\"submit()\">\n </cqa-custom-input>\n </div>\n\n <div class=\"cqa-border-t cqa-border-border-default cqa-px-6 cqa-py-4 cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <cqa-button variant=\"outlined\"\n [text]=\"cancelButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button variant=\"filled\"\n [text]=\"submitButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [loading]=\"isSubmitting\"\n [disabled]=\"!isValid || isSubmitting\"\n (clicked)=\"submit()\">\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n" }]
97
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { isOpen: [{
98
+ type: Input
99
+ }], title: [{
100
+ type: Input
101
+ }], description: [{
102
+ type: Input
103
+ }], label: [{
104
+ type: Input
105
+ }], placeholder: [{
106
+ type: Input
107
+ }], submitButtonText: [{
108
+ type: Input
109
+ }], cancelButtonText: [{
110
+ type: Input
111
+ }], isSubmitting: [{
112
+ type: Input
113
+ }], name: [{
114
+ type: Input
115
+ }], nameChange: [{
116
+ type: Output
117
+ }], submitted: [{
118
+ type: Output
119
+ }], cancelled: [{
120
+ type: Output
121
+ }] } });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wcm9tcHQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kaWFsb2dzL25hbWUtcHJvbXB0LW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9ncy9uYW1lLXByb21wdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBTW5IOzs7Ozs7Ozs7R0FTRztBQU9ILE1BQU0sT0FBTyx3QkFBd0I7SUFnQ25DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBL0JqQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsVUFBSyxHQUFHLFlBQVksQ0FBQztRQUNyQixnQkFBVyxHQUFrQixvQ0FBb0MsQ0FBQztRQUNsRSxVQUFLLEdBQUcsYUFBYSxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsOENBQThDLENBQUM7UUFDdEU7NERBQ29EO1FBQzNDLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUM1Qyw0RUFBNEU7UUFDbkUscUJBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQ3JDOztzRkFFOEU7UUFDckUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFdEIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQVVULGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUN4RCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV2QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztJQUVpQixDQUFDO0lBZjlDLElBQWEsSUFBSSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBVUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7UUFDbkQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7cUhBNUVVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDJhQ3RCckMsc3ZGQStEQTsyRkR6Q2Esd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHVCQUF1QixtQkFFaEIsdUJBQXVCLENBQUMsTUFBTSxRQUN6QyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7d0dBR3JCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFTSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBOYW1lUHJvbXB0U3VibWl0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZW5lcmljIHNpbmdsZS1pbnB1dCBwcm9tcHQgbW9kYWwuIFVzZWQgd2hlcmV2ZXIgYSBmbG93IG5lZWRzIHRvIGFzayB0aGVcbiAqIHVzZXIgZm9yIGEgc2luZ2xlIG5hbWUgKG9yIHNob3J0IHRleHQpIGFuZCBjb25maXJtIHdpdGggYSBwcmltYXJ5IGJ1dHRvbi5cbiAqXG4gKiBFeGFtcGxlczogTmV3IEZvbGRlciwgQ2xvbmUgU3VpdGUsIFJlbmFtZSwgTmV3IFBsYW4sIGV0Yy5cbiAqXG4gKiBBbGwgY29weSBpcyBjb25maWd1cmFibGUgdGhyb3VnaCBJbnB1dHMg4oCUIHNlZSBgdGl0bGVgLCBgZGVzY3JpcHRpb25gLFxuICogYGxhYmVsYCwgYHBsYWNlaG9sZGVyYCwgYHN1Ym1pdEJ1dHRvblRleHRgLCBgY2FuY2VsQnV0dG9uVGV4dGAuIERlZmF1bHRzXG4gKiBwcmVzZXJ2ZSB0aGUgbGVnYWN5IFwiTmV3IEZvbGRlclwiIHdvcmRpbmcgZm9yIGNhbGxlcnMgdGhhdCBoYXZlbid0IG1pZ3JhdGVkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbmFtZS1wcm9tcHQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmFtZS1wcm9tcHQtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBOYW1lUHJvbXB0TW9kYWxDb21wb25lbnQge1xuICBASW5wdXQoKSBpc09wZW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGUgPSAnTmV3IEZvbGRlcic7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gJ1JlbmFtZSBhbnkgdGltZSBieSBkb3VibGUtY2xpY2tpbmcnO1xuICBASW5wdXQoKSBsYWJlbCA9ICdGb2xkZXIgbmFtZSc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ2UuZy4gQ2hlY2tvdXQgRmxvdywgVXNlciBBdXRoLCBQYXltZW50IFRlc3RzJztcbiAgLyoqIFN1Ym1pdCAocHJpbWFyeSkgYnV0dG9uIHRleHQuIExldHMgY29uc3VtZXJzIHJldXNlIHRoaXMgbW9kYWwgZm9yXG4gICAqIFwiQ3JlYXRlIGZvbGRlclwiLCBcIkNsb25lIFN1aXRlXCIsIFwiUmVuYW1lXCIsIGV0Yy4gKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uVGV4dCA9ICdDcmVhdGUgZm9sZGVyJztcbiAgLyoqIENhbmNlbCAoc2Vjb25kYXJ5KSBidXR0b24gdGV4dC4gTW9zdCBjb25zdW1lcnMgY2FuIGxlYXZlIHRoZSBkZWZhdWx0LiAqL1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25UZXh0ID0gJ0NhbmNlbCc7XG4gIC8qKiBXaGVuIHRydWUsIGxvY2tzIHRoZSBtb2RhbDogc3Bpbm5lciBvbiB0aGUgc3VibWl0IGJ1dHRvbiwgYWxsIGRpc21pc3NcbiAgICogcGF0aHMgKGNhbmNlbCwgY2xvc2UgWCwgYmFja2Ryb3AsIEVTQykgYmVjb21lIG5vLW9wcywgYW5kIHN1Ym1pdCgpIGJhaWxzXG4gICAqIG91dCBzbyBhIGZhc3QgRW50ZXIgcHJlc3MgY2FuJ3QgZG91YmxlLWZpcmUgd2hpbGUgdGhlIHBhcmVudCBpcyBtaWQtQVBJLiAqL1xuICBASW5wdXQoKSBpc1N1Ym1pdHRpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIF9uYW1lID0gJyc7XG4gIEBJbnB1dCgpIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWUgfHwgJyc7XG4gICAgdGhpcy5uYW1lVG91Y2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBAT3V0cHV0KCkgbmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3VibWl0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOYW1lUHJvbXB0U3VibWl0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIG5hbWVUb3VjaGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uTmFtZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIHRoaXMubmFtZVRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMubmFtZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBuYW1lRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMubmFtZVRvdWNoZWQpIHJldHVybiBbXTtcbiAgICBjb25zdCB0cmltbWVkID0gKHRoaXMuX25hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBbYCR7dGhpcy5sYWJlbH0gaXMgcmVxdWlyZWRgXTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX25hbWUgfHwgJycpLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8IHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5zdWJtaXR0ZWQuZW1pdCh7IG5hbWU6IHRoaXMuX25hbWUudHJpbSgpIH0pO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcpIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25Fc2NhcGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaXNPcGVuXCJcbiAgICAgaWQ9XCJjcWEtdWktcm9vdFwiXG4gICAgIHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyBpbnNldDogMDsgei1pbmRleDogMTAwMDtcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1maXhlZCBjcWEtaW5zZXQtMCBjcWEtYmctYmxhY2svNDBcIlxuICAgICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctZnVsbCBjcWEtbWF4LXctWzQ4MHB4XSBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtMnhsIGNxYS1zaGFkb3ctbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWJvcmRlci1kZWZhdWx0IGNxYS1wb2ludGVyLWV2ZW50cy1hdXRvXCJcbiAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJvbkVzY2FwZSgkZXZlbnQpXCJcbiAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcC02IGNxYS1wYi00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtdGl0bGUgY3FhLW0tMFwiPnt7IHRpdGxlIH19PC9oMj5cbiAgICAgICAgICA8cCAqbmdJZj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWRlc2NyaXB0aW9uIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIHt7IGRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1oLTYgY3FhLXctNiBjcWEtcm91bmRlZCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci0wIGNxYS10ZXh0LWRlc2NyaXB0aW9uIGhvdmVyOmNxYS10ZXh0LXRpdGxlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFpc1N1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTUwXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzIwcHhdIGNxYS1sZWFkaW5nLTUgY3FhLWgtNSBjcWEtdy01XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTVcIj5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtlcnJvcnNdPVwibmFtZUVycm9yc1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZW50ZXJQcmVzc2VkKT1cInN1Ym1pdCgpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlci10IGNxYS1ib3JkZXItYm9yZGVyLWRlZmF1bHQgY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjYW5jZWxCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwic3VibWl0QnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzdWJtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==