@valtimo/dossier-management 12.10.2 → 12.11.0

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.
Files changed (29) hide show
  1. package/esm2022/lib/components/dossier-management-case-tags/dossier-management-case-tag-modal/dossier-management-case-tag-modal.component.mjs +263 -0
  2. package/esm2022/lib/components/dossier-management-case-tags/dossier-management-case-tags.component.mjs +149 -0
  3. package/esm2022/lib/components/dossier-management-detail/dossier-management-detail.component.mjs +4 -3
  4. package/esm2022/lib/components/dossier-management-detail-container/dossier-management-detail-container.component.mjs +5 -4
  5. package/esm2022/lib/components/dossier-management-external-start-form/dossier-management-external-start-form.component.mjs +127 -0
  6. package/esm2022/lib/components/dossier-management-list-columns/dossier-management-list-columns.component.mjs +33 -13
  7. package/esm2022/lib/components/dossier-management-search-fields/dossier-management-search-fields.component.mjs +3 -3
  8. package/esm2022/lib/components/dossier-management-statuses/dossier-management-status-modal/dossier-management-status-modal.component.mjs +8 -20
  9. package/esm2022/lib/components/dossier-management-tabs/dossier-management-add-tab-modal/dossier-management-add-tab-modal.component.mjs +3 -3
  10. package/esm2022/lib/components/dossier-management-tabs/tab-form/tab-form.component.mjs +3 -3
  11. package/esm2022/lib/dossier-management.module.mjs +23 -5
  12. package/esm2022/lib/models/tab.enum.mjs +2 -1
  13. package/fesm2022/valtimo-dossier-management.mjs +571 -47
  14. package/fesm2022/valtimo-dossier-management.mjs.map +1 -1
  15. package/lib/components/dossier-management-case-tags/dossier-management-case-tag-modal/dossier-management-case-tag-modal.component.d.ts +75 -0
  16. package/lib/components/dossier-management-case-tags/dossier-management-case-tag-modal/dossier-management-case-tag-modal.component.d.ts.map +1 -0
  17. package/lib/components/dossier-management-case-tags/dossier-management-case-tags.component.d.ts +48 -0
  18. package/lib/components/dossier-management-case-tags/dossier-management-case-tags.component.d.ts.map +1 -0
  19. package/lib/components/dossier-management-external-start-form/dossier-management-external-start-form.component.d.ts +37 -0
  20. package/lib/components/dossier-management-external-start-form/dossier-management-external-start-form.component.d.ts.map +1 -0
  21. package/lib/components/dossier-management-list-columns/dossier-management-list-columns.component.d.ts +3 -0
  22. package/lib/components/dossier-management-list-columns/dossier-management-list-columns.component.d.ts.map +1 -1
  23. package/lib/components/dossier-management-statuses/dossier-management-status-modal/dossier-management-status-modal.component.d.ts.map +1 -1
  24. package/lib/components/dossier-management-statuses/dossier-management-statuses.component.d.ts +1 -1
  25. package/lib/dossier-management.module.d.ts +13 -10
  26. package/lib/dossier-management.module.d.ts.map +1 -1
  27. package/lib/models/tab.enum.d.ts +2 -1
  28. package/lib/models/tab.enum.d.ts.map +1 -1
  29. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ /*
2
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
17
+ import { BehaviorSubject, combineLatest, map, Subscription, switchMap, take } from 'rxjs';
18
+ import { CARBON_CONSTANTS } from '@valtimo/components';
19
+ import { FormControl, Validators, } from '@angular/forms';
20
+ import { CaseTagsUtils } from '@valtimo/document';
21
+ import { Edit16 } from '@carbon/icons';
22
+ import { TagColor } from '@valtimo/config';
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "@angular/forms";
25
+ import * as i2 from "carbon-components-angular";
26
+ import * as i3 from "@ngx-translate/core";
27
+ import * as i4 from "@valtimo/document";
28
+ import * as i5 from "@angular/common";
29
+ import * as i6 from "@valtimo/components";
30
+ export class DossierManagementModalComponent {
31
+ set type(value) {
32
+ this._type$.next(value);
33
+ if (value === 'closed') {
34
+ setTimeout(() => {
35
+ this._typeAnimationDelay$.next(value);
36
+ }, CARBON_CONSTANTS.modalAnimationMs);
37
+ }
38
+ else {
39
+ this._typeAnimationDelay$.next(value);
40
+ }
41
+ }
42
+ set prefill(value) {
43
+ this._prefillCaseTag.next(value);
44
+ }
45
+ get key() {
46
+ return this.caseTagFormGroup?.get('key') ?? new FormControl('');
47
+ }
48
+ get title() {
49
+ return this.caseTagFormGroup?.get('title') ?? new FormControl('');
50
+ }
51
+ get color() {
52
+ return this.caseTagFormGroup?.get('color') ?? new FormControl('');
53
+ }
54
+ get invalid() {
55
+ return !!this.caseTagFormGroup?.invalid;
56
+ }
57
+ get pristine() {
58
+ return !!this.caseTagFormGroup?.pristine;
59
+ }
60
+ constructor(fb, iconService, translateService, caseTagService) {
61
+ this.fb = fb;
62
+ this.iconService = iconService;
63
+ this.translateService = translateService;
64
+ this.caseTagService = caseTagService;
65
+ this.closeModalEvent = new EventEmitter();
66
+ this.isCaseTag = false;
67
+ this._type$ = new BehaviorSubject(undefined);
68
+ this._typeAnimationDelay$ = new BehaviorSubject(undefined);
69
+ this._prefillCaseTag = new BehaviorSubject(undefined);
70
+ this.caseTagFormGroup = this.fb.group({
71
+ title: this.fb.control('', Validators.required),
72
+ key: this.fb.control('', [
73
+ Validators.required,
74
+ Validators.minLength(3),
75
+ this.uniqueKeyValidator,
76
+ ]),
77
+ color: this.fb.control('', Validators.required),
78
+ });
79
+ this.isEdit$ = combineLatest([this._typeAnimationDelay$, this._prefillCaseTag]).pipe(map(([type, prefillCaseTag]) => {
80
+ if (type === 'edit' && prefillCaseTag) {
81
+ this.prefillForm(prefillCaseTag);
82
+ }
83
+ return type === 'edit';
84
+ }));
85
+ this.isAdd$ = this._typeAnimationDelay$.pipe(map(type => {
86
+ if (type === 'add')
87
+ this.resetForm();
88
+ return type === 'add';
89
+ }));
90
+ this.isClosed$ = this._type$.pipe(map(type => type === 'closed'));
91
+ this.disabled$ = new BehaviorSubject(false);
92
+ this.COLORS = Object.values(TagColor);
93
+ this._selectedColor$ = new BehaviorSubject(undefined);
94
+ this.colorListItems$ = combineLatest([
95
+ this._selectedColor$,
96
+ this.translateService.stream('key'),
97
+ ]).pipe(map(([selectedColor]) => this.COLORS.map(color => ({
98
+ selected: color === selectedColor,
99
+ content: this.translateService.instant('interface.tagType.' + CaseTagsUtils.getTagTypeFromCaseTagColor(color)),
100
+ color,
101
+ tagType: CaseTagsUtils.getTagTypeFromCaseTagColor(color),
102
+ }))));
103
+ this.editingKey$ = new BehaviorSubject(false);
104
+ this._originalCaseTagKey$ = new BehaviorSubject('');
105
+ this._subscriptions = new Subscription();
106
+ this.iconService.registerAll([Edit16]);
107
+ }
108
+ ngOnInit() {
109
+ this.openAutoKeySubscription();
110
+ }
111
+ ngOnDestroy() {
112
+ this._subscriptions.unsubscribe();
113
+ }
114
+ addCaseTag() {
115
+ this.disable();
116
+ this._subscriptions.add(this.caseTagService.saveCaseTag(this.documentDefinitionName, this.getFormValue()).subscribe({
117
+ next: () => {
118
+ this.enable();
119
+ this.closeAndRefresh();
120
+ },
121
+ error: () => {
122
+ this.enable(false);
123
+ },
124
+ }));
125
+ }
126
+ editCaseTag() {
127
+ this.disable();
128
+ this._originalCaseTagKey$
129
+ .pipe(take(1), switchMap(originalCaseTagKey => {
130
+ return this.caseTagService.updateCaseTag(this.documentDefinitionName, originalCaseTagKey, this.getFormValue());
131
+ }))
132
+ .subscribe({
133
+ next: () => {
134
+ this.enable();
135
+ this.closeAndRefresh();
136
+ },
137
+ error: () => {
138
+ this.enable(false);
139
+ },
140
+ });
141
+ }
142
+ editKeyButtonClick() {
143
+ this.editingKey$.next(true);
144
+ }
145
+ colorDropdownChange(event) {
146
+ const newColor = event?.item?.color;
147
+ if (newColor) {
148
+ this._selectedColor$.next(newColor);
149
+ this.caseTagFormGroup.patchValue({ color: newColor });
150
+ this.caseTagFormGroup.markAsDirty();
151
+ }
152
+ }
153
+ close() {
154
+ this.closeModalEvent.emit('close');
155
+ }
156
+ onClose() {
157
+ this.close();
158
+ }
159
+ prefillForm(prefillCaseTag) {
160
+ this._originalCaseTagKey$.next(prefillCaseTag.key);
161
+ this.caseTagFormGroup.patchValue({
162
+ key: prefillCaseTag.key,
163
+ title: prefillCaseTag.title,
164
+ color: prefillCaseTag.color,
165
+ });
166
+ this._selectedColor$.next(prefillCaseTag.color);
167
+ this.caseTagFormGroup.markAsPristine();
168
+ this.resetEditingKey();
169
+ }
170
+ resetForm() {
171
+ this.caseTagFormGroup.patchValue({
172
+ key: '',
173
+ title: '',
174
+ color: TagColor.Blue,
175
+ });
176
+ this._selectedColor$.next(TagColor.Blue);
177
+ this.caseTagFormGroup.markAsPristine();
178
+ this.resetEditingKey();
179
+ }
180
+ resetEditingKey() {
181
+ this.editingKey$.next(false);
182
+ }
183
+ openAutoKeySubscription() {
184
+ this._subscriptions.add(combineLatest([this.isAdd$, this.title.valueChanges, this.editingKey$]).subscribe(([isAdd, titleValue, editingKey]) => {
185
+ if (isAdd && !editingKey) {
186
+ if (titleValue) {
187
+ this.caseTagFormGroup.patchValue({ key: this.getUniqueKey(titleValue) });
188
+ }
189
+ else {
190
+ this.clearKey();
191
+ }
192
+ }
193
+ }));
194
+ }
195
+ getUniqueKey(title) {
196
+ const dashCaseKey = `${title}`
197
+ .toLowerCase()
198
+ .replace(/[^a-z0-9-_]+|-[^a-z0-9]+/g, '-')
199
+ .replace(/_[-_]+/g, '_')
200
+ .replace(/^[^a-z]+/g, '');
201
+ const usedKeys = this.usedKeys;
202
+ if (!usedKeys.includes(dashCaseKey)) {
203
+ return dashCaseKey;
204
+ }
205
+ return this.getUniqueKeyWithNumber(dashCaseKey, usedKeys);
206
+ }
207
+ getUniqueKeyWithNumber(dashCaseKey, usedKeys) {
208
+ const numbersFromCurrentKey = (dashCaseKey.match(/^\d+|\d+\b|\d+(?=\w)/g) || []).map((numberValue) => +numberValue);
209
+ const lastNumberFromCurrentKey = numbersFromCurrentKey.length > 0 && numbersFromCurrentKey[numbersFromCurrentKey.length - 1];
210
+ const newKey = lastNumberFromCurrentKey
211
+ ? `${dashCaseKey.replace(`${lastNumberFromCurrentKey}`, `${lastNumberFromCurrentKey + 1}`)}`
212
+ : `${dashCaseKey}-1`;
213
+ if (usedKeys.includes(newKey)) {
214
+ return this.getUniqueKeyWithNumber(newKey, usedKeys);
215
+ }
216
+ return newKey;
217
+ }
218
+ clearKey() {
219
+ this.caseTagFormGroup.patchValue({ key: '' });
220
+ }
221
+ uniqueKeyValidator() {
222
+ return (control) => combineLatest([this.isEdit$, control.valueChanges]).pipe(map(([isEdit, keyValue]) => this.usedKeys?.every((key) => key !== keyValue) || isEdit
223
+ ? null
224
+ : { uniqueKey: { value: control.value } }));
225
+ }
226
+ disable() {
227
+ this.disabled$.next(true);
228
+ this.caseTagFormGroup.disable();
229
+ }
230
+ enable(delay = true) {
231
+ setTimeout(() => {
232
+ this.disabled$.next(false);
233
+ this.caseTagFormGroup.enable();
234
+ }, delay ? CARBON_CONSTANTS.modalAnimationMs : 0);
235
+ }
236
+ closeAndRefresh() {
237
+ this.closeModalEvent.emit('closeAndRefresh');
238
+ }
239
+ getFormValue() {
240
+ return {
241
+ key: this.key.value,
242
+ title: this.title.value,
243
+ color: this.color.value,
244
+ };
245
+ }
246
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.IconService }, { token: i3.TranslateService }, { token: i4.CaseTagService }], target: i0.ɵɵFactoryTarget.Component }); }
247
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DossierManagementModalComponent, selector: "valtimo-dossier-management-case-tag-modal", inputs: { type: "type", prefill: "prefill", usedKeys: "usedKeys", documentDefinitionName: "documentDefinitionName" }, outputs: { closeModalEvent: "closeModalEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n valtimoCdsModal\n *ngIf=\"{\n isAdd: isAdd$ | async,\n isEdit: isEdit$ | async,\n isClosed: isClosed$ | async,\n editingKey: editingKey$ | async,\n disabled: disabled$ | async,\n } as obs\"\n [open]=\"!obs.isClosed\"\n size=\"sm\"\n>\n <cds-modal-header showCloseButton=\"true\" (closeSelect)=\"close()\">\n <h3 cdsModalHeaderHeading>\n {{ obs.isEdit ? ('dossierManagement.caseTags.edit' | translate) : '' }}\n {{ obs.isAdd ? ('dossierManagement.caseTags.add' | translate) : '' }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"caseTagForm; context: {obs: obs}\"></ng-container>\n </section>\n\n <cds-modal-footer>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </cds-modal-footer>\n</cds-modal>\n\n<ng-template #colorDropdownItemTemplate let-item=\"item\">\n <cds-tag\n *ngIf=\"item && item.content\"\n class=\"cds-tag--no-margin case-tag-margins\"\n [type]=\"item?.tagType\"\n >\n {{ 'interface.tagType.' + item?.tagType | translate }}\n </cds-tag>\n</ng-template>\n\n<ng-template #caseTagForm let-obs=\"obs\">\n <form [formGroup]=\"caseTagFormGroup\" class=\"case-tag-form\">\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.title' | translate }}\n <input cdsText formControlName=\"title\" [attr.modal-primary-focus]=\"true\" />\n </cds-label>\n\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.key' | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n formControlName=\"key\"\n [readOnly]=\"!obs.editingKey\"\n [placeholder]=\"\n obs.isAdd && !obs.editingKey\n ? ('dossierManagement.caseTags.keyAutoGenerated' | translate)\n : ''\n \"\n />\n\n <cds-icon-button\n *ngIf=\"!obs.editingKey && obs.isAdd\"\n [disabled]=\"obs.disabled\"\n (click)=\"editKeyButtonClick()\"\n kind=\"secondary\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"edit\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-label>\n\n <div class=\"horizontal-inputs\">\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.color' | translate }}\n\n <cds-dropdown\n [id]=\"'status-color-dropdown'\"\n [appendInline]=\"false\"\n [placeholder]=\"'dossierManagement.caseTags.colorPlaceholder' | translate\"\n (selected)=\"colorDropdownChange($event)\"\n >\n <cds-dropdown-list [items]=\"colorListItems$\" [listTpl]=\"colorDropdownItemTemplate\">\n </cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button cdsButton=\"secondary\" (click)=\"onClose()\" [disabled]=\"obs.disabled\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.isAdd\"\n cdsButton=\"primary\"\n [disabled]=\"invalid || pristine || obs.disabled\"\n (click)=\"addCaseTag()\"\n >\n {{ 'interface.add' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.isEdit\"\n cdsButton=\"primary\"\n [disabled]=\"invalid || pristine || obs.disabled\"\n (click)=\"editCaseTag()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n</ng-template>\n", styles: [".case-tag-form{display:flex;flex-direction:column;gap:16px}.edit-key-input{height:40px;display:flex;width:100%;flex-direction:row;gap:16px;align-items:flex-end}.edit-key-input input:read-only{color:var(--cds-text-disabled)}::ng-deep .horizontal-inputs{display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}::ng-deep .horizontal-inputs .cds--label{width:100%;display:flex;flex-direction:column;gap:8px}.case-tag-margins{margin-top:-4px;margin-left:2px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i2.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i2.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "directive", type: i6.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "component", type: i2.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
248
+ }
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementModalComponent, decorators: [{
250
+ type: Component,
251
+ args: [{ selector: 'valtimo-dossier-management-case-tag-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n valtimoCdsModal\n *ngIf=\"{\n isAdd: isAdd$ | async,\n isEdit: isEdit$ | async,\n isClosed: isClosed$ | async,\n editingKey: editingKey$ | async,\n disabled: disabled$ | async,\n } as obs\"\n [open]=\"!obs.isClosed\"\n size=\"sm\"\n>\n <cds-modal-header showCloseButton=\"true\" (closeSelect)=\"close()\">\n <h3 cdsModalHeaderHeading>\n {{ obs.isEdit ? ('dossierManagement.caseTags.edit' | translate) : '' }}\n {{ obs.isAdd ? ('dossierManagement.caseTags.add' | translate) : '' }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"caseTagForm; context: {obs: obs}\"></ng-container>\n </section>\n\n <cds-modal-footer>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </cds-modal-footer>\n</cds-modal>\n\n<ng-template #colorDropdownItemTemplate let-item=\"item\">\n <cds-tag\n *ngIf=\"item && item.content\"\n class=\"cds-tag--no-margin case-tag-margins\"\n [type]=\"item?.tagType\"\n >\n {{ 'interface.tagType.' + item?.tagType | translate }}\n </cds-tag>\n</ng-template>\n\n<ng-template #caseTagForm let-obs=\"obs\">\n <form [formGroup]=\"caseTagFormGroup\" class=\"case-tag-form\">\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.title' | translate }}\n <input cdsText formControlName=\"title\" [attr.modal-primary-focus]=\"true\" />\n </cds-label>\n\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.key' | translate }}\n\n <div class=\"edit-key-input\">\n <input\n cdsText\n formControlName=\"key\"\n [readOnly]=\"!obs.editingKey\"\n [placeholder]=\"\n obs.isAdd && !obs.editingKey\n ? ('dossierManagement.caseTags.keyAutoGenerated' | translate)\n : ''\n \"\n />\n\n <cds-icon-button\n *ngIf=\"!obs.editingKey && obs.isAdd\"\n [disabled]=\"obs.disabled\"\n (click)=\"editKeyButtonClick()\"\n kind=\"secondary\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"edit\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-label>\n\n <div class=\"horizontal-inputs\">\n <cds-label>\n {{ 'dossierManagement.caseTags.columns.color' | translate }}\n\n <cds-dropdown\n [id]=\"'status-color-dropdown'\"\n [appendInline]=\"false\"\n [placeholder]=\"'dossierManagement.caseTags.colorPlaceholder' | translate\"\n (selected)=\"colorDropdownChange($event)\"\n >\n <cds-dropdown-list [items]=\"colorListItems$\" [listTpl]=\"colorDropdownItemTemplate\">\n </cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #buttons let-obs=\"obs\">\n <button cdsButton=\"secondary\" (click)=\"onClose()\" [disabled]=\"obs.disabled\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.isAdd\"\n cdsButton=\"primary\"\n [disabled]=\"invalid || pristine || obs.disabled\"\n (click)=\"addCaseTag()\"\n >\n {{ 'interface.add' | translate }}\n </button>\n\n <button\n *ngIf=\"obs.isEdit\"\n cdsButton=\"primary\"\n [disabled]=\"invalid || pristine || obs.disabled\"\n (click)=\"editCaseTag()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n</ng-template>\n", styles: [".case-tag-form{display:flex;flex-direction:column;gap:16px}.edit-key-input{height:40px;display:flex;width:100%;flex-direction:row;gap:16px;align-items:flex-end}.edit-key-input input:read-only{color:var(--cds-text-disabled)}::ng-deep .horizontal-inputs{display:grid;gap:16px;grid-template-columns:repeat(2,1fr)}::ng-deep .horizontal-inputs .cds--label{width:100%;display:flex;flex-direction:column;gap:8px}.case-tag-margins{margin-top:-4px;margin-left:2px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
252
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.IconService }, { type: i3.TranslateService }, { type: i4.CaseTagService }], propDecorators: { type: [{
253
+ type: Input
254
+ }], prefill: [{
255
+ type: Input
256
+ }], usedKeys: [{
257
+ type: Input
258
+ }], documentDefinitionName: [{
259
+ type: Input
260
+ }], closeModalEvent: [{
261
+ type: Output
262
+ }] } });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFnLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLW1hbmFnZW1lbnQtY2FzZS10YWdzL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZy1tb2RhbC9kb3NzaWVyLW1hbmFnZW1lbnQtY2FzZS10YWctbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZ3MvZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFnLW1vZGFsL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBSUwsV0FBVyxFQUVYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBaUIsYUFBYSxFQUFVLE1BQU0sbUJBQW1CLENBQUM7QUFFekUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxPQUFPLEVBQUMs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SUFFTyxPQUFPO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUk7UUFDekIsVUFBVSxDQUNSLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDLEVBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sWUFBWTtRQUNsQixPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQWlCO1NBQ3BDLENBQUM7SUFDSixDQUFDOytHQTlTVSwrQkFBK0I7bUdBQS9CLCtCQUErQix3UENqRDVDLGkvSEFnSUE7OzRGRC9FYSwrQkFBK0I7a0JBTjNDLFNBQVM7K0JBQ0UsMkNBQTJDLG1CQUdwQyx1QkFBdUIsQ0FBQyxNQUFNO3NLQUczQixJQUFJO3NCQUF2QixLQUFLO2dCQVljLE9BQU87c0JBQTFCLEtBQUs7Z0JBSVUsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBRVcsZUFBZTtzQkFBL0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdGF0dXNNb2RhbENsb3NlRXZlbnQsIFN0YXR1c01vZGFsVHlwZX0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q0FSQk9OX0NPTlNUQU5UU30gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yRm4sXG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtDYXNlVGFnU2VydmljZSwgQ2FzZVRhZ3NVdGlscywgQ2FzZVRhZ30gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtJY29uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge0VkaXQxNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge0xpc3RJdGVtfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2Ryb3Bkb3duL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7VGFnQ29sb3J9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFnLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZy1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZy1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRG9zc2llck1hbmFnZW1lbnRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHVibGljIHNldCB0eXBlKHZhbHVlOiBTdGF0dXNNb2RhbFR5cGUpIHtcbiAgICB0aGlzLl90eXBlJC5uZXh0KHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl90eXBlQW5pbWF0aW9uRGVsYXkkLm5leHQodmFsdWUpO1xuICAgICAgfSwgQ0FSQk9OX0NPTlNUQU5UUy5tb2RhbEFuaW1hdGlvbk1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdHlwZUFuaW1hdGlvbkRlbGF5JC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHByZWZpbGwodmFsdWU6IENhc2VUYWcpIHtcbiAgICB0aGlzLl9wcmVmaWxsQ2FzZVRhZy5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHB1YmxpYyB1c2VkS2V5cyE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwdWJsaWMgZG9jdW1lbnREZWZpbml0aW9uTmFtZSE6IHN0cmluZztcblxuICBAT3V0cHV0KCkgcHVibGljIGNsb3NlTW9kYWxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RhdHVzTW9kYWxDbG9zZUV2ZW50PigpO1xuXG4gIHB1YmxpYyBpc0Nhc2VUYWc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90eXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhdHVzTW9kYWxUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF90eXBlQW5pbWF0aW9uRGVsYXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGF0dXNNb2RhbFR5cGUgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmVmaWxsQ2FzZVRhZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FzZVRhZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2FzZVRhZ0Zvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIHRpdGxlOiB0aGlzLmZiLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIGtleTogdGhpcy5mYi5jb250cm9sKCcnLCBbXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyksXG4gICAgICB0aGlzLnVuaXF1ZUtleVZhbGlkYXRvcixcbiAgICBdKSxcbiAgICBjb2xvcjogdGhpcy5mYi5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgfSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzRWRpdCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl90eXBlQW5pbWF0aW9uRGVsYXkkLCB0aGlzLl9wcmVmaWxsQ2FzZVRhZ10pLnBpcGUoXG4gICAgbWFwKChbdHlwZSwgcHJlZmlsbENhc2VUYWddKSA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2VkaXQnICYmIHByZWZpbGxDYXNlVGFnKSB7XG4gICAgICAgIHRoaXMucHJlZmlsbEZvcm0ocHJlZmlsbENhc2VUYWcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGUgPT09ICdlZGl0JztcbiAgICB9KVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc0FkZCQgPSB0aGlzLl90eXBlQW5pbWF0aW9uRGVsYXkkLnBpcGUoXG4gICAgbWFwKHR5cGUgPT4ge1xuICAgICAgaWYgKHR5cGUgPT09ICdhZGQnKSB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICdhZGQnO1xuICAgIH0pXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzQ2xvc2VkJCA9IHRoaXMuX3R5cGUkLnBpcGUobWFwKHR5cGUgPT4gdHlwZSA9PT0gJ2Nsb3NlZCcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xPUlM6IFRhZ0NvbG9yW10gPSBPYmplY3QudmFsdWVzKFRhZ0NvbG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0ZWRDb2xvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhZ0NvbG9yIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvckxpc3RJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9zZWxlY3RlZENvbG9yJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZENvbG9yXSkgPT5cbiAgICAgIHRoaXMuQ09MT1JTLm1hcChjb2xvciA9PiAoe1xuICAgICAgICBzZWxlY3RlZDogY29sb3IgPT09IHNlbGVjdGVkQ29sb3IsXG4gICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICdpbnRlcmZhY2UudGFnVHlwZS4nICsgQ2FzZVRhZ3NVdGlscy5nZXRUYWdUeXBlRnJvbUNhc2VUYWdDb2xvcihjb2xvcilcbiAgICAgICAgKSxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIHRhZ1R5cGU6IENhc2VUYWdzVXRpbHMuZ2V0VGFnVHlwZUZyb21DYXNlVGFnQ29sb3IoY29sb3IpLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyBnZXQga2V5KCk6IEFic3RyYWN0Q29udHJvbDxzdHJpbmcgfCBudWxsLCBzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FzZVRhZ0Zvcm1Hcm91cD8uZ2V0KCdrZXknKSA/PyBuZXcgRm9ybUNvbnRyb2woJycpO1xuICB9XG5cbiAgcHVibGljIGdldCB0aXRsZSgpOiBBYnN0cmFjdENvbnRyb2w8c3RyaW5nIHwgbnVsbCwgc3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VUYWdGb3JtR3JvdXA/LmdldCgndGl0bGUnKSA/PyBuZXcgRm9ybUNvbnRyb2woJycpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBBYnN0cmFjdENvbnRyb2w8c3RyaW5nIHwgbnVsbCwgc3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhc2VUYWdGb3JtR3JvdXA/LmdldCgnY29sb3InKSA/PyBuZXcgRm9ybUNvbnRyb2woJycpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY2FzZVRhZ0Zvcm1Hcm91cD8uaW52YWxpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jYXNlVGFnRm9ybUdyb3VwPy5wcmlzdGluZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0aW5nS2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29yaWdpbmFsQ2FzZVRhZ0tleSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VydmljZTogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZVRhZ1NlcnZpY2U6IENhc2VUYWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJBbGwoW0VkaXQxNl0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkF1dG9LZXlTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ2FzZVRhZygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuY2FzZVRhZ1NlcnZpY2Uuc2F2ZUNhc2VUYWcodGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lLCB0aGlzLmdldEZvcm1WYWx1ZSgpKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmVmcmVzaCgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlKGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0Q2FzZVRhZygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcblxuICAgIHRoaXMuX29yaWdpbmFsQ2FzZVRhZ0tleSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAob3JpZ2luYWxDYXNlVGFnS2V5ID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jYXNlVGFnU2VydmljZS51cGRhdGVDYXNlVGFnKFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgb3JpZ2luYWxDYXNlVGFnS2V5LFxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtVmFsdWUoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgICAgdGhpcy5jbG9zZUFuZFJlZnJlc2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZShmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0S2V5QnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nS2V5JC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNvbG9yRHJvcGRvd25DaGFuZ2UoZXZlbnQ6IHtcbiAgICBpdGVtOiB7Y29sb3I6IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBzZWxlY3RlZDogYm9vbGVhbn07XG4gICAgaXNVcGRhdGU6IGJvb2xlYW47XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdDb2xvciA9IGV2ZW50Py5pdGVtPy5jb2xvciBhcyBUYWdDb2xvcjtcblxuICAgIGlmIChuZXdDb2xvcikge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRDb2xvciQubmV4dChuZXdDb2xvcik7XG4gICAgICB0aGlzLmNhc2VUYWdGb3JtR3JvdXAucGF0Y2hWYWx1ZSh7Y29sb3I6IG5ld0NvbG9yfSk7XG4gICAgICB0aGlzLmNhc2VUYWdGb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsRXZlbnQuZW1pdCgnY2xvc2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZmlsbEZvcm0ocHJlZmlsbENhc2VUYWc6IENhc2VUYWcpOiB2b2lkIHtcbiAgICB0aGlzLl9vcmlnaW5hbENhc2VUYWdLZXkkLm5leHQocHJlZmlsbENhc2VUYWcua2V5KTtcbiAgICB0aGlzLmNhc2VUYWdGb3JtR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICBrZXk6IHByZWZpbGxDYXNlVGFnLmtleSxcbiAgICAgIHRpdGxlOiBwcmVmaWxsQ2FzZVRhZy50aXRsZSxcbiAgICAgIGNvbG9yOiBwcmVmaWxsQ2FzZVRhZy5jb2xvcixcbiAgICB9KTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbG9yJC5uZXh0KHByZWZpbGxDYXNlVGFnLmNvbG9yKTtcbiAgICB0aGlzLmNhc2VUYWdGb3JtR3JvdXAubWFya0FzUHJpc3RpbmUoKTtcbiAgICB0aGlzLnJlc2V0RWRpdGluZ0tleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlVGFnRm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAga2V5OiAnJyxcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGNvbG9yOiBUYWdDb2xvci5CbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sb3IkLm5leHQoVGFnQ29sb3IuQmx1ZSk7XG4gICAgdGhpcy5jYXNlVGFnRm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5yZXNldEVkaXRpbmdLZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRFZGl0aW5nS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZ0tleSQubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5BdXRvS2V5U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5pc0FkZCQsIHRoaXMudGl0bGUudmFsdWVDaGFuZ2VzLCB0aGlzLmVkaXRpbmdLZXkkXSkuc3Vic2NyaWJlKFxuICAgICAgICAoW2lzQWRkLCB0aXRsZVZhbHVlLCBlZGl0aW5nS2V5XSkgPT4ge1xuICAgICAgICAgIGlmIChpc0FkZCAmJiAhZWRpdGluZ0tleSkge1xuICAgICAgICAgICAgaWYgKHRpdGxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYXNlVGFnRm9ybUdyb3VwLnBhdGNoVmFsdWUoe2tleTogdGhpcy5nZXRVbmlxdWVLZXkodGl0bGVWYWx1ZSl9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJLZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbmlxdWVLZXkodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGFzaENhc2VLZXkgPSBgJHt0aXRsZX1gXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV9dK3wtW15hLXowLTldKy9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvX1stX10rL2csICdfJylcbiAgICAgIC5yZXBsYWNlKC9eW15hLXpdKy9nLCAnJyk7XG4gICAgY29uc3QgdXNlZEtleXMgPSB0aGlzLnVzZWRLZXlzO1xuXG4gICAgaWYgKCF1c2VkS2V5cy5pbmNsdWRlcyhkYXNoQ2FzZUtleSkpIHtcbiAgICAgIHJldHVybiBkYXNoQ2FzZUtleTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRVbmlxdWVLZXlXaXRoTnVtYmVyKGRhc2hDYXNlS2V5LCB1c2VkS2V5cyk7XG4gIH1cblxuICBwcml2YXRlIGdldFVuaXF1ZUtleVdpdGhOdW1iZXIoZGFzaENhc2VLZXk6IHN0cmluZywgdXNlZEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBudW1iZXJzRnJvbUN1cnJlbnRLZXkgPSAoZGFzaENhc2VLZXkubWF0Y2goL15cXGQrfFxcZCtcXGJ8XFxkKyg/PVxcdykvZykgfHwgW10pLm1hcChcbiAgICAgIChudW1iZXJWYWx1ZTogc3RyaW5nKSA9PiArbnVtYmVyVmFsdWVcbiAgICApO1xuICAgIGNvbnN0IGxhc3ROdW1iZXJGcm9tQ3VycmVudEtleSA9XG4gICAgICBudW1iZXJzRnJvbUN1cnJlbnRLZXkubGVuZ3RoID4gMCAmJiBudW1iZXJzRnJvbUN1cnJlbnRLZXlbbnVtYmVyc0Zyb21DdXJyZW50S2V5Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG5ld0tleSA9IGxhc3ROdW1iZXJGcm9tQ3VycmVudEtleVxuICAgICAgPyBgJHtkYXNoQ2FzZUtleS5yZXBsYWNlKGAke2xhc3ROdW1iZXJGcm9tQ3VycmVudEtleX1gLCBgJHtsYXN0TnVtYmVyRnJvbUN1cnJlbnRLZXkgKyAxfWApfWBcbiAgICAgIDogYCR7ZGFzaENhc2VLZXl9LTFgO1xuXG4gICAgaWYgKHVzZWRLZXlzLmluY2x1ZGVzKG5ld0tleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFVuaXF1ZUtleVdpdGhOdW1iZXIobmV3S2V5LCB1c2VkS2V5cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0tleTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJLZXkoKTogdm9pZCB7XG4gICAgdGhpcy5jYXNlVGFnRm9ybUdyb3VwLnBhdGNoVmFsdWUoe2tleTogJyd9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5pcXVlS2V5VmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuaXNFZGl0JCwgY29udHJvbC52YWx1ZUNoYW5nZXNdKS5waXBlKFxuICAgICAgICBtYXAoKFtpc0VkaXQsIGtleVZhbHVlXSkgPT5cbiAgICAgICAgICB0aGlzLnVzZWRLZXlzPy5ldmVyeSgoa2V5OiBzdHJpbmcpID0+IGtleSAhPT0ga2V5VmFsdWUpIHx8IGlzRWRpdFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHt1bmlxdWVLZXk6IHt2YWx1ZTogY29udHJvbC52YWx1ZX19XG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmNhc2VUYWdGb3JtR3JvdXAuZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGUoZGVsYXkgPSB0cnVlKTogdm9pZCB7XG4gICAgc2V0VGltZW91dChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2FzZVRhZ0Zvcm1Hcm91cC5lbmFibGUoKTtcbiAgICAgIH0sXG4gICAgICBkZWxheSA/IENBUkJPTl9DT05TVEFOVFMubW9kYWxBbmltYXRpb25NcyA6IDBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUFuZFJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsRXZlbnQuZW1pdCgnY2xvc2VBbmRSZWZyZXNoJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1WYWx1ZSgpOiBDYXNlVGFnIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB0aGlzLmtleS52YWx1ZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLnZhbHVlLFxuICAgICAgY29sb3I6IHRoaXMuY29sb3IudmFsdWUgYXMgVGFnQ29sb3IsXG4gICAgfTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48Y2RzLW1vZGFsXG4gIHZhbHRpbW9DZHNNb2RhbFxuICAqbmdJZj1cIntcbiAgICBpc0FkZDogaXNBZGQkIHwgYXN5bmMsXG4gICAgaXNFZGl0OiBpc0VkaXQkIHwgYXN5bmMsXG4gICAgaXNDbG9zZWQ6IGlzQ2xvc2VkJCB8IGFzeW5jLFxuICAgIGVkaXRpbmdLZXk6IGVkaXRpbmdLZXkkIHwgYXN5bmMsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkJCB8IGFzeW5jLFxuICB9IGFzIG9ic1wiXG4gIFtvcGVuXT1cIiFvYnMuaXNDbG9zZWRcIlxuICBzaXplPVwic21cIlxuPlxuICA8Y2RzLW1vZGFsLWhlYWRlciBzaG93Q2xvc2VCdXR0b249XCJ0cnVlXCIgKGNsb3NlU2VsZWN0KT1cImNsb3NlKClcIj5cbiAgICA8aDMgY2RzTW9kYWxIZWFkZXJIZWFkaW5nPlxuICAgICAge3sgb2JzLmlzRWRpdCA/ICgnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3MuZWRpdCcgfCB0cmFuc2xhdGUpIDogJycgfX1cbiAgICAgIHt7IG9icy5pc0FkZCA/ICgnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3MuYWRkJyB8IHRyYW5zbGF0ZSkgOiAnJyB9fVxuICAgIDwvaDM+XG4gIDwvY2RzLW1vZGFsLWhlYWRlcj5cblxuICA8c2VjdGlvbiBjZHNNb2RhbENvbnRlbnQ+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhc2VUYWdGb3JtOyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvc2VjdGlvbj5cblxuICA8Y2RzLW1vZGFsLWZvb3Rlcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uczsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L2Nkcy1tb2RhbD5cblxuPG5nLXRlbXBsYXRlICNjb2xvckRyb3Bkb3duSXRlbVRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxuICA8Y2RzLXRhZ1xuICAgICpuZ0lmPVwiaXRlbSAmJiBpdGVtLmNvbnRlbnRcIlxuICAgIGNsYXNzPVwiY2RzLXRhZy0tbm8tbWFyZ2luIGNhc2UtdGFnLW1hcmdpbnNcIlxuICAgIFt0eXBlXT1cIml0ZW0/LnRhZ1R5cGVcIlxuICA+XG4gICAge3sgJ2ludGVyZmFjZS50YWdUeXBlLicgKyBpdGVtPy50YWdUeXBlIHwgdHJhbnNsYXRlIH19XG4gIDwvY2RzLXRhZz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2FzZVRhZ0Zvcm0gbGV0LW9icz1cIm9ic1wiPlxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNhc2VUYWdGb3JtR3JvdXBcIiBjbGFzcz1cImNhc2UtdGFnLWZvcm1cIj5cbiAgICA8Y2RzLWxhYmVsPlxuICAgICAge3sgJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmNvbHVtbnMudGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiIC8+XG4gICAgPC9jZHMtbGFiZWw+XG5cbiAgICA8Y2RzLWxhYmVsPlxuICAgICAge3sgJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmNvbHVtbnMua2V5JyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1rZXktaW5wdXRcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgY2RzVGV4dFxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImtleVwiXG4gICAgICAgICAgW3JlYWRPbmx5XT1cIiFvYnMuZWRpdGluZ0tleVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgb2JzLmlzQWRkICYmICFvYnMuZWRpdGluZ0tleVxuICAgICAgICAgICAgICA/ICgnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3Mua2V5QXV0b0dlbmVyYXRlZCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgIDogJydcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDxjZHMtaWNvbi1idXR0b25cbiAgICAgICAgICAqbmdJZj1cIiFvYnMuZWRpdGluZ0tleSAmJiBvYnMuaXNBZGRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0S2V5QnV0dG9uQ2xpY2soKVwiXG4gICAgICAgICAga2luZD1cInNlY29uZGFyeVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiZWRpdFwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuICAgICAgICA8L2Nkcy1pY29uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvY2RzLWxhYmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtaW5wdXRzXCI+XG4gICAgICA8Y2RzLWxhYmVsPlxuICAgICAgICB7eyAnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3MuY29sdW1ucy5jb2xvcicgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICA8Y2RzLWRyb3Bkb3duXG4gICAgICAgICAgW2lkXT1cIidzdGF0dXMtY29sb3ItZHJvcGRvd24nXCJcbiAgICAgICAgICBbYXBwZW5kSW5saW5lXT1cImZhbHNlXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmNvbG9yUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoc2VsZWN0ZWQpPVwiY29sb3JEcm9wZG93bkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwiY29sb3JMaXN0SXRlbXMkXCIgW2xpc3RUcGxdPVwiY29sb3JEcm9wZG93bkl0ZW1UZW1wbGF0ZVwiPlxuICAgICAgICAgIDwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9ucyBsZXQtb2JzPVwib2JzXCI+XG4gIDxidXR0b24gY2RzQnV0dG9uPVwic2Vjb25kYXJ5XCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZWRcIj5cbiAgICB7eyAnaW50ZXJmYWNlLmNhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwib2JzLmlzQWRkXCJcbiAgICBjZHNCdXR0b249XCJwcmltYXJ5XCJcbiAgICBbZGlzYWJsZWRdPVwiaW52YWxpZCB8fCBwcmlzdGluZSB8fCBvYnMuZGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJhZGRDYXNlVGFnKClcIlxuICA+XG4gICAge3sgJ2ludGVyZmFjZS5hZGQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICAqbmdJZj1cIm9icy5pc0VkaXRcIlxuICAgIGNkc0J1dHRvbj1cInByaW1hcnlcIlxuICAgIFtkaXNhYmxlZF09XCJpbnZhbGlkIHx8IHByaXN0aW5lIHx8IG9icy5kaXNhYmxlZFwiXG4gICAgKGNsaWNrKT1cImVkaXRDYXNlVGFnKClcIlxuICA+XG4gICAge3sgJ2ludGVyZmFjZS5zYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,149 @@
1
+ /*
2
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { ChangeDetectionStrategy, Component, signal, ViewChild, } from '@angular/core';
17
+ import { CaseTagsUtils } from '@valtimo/document';
18
+ import { BehaviorSubject, combineLatest, filter, map, Subject, switchMap, tap, Subscription, } from 'rxjs';
19
+ import { ViewType } from '@valtimo/components';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@valtimo/document";
22
+ import * as i2 from "@angular/router";
23
+ import * as i3 from "@angular/common";
24
+ import * as i4 from "carbon-components-angular";
25
+ import * as i5 from "@valtimo/components";
26
+ import * as i6 from "./dossier-management-case-tag-modal/dossier-management-case-tag-modal.component";
27
+ import * as i7 from "@ngx-translate/core";
28
+ export class DossierManagementCaseTagComponent {
29
+ get documentDefinitionName$() {
30
+ return this._documentDefinitionName$;
31
+ }
32
+ constructor(caseTagService, route) {
33
+ this.caseTagService = caseTagService;
34
+ this.route = route;
35
+ this._reload$ = new BehaviorSubject(null);
36
+ this._documentDefinitionName$ = this.route.params.pipe(map(params => params?.name), filter(docDefName => !!docDefName));
37
+ this.loading$ = new BehaviorSubject(true);
38
+ this.dragAndDropDisabled = signal(false);
39
+ this.usedKeys$ = new BehaviorSubject([]);
40
+ this._documentCaseTags = [];
41
+ this._subscriptions = new Subscription();
42
+ this.documentCaseTags$ = combineLatest([
43
+ this._documentDefinitionName$,
44
+ this._reload$,
45
+ ]).pipe(tap(([_, reload]) => {
46
+ if (reload === null) {
47
+ this.loading$.next(true);
48
+ }
49
+ }), switchMap(([documentDefinitionName]) => this.caseTagService.getCaseTagsManagement(documentDefinitionName)), map(caseTags => caseTags.map(caseTag => ({
50
+ ...caseTag,
51
+ tagType: CaseTagsUtils.getTagTypeFromCaseTagColor(caseTag.color),
52
+ }))), tap(caseTags => {
53
+ this._documentCaseTags = caseTags;
54
+ this.usedKeys$.next(caseTags.map(caseTag => caseTag.key));
55
+ this.loading$.next(false);
56
+ }));
57
+ this.fields$ = new BehaviorSubject([]);
58
+ this.ACTION_ITEMS = [
59
+ {
60
+ label: 'interface.edit',
61
+ callback: this.openEditModal.bind(this),
62
+ type: 'normal',
63
+ },
64
+ {
65
+ label: 'interface.delete',
66
+ callback: this.openDeleteModal.bind(this),
67
+ type: 'danger',
68
+ },
69
+ ];
70
+ this.statusModalType$ = new BehaviorSubject('closed');
71
+ this.prefillCaseTag$ = new BehaviorSubject(undefined);
72
+ this.caseTagToDelete$ = new BehaviorSubject(undefined);
73
+ this.showDeleteModal$ = new Subject();
74
+ }
75
+ ngAfterViewInit() {
76
+ this.initFields();
77
+ }
78
+ ngOnDestroy() {
79
+ this._subscriptions.unsubscribe();
80
+ }
81
+ openDeleteModal(caseTag) {
82
+ this.caseTagToDelete$.next(caseTag);
83
+ this.showDeleteModal$.next(true);
84
+ }
85
+ openEditModal(caseTag) {
86
+ this.prefillCaseTag$.next(caseTag);
87
+ this.statusModalType$.next('edit');
88
+ }
89
+ openAddModal() {
90
+ this.statusModalType$.next('add');
91
+ }
92
+ closeModal(closeModalEvent) {
93
+ if (closeModalEvent === 'closeAndRefresh') {
94
+ this.reload();
95
+ }
96
+ this.statusModalType$.next('closed');
97
+ }
98
+ confirmDeleteCaseTag(caseTag) {
99
+ this._subscriptions.add(this.documentDefinitionName$
100
+ .pipe(switchMap(documentDefinitionName => this.caseTagService.deleteCaseTag(documentDefinitionName, caseTag.key)))
101
+ .subscribe(() => {
102
+ this.reload();
103
+ }));
104
+ }
105
+ onItemsReorderedEvent(reorderedItems) {
106
+ if (!reorderedItems)
107
+ return;
108
+ this.dragAndDropDisabled.set(true);
109
+ this._subscriptions.add(this.documentDefinitionName$
110
+ .pipe(switchMap(documentDefinitionName => this.caseTagService.updateCaseTags(documentDefinitionName, reorderedItems)))
111
+ .subscribe(() => {
112
+ this.reload(true);
113
+ }));
114
+ this.dragAndDropDisabled.set(false);
115
+ }
116
+ reload(noAnimation = false) {
117
+ this._reload$.next(noAnimation ? 'noAnimation' : null);
118
+ }
119
+ initFields() {
120
+ this.fields$.next([
121
+ {
122
+ key: 'title',
123
+ label: 'dossierManagement.caseTags.columns.title',
124
+ viewType: ViewType.TEXT,
125
+ },
126
+ {
127
+ key: 'key',
128
+ label: 'dossierManagement.caseTags.columns.key',
129
+ viewType: ViewType.TEXT,
130
+ },
131
+ {
132
+ viewType: ViewType.TEMPLATE,
133
+ template: this.colorColumnTemplate,
134
+ key: 'color',
135
+ label: 'dossierManagement.caseTags.columns.color',
136
+ },
137
+ ]);
138
+ }
139
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementCaseTagComponent, deps: [{ token: i1.CaseTagService }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
140
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DossierManagementCaseTagComponent, selector: "valtimo-dossier-management-case-tags", viewQueries: [{ propertyName: "colorColumnTemplate", first: true, predicate: ["colorColumnTemplate"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n *ngIf=\"{\n loading: loading$ | async,\n documentCaseTags: documentCaseTags$ | async,\n fields: fields$ | async,\n } as obs\"\n [items]=\"obs.documentCaseTags\"\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [loading]=\"obs.loading\"\n [actionItems]=\"ACTION_ITEMS\"\n (rowClicked)=\"openEditModal($event)\"\n [dragAndDrop]=\"true\"\n [dragAndDropDisabled]=\"dragAndDropDisabled()\"\n (itemsReordered)=\"onItemsReorderedEvent($event)\"\n>\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n [description]=\"'dossierManagement.caseTags.noResults.description' | translate\"\n [title]=\"'dossierManagement.caseTags.noResults.title' | translate\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-dossier-management-case-tag-modal\n [type]=\"statusModalType$ | async\"\n [prefill]=\"prefillCaseTag$ | async\"\n [usedKeys]=\"usedKeys$ | async\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n (closeModalEvent)=\"closeModal($event)\"\n></valtimo-dossier-management-case-tag-modal>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossierManagement.caseTags.deleteText\"\n [outputOnConfirm]=\"caseTagToDelete$ | async\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"interface.delete\"\n (confirmEvent)=\"confirmDeleteCaseTag($event)\"\n></valtimo-confirmation-modal>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"dossier-management-search-fields__buttons\">\n <button cdsButton=\"primary\" [disabled]=\"obs.loading\" (click)=\"openAddModal()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'dossierManagement.caseTags.add' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #colorColumnTemplate let-data=\"data\">\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"data?.item?.tagType\">\n {{ 'interface.tagType.' + data?.item?.tagType | translate }}\n </cds-tag>\n</ng-template>\n", styles: ["::ng-deep .cds-tag--no-margin{margin:0}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i5.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "component", type: i5.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i5.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: i4.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class"] }, { kind: "component", type: i6.DossierManagementModalComponent, selector: "valtimo-dossier-management-case-tag-modal", inputs: ["type", "prefill", "usedKeys", "documentDefinitionName"], outputs: ["closeModalEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
141
+ }
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierManagementCaseTagComponent, decorators: [{
143
+ type: Component,
144
+ args: [{ selector: 'valtimo-dossier-management-case-tags', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n *ngIf=\"{\n loading: loading$ | async,\n documentCaseTags: documentCaseTags$ | async,\n fields: fields$ | async,\n } as obs\"\n [items]=\"obs.documentCaseTags\"\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [loading]=\"obs.loading\"\n [actionItems]=\"ACTION_ITEMS\"\n (rowClicked)=\"openEditModal($event)\"\n [dragAndDrop]=\"true\"\n [dragAndDropDisabled]=\"dragAndDropDisabled()\"\n (itemsReordered)=\"onItemsReorderedEvent($event)\"\n>\n <ng-container\n carbonToolbarContent\n *ngTemplateOutlet=\"buttons; context: {obs: obs}\"\n ></ng-container>\n\n <valtimo-no-results\n [description]=\"'dossierManagement.caseTags.noResults.description' | translate\"\n [title]=\"'dossierManagement.caseTags.noResults.title' | translate\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-dossier-management-case-tag-modal\n [type]=\"statusModalType$ | async\"\n [prefill]=\"prefillCaseTag$ | async\"\n [usedKeys]=\"usedKeys$ | async\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n (closeModalEvent)=\"closeModal($event)\"\n></valtimo-dossier-management-case-tag-modal>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossierManagement.caseTags.deleteText\"\n [outputOnConfirm]=\"caseTagToDelete$ | async\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"interface.delete\"\n (confirmEvent)=\"confirmDeleteCaseTag($event)\"\n></valtimo-confirmation-modal>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"dossier-management-search-fields__buttons\">\n <button cdsButton=\"primary\" [disabled]=\"obs.loading\" (click)=\"openAddModal()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'dossierManagement.caseTags.add' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #colorColumnTemplate let-data=\"data\">\n <cds-tag class=\"cds-tag--no-margin\" [type]=\"data?.item?.tagType\">\n {{ 'interface.tagType.' + data?.item?.tagType | translate }}\n </cds-tag>\n</ng-template>\n", styles: ["::ng-deep .cds-tag--no-margin{margin:0}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
145
+ }], ctorParameters: () => [{ type: i1.CaseTagService }, { type: i2.ActivatedRoute }], propDecorators: { colorColumnTemplate: [{
146
+ type: ViewChild,
147
+ args: ['colorColumnTemplate']
148
+ }] } });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2NvbXBvbmVudHMvZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFncy9kb3NzaWVyLW1hbmFnZW1lbnQtY2FzZS10YWdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLW1hbmFnZW1lbnQtY2FzZS10YWdzL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBMEIsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDekUsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsTUFBTSxFQUNOLEdBQUcsRUFFSCxPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsRUFDSCxZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQTJCLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFTdkUsTUFBTSxPQUFPLGlDQUFpQztJQVU1QyxJQUFXLHVCQUF1QjtRQUNoQyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN2QyxDQUFDO0lBdURELFlBQ21CLGNBQThCLEVBQzlCLEtBQXFCO1FBRHJCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQWxFdkIsYUFBUSxH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U0FBUzsrQkFDRSxzQ0FBc0MsbUJBRy9CLHVCQUF1QixDQUFDLE1BQU07Z0hBR2IsbUJBQW1CO3NCQUFwRCxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIE9uRGVzdHJveSxcbiAgc2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q2FzZVRhZ1NlcnZpY2UsIENhc2VUYWcsIENhc2VUYWdzVXRpbHN9IGZyb20gJ0B2YWx0aW1vL2RvY3VtZW50JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxuICBTdWJzY3JpcHRpb24sXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QWN0aW9uSXRlbSwgQ29sdW1uQ29uZmlnLCBWaWV3VHlwZX0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge1N0YXR1c01vZGFsQ2xvc2VFdmVudCwgU3RhdHVzTW9kYWxUeXBlfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWRvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZ3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rvc3NpZXItbWFuYWdlbWVudC1jYXNlLXRhZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJNYW5hZ2VtZW50Q2FzZVRhZ0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NvbG9yQ29sdW1uVGVtcGxhdGUnKSBjb2xvckNvbHVtblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlbG9hZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGwgfCAnbm9BbmltYXRpb24nPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcz8ubmFtZSksXG4gICAgZmlsdGVyKGRvY0RlZk5hbWUgPT4gISFkb2NEZWZOYW1lKVxuICApO1xuXG4gIHB1YmxpYyBnZXQgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQ7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwdWJsaWMgcmVhZG9ubHkgZHJhZ0FuZERyb3BEaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSB1c2VkS2V5cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSk7XG5cbiAgcHJpdmF0ZSBfZG9jdW1lbnRDYXNlVGFnczogQ2FzZVRhZ1tdID0gW107XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50Q2FzZVRhZ3MkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSQsXG4gICAgdGhpcy5fcmVsb2FkJCxcbiAgXSkucGlwZShcbiAgICB0YXAoKFtfLCByZWxvYWRdKSA9PiB7XG4gICAgICBpZiAocmVsb2FkID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lXSkgPT5cbiAgICAgIHRoaXMuY2FzZVRhZ1NlcnZpY2UuZ2V0Q2FzZVRhZ3NNYW5hZ2VtZW50KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICBtYXAoY2FzZVRhZ3MgPT5cbiAgICAgIGNhc2VUYWdzLm1hcChjYXNlVGFnID0+ICh7XG4gICAgICAgIC4uLmNhc2VUYWcsXG4gICAgICAgIHRhZ1R5cGU6IENhc2VUYWdzVXRpbHMuZ2V0VGFnVHlwZUZyb21DYXNlVGFnQ29sb3IoY2FzZVRhZy5jb2xvciksXG4gICAgICB9KSlcbiAgICApLFxuICAgIHRhcChjYXNlVGFncyA9PiB7XG4gICAgICB0aGlzLl9kb2N1bWVudENhc2VUYWdzID0gY2FzZVRhZ3M7XG4gICAgICB0aGlzLnVzZWRLZXlzJC5uZXh0KGNhc2VUYWdzLm1hcChjYXNlVGFnID0+IGNhc2VUYWcua2V5KSk7XG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH0pXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvbHVtbkNvbmZpZ1tdPihbXSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IEFDVElPTl9JVEVNUzogQWN0aW9uSXRlbVtdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiAnaW50ZXJmYWNlLmVkaXQnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMub3BlbkVkaXRNb2RhbC5iaW5kKHRoaXMpLFxuICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ2ludGVyZmFjZS5kZWxldGUnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMub3BlbkRlbGV0ZU1vZGFsLmJpbmQodGhpcyksXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICB9LFxuICBdO1xuXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXNNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGF0dXNNb2RhbFR5cGU+KCdjbG9zZWQnKTtcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpbGxDYXNlVGFnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FzZVRhZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2FzZVRhZ1RvRGVsZXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FzZVRhZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IHNob3dEZWxldGVNb2RhbCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZVRhZ1NlcnZpY2U6IENhc2VUYWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdEZpZWxkcygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuRGVsZXRlTW9kYWwoY2FzZVRhZzogQ2FzZVRhZyk6IHZvaWQge1xuICAgIHRoaXMuY2FzZVRhZ1RvRGVsZXRlJC5uZXh0KGNhc2VUYWcpO1xuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9wZW5FZGl0TW9kYWwoY2FzZVRhZzogQ2FzZVRhZyk6IHZvaWQge1xuICAgIHRoaXMucHJlZmlsbENhc2VUYWckLm5leHQoY2FzZVRhZyk7XG4gICAgdGhpcy5zdGF0dXNNb2RhbFR5cGUkLm5leHQoJ2VkaXQnKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuQWRkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0dXNNb2RhbFR5cGUkLm5leHQoJ2FkZCcpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlTW9kYWwoY2xvc2VNb2RhbEV2ZW50OiBTdGF0dXNNb2RhbENsb3NlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2xvc2VNb2RhbEV2ZW50ID09PSAnY2xvc2VBbmRSZWZyZXNoJykge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c01vZGFsVHlwZSQubmV4dCgnY2xvc2VkJyk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlybURlbGV0ZUNhc2VUYWcoY2FzZVRhZzogQ2FzZVRhZyk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICAgICAgdGhpcy5jYXNlVGFnU2VydmljZS5kZWxldGVDYXNlVGFnKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGNhc2VUYWcua2V5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25JdGVtc1Jlb3JkZXJlZEV2ZW50KHJlb3JkZXJlZEl0ZW1zOiBDYXNlVGFnW10pOiB2b2lkIHtcbiAgICBpZiAoIXJlb3JkZXJlZEl0ZW1zKSByZXR1cm47XG5cbiAgICB0aGlzLmRyYWdBbmREcm9wRGlzYWJsZWQuc2V0KHRydWUpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICAgICAgdGhpcy5jYXNlVGFnU2VydmljZS51cGRhdGVDYXNlVGFncyhkb2N1bWVudERlZmluaXRpb25OYW1lLCByZW9yZGVyZWRJdGVtcylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWxvYWQodHJ1ZSk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmRyYWdBbmREcm9wRGlzYWJsZWQuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVsb2FkKG5vQW5pbWF0aW9uID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWxvYWQkLm5leHQobm9BbmltYXRpb24gPyAnbm9BbmltYXRpb24nIDogbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGaWVsZHMoKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZHMkLm5leHQoW1xuICAgICAge1xuICAgICAgICBrZXk6ICd0aXRsZScsXG4gICAgICAgIGxhYmVsOiAnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3MuY29sdW1ucy50aXRsZScsXG5cbiAgICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdrZXknLFxuICAgICAgICBsYWJlbDogJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmNvbHVtbnMua2V5JyxcblxuICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuVEVYVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URU1QTEFURSxcbiAgICAgICAgdGVtcGxhdGU6IHRoaXMuY29sb3JDb2x1bW5UZW1wbGF0ZSxcbiAgICAgICAga2V5OiAnY29sb3InLFxuICAgICAgICBsYWJlbDogJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmNvbHVtbnMuY29sb3InLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48dmFsdGltby1jYXJib24tbGlzdFxuICAqbmdJZj1cIntcbiAgICBsb2FkaW5nOiBsb2FkaW5nJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50Q2FzZVRhZ3M6IGRvY3VtZW50Q2FzZVRhZ3MkIHwgYXN5bmMsXG4gICAgZmllbGRzOiBmaWVsZHMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbiAgW2l0ZW1zXT1cIm9icy5kb2N1bWVudENhc2VUYWdzXCJcbiAgW2ZpZWxkc109XCJvYnMuZmllbGRzXCJcbiAgW2hlYWRlcl09XCJmYWxzZVwiXG4gIFtsb2FkaW5nXT1cIm9icy5sb2FkaW5nXCJcbiAgW2FjdGlvbkl0ZW1zXT1cIkFDVElPTl9JVEVNU1wiXG4gIChyb3dDbGlja2VkKT1cIm9wZW5FZGl0TW9kYWwoJGV2ZW50KVwiXG4gIFtkcmFnQW5kRHJvcF09XCJ0cnVlXCJcbiAgW2RyYWdBbmREcm9wRGlzYWJsZWRdPVwiZHJhZ0FuZERyb3BEaXNhYmxlZCgpXCJcbiAgKGl0ZW1zUmVvcmRlcmVkKT1cIm9uSXRlbXNSZW9yZGVyZWRFdmVudCgkZXZlbnQpXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgIGNhcmJvblRvb2xiYXJDb250ZW50XG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zOyBjb250ZXh0OiB7b2JzOiBvYnN9XCJcbiAgPjwvbmctY29udGFpbmVyPlxuXG4gIDx2YWx0aW1vLW5vLXJlc3VsdHNcbiAgICBbZGVzY3JpcHRpb25dPVwiJ2Rvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLm5vUmVzdWx0cy5kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgIFt0aXRsZV09XCInZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3Mubm9SZXN1bHRzLnRpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cbjwvdmFsdGltby1jYXJib24tbGlzdD5cblxuPHZhbHRpbW8tZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFnLW1vZGFsXG4gIFt0eXBlXT1cInN0YXR1c01vZGFsVHlwZSQgfCBhc3luY1wiXG4gIFtwcmVmaWxsXT1cInByZWZpbGxDYXNlVGFnJCB8IGFzeW5jXCJcbiAgW3VzZWRLZXlzXT1cInVzZWRLZXlzJCB8IGFzeW5jXCJcbiAgW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdPVwiZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1wiXG4gIChjbG9zZU1vZGFsRXZlbnQpPVwiY2xvc2VNb2RhbCgkZXZlbnQpXCJcbj48L3ZhbHRpbW8tZG9zc2llci1tYW5hZ2VtZW50LWNhc2UtdGFnLW1vZGFsPlxuXG48dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImludGVyZmFjZS5kZWxldGVcIlxuICBjb25maXJtQnV0dG9uVHlwZT1cImRhbmdlclwiXG4gIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cImRvc3NpZXJNYW5hZ2VtZW50LmNhc2VUYWdzLmRlbGV0ZVRleHRcIlxuICBbb3V0cHV0T25Db25maXJtXT1cImNhc2VUYWdUb0RlbGV0ZSQgfCBhc3luY1wiXG4gIFtzaG93TW9kYWxTdWJqZWN0JF09XCJzaG93RGVsZXRlTW9kYWwkXCJcbiAgdGl0bGVUcmFuc2xhdGlvbktleT1cImludGVyZmFjZS5kZWxldGVcIlxuICAoY29uZmlybUV2ZW50KT1cImNvbmZpcm1EZWxldGVDYXNlVGFnKCRldmVudClcIlxuPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9ucyBsZXQtb2JzPVwib2JzXCI+XG4gIDxkaXYgY2xhc3M9XCJkb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkc19fYnV0dG9uc1wiPlxuICAgIDxidXR0b24gY2RzQnV0dG9uPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJvYnMubG9hZGluZ1wiIChjbGljayk9XCJvcGVuQWRkTW9kYWwoKVwiPlxuICAgICAgPHN2ZyBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPjwvc3ZnPlxuXG4gICAgICB7eyAnZG9zc2llck1hbmFnZW1lbnQuY2FzZVRhZ3MuYWRkJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29sb3JDb2x1bW5UZW1wbGF0ZSBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGNkcy10YWcgY2xhc3M9XCJjZHMtdGFnLS1uby1tYXJnaW5cIiBbdHlwZV09XCJkYXRhPy5pdGVtPy50YWdUeXBlXCI+XG4gICAge3sgJ2ludGVyZmFjZS50YWdUeXBlLicgKyBkYXRhPy5pdGVtPy50YWdUeXBlIHwgdHJhbnNsYXRlIH19XG4gIDwvY2RzLXRhZz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=