valtech-components 2.0.988 → 2.0.989

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 (31) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +6 -3
  2. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +229 -0
  3. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.i18n.mjs +38 -0
  4. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +519 -0
  5. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.i18n.mjs +54 -0
  6. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +406 -0
  7. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.i18n.mjs +72 -0
  8. package/esm2022/lib/components/organisms/member-detail-modal/types.mjs +2 -0
  9. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +231 -0
  10. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.i18n.mjs +27 -0
  11. package/esm2022/lib/components/organisms/transfer-ownership-modal/types.mjs +2 -0
  12. package/esm2022/lib/components/types.mjs +1 -1
  13. package/esm2022/lib/version.mjs +2 -2
  14. package/esm2022/public-api.mjs +7 -1
  15. package/fesm2022/valtech-components.mjs +1543 -30
  16. package/fesm2022/valtech-components.mjs.map +1 -1
  17. package/lib/components/organisms/article/article.component.d.ts +1 -0
  18. package/lib/components/organisms/edit-org-modal/edit-org-modal.component.d.ts +49 -0
  19. package/lib/components/organisms/edit-org-modal/edit-org-modal.i18n.d.ts +7 -0
  20. package/lib/components/organisms/invite-member-modal/invite-member-modal.component.d.ts +74 -0
  21. package/lib/components/organisms/invite-member-modal/invite-member-modal.i18n.d.ts +7 -0
  22. package/lib/components/organisms/member-detail-modal/member-detail-modal.component.d.ts +67 -0
  23. package/lib/components/organisms/member-detail-modal/member-detail-modal.i18n.d.ts +7 -0
  24. package/lib/components/organisms/member-detail-modal/types.d.ts +17 -0
  25. package/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.d.ts +44 -0
  26. package/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.i18n.d.ts +8 -0
  27. package/lib/components/organisms/transfer-ownership-modal/types.d.ts +11 -0
  28. package/lib/components/types.d.ts +2 -0
  29. package/lib/version.d.ts +1 -1
  30. package/package.json +1 -1
  31. package/public-api.d.ts +6 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Defaults i18n (es/en) embebidos en `val-invite-member-modal`. Auto-registrados
3
+ * en el constructor del componente si el consumer no proveyó el namespace
4
+ * (`InviteModal` por default). SOLO incluye las keys que el modal usa.
5
+ */
6
+ export const INVITE_MEMBER_MODAL_I18N = {
7
+ es: {
8
+ title: 'Invitar miembro',
9
+ subtitle: 'Busca por handle o escribe un correo para invitar.',
10
+ searchPlaceholder: 'Handle (@usuario) o correo...',
11
+ searchingLabel: 'Buscando...',
12
+ noResults: 'No se encontraron usuarios.',
13
+ inviteByEmail: 'Invitar por correo a:',
14
+ sendInvite: 'Enviar invitación',
15
+ sending: 'Enviando...',
16
+ success: 'Invitación enviada.',
17
+ successPlural: 'Invitaciones enviadas.',
18
+ close: 'Cerrar',
19
+ errorInvalid: 'Ingresa un handle o correo válido.',
20
+ sendSelected: 'Invitar seleccionados',
21
+ selectedLabel: 'Seleccionados',
22
+ roleLabel: 'Rol',
23
+ roleViewer: 'Visor',
24
+ roleViewerDesc: 'Solo lectura',
25
+ roleEditor: 'Editor',
26
+ roleEditorDesc: 'Puede editar contenido',
27
+ roleAdmin: 'Administrador',
28
+ roleAdminDesc: 'Gestión completa',
29
+ },
30
+ en: {
31
+ title: 'Invite member',
32
+ subtitle: 'Search by handle or enter an email to invite.',
33
+ searchPlaceholder: 'Handle (@user) or email...',
34
+ searchingLabel: 'Searching...',
35
+ noResults: 'No users found.',
36
+ inviteByEmail: 'Invite by email:',
37
+ sendInvite: 'Send invitation',
38
+ sending: 'Sending...',
39
+ success: 'Invitation sent.',
40
+ successPlural: 'Invitations sent.',
41
+ close: 'Close',
42
+ errorInvalid: 'Enter a valid handle or email.',
43
+ sendSelected: 'Invite selected',
44
+ selectedLabel: 'Selected',
45
+ roleLabel: 'Role',
46
+ roleViewer: 'Viewer',
47
+ roleViewerDesc: 'Read only',
48
+ roleEditor: 'Editor',
49
+ roleEditorDesc: 'Can edit content',
50
+ roleAdmin: 'Admin',
51
+ roleAdminDesc: 'Full management',
52
+ },
53
+ };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52aXRlLW1lbWJlci1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9pbnZpdGUtbWVtYmVyLW1vZGFsL2ludml0ZS1tZW1iZXItbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXFCO0lBQ3hELEVBQUUsRUFBRTtRQUNGLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsUUFBUSxFQUFFLG9EQUFvRDtRQUM5RCxpQkFBaUIsRUFBRSwrQkFBK0I7UUFDbEQsY0FBYyxFQUFFLGFBQWE7UUFDN0IsU0FBUyxFQUFFLDZCQUE2QjtRQUN4QyxhQUFhLEVBQUUsdUJBQXVCO1FBQ3RDLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsT0FBTyxFQUFFLGFBQWE7UUFDdEIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixhQUFhLEVBQUUsd0JBQXdCO1FBQ3ZDLEtBQUssRUFBRSxRQUFRO1FBQ2YsWUFBWSxFQUFFLG9DQUFvQztRQUNsRCxZQUFZLEVBQUUsdUJBQXVCO1FBQ3JDLGFBQWEsRUFBRSxlQUFlO1FBQzlCLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLGNBQWMsRUFBRSxjQUFjO1FBQzlCLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLGNBQWMsRUFBRSx3QkFBd0I7UUFDeEMsU0FBUyxFQUFFLGVBQWU7UUFDMUIsYUFBYSxFQUFFLGtCQUFrQjtLQUNsQztJQUNELEVBQUUsRUFBRTtRQUNGLEtBQUssRUFBRSxlQUFlO1FBQ3RCLFFBQVEsRUFBRSwrQ0FBK0M7UUFDekQsaUJBQWlCLEVBQUUsNEJBQTRCO1FBQy9DLGNBQWMsRUFBRSxjQUFjO1FBQzlCLFNBQVMsRUFBRSxpQkFBaUI7UUFDNUIsYUFBYSxFQUFFLGtCQUFrQjtRQUNqQyxVQUFVLEVBQUUsaUJBQWlCO1FBQzdCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsYUFBYSxFQUFFLG1CQUFtQjtRQUNsQyxLQUFLLEVBQUUsT0FBTztRQUNkLFlBQVksRUFBRSxnQ0FBZ0M7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixhQUFhLEVBQUUsVUFBVTtRQUN6QixTQUFTLEVBQUUsTUFBTTtRQUNqQixVQUFVLEVBQUUsUUFBUTtRQUNwQixjQUFjLEVBQUUsV0FBVztRQUMzQixVQUFVLEVBQUUsUUFBUTtRQUNwQixjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLGFBQWEsRUFBRSxpQkFBaUI7S0FDakM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1pbnZpdGUtbWVtYmVyLW1vZGFsYC4gQXV0by1yZWdpc3RyYWRvc1xuICogZW4gZWwgY29uc3RydWN0b3IgZGVsIGNvbXBvbmVudGUgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiAoYEludml0ZU1vZGFsYCBwb3IgZGVmYXVsdCkuIFNPTE8gaW5jbHV5ZSBsYXMga2V5cyBxdWUgZWwgbW9kYWwgdXNhLlxuICovXG5leHBvcnQgY29uc3QgSU5WSVRFX01FTUJFUl9NT0RBTF9JMThOOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIHRpdGxlOiAnSW52aXRhciBtaWVtYnJvJyxcbiAgICBzdWJ0aXRsZTogJ0J1c2NhIHBvciBoYW5kbGUgbyBlc2NyaWJlIHVuIGNvcnJlbyBwYXJhIGludml0YXIuJyxcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogJ0hhbmRsZSAoQHVzdWFyaW8pIG8gY29ycmVvLi4uJyxcbiAgICBzZWFyY2hpbmdMYWJlbDogJ0J1c2NhbmRvLi4uJyxcbiAgICBub1Jlc3VsdHM6ICdObyBzZSBlbmNvbnRyYXJvbiB1c3Vhcmlvcy4nLFxuICAgIGludml0ZUJ5RW1haWw6ICdJbnZpdGFyIHBvciBjb3JyZW8gYTonLFxuICAgIHNlbmRJbnZpdGU6ICdFbnZpYXIgaW52aXRhY2nDs24nLFxuICAgIHNlbmRpbmc6ICdFbnZpYW5kby4uLicsXG4gICAgc3VjY2VzczogJ0ludml0YWNpw7NuIGVudmlhZGEuJyxcbiAgICBzdWNjZXNzUGx1cmFsOiAnSW52aXRhY2lvbmVzIGVudmlhZGFzLicsXG4gICAgY2xvc2U6ICdDZXJyYXInLFxuICAgIGVycm9ySW52YWxpZDogJ0luZ3Jlc2EgdW4gaGFuZGxlIG8gY29ycmVvIHbDoWxpZG8uJyxcbiAgICBzZW5kU2VsZWN0ZWQ6ICdJbnZpdGFyIHNlbGVjY2lvbmFkb3MnLFxuICAgIHNlbGVjdGVkTGFiZWw6ICdTZWxlY2Npb25hZG9zJyxcbiAgICByb2xlTGFiZWw6ICdSb2wnLFxuICAgIHJvbGVWaWV3ZXI6ICdWaXNvcicsXG4gICAgcm9sZVZpZXdlckRlc2M6ICdTb2xvIGxlY3R1cmEnLFxuICAgIHJvbGVFZGl0b3I6ICdFZGl0b3InLFxuICAgIHJvbGVFZGl0b3JEZXNjOiAnUHVlZGUgZWRpdGFyIGNvbnRlbmlkbycsXG4gICAgcm9sZUFkbWluOiAnQWRtaW5pc3RyYWRvcicsXG4gICAgcm9sZUFkbWluRGVzYzogJ0dlc3Rpw7NuIGNvbXBsZXRhJyxcbiAgfSxcbiAgZW46IHtcbiAgICB0aXRsZTogJ0ludml0ZSBtZW1iZXInLFxuICAgIHN1YnRpdGxlOiAnU2VhcmNoIGJ5IGhhbmRsZSBvciBlbnRlciBhbiBlbWFpbCB0byBpbnZpdGUuJyxcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogJ0hhbmRsZSAoQHVzZXIpIG9yIGVtYWlsLi4uJyxcbiAgICBzZWFyY2hpbmdMYWJlbDogJ1NlYXJjaGluZy4uLicsXG4gICAgbm9SZXN1bHRzOiAnTm8gdXNlcnMgZm91bmQuJyxcbiAgICBpbnZpdGVCeUVtYWlsOiAnSW52aXRlIGJ5IGVtYWlsOicsXG4gICAgc2VuZEludml0ZTogJ1NlbmQgaW52aXRhdGlvbicsXG4gICAgc2VuZGluZzogJ1NlbmRpbmcuLi4nLFxuICAgIHN1Y2Nlc3M6ICdJbnZpdGF0aW9uIHNlbnQuJyxcbiAgICBzdWNjZXNzUGx1cmFsOiAnSW52aXRhdGlvbnMgc2VudC4nLFxuICAgIGNsb3NlOiAnQ2xvc2UnLFxuICAgIGVycm9ySW52YWxpZDogJ0VudGVyIGEgdmFsaWQgaGFuZGxlIG9yIGVtYWlsLicsXG4gICAgc2VuZFNlbGVjdGVkOiAnSW52aXRlIHNlbGVjdGVkJyxcbiAgICBzZWxlY3RlZExhYmVsOiAnU2VsZWN0ZWQnLFxuICAgIHJvbGVMYWJlbDogJ1JvbGUnLFxuICAgIHJvbGVWaWV3ZXI6ICdWaWV3ZXInLFxuICAgIHJvbGVWaWV3ZXJEZXNjOiAnUmVhZCBvbmx5JyxcbiAgICByb2xlRWRpdG9yOiAnRWRpdG9yJyxcbiAgICByb2xlRWRpdG9yRGVzYzogJ0NhbiBlZGl0IGNvbnRlbnQnLFxuICAgIHJvbGVBZG1pbjogJ0FkbWluJyxcbiAgICByb2xlQWRtaW5EZXNjOiAnRnVsbCBtYW5hZ2VtZW50JyxcbiAgfSxcbn07XG4iXX0=
@@ -0,0 +1,406 @@
1
+ import { Component, computed, inject, Input, signal } from '@angular/core';
2
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import { IonButton, IonButtons, IonContent, IonHeader, IonToolbar } from '@ionic/angular/standalone';
5
+ import { ButtonComponent } from '../../atoms/button/button.component';
6
+ import { DisplayComponent } from '../../atoms/display/display.component';
7
+ import { TextComponent } from '../../atoms/text/text.component';
8
+ import { TitleComponent } from '../../atoms/title/title.component';
9
+ import { UserAvatarComponent } from '../../atoms/user-avatar/user-avatar.component';
10
+ import { SearchSelectorComponent } from '../../molecules/select-input/select-input.component';
11
+ import { ComponentStates, InputType } from '../../types';
12
+ import { I18nService } from '../../../services/i18n';
13
+ import { OrgService } from '../../../services/org/org.service';
14
+ import { ToastService } from '../../../services/toast.service';
15
+ import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
16
+ import { ConfirmationDialogService } from '../../../services/confirmation-dialog/confirmation-dialog.service';
17
+ import { MEMBER_DETAIL_MODAL_I18N } from './member-detail-modal.i18n';
18
+ import * as i0 from "@angular/core";
19
+ const DEFAULT_NAMESPACE = 'Settings.MemberDetail';
20
+ /**
21
+ * `val-member-detail-modal` — detalle de miembro de organización: perfil, rol y
22
+ * permisos. Promovido desde `showcase` bajo el proceso de ADR-021.
23
+ *
24
+ * Si `canManage` es true, permite cambiar el rol (vía `OrgService.changeMemberRole`)
25
+ * y quitar al miembro (vía `OrgService.removeMember`, con confirmación destructiva).
26
+ * Los permisos del rol actual se muestran cuando el consumer los provee en
27
+ * `availableRoles`.
28
+ *
29
+ * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` + callback
30
+ * `onChanged`. Header canónico (Regla #5): sin `ion-title`, botón Cerrar texto en
31
+ * `slot=end`, identidad en el body con `val-user-avatar`/`val-display`/`val-title`.
32
+ *
33
+ * Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el namespace
34
+ * `Settings.MemberDetail`.
35
+ */
36
+ export class MemberDetailModalComponent {
37
+ constructor() {
38
+ this.orgService = inject(OrgService);
39
+ this.toast = inject(ToastService);
40
+ this.errors = inject(ValtechErrorService);
41
+ this.i18n = inject(I18nService);
42
+ this.confirmDialog = inject(ConfirmationDialogService);
43
+ /** Organización a la que pertenece el miembro. */
44
+ this.orgId = '';
45
+ /** Si true, habilita cambio de rol y eliminación. */
46
+ this.canManage = false;
47
+ /** Si true, el miembro mostrado es el propio usuario. */
48
+ this.isSelf = false;
49
+ /** Roles disponibles (con permisos opcionales) para el selector de rol. */
50
+ this.availableRoles = [
51
+ { id: 'viewer', name: 'viewer' },
52
+ { id: 'editor', name: 'editor' },
53
+ { id: 'admin', name: 'admin' },
54
+ ];
55
+ /** Namespace i18n con que la vista resuelve sus textos. */
56
+ this.i18nNamespace = DEFAULT_NAMESPACE;
57
+ this.working = signal(false);
58
+ this.currentRole = signal('');
59
+ this.roleControl = new FormControl('');
60
+ this.displayName = computed(() => this.member?.name || this.member?.handle || this.member?.email || '—');
61
+ this.subtitle = computed(() => {
62
+ if (this.isSelf)
63
+ return this.t('subtitleSelf');
64
+ if (this.member?.handle)
65
+ return '@' + this.member.handle;
66
+ return this.member?.email ?? '';
67
+ });
68
+ this.currentRoleLabel = computed(() => this.roleLabel(this.currentRole()));
69
+ this.permissionsForCurrentRole = computed(() => {
70
+ const roleId = this.currentRole();
71
+ const role = this.availableRoles.find(r => r.id === roleId || r.name === roleId);
72
+ return role?.permissions ?? [];
73
+ });
74
+ this.roleSelectProps = computed(() => ({
75
+ control: this.roleControl,
76
+ label: '',
77
+ placeholder: this.t('roleLabel'),
78
+ type: InputType.SELECT,
79
+ state: this.working() ? ComponentStates.DISABLED : ComponentStates.ENABLED,
80
+ options: this.availableRoles.map(r => ({
81
+ id: r.id,
82
+ name: this.roleLabel(r.name),
83
+ order: 0,
84
+ })),
85
+ }));
86
+ this.removeButtonProps = computed(() => ({
87
+ text: this.t('removeCta'),
88
+ token: 'member-remove',
89
+ color: 'danger',
90
+ fill: 'outline',
91
+ expand: 'block',
92
+ size: 'default',
93
+ type: 'button',
94
+ state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,
95
+ }));
96
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
97
+ this.i18n.registerContent(DEFAULT_NAMESPACE, MEMBER_DETAIL_MODAL_I18N);
98
+ }
99
+ }
100
+ ngOnInit() {
101
+ if (!this.i18n.hasNamespace(this.i18nNamespace)) {
102
+ this.i18n.registerContent(this.i18nNamespace, MEMBER_DETAIL_MODAL_I18N);
103
+ }
104
+ const roleName = this.member?.roles?.[0] ?? '';
105
+ // Resolve the role name to its UUID -- the select uses r.id (UUID) as value
106
+ const matched = this.availableRoles.find(r => r.name === roleName);
107
+ const roleId = matched?.id ?? roleName;
108
+ this.currentRole.set(roleId);
109
+ this.roleControl.setValue(roleId, { emitEvent: false });
110
+ this.roleSub = this.roleControl.valueChanges.subscribe(v => {
111
+ if (v && v !== this.currentRole())
112
+ void this.onChangeRole(v);
113
+ });
114
+ }
115
+ permissionLabel(perm) {
116
+ if (perm === '*:*')
117
+ return this.t('permAll');
118
+ const [resource, action] = perm.split(':');
119
+ const resKey = {
120
+ users: 'permUsers',
121
+ documents: 'permDocuments',
122
+ roles: 'permRoles',
123
+ media: 'permMedia',
124
+ templates: 'permTemplates',
125
+ '*': 'permAll',
126
+ };
127
+ const actKey = {
128
+ read: 'permRead',
129
+ write: 'permWrite',
130
+ create: 'permCreate',
131
+ delete: 'permDelete',
132
+ manage: 'permManage',
133
+ '*': 'permAll',
134
+ };
135
+ const res = this.t(resKey[resource] ?? resource);
136
+ const act = this.t(actKey[action] ?? action);
137
+ return `${res}: ${act}`;
138
+ }
139
+ async onChangeRole(newRoleId) {
140
+ if (this.working())
141
+ return;
142
+ this.working.set(true);
143
+ try {
144
+ await firstValueFrom(this.orgService.changeMemberRole(this.orgId, this.member.userId, newRoleId));
145
+ this.currentRole.set(newRoleId);
146
+ this.member = { ...this.member, roles: [newRoleId] };
147
+ this.toast.show({
148
+ message: this.t('changeRoleSuccess'),
149
+ color: 'dark',
150
+ duration: 3000,
151
+ });
152
+ this.onChanged?.();
153
+ }
154
+ catch (err) {
155
+ this.roleControl.setValue(this.currentRole(), { emitEvent: false });
156
+ this.errors.handle(err, {
157
+ context: 'memberDetail.changeRole',
158
+ fallbackKey: 'changeRoleError',
159
+ i18nNamespace: this.i18nNamespace,
160
+ });
161
+ }
162
+ finally {
163
+ this.working.set(false);
164
+ }
165
+ }
166
+ async onRemove() {
167
+ if (this.working())
168
+ return;
169
+ const result = await this.confirmDialog.confirmDestructive({
170
+ title: this.t('removeConfirmTitle'),
171
+ message: this.t('removeConfirmMessage'),
172
+ confirmButton: { text: this.t('removeConfirmOk') },
173
+ cancelButton: { text: this.t('cancelCta') },
174
+ });
175
+ if (!result.confirmed)
176
+ return;
177
+ this.working.set(true);
178
+ try {
179
+ await firstValueFrom(this.orgService.removeMember(this.orgId, this.member.userId));
180
+ this.toast.show({
181
+ message: this.t('removeSuccess'),
182
+ color: 'dark',
183
+ duration: 3000,
184
+ });
185
+ this.onChanged?.();
186
+ this.dismiss();
187
+ }
188
+ catch (err) {
189
+ this.errors.handle(err, {
190
+ context: 'memberDetail.remove',
191
+ fallbackKey: 'removeError',
192
+ i18nNamespace: this.i18nNamespace,
193
+ });
194
+ }
195
+ finally {
196
+ this.working.set(false);
197
+ }
198
+ }
199
+ roleLabel(roleIdOrName) {
200
+ // Try to find by id first (post-change, UUID stored), then by name (initial load)
201
+ const found = this.availableRoles.find(r => r.id === roleIdOrName || r.name === roleIdOrName);
202
+ const name = found?.name ?? roleIdOrName;
203
+ const keyMap = {
204
+ viewer: 'roleViewer',
205
+ editor: 'roleEditor',
206
+ admin: 'roleAdmin',
207
+ super_admin: 'roleSuperAdmin',
208
+ };
209
+ const key = keyMap[name] ?? name;
210
+ const label = this.t(key);
211
+ return label && !label.startsWith('[') ? label : name;
212
+ }
213
+ ngOnDestroy() {
214
+ this.roleSub?.unsubscribe();
215
+ }
216
+ dismiss() {
217
+ this._modalRef?.dismiss(null, 'cancel');
218
+ }
219
+ t(key) {
220
+ return this.i18n.t(key, this.i18nNamespace);
221
+ }
222
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberDetailModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
223
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MemberDetailModalComponent, isStandalone: true, selector: "val-member-detail-modal", inputs: { _modalRef: "_modalRef", member: "member", orgId: "orgId", canManage: "canManage", isSelf: "isSelf", availableRoles: "availableRoles", onChanged: "onChanged", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
224
+ <ion-header>
225
+ <ion-toolbar>
226
+ <ion-buttons slot="end">
227
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
228
+ <strong>{{ t('close') }}</strong>
229
+ </ion-button>
230
+ </ion-buttons>
231
+ </ion-toolbar>
232
+ </ion-header>
233
+
234
+ <ion-content class="ion-padding">
235
+ <div class="member-head">
236
+ <val-user-avatar
237
+ [props]="{
238
+ name: member.name,
239
+ avatarUrl: member.avatar,
240
+ email: member.email,
241
+ size: 'large',
242
+ }"
243
+ />
244
+ <val-display [props]="{ content: displayName(), size: 'small', color: 'dark' }" />
245
+ <val-title
246
+ [props]="{
247
+ content: subtitle(),
248
+ size: 'large',
249
+ color: '',
250
+ bold: false,
251
+ }"
252
+ />
253
+ </div>
254
+
255
+ <div class="role-section">
256
+ @if (canManage) {
257
+ <val-title
258
+ [props]="{
259
+ content: t('roleLabel'),
260
+ size: 'small',
261
+ color: 'dark',
262
+ bold: false,
263
+ }"
264
+ />
265
+ <val-select-input data-testid="member-role-select" [props]="roleSelectProps()" />
266
+ <val-text
267
+ [props]="{
268
+ content: t('roleHint'),
269
+ size: 'small',
270
+ color: 'medium',
271
+ bold: false,
272
+ }"
273
+ />
274
+ } @else {
275
+ <span class="role-readonly-label">{{ t('roleReadonly') }}</span>
276
+ <span class="member-role-badge">{{ currentRoleLabel() }}</span>
277
+ }
278
+ </div>
279
+
280
+ @if (permissionsForCurrentRole().length > 0) {
281
+ <div class="perms-section">
282
+ <span class="perms-label">{{ t('permissionsTitle') }}</span>
283
+ <div class="perms-list">
284
+ @for (perm of permissionsForCurrentRole(); track perm) {
285
+ <span class="perm-chip">{{ permissionLabel(perm) }}</span>
286
+ }
287
+ </div>
288
+ </div>
289
+ }
290
+
291
+ @if (canManage) {
292
+ <div class="remove-section">
293
+ <val-button [props]="removeButtonProps()" (click)="onRemove()" />
294
+ </div>
295
+ }
296
+ </ion-content>
297
+ `, isInline: true, styles: ["ion-content{--padding-bottom: 24px}.member-head{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;margin-bottom:20px}val-display{display:block}val-title{display:block}.role-section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.role-readonly-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.member-role-badge{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:4px 12px;border-radius:20px;width:fit-content;background:color-mix(in srgb,var(--ion-color-primary) 12%,transparent);color:var(--ion-color-primary)}.perms-section{display:flex;flex-direction:column;gap:10px;margin-bottom:24px}.perms-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.perms-list{display:flex;flex-wrap:wrap;gap:6px}.perm-chip{font-size:.75rem;font-weight:500;padding:3px 10px;border-radius:20px;border:1px solid var(--val-border-color, rgba(0, 0, 0, .12));color:var(--ion-color-dark);background:transparent}.remove-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08));padding-top:20px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }] }); }
298
+ }
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberDetailModalComponent, decorators: [{
300
+ type: Component,
301
+ args: [{ selector: 'val-member-detail-modal', standalone: true, imports: [
302
+ IonHeader,
303
+ IonToolbar,
304
+ IonButtons,
305
+ IonButton,
306
+ IonContent,
307
+ ReactiveFormsModule,
308
+ ButtonComponent,
309
+ DisplayComponent,
310
+ SearchSelectorComponent,
311
+ TextComponent,
312
+ TitleComponent,
313
+ UserAvatarComponent,
314
+ ], template: `
315
+ <ion-header>
316
+ <ion-toolbar>
317
+ <ion-buttons slot="end">
318
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
319
+ <strong>{{ t('close') }}</strong>
320
+ </ion-button>
321
+ </ion-buttons>
322
+ </ion-toolbar>
323
+ </ion-header>
324
+
325
+ <ion-content class="ion-padding">
326
+ <div class="member-head">
327
+ <val-user-avatar
328
+ [props]="{
329
+ name: member.name,
330
+ avatarUrl: member.avatar,
331
+ email: member.email,
332
+ size: 'large',
333
+ }"
334
+ />
335
+ <val-display [props]="{ content: displayName(), size: 'small', color: 'dark' }" />
336
+ <val-title
337
+ [props]="{
338
+ content: subtitle(),
339
+ size: 'large',
340
+ color: '',
341
+ bold: false,
342
+ }"
343
+ />
344
+ </div>
345
+
346
+ <div class="role-section">
347
+ @if (canManage) {
348
+ <val-title
349
+ [props]="{
350
+ content: t('roleLabel'),
351
+ size: 'small',
352
+ color: 'dark',
353
+ bold: false,
354
+ }"
355
+ />
356
+ <val-select-input data-testid="member-role-select" [props]="roleSelectProps()" />
357
+ <val-text
358
+ [props]="{
359
+ content: t('roleHint'),
360
+ size: 'small',
361
+ color: 'medium',
362
+ bold: false,
363
+ }"
364
+ />
365
+ } @else {
366
+ <span class="role-readonly-label">{{ t('roleReadonly') }}</span>
367
+ <span class="member-role-badge">{{ currentRoleLabel() }}</span>
368
+ }
369
+ </div>
370
+
371
+ @if (permissionsForCurrentRole().length > 0) {
372
+ <div class="perms-section">
373
+ <span class="perms-label">{{ t('permissionsTitle') }}</span>
374
+ <div class="perms-list">
375
+ @for (perm of permissionsForCurrentRole(); track perm) {
376
+ <span class="perm-chip">{{ permissionLabel(perm) }}</span>
377
+ }
378
+ </div>
379
+ </div>
380
+ }
381
+
382
+ @if (canManage) {
383
+ <div class="remove-section">
384
+ <val-button [props]="removeButtonProps()" (click)="onRemove()" />
385
+ </div>
386
+ }
387
+ </ion-content>
388
+ `, styles: ["ion-content{--padding-bottom: 24px}.member-head{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;margin-bottom:20px}val-display{display:block}val-title{display:block}.role-section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.role-readonly-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.member-role-badge{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:4px 12px;border-radius:20px;width:fit-content;background:color-mix(in srgb,var(--ion-color-primary) 12%,transparent);color:var(--ion-color-primary)}.perms-section{display:flex;flex-direction:column;gap:10px;margin-bottom:24px}.perms-label{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ion-color-medium)}.perms-list{display:flex;flex-wrap:wrap;gap:6px}.perm-chip{font-size:.75rem;font-weight:500;padding:3px 10px;border-radius:20px;border:1px solid var(--val-border-color, rgba(0, 0, 0, .12));color:var(--ion-color-dark);background:transparent}.remove-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08));padding-top:20px}\n"] }]
389
+ }], ctorParameters: () => [], propDecorators: { _modalRef: [{
390
+ type: Input
391
+ }], member: [{
392
+ type: Input
393
+ }], orgId: [{
394
+ type: Input
395
+ }], canManage: [{
396
+ type: Input
397
+ }], isSelf: [{
398
+ type: Input
399
+ }], availableRoles: [{
400
+ type: Input
401
+ }], onChanged: [{
402
+ type: Input
403
+ }], i18nNamespace: [{
404
+ type: Input
405
+ }] } });
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWRldGFpbC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21lbWJlci1kZXRhaWwtbW9kYWwvbWVtYmVyLWRldGFpbC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzlGLE9BQU8sRUFBa0IsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFF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YUFBYSx3RUFDYixjQUFjLHlFQUNkLG1CQUFtQjs7NEZBMEpWLDBCQUEwQjtrQkF6S3RDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixTQUFTO3dCQUNULFVBQVU7d0JBQ1YsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsdUJBQXVCO3dCQUN2QixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsbUJBQW1CO3FCQUNwQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBFVDt3REFzRlEsU0FBUztzQkFBakIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uVG9vbGJhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVc2VyQXZhdGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdXNlci1hdmF0YXIvdXNlci1hdmF0YXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3NlbGVjdC1pbnB1dC9zZWxlY3QtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhLCBDb21wb25lbnRTdGF0ZXMsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IE9yZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vcmcvb3JnLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBWYWx0ZWNoRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL3ZhbHRlY2gtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBNZW1iZXJEZXRhaWwsIE9yZ1JvbGVXaXRoUGVybWlzc2lvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE1FTUJFUl9ERVRBSUxfTU9EQUxfSTE4TiB9IGZyb20gJy4vbWVtYmVyLWRldGFpbC1tb2RhbC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuTWVtYmVyRGV0YWlsJztcblxuLyoqXG4gKiBgdmFsLW1lbWJlci1kZXRhaWwtbW9kYWxgIOKAlCBkZXRhbGxlIGRlIG1pZW1icm8gZGUgb3JnYW5pemFjacOzbjogcGVyZmlsLCByb2wgeVxuICogcGVybWlzb3MuIFByb21vdmlkbyBkZXNkZSBgc2hvd2Nhc2VgIGJham8gZWwgcHJvY2VzbyBkZSBBRFItMDIxLlxuICpcbiAqIFNpIGBjYW5NYW5hZ2VgIGVzIHRydWUsIHBlcm1pdGUgY2FtYmlhciBlbCByb2wgKHbDrWEgYE9yZ1NlcnZpY2UuY2hhbmdlTWVtYmVyUm9sZWApXG4gKiB5IHF1aXRhciBhbCBtaWVtYnJvICh2w61hIGBPcmdTZXJ2aWNlLnJlbW92ZU1lbWJlcmAsIGNvbiBjb25maXJtYWNpw7NuIGRlc3RydWN0aXZhKS5cbiAqIExvcyBwZXJtaXNvcyBkZWwgcm9sIGFjdHVhbCBzZSBtdWVzdHJhbiBjdWFuZG8gZWwgY29uc3VtZXIgbG9zIHByb3ZlZSBlblxuICogYGF2YWlsYWJsZVJvbGVzYC5cbiAqXG4gKiBBYmllcnRvIHbDrWEgYE1vZGFsU2VydmljZWAg4oCUIHJlY2liZSBgX21vZGFsUmVmYCBwb3IgYGNvbXBvbmVudFByb3BzYCArIGNhbGxiYWNrXG4gKiBgb25DaGFuZ2VkYC4gSGVhZGVyIGNhbsOzbmljbyAoUmVnbGEgIzUpOiBzaW4gYGlvbi10aXRsZWAsIGJvdMOzbiBDZXJyYXIgdGV4dG8gZW5cbiAqIGBzbG90PWVuZGAsIGlkZW50aWRhZCBlbiBlbCBib2R5IGNvbiBgdmFsLXVzZXItYXZhdGFyYC9gdmFsLWRpc3BsYXlgL2B2YWwtdGl0bGVgLlxuICpcbiAqIEF1dG8tcmVnaXN0cmEgc3VzIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBzaSBlbCBjb25zdW1lciBubyBwcm92ZXnDsyBlbCBuYW1lc3BhY2VcbiAqIGBTZXR0aW5ncy5NZW1iZXJEZXRhaWxgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbWVtYmVyLWRldGFpbC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uVG9vbGJhcixcbiAgICBJb25CdXR0b25zLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25Db250ZW50LFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgU2VhcmNoU2VsZWN0b3JDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgICBVc2VyQXZhdGFyQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJkaXNtaXNzKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuXG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZW1iZXItaGVhZFwiPlxuICAgICAgICA8dmFsLXVzZXItYXZhdGFyXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIG5hbWU6IG1lbWJlci5uYW1lLFxuICAgICAgICAgICAgYXZhdGFyVXJsOiBtZW1iZXIuYXZhdGFyLFxuICAgICAgICAgICAgZW1haWw6IG1lbWJlci5lbWFpbCxcbiAgICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgfVwiXG4gICAgICAgIC8+XG4gICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieyBjb250ZW50OiBkaXNwbGF5TmFtZSgpLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnIH1cIiAvPlxuICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIGNvbnRlbnQ6IHN1YnRpdGxlKCksXG4gICAgICAgICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgICAgICAgY29sb3I6ICcnLFxuICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgfVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInJvbGUtc2VjdGlvblwiPlxuICAgICAgICBAaWYgKGNhbk1hbmFnZSkge1xuICAgICAgICAgIDx2YWwtdGl0bGVcbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHQoJ3JvbGVMYWJlbCcpLFxuICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHZhbC1zZWxlY3QtaW5wdXQgZGF0YS10ZXN0aWQ9XCJtZW1iZXItcm9sZS1zZWxlY3RcIiBbcHJvcHNdPVwicm9sZVNlbGVjdFByb3BzKClcIiAvPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogdCgncm9sZUhpbnQnKSxcbiAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgY29sb3I6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm9sZS1yZWFkb25seS1sYWJlbFwiPnt7IHQoJ3JvbGVSZWFkb25seScpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVtYmVyLXJvbGUtYmFkZ2VcIj57eyBjdXJyZW50Um9sZUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHBlcm1pc3Npb25zRm9yQ3VycmVudFJvbGUoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtcy1zZWN0aW9uXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJtcy1sYWJlbFwiPnt7IHQoJ3Blcm1pc3Npb25zVGl0bGUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVybXMtbGlzdFwiPlxuICAgICAgICAgICAgQGZvciAocGVybSBvZiBwZXJtaXNzaW9uc0ZvckN1cnJlbnRSb2xlKCk7IHRyYWNrIHBlcm0pIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJtLWNoaXBcIj57eyBwZXJtaXNzaW9uTGFiZWwocGVybSkgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKGNhbk1hbmFnZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmVtb3ZlLXNlY3Rpb25cIj5cbiAgICAgICAgICA8dmFsLWJ1dHRvbiBbcHJvcHNdPVwicmVtb3ZlQnV0dG9uUHJvcHMoKVwiIChjbGljayk9XCJvblJlbW92ZSgpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9pb24tY29udGVudD5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgaW9uLWNvbnRlbnQge1xuICAgICAgICAtLXBhZGRpbmctYm90dG9tOiAyNHB4O1xuICAgICAgfVxuICAgICAgLm1lbWJlci1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cbiAgICAgIHZhbC1kaXNwbGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICB2YWwtdGl0bGUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5yb2xlLXNlY3Rpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgIH1cbiAgICAgIC5yb2xlLXJlYWRvbmx5LWxhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjc0cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICB9XG4gICAgICAubWVtYmVyLXJvbGUtYmFkZ2Uge1xuICAgICAgICBmb250LXNpemU6IDAuNzhyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSkgMTIlLCB0cmFuc3BhcmVudCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAucGVybXMtc2VjdGlvbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgIH1cbiAgICAgIC5wZXJtcy1sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NHJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgfVxuICAgICAgLnBlcm1zLWxpc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgfVxuICAgICAgLnBlcm0tY2hpcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgcGFkZGluZzogM3B4IDEwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXZhbC1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xMikpO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cbiAgICAgIC5yZW1vdmUtc2VjdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS12YWwtYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVtYmVyRGV0YWlsTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgb3JnU2VydmljZSA9IGluamVjdChPcmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb25maXJtRGlhbG9nID0gaW5qZWN0KENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UpO1xuXG4gIC8qKiBJbnllY3RhZG8gcG9yIGBNb2RhbFNlcnZpY2Uub3BlbmAg4oCUIHJlZmVyZW5jaWEgcGFyYSBjZXJyYXIgZGVzZGUgZGVudHJvLiAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gdm9pZCB9O1xuXG4gIC8qKiBNaWVtYnJvIGEgbW9zdHJhciAocGFzYWRvIHBvciBgY29tcG9uZW50UHJvcHNgKS4gKi9cbiAgQElucHV0KCkgbWVtYmVyITogTWVtYmVyRGV0YWlsO1xuXG4gIC8qKiBPcmdhbml6YWNpw7NuIGEgbGEgcXVlIHBlcnRlbmVjZSBlbCBtaWVtYnJvLiAqL1xuICBASW5wdXQoKSBvcmdJZCA9ICcnO1xuXG4gIC8qKiBTaSB0cnVlLCBoYWJpbGl0YSBjYW1iaW8gZGUgcm9sIHkgZWxpbWluYWNpw7NuLiAqL1xuICBASW5wdXQoKSBjYW5NYW5hZ2UgPSBmYWxzZTtcblxuICAvKiogU2kgdHJ1ZSwgZWwgbWllbWJybyBtb3N0cmFkbyBlcyBlbCBwcm9waW8gdXN1YXJpby4gKi9cbiAgQElucHV0KCkgaXNTZWxmID0gZmFsc2U7XG5cbiAgLyoqIFJvbGVzIGRpc3BvbmlibGVzIChjb24gcGVybWlzb3Mgb3BjaW9uYWxlcykgcGFyYSBlbCBzZWxlY3RvciBkZSByb2wuICovXG4gIEBJbnB1dCgpIGF2YWlsYWJsZVJvbGVzOiBPcmdSb2xlV2l0aFBlcm1pc3Npb25zW10gPSBbXG4gICAgeyBpZDogJ3ZpZXdlcicsIG5hbWU6ICd2aWV3ZXInIH0sXG4gICAgeyBpZDogJ2VkaXRvcicsIG5hbWU6ICdlZGl0b3InIH0sXG4gICAgeyBpZDogJ2FkbWluJywgbmFtZTogJ2FkbWluJyB9LFxuICBdO1xuXG4gIC8qKiBDYWxsYmFjayB0cmFzIGNhbWJpYXIgcm9sIG8gcXVpdGFyIGFsIG1pZW1icm8gKHBhc2FkbyBwb3IgYGNvbXBvbmVudFByb3BzYCkuICovXG4gIEBJbnB1dCgpIG9uQ2hhbmdlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIE5hbWVzcGFjZSBpMThuIGNvbiBxdWUgbGEgdmlzdGEgcmVzdWVsdmUgc3VzIHRleHRvcy4gKi9cbiAgQElucHV0KCkgaTE4bk5hbWVzcGFjZSA9IERFRkFVTFRfTkFNRVNQQUNFO1xuXG4gIHJlYWRvbmx5IHdvcmtpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBjdXJyZW50Um9sZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICByZWFkb25seSByb2xlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSByb2xlU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5tZW1iZXI/Lm5hbWUgfHwgdGhpcy5tZW1iZXI/LmhhbmRsZSB8fCB0aGlzLm1lbWJlcj8uZW1haWwgfHwgJ+KAlCdcbiAgKTtcblxuICByZWFkb25seSBzdWJ0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5pc1NlbGYpIHJldHVybiB0aGlzLnQoJ3N1YnRpdGxlU2VsZicpO1xuICAgIGlmICh0aGlzLm1lbWJlcj8uaGFuZGxlKSByZXR1cm4gJ0AnICsgdGhpcy5tZW1iZXIuaGFuZGxlO1xuICAgIHJldHVybiB0aGlzLm1lbWJlcj8uZW1haWwgPz8gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRSb2xlTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJvbGVMYWJlbCh0aGlzLmN1cnJlbnRSb2xlKCkpKTtcblxuICByZWFkb25seSBwZXJtaXNzaW9uc0ZvckN1cnJlbnRSb2xlID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHtcbiAgICBjb25zdCByb2xlSWQgPSB0aGlzLmN1cnJlbnRSb2xlKCk7XG4gICAgY29uc3Qgcm9sZSA9IHRoaXMuYXZhaWxhYmxlUm9sZXMuZmluZChyID0+IHIuaWQgPT09IHJvbGVJZCB8fCByLm5hbWUgPT09IHJvbGVJZCk7XG4gICAgcmV0dXJuIHJvbGU/LnBlcm1pc3Npb25zID8/IFtdO1xuICB9KTtcblxuICByZWFkb25seSByb2xlU2VsZWN0UHJvcHMgPSBjb21wdXRlZDxQYXJ0aWFsPElucHV0TWV0YWRhdGE+PigoKSA9PiAoe1xuICAgIGNvbnRyb2w6IHRoaXMucm9sZUNvbnRyb2wgYXMgRm9ybUNvbnRyb2wsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ3JvbGVMYWJlbCcpLFxuICAgIHR5cGU6IElucHV0VHlwZS5TRUxFQ1QsXG4gICAgc3RhdGU6IHRoaXMud29ya2luZygpID8gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgb3B0aW9uczogdGhpcy5hdmFpbGFibGVSb2xlcy5tYXAociA9PiAoe1xuICAgICAgaWQ6IHIuaWQsXG4gICAgICBuYW1lOiB0aGlzLnJvbGVMYWJlbChyLm5hbWUpLFxuICAgICAgb3JkZXI6IDAsXG4gICAgfSkpLFxuICB9KSk7XG5cbiAgcmVhZG9ubHkgcmVtb3ZlQnV0dG9uUHJvcHMgPSBjb21wdXRlZDxQYXJ0aWFsPEJ1dHRvbk1ldGFkYXRhPj4oKCkgPT4gKHtcbiAgICB0ZXh0OiB0aGlzLnQoJ3JlbW92ZUN0YScpLFxuICAgIHRva2VuOiAnbWVtYmVyLXJlbW92ZScsXG4gICAgY29sb3I6ICdkYW5nZXInLFxuICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIHR5cGU6ICdidXR0b24nLFxuICAgIHN0YXRlOiB0aGlzLndvcmtpbmcoKSA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gIH0pKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoREVGQVVMVF9OQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KERFRkFVTFRfTkFNRVNQQUNFLCBNRU1CRVJfREVUQUlMX01PREFMX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZSh0aGlzLmkxOG5OYW1lc3BhY2UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KHRoaXMuaTE4bk5hbWVzcGFjZSwgTUVNQkVSX0RFVEFJTF9NT0RBTF9JMThOKTtcbiAgICB9XG4gICAgY29uc3Qgcm9sZU5hbWUgPSB0aGlzLm1lbWJlcj8ucm9sZXM/LlswXSA/PyAnJztcbiAgICAvLyBSZXNvbHZlIHRoZSByb2xlIG5hbWUgdG8gaXRzIFVVSUQgLS0gdGhlIHNlbGVjdCB1c2VzIHIuaWQgKFVVSUQpIGFzIHZhbHVlXG4gICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMuYXZhaWxhYmxlUm9sZXMuZmluZChyID0+IHIubmFtZSA9PT0gcm9sZU5hbWUpO1xuICAgIGNvbnN0IHJvbGVJZCA9IG1hdGNoZWQ/LmlkID8/IHJvbGVOYW1lO1xuICAgIHRoaXMuY3VycmVudFJvbGUuc2V0KHJvbGVJZCk7XG4gICAgdGhpcy5yb2xlQ29udHJvbC5zZXRWYWx1ZShyb2xlSWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLnJvbGVTdWIgPSB0aGlzLnJvbGVDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XG4gICAgICBpZiAodiAmJiB2ICE9PSB0aGlzLmN1cnJlbnRSb2xlKCkpIHZvaWQgdGhpcy5vbkNoYW5nZVJvbGUodik7XG4gICAgfSk7XG4gIH1cblxuICBwZXJtaXNzaW9uTGFiZWwocGVybTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocGVybSA9PT0gJyo6KicpIHJldHVybiB0aGlzLnQoJ3Blcm1BbGwnKTtcbiAgICBjb25zdCBbcmVzb3VyY2UsIGFjdGlvbl0gPSBwZXJtLnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgcmVzS2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgdXNlcnM6ICdwZXJtVXNlcnMnLFxuICAgICAgZG9jdW1lbnRzOiAncGVybURvY3VtZW50cycsXG4gICAgICByb2xlczogJ3Blcm1Sb2xlcycsXG4gICAgICBtZWRpYTogJ3Blcm1NZWRpYScsXG4gICAgICB0ZW1wbGF0ZXM6ICdwZXJtVGVtcGxhdGVzJyxcbiAgICAgICcqJzogJ3Blcm1BbGwnLFxuICAgIH07XG4gICAgY29uc3QgYWN0S2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcmVhZDogJ3Blcm1SZWFkJyxcbiAgICAgIHdyaXRlOiAncGVybVdyaXRlJyxcbiAgICAgIGNyZWF0ZTogJ3Blcm1DcmVhdGUnLFxuICAgICAgZGVsZXRlOiAncGVybURlbGV0ZScsXG4gICAgICBtYW5hZ2U6ICdwZXJtTWFuYWdlJyxcbiAgICAgICcqJzogJ3Blcm1BbGwnLFxuICAgIH07XG4gICAgY29uc3QgcmVzID0gdGhpcy50KHJlc0tleVtyZXNvdXJjZV0gPz8gcmVzb3VyY2UpO1xuICAgIGNvbnN0IGFjdCA9IHRoaXMudChhY3RLZXlbYWN0aW9uXSA/PyBhY3Rpb24pO1xuICAgIHJldHVybiBgJHtyZXN9OiAke2FjdH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvbkNoYW5nZVJvbGUobmV3Um9sZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53b3JraW5nKCkpIHJldHVybjtcbiAgICB0aGlzLndvcmtpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLm9yZ1NlcnZpY2UuY2hhbmdlTWVtYmVyUm9sZSh0aGlzLm9yZ0lkLCB0aGlzLm1lbWJlci51c2VySWQsIG5ld1JvbGVJZCkpO1xuICAgICAgdGhpcy5jdXJyZW50Um9sZS5zZXQobmV3Um9sZUlkKTtcbiAgICAgIHRoaXMubWVtYmVyID0geyAuLi50aGlzLm1lbWJlciwgcm9sZXM6IFtuZXdSb2xlSWRdIH07XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2NoYW5nZVJvbGVTdWNjZXNzJyksXG4gICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlZD8uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnJvbGVDb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFJvbGUoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnbWVtYmVyRGV0YWlsLmNoYW5nZVJvbGUnLFxuICAgICAgICBmYWxsYmFja0tleTogJ2NoYW5nZVJvbGVFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IHRoaXMuaTE4bk5hbWVzcGFjZSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLndvcmtpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblJlbW92ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53b3JraW5nKCkpIHJldHVybjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1EaWFsb2cuY29uZmlybURlc3RydWN0aXZlKHtcbiAgICAgIHRpdGxlOiB0aGlzLnQoJ3JlbW92ZUNvbmZpcm1UaXRsZScpLFxuICAgICAgbWVzc2FnZTogdGhpcy50KCdyZW1vdmVDb25maXJtTWVzc2FnZScpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiB0aGlzLnQoJ3JlbW92ZUNvbmZpcm1PaycpIH0sXG4gICAgICBjYW5jZWxCdXR0b246IHsgdGV4dDogdGhpcy50KCdjYW5jZWxDdGEnKSB9LFxuICAgIH0pO1xuICAgIGlmICghcmVzdWx0LmNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIHRoaXMud29ya2luZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMub3JnU2VydmljZS5yZW1vdmVNZW1iZXIodGhpcy5vcmdJZCwgdGhpcy5tZW1iZXIudXNlcklkKSk7XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ3JlbW92ZVN1Y2Nlc3MnKSxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub25DaGFuZ2VkPy4oKTtcbiAgICAgIHRoaXMuZGlzbWlzcygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnbWVtYmVyRGV0YWlsLnJlbW92ZScsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAncmVtb3ZlRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiB0aGlzLmkxOG5OYW1lc3BhY2UsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy53b3JraW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcm9sZUxhYmVsKHJvbGVJZE9yTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUcnkgdG8gZmluZCBieSBpZCBmaXJzdCAocG9zdC1jaGFuZ2UsIFVVSUQgc3RvcmVkKSwgdGhlbiBieSBuYW1lIChpbml0aWFsIGxvYWQpXG4gICAgY29uc3QgZm91bmQgPSB0aGlzLmF2YWlsYWJsZVJvbGVzLmZpbmQociA9PiByLmlkID09PSByb2xlSWRPck5hbWUgfHwgci5uYW1lID09PSByb2xlSWRPck5hbWUpO1xuICAgIGNvbnN0IG5hbWUgPSBmb3VuZD8ubmFtZSA/PyByb2xlSWRPck5hbWU7XG4gICAgY29uc3Qga2V5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgdmlld2VyOiAncm9sZVZpZXdlcicsXG4gICAgICBlZGl0b3I6ICdyb2xlRWRpdG9yJyxcbiAgICAgIGFkbWluOiAncm9sZUFkbWluJyxcbiAgICAgIHN1cGVyX2FkbWluOiAncm9sZVN1cGVyQWRtaW4nLFxuICAgIH07XG4gICAgY29uc3Qga2V5ID0ga2V5TWFwW25hbWVdID8/IG5hbWU7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLnQoa2V5KTtcbiAgICByZXR1cm4gbGFiZWwgJiYgIWxhYmVsLnN0YXJ0c1dpdGgoJ1snKSA/IGxhYmVsIDogbmFtZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucm9sZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGRpc21pc3MoKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kYWxSZWY/LmRpc21pc3MobnVsbCwgJ2NhbmNlbCcpO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5pMThuTmFtZXNwYWNlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Defaults i18n (es/en) embebidos en `val-member-detail-modal`. Auto-registrados
3
+ * en el constructor del componente si el consumer no proveyó el namespace
4
+ * (`Settings.MemberDetail` por default). SOLO incluye las keys que el modal usa.
5
+ */
6
+ export const MEMBER_DETAIL_MODAL_I18N = {
7
+ es: {
8
+ close: 'Cerrar',
9
+ subtitleSelf: 'Tú',
10
+ roleLabel: 'Rol',
11
+ roleHint: 'Cambia el rol de este miembro en la organización.',
12
+ roleReadonly: 'Rol en la organización',
13
+ roleViewer: 'Visor',
14
+ roleEditor: 'Editor',
15
+ roleAdmin: 'Admin',
16
+ roleSuperAdmin: 'Super Admin',
17
+ removeCta: 'Quitar de la organización',
18
+ removeConfirmTitle: 'Quitar miembro',
19
+ removeConfirmMessage: '¿Quitar a este miembro de la organización?',
20
+ removeConfirmOk: 'Quitar',
21
+ cancelCta: 'Cancelar',
22
+ changeRoleSuccess: 'Rol actualizado.',
23
+ changeRoleError: 'No se pudo cambiar el rol.',
24
+ removeSuccess: 'Miembro eliminado.',
25
+ removeError: 'No se pudo eliminar al miembro.',
26
+ permissionsTitle: 'Permisos del rol',
27
+ permAll: 'Todo',
28
+ permUsers: 'Usuarios',
29
+ permDocuments: 'Documentos',
30
+ permRoles: 'Roles',
31
+ permMedia: 'Media',
32
+ permTemplates: 'Plantillas',
33
+ permRead: 'Leer',
34
+ permWrite: 'Escribir',
35
+ permCreate: 'Crear',
36
+ permDelete: 'Eliminar',
37
+ permManage: 'Gestionar',
38
+ },
39
+ en: {
40
+ close: 'Close',
41
+ subtitleSelf: 'You',
42
+ roleLabel: 'Role',
43
+ roleHint: "Change this member's role in the organization.",
44
+ roleReadonly: 'Role in the organization',
45
+ roleViewer: 'Viewer',
46
+ roleEditor: 'Editor',
47
+ roleAdmin: 'Admin',
48
+ roleSuperAdmin: 'Super Admin',
49
+ removeCta: 'Remove from organization',
50
+ removeConfirmTitle: 'Remove member',
51
+ removeConfirmMessage: 'Remove this member from the organization?',
52
+ removeConfirmOk: 'Remove',
53
+ cancelCta: 'Cancel',
54
+ changeRoleSuccess: 'Role updated.',
55
+ changeRoleError: 'Could not change role.',
56
+ removeSuccess: 'Member removed.',
57
+ removeError: 'Could not remove member.',
58
+ permissionsTitle: 'Role permissions',
59
+ permAll: 'All',
60
+ permUsers: 'Users',
61
+ permDocuments: 'Documents',
62
+ permRoles: 'Roles',
63
+ permMedia: 'Media',
64
+ permTemplates: 'Templates',
65
+ permRead: 'Read',
66
+ permWrite: 'Write',
67
+ permCreate: 'Create',
68
+ permDelete: 'Delete',
69
+ permManage: 'Manage',
70
+ },
71
+ };
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWRldGFpbC1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9tZW1iZXItZGV0YWlsLW1vZGFsL21lbWJlci1kZXRhaWwtbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXFCO0lBQ3hELEVBQUUsRUFBRTtRQUNGLEtBQUssRUFBRSxRQUFRO1FBQ2YsWUFBWSxFQUFFLElBQUk7UUFDbEIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsUUFBUSxFQUFFLG1EQUFtRDtRQUM3RCxZQUFZLEVBQUUsd0JBQXdCO1FBQ3RDLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLGNBQWMsRUFBRSxhQUFhO1FBQzdCLFNBQVMsRUFBRSwyQkFBMkI7UUFDdEMsa0JBQWtCLEVBQUUsZ0JBQWdCO1FBQ3BDLG9CQUFvQixFQUFFLDRDQUE0QztRQUNsRSxlQUFlLEVBQUUsUUFBUTtRQUN6QixTQUFTLEVBQUUsVUFBVTtRQUNyQixpQkFBaUIsRUFBRSxrQkFBa0I7UUFDckMsZUFBZSxFQUFFLDRCQUE0QjtRQUM3QyxhQUFhLEVBQUUsb0JBQW9CO1FBQ25DLFdBQVcsRUFBRSxpQ0FBaUM7UUFDOUMsZ0JBQWdCLEVBQUUsa0JBQWtCO1FBQ3BDLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLFVBQVU7UUFDckIsYUFBYSxFQUFFLFlBQVk7UUFDM0IsU0FBUyxFQUFFLE9BQU87UUFDbEIsU0FBUyxFQUFFLE9BQU87UUFDbEIsYUFBYSxFQUFFLFlBQVk7UUFDM0IsUUFBUSxFQUFFLE1BQU07UUFDaEIsU0FBUyxFQUFFLFVBQVU7UUFDckIsVUFBVSxFQUFFLE9BQU87UUFDbkIsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFdBQVc7S0FDeEI7SUFDRCxFQUFFLEVBQUU7UUFDRixLQUFLLEVBQUUsT0FBTztRQUNkLFlBQVksRUFBRSxLQUFLO1FBQ25CLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLFFBQVEsRUFBRSxnREFBZ0Q7UUFDMUQsWUFBWSxFQUFFLDBCQUEwQjtRQUN4QyxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsUUFBUTtRQUNwQixTQUFTLEVBQUUsT0FBTztRQUNsQixjQUFjLEVBQUUsYUFBYTtRQUM3QixTQUFTLEVBQUUsMEJBQTBCO1FBQ3JDLGtCQUFrQixFQUFFLGVBQWU7UUFDbkMsb0JBQW9CLEVBQUUsMkNBQTJDO1FBQ2pFLGVBQWUsRUFBRSxRQUFRO1FBQ3pCLFNBQVMsRUFBRSxRQUFRO1FBQ25CLGlCQUFpQixFQUFFLGVBQWU7UUFDbEMsZUFBZSxFQUFFLHdCQUF3QjtRQUN6QyxhQUFhLEVBQUUsaUJBQWlCO1FBQ2hDLFdBQVcsRUFBRSwwQkFBMEI7UUFDdkMsZ0JBQWdCLEVBQUUsa0JBQWtCO1FBQ3BDLE9BQU8sRUFBRSxLQUFLO1FBQ2QsU0FBUyxFQUFFLE9BQU87UUFDbEIsYUFBYSxFQUFFLFdBQVc7UUFDMUIsU0FBUyxFQUFFLE9BQU87UUFDbEIsU0FBUyxFQUFFLE9BQU87UUFDbEIsYUFBYSxFQUFFLFdBQVc7UUFDMUIsUUFBUSxFQUFFLE1BQU07UUFDaEIsU0FBUyxFQUFFLE9BQU87UUFDbEIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFFBQVE7S0FDckI7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1tZW1iZXItZGV0YWlsLW1vZGFsYC4gQXV0by1yZWdpc3RyYWRvc1xuICogZW4gZWwgY29uc3RydWN0b3IgZGVsIGNvbXBvbmVudGUgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiAoYFNldHRpbmdzLk1lbWJlckRldGFpbGAgcG9yIGRlZmF1bHQpLiBTT0xPIGluY2x1eWUgbGFzIGtleXMgcXVlIGVsIG1vZGFsIHVzYS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FTUJFUl9ERVRBSUxfTU9EQUxfSTE4TjogTGFuZ3VhZ2VzQ29udGVudCA9IHtcbiAgZXM6IHtcbiAgICBjbG9zZTogJ0NlcnJhcicsXG4gICAgc3VidGl0bGVTZWxmOiAnVMO6JyxcbiAgICByb2xlTGFiZWw6ICdSb2wnLFxuICAgIHJvbGVIaW50OiAnQ2FtYmlhIGVsIHJvbCBkZSBlc3RlIG1pZW1icm8gZW4gbGEgb3JnYW5pemFjacOzbi4nLFxuICAgIHJvbGVSZWFkb25seTogJ1JvbCBlbiBsYSBvcmdhbml6YWNpw7NuJyxcbiAgICByb2xlVmlld2VyOiAnVmlzb3InLFxuICAgIHJvbGVFZGl0b3I6ICdFZGl0b3InLFxuICAgIHJvbGVBZG1pbjogJ0FkbWluJyxcbiAgICByb2xlU3VwZXJBZG1pbjogJ1N1cGVyIEFkbWluJyxcbiAgICByZW1vdmVDdGE6ICdRdWl0YXIgZGUgbGEgb3JnYW5pemFjacOzbicsXG4gICAgcmVtb3ZlQ29uZmlybVRpdGxlOiAnUXVpdGFyIG1pZW1icm8nLFxuICAgIHJlbW92ZUNvbmZpcm1NZXNzYWdlOiAnwr9RdWl0YXIgYSBlc3RlIG1pZW1icm8gZGUgbGEgb3JnYW5pemFjacOzbj8nLFxuICAgIHJlbW92ZUNvbmZpcm1PazogJ1F1aXRhcicsXG4gICAgY2FuY2VsQ3RhOiAnQ2FuY2VsYXInLFxuICAgIGNoYW5nZVJvbGVTdWNjZXNzOiAnUm9sIGFjdHVhbGl6YWRvLicsXG4gICAgY2hhbmdlUm9sZUVycm9yOiAnTm8gc2UgcHVkbyBjYW1iaWFyIGVsIHJvbC4nLFxuICAgIHJlbW92ZVN1Y2Nlc3M6ICdNaWVtYnJvIGVsaW1pbmFkby4nLFxuICAgIHJlbW92ZUVycm9yOiAnTm8gc2UgcHVkbyBlbGltaW5hciBhbCBtaWVtYnJvLicsXG4gICAgcGVybWlzc2lvbnNUaXRsZTogJ1Blcm1pc29zIGRlbCByb2wnLFxuICAgIHBlcm1BbGw6ICdUb2RvJyxcbiAgICBwZXJtVXNlcnM6ICdVc3VhcmlvcycsXG4gICAgcGVybURvY3VtZW50czogJ0RvY3VtZW50b3MnLFxuICAgIHBlcm1Sb2xlczogJ1JvbGVzJyxcbiAgICBwZXJtTWVkaWE6ICdNZWRpYScsXG4gICAgcGVybVRlbXBsYXRlczogJ1BsYW50aWxsYXMnLFxuICAgIHBlcm1SZWFkOiAnTGVlcicsXG4gICAgcGVybVdyaXRlOiAnRXNjcmliaXInLFxuICAgIHBlcm1DcmVhdGU6ICdDcmVhcicsXG4gICAgcGVybURlbGV0ZTogJ0VsaW1pbmFyJyxcbiAgICBwZXJtTWFuYWdlOiAnR2VzdGlvbmFyJyxcbiAgfSxcbiAgZW46IHtcbiAgICBjbG9zZTogJ0Nsb3NlJyxcbiAgICBzdWJ0aXRsZVNlbGY6ICdZb3UnLFxuICAgIHJvbGVMYWJlbDogJ1JvbGUnLFxuICAgIHJvbGVIaW50OiBcIkNoYW5nZSB0aGlzIG1lbWJlcidzIHJvbGUgaW4gdGhlIG9yZ2FuaXphdGlvbi5cIixcbiAgICByb2xlUmVhZG9ubHk6ICdSb2xlIGluIHRoZSBvcmdhbml6YXRpb24nLFxuICAgIHJvbGVWaWV3ZXI6ICdWaWV3ZXInLFxuICAgIHJvbGVFZGl0b3I6ICdFZGl0b3InLFxuICAgIHJvbGVBZG1pbjogJ0FkbWluJyxcbiAgICByb2xlU3VwZXJBZG1pbjogJ1N1cGVyIEFkbWluJyxcbiAgICByZW1vdmVDdGE6ICdSZW1vdmUgZnJvbSBvcmdhbml6YXRpb24nLFxuICAgIHJlbW92ZUNvbmZpcm1UaXRsZTogJ1JlbW92ZSBtZW1iZXInLFxuICAgIHJlbW92ZUNvbmZpcm1NZXNzYWdlOiAnUmVtb3ZlIHRoaXMgbWVtYmVyIGZyb20gdGhlIG9yZ2FuaXphdGlvbj8nLFxuICAgIHJlbW92ZUNvbmZpcm1PazogJ1JlbW92ZScsXG4gICAgY2FuY2VsQ3RhOiAnQ2FuY2VsJyxcbiAgICBjaGFuZ2VSb2xlU3VjY2VzczogJ1JvbGUgdXBkYXRlZC4nLFxuICAgIGNoYW5nZVJvbGVFcnJvcjogJ0NvdWxkIG5vdCBjaGFuZ2Ugcm9sZS4nLFxuICAgIHJlbW92ZVN1Y2Nlc3M6ICdNZW1iZXIgcmVtb3ZlZC4nLFxuICAgIHJlbW92ZUVycm9yOiAnQ291bGQgbm90IHJlbW92ZSBtZW1iZXIuJyxcbiAgICBwZXJtaXNzaW9uc1RpdGxlOiAnUm9sZSBwZXJtaXNzaW9ucycsXG4gICAgcGVybUFsbDogJ0FsbCcsXG4gICAgcGVybVVzZXJzOiAnVXNlcnMnLFxuICAgIHBlcm1Eb2N1bWVudHM6ICdEb2N1bWVudHMnLFxuICAgIHBlcm1Sb2xlczogJ1JvbGVzJyxcbiAgICBwZXJtTWVkaWE6ICdNZWRpYScsXG4gICAgcGVybVRlbXBsYXRlczogJ1RlbXBsYXRlcycsXG4gICAgcGVybVJlYWQ6ICdSZWFkJyxcbiAgICBwZXJtV3JpdGU6ICdXcml0ZScsXG4gICAgcGVybUNyZWF0ZTogJ0NyZWF0ZScsXG4gICAgcGVybURlbGV0ZTogJ0RlbGV0ZScsXG4gICAgcGVybU1hbmFnZTogJ01hbmFnZScsXG4gIH0sXG59O1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL21lbWJlci1kZXRhaWwtbW9kYWwvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ01lbWJlciwgT3JnUm9sZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL29yZy90eXBlcyc7XG5cbi8qKlxuICogTWllbWJybyBkZSBvcmdhbml6YWNpw7NuIGVucmlxdWVjaWRvIGNvbiBkYXRvcyBkZSBwZXJmaWwgcMO6YmxpY29cbiAqIChgaGFuZGxlYC9gYXZhdGFyYCksIGNvbnN1bWlkbyBwb3IgYHZhbC1tZW1iZXItZGV0YWlsLW1vZGFsYC4gUHJvbW92aWRvIGRlc2RlXG4gKiBgc2hvd2Nhc2VgIGJham8gZWwgcHJvY2VzbyBkZSBBRFItMDIxLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbWJlckRldGFpbCBleHRlbmRzIE9yZ01lbWJlciB7XG4gIGhhbmRsZT86IHN0cmluZztcbiAgYXZhdGFyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJvbCBkZSBvcmdhbml6YWNpw7NuIGNvbiBwZXJtaXNvcyBvcGNpb25hbGVzLiBFbCBtb2RhbCBtdWVzdHJhIGxvcyBwZXJtaXNvcyBkZWxcbiAqIHJvbCBhY3R1YWwgY3VhbmRvIGVsIGNvbnN1bWVyIGxvcyBwcm92ZWUgZW4gYGF2YWlsYWJsZVJvbGVzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdSb2xlV2l0aFBlcm1pc3Npb25zIGV4dGVuZHMgT3JnUm9sZSB7XG4gIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG59XG4iXX0=