@idea-ionic/agenda 8.2.9 → 8.2.11

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.
@@ -58,46 +58,47 @@ export class IDEACalendarCreationComponent {
58
58
  this.calendar.load(cal);
59
59
  this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');
60
60
  if (!cal.external) {
61
- this._modal.dismiss(this.calendar);
61
+ await this._modal.dismiss(this.calendar);
62
62
  return;
63
63
  }
64
64
  try {
65
- await this._calendars.linkExtService(this.calendar);
65
+ await this._loading.hide();
66
+ await this._calendars.linkExtService(this.calendar, this.baseURL);
66
67
  const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);
67
68
  if (!res) {
68
- this._modal.dismiss(this.calendar);
69
+ await this._modal.dismiss(this.calendar);
69
70
  return;
70
71
  }
71
72
  this.calendar.load(res);
72
- await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
73
73
  try {
74
+ await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
74
75
  await this._calendars.syncCalendar(this.calendar);
75
- this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
76
+ await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
76
77
  }
77
78
  catch (error) {
78
- this._message.error('COMMON.OPERATION_FAILED');
79
+ await this._message.error('COMMON.OPERATION_FAILED');
79
80
  }
80
81
  finally {
81
- this._modal.dismiss(this.calendar);
82
+ await this._modal.dismiss(this.calendar);
82
83
  }
83
84
  }
84
85
  catch (error) {
85
- this._message.error('COMMON.OPERATION_FAILED');
86
- this._modal.dismiss(this.calendar);
86
+ await this._message.error('COMMON.OPERATION_FAILED');
87
+ await this._modal.dismiss(this.calendar);
87
88
  }
88
89
  }
89
90
  catch (error) {
90
- this._message.error('COMMON.OPERATION_FAILED');
91
+ await this._message.error('COMMON.OPERATION_FAILED');
91
92
  }
92
93
  finally {
93
- this._loading.hide();
94
+ await this._loading.hide();
94
95
  }
95
96
  }
96
97
  close() {
97
98
  this._modal.dismiss();
98
99
  }
99
100
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"], dependencies: [{ kind: "component", type: i1.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: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i1.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i1.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
101
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars", baseURL: "baseURL" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"], dependencies: [{ kind: "component", type: i1.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: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i1.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i1.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
101
102
  }
102
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, decorators: [{
103
104
  type: Component,
@@ -106,6 +107,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
106
107
  type: Input
107
108
  }], onlyExternalCalendars: [{
108
109
  type: Input
110
+ }], baseURL: [{
111
+ type: Input
109
112
  }] } });
110
113
  /**
111
114
  * The possible scopes of the calendar.
@@ -115,4 +118,4 @@ export var CalendarScopes;
115
118
  CalendarScopes["SHARED"] = "shared";
116
119
  CalendarScopes["PRIVATE"] = "private"; // userId
117
120
  })(CalendarScopes || (CalendarScopes = {}));
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyw2QkFBNkI7SUFMMUM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4QyxlQUFVLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFjMUMsa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFDdkIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxJ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Q0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQTVGVSw2QkFBNkI7a0dBQTdCLDZCQUE2QixnSkNiMUMsdTVJQW1IQTs7MkZEdEdhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSx3QkFBd0I7OEJBZXpCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLOztBQWdGUjs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUEsQ0FBQyxTQUFTO0FBQy9CLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IENhbGVuZGFyLCBFeHRlcm5hbENhbGVuZGFySW5mbywgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMsIE1lbWJlcnNoaXAsIFRlYW0gfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQUxvYWRpbmdTZXJ2aWNlLCBJREVBTWVzc2FnZVNlcnZpY2UsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcbmltcG9ydCB7IElERUFUaW5DYW5TZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvdW5jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWNyZWF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhckNyZWF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NhbGVuZGFyQ3JlYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDcmVhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2xvYWRpbmcgPSBpbmplY3QoSURFQUxvYWRpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF90YyA9IGluamVjdChJREVBVGluQ2FuU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG9ubHkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBzY29wZS5cbiAgICovXG4gIEBJbnB1dCgpIGZpeFNjb3BlOiBDYWxlbmRhclNjb3BlcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgd2Ugd2FudCB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgbG9jYWwgY2FsZW5kYXJzLlxuICAgKi9cbiAgQElucHV0KCkgb25seUV4dGVybmFsQ2FsZW5kYXJzOiBib29sZWFuO1xuXG4gIHRlYW06IFRlYW07XG4gIG1lbWJlcnNoaXA6IE1lbWJlcnNoaXA7XG4gIGNhbGVuZGFyOiBDYWxlbmRhcjtcbiAgREVGQVVMVF9DT0xPUiA9ICcjNTU1JztcbiAgU09VUkNFUyA9IE9iamVjdC5rZXlzKEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyID0gbmV3IENhbGVuZGFyKCk7XG4gICAgdGhpcy50ZWFtID0gdGhpcy5fdGMuZ2V0KCd0ZWFtJyk7XG4gICAgdGhpcy5tZW1iZXJzaGlwID0gdGhpcy5fdGMuZ2V0KCdtZW1iZXJzaGlwJyk7XG4gICAgaWYgKHRoaXMuZml4U2NvcGUgPT09IENhbGVuZGFyU2NvcGVzLlNIQVJFRCkgdGhpcy5jYWxlbmRhci50ZWFtSWQgPSB0aGlzLnRlYW0udGVhbUlkO1xuICAgIGlmICh0aGlzLmZpeFNjb3BlID09PSBDYWxlbmRhclNjb3Blcy5QUklWQVRFKSB0aGlzLmNhbGVuZGFyLnVzZXJJZCA9IHRoaXMubWVtYmVyc2hpcC51c2VySWQ7XG4gIH1cblxuICByZXNldFNjb3BlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbkNoYW5nZVNjb3BlKCkpIHRoaXMuY2FsZW5kYXIudGVhbUlkID0gdGhpcy5jYWxlbmRhci51c2VySWQgPSBudWxsO1xuICB9XG4gIGNhbkNoYW5nZVNjb3BlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5maXhTY29wZSAmJiB0aGlzLnNjb3BlSXNTZXQoKTtcbiAgfVxuICBzY29wZUlzU2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY2FsZW5kYXIudXNlcklkKSB8fCBCb29sZWFuKHRoaXMuY2FsZW5kYXIudGVhbUlkKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVOZXdDYWxlbmRhcihzZXJ2aWNlPzogRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2NvcGVJc1NldCgpKSByZXR1cm47XG4gICAgaWYgKCFzZXJ2aWNlICYmIHRoaXMub25seUV4dGVybmFsQ2FsZW5kYXJzKSByZXR1cm47XG4gICAgaWYgKHNlcnZpY2UpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuZXh0ZXJuYWwgPSBuZXcgRXh0ZXJuYWxDYWxlbmRhckluZm8oeyBzZXJ2aWNlIH0pO1xuICAgICAgdGhpcy5jYWxlbmRhci5uYW1lID0gJy0nOyAvLyBpdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGV4dGVybmFsIG5hbWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxlbmRhci5uYW1lID0gdGhpcy5jYWxlbmRhci51c2VySWRcbiAgICAgICAgPyB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFRkFVTFRfUEVSU09OQUxfQ0FMRU5EQVJfTkFNRScpXG4gICAgICAgIDogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERUZBVUxUX1RFQU1fQ0FMRU5EQVJfTkFNRScpO1xuICAgICAgdGhpcy5jYWxlbmRhci5jb2xvciA9IHRoaXMuREVGQVVMVF9DT0xPUjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdygpO1xuICAgICAgY29uc3QgY2FsID0gYXdhaXQgdGhpcy5fY2FsZW5kYXJzLnBvc3RDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgIHRoaXMuY2FsZW5kYXIubG9hZChjYWwpO1xuICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQ0FMRU5EQVJfQ1JFQVRFRCcpO1xuICAgICAgaWYgKCFjYWwuZXh0ZXJuYWwpIHtcbiAgICAgICAgdGhpcy5fbW9kYWwuZGlzbWlzcyh0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmxpbmtFeHRTZXJ2aWNlKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9jYWxlbmRhcnMuY2hvb3NlQW5kU2V0RXh0ZXJuYWxDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGVuZGFyLmxvYWQocmVzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGVuZGFycy5zeW5jQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19DT01QTEVURUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBzY29wZXMgb2YgdGhlIGNhbGVuZGFyLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNjb3BlcyB7XG4gIFNIQVJFRCA9ICdzaGFyZWQnLCAvLyB0ZWFtSWRcbiAgUFJJVkFURSA9ICdwcml2YXRlJyAvLyB1c2VySWRcbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIEBpZiAoIWNhbkNoYW5nZVNjb3BlKCkpIHtcbiAgICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uQ0xPU0UnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FuQ2hhbmdlU2NvcGUoKSkge1xuICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRTY29wZSgpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy1iYWNrXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICAgICAgPHNwYW4+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BRERfQV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICB9XG4gICAgICBAaWYgKGNhbGVuZGFyLnVzZXJJZCkge1xuICAgICAgICA8c3Bhbj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FsZW5kYXIudGVhbUlkKSB7XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVEVBTV9DQUxFTkRBUicgfCB0cmFuc2xhdGU6IHsgdGVhbTogdGVhbS5uYW1lIH0gfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfVxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8IS0tIDFzdCBTVEVQIC0tPlxuICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tcGFkZGluZyBjaG9pY2VHcmlkXCI+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DUkVBVEVfUFJJVkFURV9PUl9URUFNJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci51c2VySWQgPSBtZW1iZXJzaGlwLnVzZXJJZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVyc29uXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuUEVSU09OQUxfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci50ZWFtSWQgPSBtZW1iZXJzaGlwLnRlYW1JZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuICB9XG4gIDwhLS0gMm5kIFNURVAgLS0+XG4gIEBpZiAoc2NvcGVJc1NldCgpKSB7XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLXBhZGRpbmcgY2hvaWNlR3JpZFwiPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuV0hJQ0hfRVhURVJOQUxfU0VSVklDRV9UT19MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSElDSF9FWFRFUk5BTF9TRVJWSUNFX1RPX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFvbmx5RXh0ZXJuYWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCI+XG4gICAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJzdGVwMlwiIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJzYXZlTmV3Q2FsZW5kYXIoKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRE9OVF9MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET05UX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKHMgb2YgU09VUkNFUzsgdHJhY2sgcykge1xuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIj5cbiAgICAgICAgICAgIDxpb24tY2FyZCBjbGFzcz1cInN0ZXAyXCIgW2J1dHRvbl09XCJ0cnVlXCIgKGNsaWNrKT1cInNhdmVOZXdDYWxlbmRhcihzKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKHMpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPlxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5TRVJWSUNFUy4nICsgcyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgfVxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJDcmVhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyw2QkFBNkI7SUFMMUM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4QyxlQUFVLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFrQjFDLGtCQUFhLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLFlBQU8sR0FBRyxNQUFNLENBQUMs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QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBakdVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLG9LQ2IxQyx1NUlBbUhBOzsyRkR0R2EsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLHdCQUF3Qjs4QkFlekIsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLOztBQWlGUjs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUEsQ0FBQyxTQUFTO0FBQy9CLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IENhbGVuZGFyLCBFeHRlcm5hbENhbGVuZGFySW5mbywgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMsIE1lbWJlcnNoaXAsIFRlYW0gfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQUxvYWRpbmdTZXJ2aWNlLCBJREVBTWVzc2FnZVNlcnZpY2UsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcbmltcG9ydCB7IElERUFUaW5DYW5TZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvdW5jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWNyZWF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhckNyZWF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NhbGVuZGFyQ3JlYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDcmVhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2xvYWRpbmcgPSBpbmplY3QoSURFQUxvYWRpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF90YyA9IGluamVjdChJREVBVGluQ2FuU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG9ubHkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBzY29wZS5cbiAgICovXG4gIEBJbnB1dCgpIGZpeFNjb3BlOiBDYWxlbmRhclNjb3BlcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgd2Ugd2FudCB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgbG9jYWwgY2FsZW5kYXJzLlxuICAgKi9cbiAgQElucHV0KCkgb25seUV4dGVybmFsQ2FsZW5kYXJzOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIFVSTCB0byBiZSB1c2VkIG9uIHRoZSByZWRpcmVjdCBjYWxscy5cbiAgICovXG4gIEBJbnB1dCgpIGJhc2VVUkw6IHN0cmluZztcblxuICB0ZWFtOiBUZWFtO1xuICBtZW1iZXJzaGlwOiBNZW1iZXJzaGlwO1xuICBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIERFRkFVTFRfQ09MT1IgPSAnIzU1NSc7XG4gIFNPVVJDRVMgPSBPYmplY3Qua2V5cyhFeHRlcm5hbENhbGVuZGFyU291cmNlcyk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhciA9IG5ldyBDYWxlbmRhcigpO1xuICAgIHRoaXMudGVhbSA9IHRoaXMuX3RjLmdldCgndGVhbScpO1xuICAgIHRoaXMubWVtYmVyc2hpcCA9IHRoaXMuX3RjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIGlmICh0aGlzLmZpeFNjb3BlID09PSBDYWxlbmRhclNjb3Blcy5TSEFSRUQpIHRoaXMuY2FsZW5kYXIudGVhbUlkID0gdGhpcy50ZWFtLnRlYW1JZDtcbiAgICBpZiAodGhpcy5maXhTY29wZSA9PT0gQ2FsZW5kYXJTY29wZXMuUFJJVkFURSkgdGhpcy5jYWxlbmRhci51c2VySWQgPSB0aGlzLm1lbWJlcnNoaXAudXNlcklkO1xuICB9XG5cbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5DaGFuZ2VTY29wZSgpKSB0aGlzLmNhbGVuZGFyLnRlYW1JZCA9IHRoaXMuY2FsZW5kYXIudXNlcklkID0gbnVsbDtcbiAgfVxuICBjYW5DaGFuZ2VTY29wZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZml4U2NvcGUgJiYgdGhpcy5zY29wZUlzU2V0KCk7XG4gIH1cbiAgc2NvcGVJc1NldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNhbGVuZGFyLnVzZXJJZCkgfHwgQm9vbGVhbih0aGlzLmNhbGVuZGFyLnRlYW1JZCk7XG4gIH1cblxuICBhc3luYyBzYXZlTmV3Q2FsZW5kYXIoc2VydmljZT86IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnNjb3BlSXNTZXQoKSkgcmV0dXJuO1xuICAgIGlmICghc2VydmljZSAmJiB0aGlzLm9ubHlFeHRlcm5hbENhbGVuZGFycykgcmV0dXJuO1xuICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLmV4dGVybmFsID0gbmV3IEV4dGVybmFsQ2FsZW5kYXJJbmZvKHsgc2VydmljZSB9KTtcbiAgICAgIHRoaXMuY2FsZW5kYXIubmFtZSA9ICctJzsgLy8gaXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBleHRlcm5hbCBuYW1lXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIubmFtZSA9IHRoaXMuY2FsZW5kYXIudXNlcklkXG4gICAgICAgID8gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERUZBVUxUX1BFUlNPTkFMX0NBTEVOREFSX05BTUUnKVxuICAgICAgICA6IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVGQVVMVF9URUFNX0NBTEVOREFSX05BTUUnKTtcbiAgICAgIHRoaXMuY2FsZW5kYXIuY29sb3IgPSB0aGlzLkRFRkFVTFRfQ09MT1I7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgIGNvbnN0IGNhbCA9IGF3YWl0IHRoaXMuX2NhbGVuZGFycy5wb3N0Q2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICB0aGlzLmNhbGVuZGFyLmxvYWQoY2FsKTtcbiAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0NSRUFURUQnKTtcbiAgICAgIGlmICghY2FsLmV4dGVybmFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLl9jYWxlbmRhcnMubGlua0V4dFNlcnZpY2UodGhpcy5jYWxlbmRhciwgdGhpcy5iYXNlVVJMKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmNob29zZUFuZFNldEV4dGVybmFsQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbW9kYWwuZGlzbWlzcyh0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxlbmRhci5sb2FkKHJlcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGVuZGFycy5zeW5jQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19DT01QTEVURUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuX21vZGFsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBzY29wZXMgb2YgdGhlIGNhbGVuZGFyLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNjb3BlcyB7XG4gIFNIQVJFRCA9ICdzaGFyZWQnLCAvLyB0ZWFtSWRcbiAgUFJJVkFURSA9ICdwcml2YXRlJyAvLyB1c2VySWRcbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIEBpZiAoIWNhbkNoYW5nZVNjb3BlKCkpIHtcbiAgICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uQ0xPU0UnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FuQ2hhbmdlU2NvcGUoKSkge1xuICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRTY29wZSgpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy1iYWNrXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICAgICAgPHNwYW4+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BRERfQV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICB9XG4gICAgICBAaWYgKGNhbGVuZGFyLnVzZXJJZCkge1xuICAgICAgICA8c3Bhbj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY2FsZW5kYXIudGVhbUlkKSB7XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVEVBTV9DQUxFTkRBUicgfCB0cmFuc2xhdGU6IHsgdGVhbTogdGVhbS5uYW1lIH0gfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfVxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8IS0tIDFzdCBTVEVQIC0tPlxuICBAaWYgKCFzY29wZUlzU2V0KCkpIHtcbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tcGFkZGluZyBjaG9pY2VHcmlkXCI+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aDE+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DUkVBVEVfUFJJVkFURV9PUl9URUFNJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci51c2VySWQgPSBtZW1iZXJzaGlwLnVzZXJJZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVyc29uXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBFUlNPTkFMX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuUEVSU09OQUxfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCIgW3NpemVTbV09XCI2XCI+XG4gICAgICAgICAgPGlvbi1jYXJkIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJjYWxlbmRhci50ZWFtSWQgPSBtZW1iZXJzaGlwLnRlYW1JZFwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxoMT57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuICB9XG4gIDwhLS0gMm5kIFNURVAgLS0+XG4gIEBpZiAoc2NvcGVJc1NldCgpKSB7XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLXBhZGRpbmcgY2hvaWNlR3JpZFwiPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuV0hJQ0hfRVhURVJOQUxfU0VSVklDRV9UT19MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSElDSF9FWFRFUk5BTF9TRVJWSUNFX1RPX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFvbmx5RXh0ZXJuYWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjEyXCI+XG4gICAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJzdGVwMlwiIFtidXR0b25dPVwidHJ1ZVwiIChjbGljayk9XCJzYXZlTmV3Q2FsZW5kYXIoKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRE9OVF9MSU5LJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET05UX0xJTktfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKHMgb2YgU09VUkNFUzsgdHJhY2sgcykge1xuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIj5cbiAgICAgICAgICAgIDxpb24tY2FyZCBjbGFzcz1cInN0ZXAyXCIgW2J1dHRvbl09XCJ0cnVlXCIgKGNsaWNrKT1cInNhdmVOZXdDYWxlbmRhcihzKVwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKHMpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGgxPlxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5TRVJWSUNFUy4nICsgcyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LX1RPX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgfVxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
@@ -81,7 +81,7 @@ export class IDEACalendarItemComponent {
81
81
  };
82
82
  const doLink = async () => {
83
83
  try {
84
- await this._calendars.linkExtService(this.calendar);
84
+ await this._calendars.linkExtService(this.calendar, this.baseURL);
85
85
  this.linkExtCalendarOrDelete();
86
86
  }
87
87
  catch (error) {
@@ -99,7 +99,7 @@ export class IDEACalendarItemComponent {
99
99
  }
100
100
  }
101
101
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
102
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor", baseURL: "baseURL" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
103
103
  }
104
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, decorators: [{
105
105
  type: Component,
@@ -112,7 +112,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
112
112
  type: Input
113
113
  }], hideColor: [{
114
114
  type: Input
115
+ }], baseURL: [{
116
+ type: Input
115
117
  }], somethingChanged: [{
116
118
  type: Output
117
119
  }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJJdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhckl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyx5QkFBeUI7SUFMdEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDckQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBa0IxQzs7V0FFRztRQUNPLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7S0FzRTNEO0lBcEVDLEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVE7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QUFRO3NCQUFoQixLQUFLO2dCQUlHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBTG9hZGluZ1NlcnZpY2UsIElERUFNZXNzYWdlU2VydmljZSwgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJ2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhckl0ZW0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJJdGVtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsZW5kYXIgdG8gc2hvdy5cbiAgICovXG4gIEBJbnB1dCgpIGNhbGVuZGFyOiBDYWxlbmRhcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB3ZSB3YW50IHRvIGVuYWJsZSBhZHZhbmNlZCBwZXJtaXNzaW9ucyAoYmFzZWQgb24gdGhlIG1lbWJlcnNoaXBzKSBvbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBoaWRlQ29sb3I6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXBvcnQgdG8gcGFyZW50IGNvbXBvbmVudHMgYSBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgc29tZXRoaW5nQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXI+KCk7XG5cbiAgYXN5bmMgbWFuYWdlQ2FsZW5kYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMuX21vZGFsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IElERUFDYWxlbmRhckNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiB7XG4gICAgICAgIGNhbGVuZGFyOiB0aGlzLmNhbGVuZGFyLFxuICAgICAgICBhZHZhbmNlZFBlcm1pc3Npb25zOiB0aGlzLmFkdmFuY2VkUGVybWlzc2lvbnMsXG4gICAgICAgIGhpZGVDb2xvcjogdGhpcy5oaWRlQ29sb3JcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtb2RhbC5vbkRpZERpc21pc3MoKS50aGVuKHJlcyA9PiB7XG4gICAgICBjb25zdCBjYWwgPSByZXMuZGF0YTtcbiAgICAgIGlmIChjYWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgZWxzZSBpZiAoY2FsID09PSBudWxsKSB0aGlzLmNhbGVuZGFyID0gbnVsbDtcbiAgICAgIGVsc2UgdGhpcy5jYWxlbmRhci5sb2FkKGNhbCk7XG4gICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQuZW1pdCgpO1xuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIGxpbmtFeHRDYWxlbmRhck9yRGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhbCA9IGF3YWl0IHRoaXMuX2NhbGVuZGFycy5jaG9vc2VBbmRTZXRFeHRlcm5hbENhbGVuZGFyKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgaWYgKCFjYWwpIHRocm93IG5ldyBFcnJvcignTk9fRVhURVJOQUxfQ0FMRU5EQVJfQ0hPU0VOJyk7XG4gICAgICB0aGlzLmNhbGVuZGFyLmxvYWQoY2FsKTtcbiAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0xJTktFRCcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19NQVlfVEFLRV9BX1dISUxFJykpO1xuICAgICAgICBhd2FpdCB0aGlzLl9jYWxlbmRhcnMuc3luY0NhbGVuZGFyKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5GSVJTVF9TWU5DX0NPTVBMRVRFRCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQuZW1pdCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkb0RlbGV0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxlbmRhcnMuZGVsZXRlQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdDT01NT04uT1BFUkFUSU9OX0NPTVBMRVRFRCcpO1xuICAgICAgICAgIHRoaXMuc29tZXRoaW5nQ2hhbmdlZC5lbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRvTGluayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxlbmRhcnMubGlua0V4dFNlcnZpY2UodGhpcy5jYWxlbmRhcik7XG4gICAgICAgICAgdGhpcy5saW5rRXh0Q2FsZW5kYXJPckRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX05PVF9ZRVRfTElOS0VEJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET19ZT1VfV0FOVF9QUk9DRUVEX0xJTktJTkdfT1JfREVMRVRFJyk7XG4gICAgICBjb25zdCBidXR0b25zID0gW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uREVMRVRFJyksIGhhbmRsZXI6IGRvRGVsZXRlIH0sXG4gICAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LJyksIGhhbmRsZXI6IGRvTGluayB9XG4gICAgICBdO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMgfSk7XG4gICAgICBhbGVydC5wcmVzZW50KCk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKGNhbGVuZGFyKSB7XG4gIDxpb24taXRlbVxuICAgIGNsYXNzPVwiY2FsZW5kYXJJdGVtXCJcbiAgICBbYnV0dG9uXT1cIiFkaXNhYmxlZFwiXG4gICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicgfCB0cmFuc2xhdGVcIlxuICAgIChjbGljayk9XCJjYWxlbmRhci5leHRlcm5hbCAmJiAhY2FsZW5kYXIuZXh0ZXJuYWwuY2FsZW5kYXJJZCA/IGxpbmtFeHRDYWxlbmRhck9yRGVsZXRlKCkgOiBtYW5hZ2VDYWxlbmRhcigpXCJcbiAgPlxuICAgIEBpZiAoIWhpZGVDb2xvcikge1xuICAgICAgPGlvbi1hdmF0YXIgc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJjb2xvckNpcmNsZVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNhbGVuZGFyLmNvbG9yXCIgLz5cbiAgICB9XG4gICAgPGlvbi1sYWJlbD5cbiAgICAgIHt7IGNhbGVuZGFyLm5hbWUgfX1cbiAgICAgIDxwPlxuICAgICAgICBAaWYgKGNhbGVuZGFyLmV4dGVybmFsICYmICFjYWxlbmRhci5leHRlcm5hbC5jYWxlbmRhcklkKSB7XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRBUF9UT19DT05GSUdVUkUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgfVxuICAgICAgICB7eyBjYWxlbmRhci5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9wPlxuICAgIDwvaW9uLWxhYmVsPlxuICAgIEBpZiAoY2FsZW5kYXIuZXh0ZXJuYWwgJiYgIWNhbGVuZGFyLmV4dGVybmFsLmNhbGVuZGFySWQpIHtcbiAgICAgIDxpb24taWNvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgY29sb3I9XCJkYW5nZXJcIlxuICAgICAgICBuYW1lPVwiZmxhc2gtb2ZmXCJcbiAgICAgICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuQ0FMRU5EQVJfTk9UX1lFVF9MSU5LRURfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgLz5cbiAgICB9XG4gICAgQGlmIChjYWxlbmRhci5leHRlcm5hbD8uc2VydmljZSkge1xuICAgICAgPGlvbi1pY29uXG4gICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKGNhbGVuZGFyLmV4dGVybmFsLnNlcnZpY2UpXCJcbiAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktFRF9UTycgfCB0cmFuc2xhdGUpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBjYWxlbmRhci5leHRlcm5hbC5zZXJ2aWNlIHwgdHJhbnNsYXRlKVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG59XG4iXX0=
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJJdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhckl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBTzNELE1BQU0sT0FBTyx5QkFBeUI7SUFMdEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDckQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBc0IxQzs7V0FFRztRQUNPLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7S0FzRTNEO0lBcEVDLEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVE7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O3NCQUFoQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUlJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBTG9hZGluZ1NlcnZpY2UsIElERUFNZXNzYWdlU2VydmljZSwgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJ2NhbGVuZGFySXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhckl0ZW0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJJdGVtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG4gIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsZW5kYXIgdG8gc2hvdy5cbiAgICovXG4gIEBJbnB1dCgpIGNhbGVuZGFyOiBDYWxlbmRhcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB3ZSB3YW50IHRvIGVuYWJsZSBhZHZhbmNlZCBwZXJtaXNzaW9ucyAoYmFzZWQgb24gdGhlIG1lbWJlcnNoaXBzKSBvbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBoaWRlQ29sb3I6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIGJlIHVzZWQgb24gdGhlIHJlZGlyZWN0IGNhbGxzLlxuICAgKi9cbiAgQElucHV0KCkgYmFzZVVSTDogc3RyaW5nO1xuICAvKipcbiAgICogUmVwb3J0IHRvIHBhcmVudCBjb21wb25lbnRzIGEgY2hhbmdlLlxuICAgKi9cbiAgQE91dHB1dCgpIHNvbWV0aGluZ0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyPigpO1xuXG4gIGFzeW5jIG1hbmFnZUNhbGVuZGFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLl9tb2RhbC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBJREVBQ2FsZW5kYXJDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRQcm9wczoge1xuICAgICAgICBjYWxlbmRhcjogdGhpcy5jYWxlbmRhcixcbiAgICAgICAgYWR2YW5jZWRQZXJtaXNzaW9uczogdGhpcy5hZHZhbmNlZFBlcm1pc3Npb25zLFxuICAgICAgICBoaWRlQ29sb3I6IHRoaXMuaGlkZUNvbG9yXG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kYWwub25EaWREaXNtaXNzKCkudGhlbihyZXMgPT4ge1xuICAgICAgY29uc3QgY2FsID0gcmVzLmRhdGE7XG4gICAgICBpZiAoY2FsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGVsc2UgaWYgKGNhbCA9PT0gbnVsbCkgdGhpcy5jYWxlbmRhciA9IG51bGw7XG4gICAgICBlbHNlIHRoaXMuY2FsZW5kYXIubG9hZChjYWwpO1xuICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkLmVtaXQoKTtcbiAgICB9KTtcbiAgICBtb2RhbC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBsaW5rRXh0Q2FsZW5kYXJPckRlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWwgPSBhd2FpdCB0aGlzLl9jYWxlbmRhcnMuY2hvb3NlQW5kU2V0RXh0ZXJuYWxDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgIGlmICghY2FsKSB0aHJvdyBuZXcgRXJyb3IoJ05PX0VYVEVSTkFMX0NBTEVOREFSX0NIT1NFTicpO1xuICAgICAgdGhpcy5jYWxlbmRhci5sb2FkKGNhbCk7XG4gICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DQUxFTkRBUl9MSU5LRUQnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdyh0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkZJUlNUX1NZTkNfTUFZX1RBS0VfQV9XSElMRScpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLnN5bmNDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRklSU1RfU1lOQ19DT01QTEVURUQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZG9EZWxldGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmRlbGV0ZUNhbGVuZGFyKHRoaXMuY2FsZW5kYXIpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ09NTU9OLk9QRVJBVElPTl9DT01QTEVURUQnKTtcbiAgICAgICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQuZW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBkb0xpbmsgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmxpbmtFeHRTZXJ2aWNlKHRoaXMuY2FsZW5kYXIsIHRoaXMuYmFzZVVSTCk7XG4gICAgICAgICAgdGhpcy5saW5rRXh0Q2FsZW5kYXJPckRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX05PVF9ZRVRfTElOS0VEJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ET19ZT1VfV0FOVF9QUk9DRUVEX0xJTktJTkdfT1JfREVMRVRFJyk7XG4gICAgICBjb25zdCBidXR0b25zID0gW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uREVMRVRFJyksIGhhbmRsZXI6IGRvRGVsZXRlIH0sXG4gICAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LJyksIGhhbmRsZXI6IGRvTGluayB9XG4gICAgICBdO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMgfSk7XG4gICAgICBhbGVydC5wcmVzZW50KCk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKGNhbGVuZGFyKSB7XG4gIDxpb24taXRlbVxuICAgIGNsYXNzPVwiY2FsZW5kYXJJdGVtXCJcbiAgICBbYnV0dG9uXT1cIiFkaXNhYmxlZFwiXG4gICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicgfCB0cmFuc2xhdGVcIlxuICAgIChjbGljayk9XCJjYWxlbmRhci5leHRlcm5hbCAmJiAhY2FsZW5kYXIuZXh0ZXJuYWwuY2FsZW5kYXJJZCA/IGxpbmtFeHRDYWxlbmRhck9yRGVsZXRlKCkgOiBtYW5hZ2VDYWxlbmRhcigpXCJcbiAgPlxuICAgIEBpZiAoIWhpZGVDb2xvcikge1xuICAgICAgPGlvbi1hdmF0YXIgc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJjb2xvckNpcmNsZVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNhbGVuZGFyLmNvbG9yXCIgLz5cbiAgICB9XG4gICAgPGlvbi1sYWJlbD5cbiAgICAgIHt7IGNhbGVuZGFyLm5hbWUgfX1cbiAgICAgIDxwPlxuICAgICAgICBAaWYgKGNhbGVuZGFyLmV4dGVybmFsICYmICFjYWxlbmRhci5leHRlcm5hbC5jYWxlbmRhcklkKSB7XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRBUF9UT19DT05GSUdVUkUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgfVxuICAgICAgICB7eyBjYWxlbmRhci5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9wPlxuICAgIDwvaW9uLWxhYmVsPlxuICAgIEBpZiAoY2FsZW5kYXIuZXh0ZXJuYWwgJiYgIWNhbGVuZGFyLmV4dGVybmFsLmNhbGVuZGFySWQpIHtcbiAgICAgIDxpb24taWNvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgY29sb3I9XCJkYW5nZXJcIlxuICAgICAgICBuYW1lPVwiZmxhc2gtb2ZmXCJcbiAgICAgICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuQ0FMRU5EQVJfTk9UX1lFVF9MSU5LRURfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgLz5cbiAgICB9XG4gICAgQGlmIChjYWxlbmRhci5leHRlcm5hbD8uc2VydmljZSkge1xuICAgICAgPGlvbi1pY29uXG4gICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICBbbmFtZV09XCJfY2FsZW5kYXJzLmdldFNlcnZpY2VJY29uKGNhbGVuZGFyLmV4dGVybmFsLnNlcnZpY2UpXCJcbiAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktFRF9UTycgfCB0cmFuc2xhdGUpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICgnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBjYWxlbmRhci5leHRlcm5hbC5zZXJ2aWNlIHwgdHJhbnNsYXRlKVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG59XG4iXX0=
@@ -71,10 +71,11 @@ export class IDEACalendarsService {
71
71
  /**
72
72
  * Link the calendar with the chosen external service (auth flow).
73
73
  */
74
- async linkExtService(cal) {
74
+ async linkExtService(cal, baseURL) {
75
75
  if (!cal.external)
76
76
  throw new Error('NOT_EXTERNAL');
77
- const baseURL = window.location.protocol.concat('//', window.location.hostname);
77
+ if (!baseURL)
78
+ baseURL = window.location.protocol.concat('//', window.location.hostname);
78
79
  let url;
79
80
  switch (cal.external.service) {
80
81
  case ExternalCalendarSources.GOOGLE:
@@ -208,4 +209,4 @@ export class IDEACalendarsService {
208
209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarsService, decorators: [{
209
210
  type: Injectable
210
211
  }] });
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUV6RDs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFWSxTQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQXFMdEQ7SUFuTEM7O09BRUc7SUFDSCxjQUFjLENBQUMsT0FBeUM7UUFDdEQsUUFBUSxPQUFPLEVBQUUsQ0FBQztZQUNoQixLQUFLLHVCQUF1QixDQUFDLE1BQU07Z0JBQ2pDLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLEtBQUssdUJBQXVCLENBQUMsU0FBUztnQkFDcEMsT0FBTyxjQUFjLENBQUM7WUFDeEI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxRQUFrQjtRQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQWE7UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRyxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBYTtRQUM3QixNQUFNLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RSxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBYTtRQUNoQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBYSxFQUFFLFVBQWtCO1FBQ3pELE1BQU0sSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUMvRyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQWE7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEYsSUFBSSxHQUFXLENBQUM7UUFDaEIsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLEtBQUssdUJBQXVCLENBQUMsTUFBTTtnQkFDakMsR0FBRztvQkFDRCwrQ0FBK0M7d0JBQy9DLGFBQWEsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQy9ELHFCQUFxQjt3QkFDckIsaUJBQWlCLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUFFO3dCQUMzRiw4QkFBOEI7d0JBQzlCLHFDQUFxQzt3QkFDckMsVUFBVSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDekQsVUFBVSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDakQsTUFBTTtZQUNSLEtBQUssdUJBQXVCLENBQUMsU0FBUztnQkFDcEMsR0FBRztvQkFDRCxpRUFBaUU7d0JBQ2pFLGFBQWEsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ2xFLHFCQUFxQjt3QkFDckIsaUJBQWlCLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUFFO3dCQUM5RixzQkFBc0I7d0JBQ3RCLFVBQVUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQzVELFVBQVUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU07UUFDVixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0MsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixpRUFBaUU7UUFDakUsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ08sS0FBSyxDQUFDLHdCQUF3QjtRQUNwQyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDOUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMvRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0YsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQWE7UUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRCxnR0FBZ0c7UUFDaEcsTUFBTSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDOUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVFLE1BQU0sT0FBTyxHQUFHLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQ2hCLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDekYsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFnQixDQUFDLENBQUM7UUFDaEcsQ0FBQzthQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssdUJBQXVCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JHLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFnQixDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsNEJBQTRCLENBQUMsR0FBYTtRQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDdEIsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFhO1FBQzFELElBQUksT0FBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDckMsU0FBUyxFQUFFLHdCQUF3QjtZQUNuQyxjQUFjLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDckUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsMkRBQTJELENBQUM7Z0JBQ2pHLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixlQUFlLEVBQUUsSUFBSTtnQkFDckIsVUFBVSxFQUFFLElBQUk7YUFDakI7WUFDRCxlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxHQUFhO1FBQ3hCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUNEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsR0FBYSxFQUFFLElBQTJCO1FBQ25FLDRGQUE0RjtRQUM1RixJQUFJLENBQUMsSUFBSTthQUNOLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLElBQUksRUFBRSxJQUFJO1lBQ1YsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1NBQzVELENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQVEsRUFBRTtZQUN2QixJQUFJLEdBQUcsQ0FBQyxRQUFRO2dCQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7O2dCQUNoRCxJQUFJLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7OEdBMUxVLG9CQUFvQjtrSEFBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgQnJvd3NlciB9IGZyb20gJ0BjYXBhY2l0b3IvYnJvd3Nlcic7XG5pbXBvcnQgeyBDYWxlbmRhciwgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMsIFN1Z2dlc3Rpb24gfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHtcbiAgSURFQUVudmlyb25tZW50LFxuICBJREVBTG9hZGluZ1NlcnZpY2UsXG4gIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICBJREVBU3VnZ2VzdGlvbnNDb21wb25lbnRcbn0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcbmltcG9ydCB7IElERUFBV1NBUElTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvdW5jb21tb24nO1xuXG4vKipcbiAqIE5vdGU6IHRvIHRlc3QgbG9jYWxseSwgeW91IG5lZWQgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSByZWRpcmVjdCBVUkk6XG4gKiAgLSBpbiB0aGUgbGFtYmRhIGBpZGVhX2NhbGVuZGFyc2AsIGUuZy4gYFNDQVJMRVRUX1VSTGA7XG4gKiAgLSBpbiB0aGUgY2xpZW50IGNvbmZpZyBmaWxlOiBgQVBQX1VSTGAuXG4gKiBJbiBib3RoIGNhc2VzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBgaHR0cDovL2xvY2FsaG9zdDo4MTAwYCAob3IgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBVUkwpLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSURFQUNhbGVuZGFyc1NlcnZpY2Uge1xuICBwcm90ZWN0ZWQgX2VudiA9IGluamVjdChJREVBRW52aXJvbm1lbnQpO1xuICBwcml2YXRlIF9tb2RhbCA9IGluamVjdChNb2RhbENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9hbGVydCA9IGluamVjdChBbGVydENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX0FQSSA9IGluamVjdChJREVBQVdTQVBJU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaW9uLWljb24gb2YgYW4gZXh0ZXJuYWwgc2VydmljZSBmcm9tIGl0cyBuYW1lLlxuICAgKi9cbiAgZ2V0U2VydmljZUljb24oc2VydmljZTogRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc2VydmljZSkge1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5HT09HTEU6XG4gICAgICAgIHJldHVybiAnbG9nby1nb29nbGUnO1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5NSUNST1NPRlQ6XG4gICAgICAgIHJldHVybiAnbG9nby13aW5kb3dzJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnaGVscCc7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2UgVVJMIGZvciBBUEkgcmVxdWVzdCAoc2hhcmVkL3ByaXZhdGUgY2FsZW5kYXIpLlxuICAgKi9cbiAgZ2V0UmVxdWVzdFVSTChjYWxlbmRhcjogQ2FsZW5kYXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAoY2FsZW5kYXIudGVhbUlkID8gYHRlYW1zLyR7Y2FsZW5kYXIudGVhbUlkfS9gIDogJycpLmNvbmNhdCgnY2FsZW5kYXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNhbGVuZGFyLlxuICAgKi9cbiAgYXN5bmMgcG9zdENhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPENhbGVuZGFyPiB7XG4gICAgY29uc3QgY2FsZW5kYXIgPSBhd2FpdCB0aGlzLl9BUEkucG9zdFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7IGlkZWE6IHRydWUsIGJvZHk6IGNhbCB9KTtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyKGNhbGVuZGFyKTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGNhbGVuZGFyLlxuICAgKi9cbiAgYXN5bmMgcHV0Q2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICBjb25zdCBib2R5ID0geyBpZGVhOiB0cnVlLCByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCwgYm9keTogY2FsIH07XG4gICAgY29uc3QgY2FsZW5kYXIgPSBhd2FpdCB0aGlzLl9BUEkucHV0UmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIGJvZHkpO1xuICAgIHJldHVybiBuZXcgQ2FsZW5kYXIoY2FsZW5kYXIpO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUNhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLl9BUEkuZGVsZXRlUmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIHsgaWRlYTogdHJ1ZSwgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEFzc29jaWF0ZSBhbiBleHRlcm5hbCBjYWxlbmRhciB3aXRoIHRoZSBnaXZlbiBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHNldEV4dGVybmFsQ2FsZW5kYXIoY2FsOiBDYWxlbmRhciwgZXh0ZXJuYWxJZDogc3RyaW5nKTogUHJvbWlzZTxDYWxlbmRhcj4ge1xuICAgIGNvbnN0IGJvZHkgPSB7IGlkZWE6IHRydWUsIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkLCBib2R5OiB7IGFjdGlvbjogJ1NFVF9FWFRFUk5BTF9DQUxFTkRBUicsIGV4dGVybmFsSWQgfSB9O1xuICAgIGNvbnN0IGNhbGVuZGFyID0gYXdhaXQgdGhpcy5fQVBJLnBhdGNoUmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIGJvZHkpO1xuICAgIHJldHVybiBuZXcgQ2FsZW5kYXIoY2FsZW5kYXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgdGhlIGNhbGVuZGFyIHdpdGggdGhlIGNob3NlbiBleHRlcm5hbCBzZXJ2aWNlIChhdXRoIGZsb3cpLlxuICAgKi9cbiAgYXN5bmMgbGlua0V4dFNlcnZpY2UoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY2FsLmV4dGVybmFsKSB0aHJvdyBuZXcgRXJyb3IoJ05PVF9FWFRFUk5BTCcpO1xuICAgIGNvbnN0IGJhc2VVUkwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuY29uY2F0KCcvLycsIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7XG4gICAgbGV0IHVybDogc3RyaW5nO1xuICAgIHN3aXRjaCAoY2FsLmV4dGVybmFsLnNlcnZpY2UpIHtcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFOlxuICAgICAgICB1cmwgPVxuICAgICAgICAgICdodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vby9vYXV0aDIvdjIvYXV0aD8nICtcbiAgICAgICAgICBgY2xpZW50X2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuX2Vudi5nb29nbGUuYXBpQ2xpZW50SWQpfWAgK1xuICAgICAgICAgICcmcmVzcG9uc2VfdHlwZT1jb2RlJyArXG4gICAgICAgICAgYCZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQoYmFzZVVSTC5jb25jYXQoJy9lY2hvL2dvb2dsZS1jYWxlbmRhcnMtaW50ZWdyYXRpb24nKSl9YCArXG4gICAgICAgICAgJyZpbmNsdWRlX2dyYW50ZWRfc2NvcGVzPXRydWUnICtcbiAgICAgICAgICAnJmFjY2Vzc190eXBlPW9mZmxpbmUmcHJvbXB0PWNvbnNlbnQnICtcbiAgICAgICAgICBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuX2Vudi5nb29nbGUuYXBpU2NvcGUpfWAgK1xuICAgICAgICAgIGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQoY2FsLmNhbGVuZGFySWQpfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5NSUNST1NPRlQ6XG4gICAgICAgIHVybCA9XG4gICAgICAgICAgJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9jb21tb24vb2F1dGgyL3YyLjAvYXV0aG9yaXplPycgK1xuICAgICAgICAgIGBjbGllbnRfaWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5fZW52Lm1pY3Jvc29mdC5hcGlDbGllbnRJZCl9YCArXG4gICAgICAgICAgJyZyZXNwb25zZV90eXBlPWNvZGUnICtcbiAgICAgICAgICBgJnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVVJMLmNvbmNhdCgnL2VjaG8vbWljcm9zb2Z0LWNhbGVuZGFycy1pbnRlZ3JhdGlvbicpKX1gICtcbiAgICAgICAgICAnJnJlc3BvbnNlX21vZGU9cXVlcnknICtcbiAgICAgICAgICBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuX2Vudi5taWNyb3NvZnQuYXBpU2NvcGUpfWAgK1xuICAgICAgICAgIGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQoY2FsLmNhbGVuZGFySWQpfWA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKCdJTlZBTElEX1NFUlZJQ0UnKTtcbiAgICBhd2FpdCBCcm93c2VyLm9wZW4oeyB1cmwgfSk7XG4gICAgLy8gc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVuL2lmIHRoZSBhdXRoIGZsb3cgd2lsbCBmaW5pc2gsIHdlIHdhaXRcbiAgICBhd2FpdCB0aGlzLnNob3dBbGVydExpbmtpbmdDYWxlbmRhcigpO1xuICB9XG4gIHByaXZhdGUgYXN5bmMgc2hvd0FsZXJ0TGlua2luZ0NhbGVuZGFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0lOR19DQUxFTkRBUicpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0lOR19DQUxFTkRBUl9DT05GSVJNX09OQ0VfRE9ORScpO1xuICAgICAgY29uc3QgYnV0dG9ucyA9IFt7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uRE9ORScpLCBoYW5kbGVyOiByZXNvbHZlIH1dO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMsIGJhY2tkcm9wRGlzbWlzczogZmFsc2UgfSk7XG4gICAgICBhbGVydC5wcmVzZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBleHRlcm5hbCBjYWxlbmRhcnMgbGlzdCBvZiB0aGUgZXh0ZXJuYWwgc2VydmljZS5cbiAgICovXG4gIGFzeW5jIGdldEV4dGVybmFsQ2FsZW5kYXJzKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPEV4dENhbGVuZGFyW10+IHtcbiAgICBpZiAoIWNhbC5leHRlcm5hbCkgdGhyb3cgbmV3IEVycm9yKCdOT1RfRVhURVJOQUwnKTtcbiAgICAvLyBnZXQgdGhlIGFjY2VzcyB0b2tlbiB0byBtYWtlIHJlcXVlc3RzOyBpbiBjYXNlIGl0IGZhaWxzLCBwcm9jZWVkIHRvIGxpbmsgdGhlIGV4dGVybmFsIHNlcnZpY2VcbiAgICBjb25zdCBib2R5ID0geyBpZGVhOiB0cnVlLCByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCwgYm9keTogeyBhY3Rpb246ICdHRVRfQUNDRVNTX1RPS0VOJyB9IH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fQVBJLnBhdGNoUmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIGJvZHkpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IEF1dGhvcml6YXRpb246ICdCZWFyZXIgJy5jb25jYXQocmVzdWx0LnRva2VuKSB9O1xuICAgIGlmIChjYWwuZXh0ZXJuYWwuc2VydmljZSA9PT0gRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGZldGNoKCdodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9jYWxlbmRhci92My91c2Vycy9tZS9jYWxlbmRhckxpc3QnLCB7IGhlYWRlcnMgfSlcbiAgICAgICkuanNvbigpO1xuICAgICAgcmV0dXJuIHJlcy5pdGVtcy5tYXAoKGM6IGFueSk6IEV4dENhbGVuZGFyID0+ICh7IG5hbWU6IGMuc3VtbWFyeSwgaWQ6IGMuaWQgfSkgYXMgRXh0Q2FsZW5kYXIpO1xuICAgIH0gZWxzZSBpZiAoY2FsLmV4dGVybmFsLnNlcnZpY2UgPT09IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLk1JQ1JPU09GVCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgKGF3YWl0IGZldGNoKCdodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20vdjEuMC9tZS9jYWxlbmRhcnMnLCB7IGhlYWRlcnMgfSkpLmpzb24oKTtcbiAgICAgIHJldHVybiByZXMudmFsdWUubWFwKChjOiBhbnkpOiBFeHRDYWxlbmRhciA9PiAoeyBuYW1lOiBjLm5hbWUsIGlkOiBjLmlkIH0pIGFzIEV4dENhbGVuZGFyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGV4dGVybmFsIHNlcnZpY2UgaXMgbGlua2VkLCBjaG9vc2UgYW4gZXh0ZXJuYWwgY2FsZW5kYXIgYW5kIHNldCBpdCBmb3IgdGhlIGNob3NlbiBjYWxlbmRhci5cbiAgICogQHJldHVybiB0aGUgdXBkYXRlZCBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIGNob29zZUFuZFNldEV4dGVybmFsQ2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICBjb25zdCBleHRDYWxJZCA9IGF3YWl0IHRoaXMub3Blbk1vZGFsQW5kUGlja0V4dGVybmFsQ2FsZW5kYXIoY2FsKTtcbiAgICBpZiAoIWV4dENhbElkKSByZXR1cm47XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0RXh0ZXJuYWxDYWxlbmRhcihjYWwsIGV4dENhbElkKTtcbiAgfVxuICAvKipcbiAgICogT3BlbiB0aGUgbW9kYWwgdG8gcGljayBhIGNhbGVuZGFyIGZyb20gdGhlIGV4dGVybmFsIHNlcnZpY2UuXG4gICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBleHRlcm5hbCBjYWxlbmRhci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3Blbk1vZGFsQW5kUGlja0V4dGVybmFsQ2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGV4dENhbHM6IEV4dENhbGVuZGFyW107XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdygpO1xuICAgICAgZXh0Q2FscyA9IGF3YWl0IHRoaXMuZ2V0RXh0ZXJuYWxDYWxlbmRhcnMoY2FsKTtcbiAgICAgIGlmICghZXh0Q2Fscy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignTk9fRVhURVJOQUxfQ0FMRU5EQVJTJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICB9XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLl9tb2RhbC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBJREVBU3VnZ2VzdGlvbnNDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRQcm9wczoge1xuICAgICAgICBkYXRhOiBleHRDYWxzLm1hcChjID0+IG5ldyBTdWdnZXN0aW9uKHsgdmFsdWU6IGMuaWQsIG5hbWU6IGMubmFtZSB9KSksXG4gICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNIT09TRV9BTl9FWFRFUk5BTF9DQUxFTkRBUl9UT19MSU5LJyksXG4gICAgICAgIHNvcnREYXRhOiB0cnVlLFxuICAgICAgICBoaWRlSWRGcm9tVUk6IHRydWUsXG4gICAgICAgIGhpZGVDbGVhckJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgbXVzdENob29zZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2VcbiAgICB9KTtcbiAgICBtb2RhbC5wcmVzZW50KCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgbW9kYWwub25EaWREaXNtaXNzKCk7XG4gICAgcmV0dXJuIHJlcy5kYXRhID8gcmVzLmRhdGEudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcnN0IHN5bmMgb2YgdGhlIGV4dGVuYWwgY2FsZW5kYXIuXG4gICAqL1xuICBzeW5jQ2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB0aGlzLnN5bmNDYWxlbmRhckhlbHBlcihjYWwsIGVyciA9PiAoZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCkpKSk7XG4gIH1cbiAgLyoqXG4gICAqIEhlbHBlciB0byByZWN1cnNpdmVseSBzeW5jIGFuIHRoZSBleHRlbmFsIGNhbGVuZGFyLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jQ2FsZW5kYXJIZWxwZXIoY2FsOiBDYWxlbmRhciwgZG9uZTogKGVycj86IEVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gdGhpcyBpcyBhIHJlY3Vyc2l2ZSBvcGVyYXRpb246IHRoZSBBUEkgcmV0dXJucyBpZiB0aGUgc3luYyBoYXMgdG8gY29udGludWUgb3IgaXQgZmluaXNoZWRcbiAgICB0aGlzLl9BUElcbiAgICAgIC5wYXRjaFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7XG4gICAgICAgIGlkZWE6IHRydWUsXG4gICAgICAgIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkLFxuICAgICAgICBib2R5OiB7IGFjdGlvbjogJ1NZTkNfRVhURVJOQUxfQ0FMRU5EQVInLCBmaXJzdFN5bmM6IHRydWUgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXM6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVzLm1vcmVEYXRhKSB0aGlzLnN5bmNDYWxlbmRhckhlbHBlcihjYWwsIGRvbmUpO1xuICAgICAgICBlbHNlIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IGRvbmUoZXJyKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgc3RydWN0dXJlIHRvIGRlZmluZSBleHRlcm5hbCBzZXJ2aWNlcycgY2FsZW5kYXJzIChiYXNpYyBpbmZvKS5cbiAqL1xuaW50ZXJmYWNlIEV4dENhbGVuZGFyIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufVxuIl19
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUV6RDs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFWSxTQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQXFMdEQ7SUFuTEM7O09BRUc7SUFDSCxjQUFjLENBQUMsT0FBeUM7UUFDdEQsUUFBUSxPQUFPLEVBQUUsQ0FBQztZQUNoQixLQUFLLHVCQUF1QixDQUFDLE1BQU07Z0JBQ2pDLE9BQU8sYUFBYSxDQUFDO1lBQ3ZC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RUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsR0FBYTtRQUN4QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUM7SUFDRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLEdBQWEsRUFBRSxJQUEyQjtRQUNuRSw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLElBQUk7YUFDTixhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxJQUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtTQUM1RCxDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFRLEVBQUU7WUFDdkIsSUFBSSxHQUFHLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFDaEQsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOzhHQTFMVSxvQkFBb0I7a0hBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEJyb3dzZXIgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgQ2FsZW5kYXIsIEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLCBTdWdnZXN0aW9uIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7XG4gIElERUFFbnZpcm9ubWVudCxcbiAgSURFQUxvYWRpbmdTZXJ2aWNlLFxuICBJREVBVHJhbnNsYXRpb25zU2VydmljZSxcbiAgSURFQVN1Z2dlc3Rpb25zQ29tcG9uZW50XG59IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5pbXBvcnQgeyBJREVBQVdTQVBJU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL3VuY29tbW9uJztcblxuLyoqXG4gKiBOb3RlOiB0byB0ZXN0IGxvY2FsbHksIHlvdSBuZWVkIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgcmVkaXJlY3QgVVJJOlxuICogIC0gaW4gdGhlIGxhbWJkYSBgaWRlYV9jYWxlbmRhcnNgLCBlLmcuIGBTQ0FSTEVUVF9VUkxgO1xuICogIC0gaW4gdGhlIGNsaWVudCBjb25maWcgZmlsZTogYEFQUF9VUkxgLlxuICogSW4gYm90aCBjYXNlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gYGh0dHA6Ly9sb2NhbGhvc3Q6ODEwMGAgKG9yIGFjY29yZGluZyB0byB0aGUgbG9jYWwgVVJMKS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElERUFDYWxlbmRhcnNTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIF9lbnYgPSBpbmplY3QoSURFQUVudmlyb25tZW50KTtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbG9hZGluZyA9IGluamVjdChJREVBTG9hZGluZ1NlcnZpY2UpO1xuICBwcml2YXRlIF9BUEkgPSBpbmplY3QoSURFQUFXU0FQSVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGlvbi1pY29uIG9mIGFuIGV4dGVybmFsIHNlcnZpY2UgZnJvbSBpdHMgbmFtZS5cbiAgICovXG4gIGdldFNlcnZpY2VJY29uKHNlcnZpY2U6IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHNlcnZpY2UpIHtcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFOlxuICAgICAgICByZXR1cm4gJ2xvZ28tZ29vZ2xlJztcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuTUlDUk9TT0ZUOlxuICAgICAgICByZXR1cm4gJ2xvZ28td2luZG93cyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2hlbHAnO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIFVSTCBmb3IgQVBJIHJlcXVlc3QgKHNoYXJlZC9wcml2YXRlIGNhbGVuZGFyKS5cbiAgICovXG4gIGdldFJlcXVlc3RVUkwoY2FsZW5kYXI6IENhbGVuZGFyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGNhbGVuZGFyLnRlYW1JZCA/IGB0ZWFtcy8ke2NhbGVuZGFyLnRlYW1JZH0vYCA6ICcnKS5jb25jYXQoJ2NhbGVuZGFycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHBvc3RDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTxDYWxlbmRhcj4ge1xuICAgIGNvbnN0IGNhbGVuZGFyID0gYXdhaXQgdGhpcy5fQVBJLnBvc3RSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwgeyBpZGVhOiB0cnVlLCBib2R5OiBjYWwgfSk7XG4gICAgcmV0dXJuIG5ldyBDYWxlbmRhcihjYWxlbmRhcik7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHB1dENhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPENhbGVuZGFyPiB7XG4gICAgY29uc3QgYm9keSA9IHsgaWRlYTogdHJ1ZSwgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQsIGJvZHk6IGNhbCB9O1xuICAgIGNvbnN0IGNhbGVuZGFyID0gYXdhaXQgdGhpcy5fQVBJLnB1dFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCBib2R5KTtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyKGNhbGVuZGFyKTtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgY2FsZW5kYXIuXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fQVBJLmRlbGV0ZVJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7IGlkZWE6IHRydWUsIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkIH0pO1xuICB9XG4gIC8qKlxuICAgKiBBc3NvY2lhdGUgYW4gZXh0ZXJuYWwgY2FsZW5kYXIgd2l0aCB0aGUgZ2l2ZW4gY2FsZW5kYXIuXG4gICAqL1xuICBhc3luYyBzZXRFeHRlcm5hbENhbGVuZGFyKGNhbDogQ2FsZW5kYXIsIGV4dGVybmFsSWQ6IHN0cmluZyk6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICBjb25zdCBib2R5ID0geyBpZGVhOiB0cnVlLCByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCwgYm9keTogeyBhY3Rpb246ICdTRVRfRVhURVJOQUxfQ0FMRU5EQVInLCBleHRlcm5hbElkIH0gfTtcbiAgICBjb25zdCBjYWxlbmRhciA9IGF3YWl0IHRoaXMuX0FQSS5wYXRjaFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCBib2R5KTtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyKGNhbGVuZGFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHRoZSBjYWxlbmRhciB3aXRoIHRoZSBjaG9zZW4gZXh0ZXJuYWwgc2VydmljZSAoYXV0aCBmbG93KS5cbiAgICovXG4gIGFzeW5jIGxpbmtFeHRTZXJ2aWNlKGNhbDogQ2FsZW5kYXIsIGJhc2VVUkw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY2FsLmV4dGVybmFsKSB0aHJvdyBuZXcgRXJyb3IoJ05PVF9FWFRFUk5BTCcpO1xuICAgIGlmICghYmFzZVVSTCkgYmFzZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5jb25jYXQoJy8vJywgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtcbiAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgc3dpdGNoIChjYWwuZXh0ZXJuYWwuc2VydmljZSkge1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5HT09HTEU6XG4gICAgICAgIHVybCA9XG4gICAgICAgICAgJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi92Mi9hdXRoPycgK1xuICAgICAgICAgIGBjbGllbnRfaWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5fZW52Lmdvb2dsZS5hcGlDbGllbnRJZCl9YCArXG4gICAgICAgICAgJyZyZXNwb25zZV90eXBlPWNvZGUnICtcbiAgICAgICAgICBgJnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVVJMLmNvbmNhdCgnL2VjaG8vZ29vZ2xlLWNhbGVuZGFycy1pbnRlZ3JhdGlvbicpKX1gICtcbiAgICAgICAgICAnJmluY2x1ZGVfZ3JhbnRlZF9zY29wZXM9dHJ1ZScgK1xuICAgICAgICAgICcmYWNjZXNzX3R5cGU9b2ZmbGluZSZwcm9tcHQ9Y29uc2VudCcgK1xuICAgICAgICAgIGAmc2NvcGU9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5fZW52Lmdvb2dsZS5hcGlTY29wZSl9YCArXG4gICAgICAgICAgYCZzdGF0ZT0ke2VuY29kZVVSSUNvbXBvbmVudChjYWwuY2FsZW5kYXJJZCl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLk1JQ1JPU09GVDpcbiAgICAgICAgdXJsID1cbiAgICAgICAgICAnaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi9vYXV0aDIvdjIuMC9hdXRob3JpemU/JyArXG4gICAgICAgICAgYGNsaWVudF9pZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLl9lbnYubWljcm9zb2Z0LmFwaUNsaWVudElkKX1gICtcbiAgICAgICAgICAnJnJlc3BvbnNlX3R5cGU9Y29kZScgK1xuICAgICAgICAgIGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2VVUkwuY29uY2F0KCcvZWNoby9taWNyb3NvZnQtY2FsZW5kYXJzLWludGVncmF0aW9uJykpfWAgK1xuICAgICAgICAgICcmcmVzcG9uc2VfbW9kZT1xdWVyeScgK1xuICAgICAgICAgIGAmc2NvcGU9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5fZW52Lm1pY3Jvc29mdC5hcGlTY29wZSl9YCArXG4gICAgICAgICAgYCZzdGF0ZT0ke2VuY29kZVVSSUNvbXBvbmVudChjYWwuY2FsZW5kYXJJZCl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ0lOVkFMSURfU0VSVklDRScpO1xuICAgIGF3YWl0IEJyb3dzZXIub3Blbih7IHVybCB9KTtcbiAgICAvLyBzaW5jZSB3ZSBkb24ndCBrbm93IHdoZW4vaWYgdGhlIGF1dGggZmxvdyB3aWxsIGZpbmlzaCwgd2Ugd2FpdFxuICAgIGF3YWl0IHRoaXMuc2hvd0FsZXJ0TGlua2luZ0NhbGVuZGFyKCk7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBzaG93QWxlcnRMaW5raW5nQ2FsZW5kYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LSU5HX0NBTEVOREFSJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LSU5HX0NBTEVOREFSX0NPTkZJUk1fT05DRV9ET05FJyk7XG4gICAgICBjb25zdCBidXR0b25zID0gW3sgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5ET05FJyksIGhhbmRsZXI6IHJlc29sdmUgfV07XG4gICAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuX2FsZXJ0LmNyZWF0ZSh7IGhlYWRlciwgbWVzc2FnZSwgYnV0dG9ucywgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZSB9KTtcbiAgICAgIGFsZXJ0LnByZXNlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVybmFsIGNhbGVuZGFycyBsaXN0IG9mIHRoZSBleHRlcm5hbCBzZXJ2aWNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXh0ZXJuYWxDYWxlbmRhcnMoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8RXh0Q2FsZW5kYXJbXT4ge1xuICAgIGlmICghY2FsLmV4dGVybmFsKSB0aHJvdyBuZXcgRXJyb3IoJ05PVF9FWFRFUk5BTCcpO1xuICAgIC8vIGdldCB0aGUgYWNjZXNzIHRva2VuIHRvIG1ha2UgcmVxdWVzdHM7IGluIGNhc2UgaXQgZmFpbHMsIHByb2NlZWQgdG8gbGluayB0aGUgZXh0ZXJuYWwgc2VydmljZVxuICAgIGNvbnN0IGJvZHkgPSB7IGlkZWE6IHRydWUsIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkLCBib2R5OiB7IGFjdGlvbjogJ0dFVF9BQ0NFU1NfVE9LRU4nIH0gfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9BUEkucGF0Y2hSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwgYm9keSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHsgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAnLmNvbmNhdChyZXN1bHQudG9rZW4pIH07XG4gICAgaWYgKGNhbC5leHRlcm5hbC5zZXJ2aWNlID09PSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5HT09HTEUpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IChcbiAgICAgICAgYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2NhbGVuZGFyL3YzL3VzZXJzL21lL2NhbGVuZGFyTGlzdCcsIHsgaGVhZGVycyB9KVxuICAgICAgKS5qc29uKCk7XG4gICAgICByZXR1cm4gcmVzLml0ZW1zLm1hcCgoYzogYW55KTogRXh0Q2FsZW5kYXIgPT4gKHsgbmFtZTogYy5zdW1tYXJ5LCBpZDogYy5pZCB9KSBhcyBFeHRDYWxlbmRhcik7XG4gICAgfSBlbHNlIGlmIChjYWwuZXh0ZXJuYWwuc2VydmljZSA9PT0gRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuTUlDUk9TT0ZUKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goJ2h0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wL21lL2NhbGVuZGFycycsIHsgaGVhZGVycyB9KSkuanNvbigpO1xuICAgICAgcmV0dXJuIHJlcy52YWx1ZS5tYXAoKGM6IGFueSk6IEV4dENhbGVuZGFyID0+ICh7IG5hbWU6IGMubmFtZSwgaWQ6IGMuaWQgfSkgYXMgRXh0Q2FsZW5kYXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZXh0ZXJuYWwgc2VydmljZSBpcyBsaW5rZWQsIGNob29zZSBhbiBleHRlcm5hbCBjYWxlbmRhciBhbmQgc2V0IGl0IGZvciB0aGUgY2hvc2VuIGNhbGVuZGFyLlxuICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNhbGVuZGFyLlxuICAgKi9cbiAgYXN5bmMgY2hvb3NlQW5kU2V0RXh0ZXJuYWxDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTxDYWxlbmRhcj4ge1xuICAgIGNvbnN0IGV4dENhbElkID0gYXdhaXQgdGhpcy5vcGVuTW9kYWxBbmRQaWNrRXh0ZXJuYWxDYWxlbmRhcihjYWwpO1xuICAgIGlmICghZXh0Q2FsSWQpIHJldHVybjtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRFeHRlcm5hbENhbGVuZGFyKGNhbCwgZXh0Q2FsSWQpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVuIHRoZSBtb2RhbCB0byBwaWNrIGEgY2FsZW5kYXIgZnJvbSB0aGUgZXh0ZXJuYWwgc2VydmljZS5cbiAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIGV4dGVybmFsIGNhbGVuZGFyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kYWxBbmRQaWNrRXh0ZXJuYWxDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgZXh0Q2FsczogRXh0Q2FsZW5kYXJbXTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KCk7XG4gICAgICBleHRDYWxzID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbENhbGVuZGFycyhjYWwpO1xuICAgICAgaWYgKCFleHRDYWxzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdOT19FWFRFUk5BTF9DQUxFTkRBUlMnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2xvYWRpbmcuaGlkZSgpO1xuICAgIH1cbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMuX21vZGFsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IElERUFTdWdnZXN0aW9uc0NvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiB7XG4gICAgICAgIGRhdGE6IGV4dENhbHMubWFwKGMgPT4gbmV3IFN1Z2dlc3Rpb24oeyB2YWx1ZTogYy5pZCwgbmFtZTogYy5uYW1lIH0pKSxcbiAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQ0hPT1NFX0FOX0VYVEVSTkFMX0NBTEVOREFSX1RPX0xJTksnKSxcbiAgICAgICAgc29ydERhdGE6IHRydWUsXG4gICAgICAgIGhpZGVJZEZyb21VSTogdHJ1ZSxcbiAgICAgICAgaGlkZUNsZWFyQnV0dG9uOiB0cnVlLFxuICAgICAgICBtdXN0Q2hvb3NlOiB0cnVlXG4gICAgICB9LFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZVxuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBtb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgICByZXR1cm4gcmVzLmRhdGEgPyByZXMuZGF0YS52YWx1ZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmlyc3Qgc3luYyBvZiB0aGUgZXh0ZW5hbCBjYWxlbmRhci5cbiAgICovXG4gIHN5bmNDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHRoaXMuc3luY0NhbGVuZGFySGVscGVyKGNhbCwgZXJyID0+IChlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoKSkpKTtcbiAgfVxuICAvKipcbiAgICogSGVscGVyIHRvIHJlY3Vyc2l2ZWx5IHN5bmMgYW4gdGhlIGV4dGVuYWwgY2FsZW5kYXIuXG4gICAqL1xuICBwcml2YXRlIHN5bmNDYWxlbmRhckhlbHBlcihjYWw6IENhbGVuZGFyLCBkb25lOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyB0aGlzIGlzIGEgcmVjdXJzaXZlIG9wZXJhdGlvbjogdGhlIEFQSSByZXR1cm5zIGlmIHRoZSBzeW5jIGhhcyB0byBjb250aW51ZSBvciBpdCBmaW5pc2hlZFxuICAgIHRoaXMuX0FQSVxuICAgICAgLnBhdGNoUmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIHtcbiAgICAgICAgaWRlYTogdHJ1ZSxcbiAgICAgICAgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQsXG4gICAgICAgIGJvZHk6IHsgYWN0aW9uOiAnU1lOQ19FWFRFUk5BTF9DQUxFTkRBUicsIGZpcnN0U3luYzogdHJ1ZSB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlczogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChyZXMubW9yZURhdGEpIHRoaXMuc3luY0NhbGVuZGFySGVscGVyKGNhbCwgZG9uZSk7XG4gICAgICAgIGVsc2UgZG9uZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gZG9uZShlcnIpKTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBzdHJ1Y3R1cmUgdG8gZGVmaW5lIGV4dGVybmFsIHNlcnZpY2VzJyBjYWxlbmRhcnMgKGJhc2ljIGluZm8pLlxuICovXG5pbnRlcmZhY2UgRXh0Q2FsZW5kYXIge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG4iXX0=
@@ -417,10 +417,11 @@ class IDEACalendarsService {
417
417
  /**
418
418
  * Link the calendar with the chosen external service (auth flow).
419
419
  */
420
- async linkExtService(cal) {
420
+ async linkExtService(cal, baseURL) {
421
421
  if (!cal.external)
422
422
  throw new Error('NOT_EXTERNAL');
423
- const baseURL = window.location.protocol.concat('//', window.location.hostname);
423
+ if (!baseURL)
424
+ baseURL = window.location.protocol.concat('//', window.location.hostname);
424
425
  let url;
425
426
  switch (cal.external.service) {
426
427
  case ExternalCalendarSources.GOOGLE:
@@ -729,7 +730,7 @@ class IDEACalendarItemComponent {
729
730
  };
730
731
  const doLink = async () => {
731
732
  try {
732
- await this._calendars.linkExtService(this.calendar);
733
+ await this._calendars.linkExtService(this.calendar, this.baseURL);
733
734
  this.linkExtCalendarOrDelete();
734
735
  }
735
736
  catch (error) {
@@ -747,7 +748,7 @@ class IDEACalendarItemComponent {
747
748
  }
748
749
  }
749
750
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
750
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], dependencies: [{ kind: "component", type: i2.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
751
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarItemComponent, selector: "idea-calendar-item", inputs: { calendar: "calendar", disabled: "disabled", advancedPermissions: "advancedPermissions", hideColor: "hideColor", baseURL: "baseURL" }, outputs: { somethingChanged: "somethingChanged" }, ngImport: i0, template: "@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n", styles: [".calendarItem ion-avatar.colorCircle{width:20px;height:20px;background-color:#555}\n"], dependencies: [{ kind: "component", type: i2.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
751
752
  }
752
753
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarItemComponent, decorators: [{
753
754
  type: Component,
@@ -760,6 +761,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
760
761
  type: Input
761
762
  }], hideColor: [{
762
763
  type: Input
764
+ }], baseURL: [{
765
+ type: Input
763
766
  }], somethingChanged: [{
764
767
  type: Output
765
768
  }] } });
@@ -815,46 +818,47 @@ class IDEACalendarCreationComponent {
815
818
  this.calendar.load(cal);
816
819
  this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');
817
820
  if (!cal.external) {
818
- this._modal.dismiss(this.calendar);
821
+ await this._modal.dismiss(this.calendar);
819
822
  return;
820
823
  }
821
824
  try {
822
- await this._calendars.linkExtService(this.calendar);
825
+ await this._loading.hide();
826
+ await this._calendars.linkExtService(this.calendar, this.baseURL);
823
827
  const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);
824
828
  if (!res) {
825
- this._modal.dismiss(this.calendar);
829
+ await this._modal.dismiss(this.calendar);
826
830
  return;
827
831
  }
828
832
  this.calendar.load(res);
829
- await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
830
833
  try {
834
+ await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));
831
835
  await this._calendars.syncCalendar(this.calendar);
832
- this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
836
+ await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');
833
837
  }
834
838
  catch (error) {
835
- this._message.error('COMMON.OPERATION_FAILED');
839
+ await this._message.error('COMMON.OPERATION_FAILED');
836
840
  }
837
841
  finally {
838
- this._modal.dismiss(this.calendar);
842
+ await this._modal.dismiss(this.calendar);
839
843
  }
840
844
  }
841
845
  catch (error) {
842
- this._message.error('COMMON.OPERATION_FAILED');
843
- this._modal.dismiss(this.calendar);
846
+ await this._message.error('COMMON.OPERATION_FAILED');
847
+ await this._modal.dismiss(this.calendar);
844
848
  }
845
849
  }
846
850
  catch (error) {
847
- this._message.error('COMMON.OPERATION_FAILED');
851
+ await this._message.error('COMMON.OPERATION_FAILED');
848
852
  }
849
853
  finally {
850
- this._loading.hide();
854
+ await this._loading.hide();
851
855
  }
852
856
  }
853
857
  close() {
854
858
  this._modal.dismiss();
855
859
  }
856
860
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
857
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"], dependencies: [{ kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
861
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarCreationComponent, selector: "idea-calendar-creation", inputs: { fixScope: "fixScope", onlyExternalCalendars: "onlyExternalCalendars", baseURL: "baseURL" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n", styles: ["ion-content{--background: var(--ion-color-white-shade)}.choiceGrid ion-row ion-col>h1{margin:10px 0 0;font-size:1.1em}.choiceGrid ion-row ion-col>p{margin-top:0;margin-bottom:0;font-size:.9em}.choiceGrid ion-row:first-child ion-col{padding-bottom:25px}.choiceGrid ion-card{--ion-item-background: var(--ion-color-white);--color: var(--ion-color-dark-tint);height:240px;margin:0 auto;text-align:center}.choiceGrid ion-card ion-card-header{padding-bottom:10px}.choiceGrid ion-card ion-card-header ion-card-title{font-size:2.5em}.choiceGrid ion-card ion-card-content h1{font-size:1.4em;height:60px}.choiceGrid ion-card.step2{height:135px}.choiceGrid ion-card.step2 ion-card-header{padding-top:10px;padding-bottom:0}.choiceGrid ion-card.step2 ion-card-content h1{height:auto}\n"], dependencies: [{ kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
858
862
  }
859
863
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarCreationComponent, decorators: [{
860
864
  type: Component,
@@ -863,6 +867,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
863
867
  type: Input
864
868
  }], onlyExternalCalendars: [{
865
869
  type: Input
870
+ }], baseURL: [{
871
+ type: Input
866
872
  }] } });
867
873
  /**
868
874
  * The possible scopes of the calendar.
@@ -1 +1 @@
1
- {"version":3,"file":"idea-ionic-agenda.mjs","sources":["../../../modules/agenda/src/dateFormatter.provider.ts","../../../modules/agenda/src/agenda.component.ts","../../../modules/agenda/src/agenda.component.html","../../../modules/agenda/src/calendars.service.ts","../../../modules/agenda/src/calendar.component.ts","../../../modules/agenda/src/calendar.component.html","../../../modules/agenda/src/calendarItem.component.ts","../../../modules/agenda/src/calendarItem.component.html","../../../modules/agenda/src/calendarCreation.component.ts","../../../modules/agenda/src/calendarCreation.component.html","../../../modules/agenda/src/agenda.module.ts","../../../modules/agenda/idea-ionic-agenda.ts"],"sourcesContent":["import { formatDate } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport { CalendarDateFormatter, DateFormatterParams } from 'angular-calendar';\n\n@Injectable()\nexport class CustomDateFormatter extends CalendarDateFormatter {\n // MONTH VIEW\n monthViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n monthViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM y', locale);\n\n // WEEK VIEW\n weekViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n weekViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n weekViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM yyyy', locale);\n\n // DAY VIEW\n dayViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n dayViewTitle = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'EEEE, dd MMM yyyy', locale) : formatDate(date, 'EEEE, MMM dd, yyyy', locale);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n Input,\n Output,\n EventEmitter,\n OnInit,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { IonContent, Platform } from '@ionic/angular/standalone';\nimport { finalize, fromEvent, Subject, takeUntil } from 'rxjs';\nimport {\n CalendarEvent,\n CalendarEventTimesChangedEvent,\n CalendarMonthViewBeforeRenderEvent,\n CalendarView,\n CalendarWeekViewBeforeRenderEvent\n} from 'angular-calendar';\nimport { isFuture, isToday, isSameDay, endOfWeek, addDays, addMinutes } from 'date-fns';\n// @ts-ignore\nimport ColorParse from 'color-parse';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-agenda',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'agenda.component.html',\n styleUrls: ['agenda.component.scss']\n})\nexport class IDEAAgendaComponent implements OnInit {\n private _cdr = inject(ChangeDetectorRef);\n private _platform = inject(Platform);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The events to display in the calendar.\n */\n @Input() events: AgendaEvent[] = [];\n /**\n * An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.\n */\n @Input() excludeDays: number[] = [];\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n @Input() dayStartHour = 0;\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n @Input() dayEndHour = 23;\n /**\n * The number of segments in an hour. Must divide equally into 60.\n */\n @Input() hourSegments = 2;\n /**\n * Whether to open the current day's details right away in month view.\n */\n @Input() activeDayIsOpen = false;\n /**\n * The view mode for the agenda.\n */\n @Input() view: CalendarView = CalendarView.Week;\n /**\n * The allowed view mode for the agenda.\n */\n @Input() allowedViews = [CalendarView.Day, CalendarView.Week, CalendarView.Month];\n /**\n * Whether to block any day/slot in the past.\n */\n @Input() onlyFuture = false;\n /**\n * Some notes to show underneath the calendar's header.\n */\n @Input() titleNotes: string;\n /**\n * The template for new events created by drag&drop.\n */\n @Input() newEventTemplate: AgendaEvent = { title: 'New', start: null, meta: {} };\n /**\n * Whether (and how) to allow the creation of events by drag&drop.\n * If enabled, on mobile it requires the `parentContent` to be set for a correct execution.\n */\n @Input() allowDragToCreate: DragToCreateOptions = DragToCreateOptions.DISABLED;\n /**\n * The parent ion-content, in case we want to control its scrollability for drag&drop features.\n */\n @Input() parentContent: IonContent;\n /**\n * Trigger when an event is selected.\n */\n @Output() selectEvent = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when a day is selected.\n */\n @Output() selectDay = new EventEmitter<Date>();\n /**\n * Trigger when a time slot is selected.\n */\n @Output() selectSlot = new EventEmitter<Date>();\n /**\n * Trigger when a new event is added by drag and drop.\n */\n @Output() newEventByDrag = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when an event changed date (drag&drop or resize).\n */\n @Output() changeEvent = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when the view date of reference changed (because we moved inside the calendar).\n */\n @Output() changeDate = new EventEmitter<Date>();\n /**\n * Trigger before the rendering of the week or day view.\n */\n @Output() beforeWeekOrDayViewRenderEmitter = new EventEmitter<CalendarWeekViewBeforeRenderEvent>();\n /**\n * Trigger before the rendering of the month view.\n */\n @Output() beforeMonthViewRenderEmitter = new EventEmitter<CalendarMonthViewBeforeRenderEvent>();\n\n CalendarView = CalendarView;\n Attendance = EventAttendance;\n viewDate = new Date();\n refresh = new Subject<void>();\n /**\n * @hide\n */\n locale: string;\n /**\n * @hide\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n ngOnInit(): void {\n this.locale = this._translate.getCurrentLang();\n // in case of Italian locale the starting day for the week is monday (1), otherwise sunday (0)\n this.weekStartsOn = this.locale === 'it' ? 1 : 0;\n }\n isMobile(): boolean {\n return this._platform.is('mobile');\n }\n\n /**\n * Run some checks before the month view is rendered (e.g. disable invalid days).\n */\n beforeMonthViewRender(event: CalendarMonthViewBeforeRenderEvent): void {\n this.beforeMonthViewRenderEmitter.emit(event);\n const { body } = event;\n body.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n }\n /**\n * Run some checks before the week/day view is rendered (e.g. disable invalid days).\n */\n beforeWeekOrDayViewRender(event: CalendarWeekViewBeforeRenderEvent): void {\n this.beforeWeekOrDayViewRenderEmitter.emit(event);\n const { header, hourColumns } = event;\n header.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n hourColumns.forEach(hourCol => {\n hourCol.hours.forEach(hour => {\n hour.segments.forEach(segment => {\n if (!this.dateIsValid(segment.date)) segment.cssClass = 'cal-disabled';\n });\n });\n });\n }\n\n dateIsValid(date: any, sameDayIsValid?: boolean): boolean {\n if (!this.onlyFuture) return true;\n return isFuture(date) || (sameDayIsValid ? isToday(date) : false);\n }\n\n setView(view: CalendarView): void {\n this.view = view;\n }\n\n viewDateChanged(newDate: Date): void {\n if (this.view === CalendarView.Month) this.activeDayIsOpen = false;\n this.changeDate.emit(newDate);\n }\n\n changeDay({ date, events }: { date: Date; events: AgendaEvent[] }): void {\n if (!this.dateIsValid(date, true)) return;\n if ((isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || !events || events.length === 0)\n this.activeDayIsOpen = false;\n else this.activeDayIsOpen = true;\n this.viewDate = date;\n }\n\n eventTimesChanged({ event, newStart, newEnd }: CalendarEventTimesChangedEvent): void {\n event.start = newStart;\n event.end = newEnd;\n this.events = this.events.slice();\n this.changeEvent.emit(event);\n }\n\n getAlternateColor(color: string, amount: number, opacity?: number): string | undefined {\n if (!color?.trim()) return undefined;\n const alt = ColorParse(color.trim());\n const r = Math.max(Math.min(255, Number(alt.values[0]) + amount), 0);\n const g = Math.max(Math.min(255, Number(alt.values[1]) + amount), 0);\n const b = Math.max(Math.min(255, Number(alt.values[2]) + amount), 0);\n return `rgba(${r}, ${g}, ${b}, ${opacity || 1})`;\n }\n\n getTooltipContent(event: AgendaEvent): string {\n if (!event) return '';\n let str = event.title ? '<b>' + event.title + '</b>' : '';\n if (event.target) str = str.concat('<br>', event.target);\n if (event.location) str = str.concat('<br>', event.location);\n if (event.description) {\n str = str.concat('<br>');\n str = str.concat('<br>', event.description);\n }\n if (event.icons) {\n str = str.concat('<br>');\n event.icons.forEach(x => (str = str.concat('<br>', '<i>', x.title, '</i>')));\n }\n if (event.avatars && event.avatars.length) {\n str = str.concat('<br><br>~');\n event.avatars.forEach(x => (str = str.concat('<br>', x.title)));\n }\n return str;\n }\n\n getPreviewDescription(description: string): string {\n return description && description.length > 100 ? description.slice(0, 100).concat('...') : description;\n }\n\n startDragToCreate(event: Event, segmentDate: Date, segmentElement: HTMLElement): void {\n if (!this.allowDragToCreate) return;\n\n if (this.parentContent) this.parentContent.scrollY = false;\n\n const eventByDragAndDrop: AgendaEvent = { ...this.newEventTemplate, start: segmentDate };\n this.events = [...this.events, eventByDragAndDrop];\n\n const segmentPosition = segmentElement.getBoundingClientRect();\n const endOfView = endOfWeek(this.viewDate, { weekStartsOn: this.weekStartsOn });\n\n const whileDragging = (draggingEvent: Event): void => {\n const { clientY, clientX } =\n draggingEvent.type === 'touchmove' ? (draggingEvent as TouchEvent).touches[0] : (draggingEvent as MouseEvent);\n\n const minutesDiff = ceilToNearest(clientY - segmentPosition.top, 30);\n const daysDiff = floorToNearest(clientX - segmentPosition.left, segmentPosition.width) / segmentPosition.width;\n\n let newEnd: Date;\n if (this.allowDragToCreate === DragToCreateOptions.ONLY_SAME_DAY) newEnd = addMinutes(segmentDate, minutesDiff);\n else newEnd = addDays(addMinutes(segmentDate, minutesDiff), daysDiff);\n\n if (newEnd > segmentDate && newEnd < endOfView) eventByDragAndDrop.end = newEnd;\n refreshView();\n };\n\n const endOfDrag = (): void => {\n if (this.parentContent) this.parentContent.scrollY = true;\n eventByDragAndDrop.end = this.getFixedEndDateWithMinimumSegmentDuration(eventByDragAndDrop);\n refreshView();\n this.newEventByDrag.emit(eventByDragAndDrop);\n };\n\n const refreshView = (): void => {\n this.events = [...this.events];\n this._cdr.detectChanges();\n };\n\n if (event.type === 'touchstart') {\n fromEvent(document, 'touchmove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'touchend')))\n .subscribe(whileDragging);\n } else {\n fromEvent(document, 'mousemove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'mouseup')))\n .subscribe(whileDragging);\n }\n }\n private getFixedEndDateWithMinimumSegmentDuration(agendaBooking: AgendaEvent): Date {\n const fixedEnd = new Date(agendaBooking.end || agendaBooking.start);\n const segmentSizeInMinutes = 60 / this.hourSegments;\n if (fixedEnd.getTime() <= agendaBooking.start.getTime() + segmentSizeInMinutes * 60 * 1000)\n fixedEnd.setMinutes(agendaBooking.start.getMinutes() + segmentSizeInMinutes);\n return fixedEnd;\n }\n}\n\n/**\n * A richer version of the classic CalendarEvent.\n */\nexport interface AgendaEvent extends CalendarEvent {\n /**\n * A brief description for the event.\n */\n description?: string;\n /**\n * The customer/stakeholder/target of the event.\n */\n target?: string;\n /**\n * The location of the event.\n */\n location?: string;\n /**\n * A list of URLs of images to show as small avatars.\n */\n avatars?: { id: string; url: string; title: string }[];\n /**\n * A list of ion-icons to show.\n */\n icons?: { name: string; title: string }[];\n /**\n * The colors of the event displayed.\n */\n color?: { primary: string; secondary?: string } | any;\n /**\n * Whether the event is external; external events are less important UI-wise.\n */\n external?: boolean;\n /**\n * The attendance status to this event, if any.\n */\n attendance?: EventAttendance;\n /**\n * A standard and unique id for the event, valid across multiple sources.\n */\n iCalUID?: string;\n}\n\n/**\n * Possible attendance statuses for the event.\n */\nexport enum EventAttendance {\n DECLINED = -1,\n NEEDS_ACTION = 0,\n TENTATIVE,\n ACCEPTED\n}\n\n/**\n * The options to allow (or not) drag&drop to create a new event.\n */\nexport enum DragToCreateOptions {\n DISABLED = 0,\n ONLY_SAME_DAY = 1,\n FREE = 2\n}\n\nconst floorToNearest = (amount: number, precision: number): number => Math.floor(amount / precision) * precision;\nconst ceilToNearest = (amount: number, precision: number): number => Math.ceil(amount / precision) * precision;\n","<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour\"\n [dayEndHour]=\"dayEndHour\"\n [hourSegments]=\"hourSegments\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour\"\n [dayEndHour]=\"dayEndHour\"\n [hourSegments]=\"hourSegments\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Calendar, ExternalCalendarSources, Suggestion } from 'idea-toolbox';\nimport {\n IDEAEnvironment,\n IDEALoadingService,\n IDEATranslationsService,\n IDEASuggestionsComponent\n} from '@idea-ionic/common';\nimport { IDEAAWSAPIService } from '@idea-ionic/uncommon';\n\n/**\n * Note: to test locally, you need to temporarily change the redirect URI:\n * - in the lambda `idea_calendars`, e.g. `SCARLETT_URL`;\n * - in the client config file: `APP_URL`.\n * In both cases, the value should be set to `http://localhost:8100` (or according to the local URL).\n */\n@Injectable()\nexport class IDEACalendarsService {\n protected _env = inject(IDEAEnvironment);\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * Get the ion-icon of an external service from its name.\n */\n getServiceIcon(service: ExternalCalendarSources | string): string {\n switch (service) {\n case ExternalCalendarSources.GOOGLE:\n return 'logo-google';\n case ExternalCalendarSources.MICROSOFT:\n return 'logo-windows';\n default:\n return 'help';\n }\n }\n /**\n * Get the base URL for API request (shared/private calendar).\n */\n getRequestURL(calendar: Calendar): string {\n return (calendar.teamId ? `teams/${calendar.teamId}/` : '').concat('calendars');\n }\n\n /**\n * Create a new calendar.\n */\n async postCalendar(cal: Calendar): Promise<Calendar> {\n const calendar = await this._API.postResource(this.getRequestURL(cal), { idea: true, body: cal });\n return new Calendar(calendar);\n }\n /**\n * Update an existing calendar.\n */\n async putCalendar(cal: Calendar): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: cal };\n const calendar = await this._API.putResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n /**\n * Delete a calendar.\n */\n async deleteCalendar(cal: Calendar): Promise<void> {\n await this._API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId });\n }\n /**\n * Associate an external calendar with the given calendar.\n */\n async setExternalCalendar(cal: Calendar, externalId: string): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'SET_EXTERNAL_CALENDAR', externalId } };\n const calendar = await this._API.patchResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n\n /**\n * Link the calendar with the chosen external service (auth flow).\n */\n async linkExtService(cal: Calendar): Promise<void> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n const baseURL = window.location.protocol.concat('//', window.location.hostname);\n let url: string;\n switch (cal.external.service) {\n case ExternalCalendarSources.GOOGLE:\n url =\n 'https://accounts.google.com/o/oauth2/v2/auth?' +\n `client_id=${encodeURIComponent(this._env.google.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +\n '&include_granted_scopes=true' +\n '&access_type=offline&prompt=consent' +\n `&scope=${encodeURIComponent(this._env.google.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n case ExternalCalendarSources.MICROSOFT:\n url =\n 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +\n `client_id=${encodeURIComponent(this._env.microsoft.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +\n '&response_mode=query' +\n `&scope=${encodeURIComponent(this._env.microsoft.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n }\n if (!url) throw new Error('INVALID_SERVICE');\n await Browser.open({ url });\n // since we don't know when/if the auth flow will finish, we wait\n await this.showAlertLinkingCalendar();\n }\n private async showAlertLinkingCalendar(): Promise<void> {\n return new Promise(async resolve => {\n const header = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE');\n const buttons = [{ text: this._translate._('COMMON.DONE'), handler: resolve }];\n const alert = await this._alert.create({ header, message, buttons, backdropDismiss: false });\n alert.present();\n });\n }\n\n /**\n * Get the external calendars list of the external service.\n */\n async getExternalCalendars(cal: Calendar): Promise<ExtCalendar[]> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n // get the access token to make requests; in case it fails, proceed to link the external service\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'GET_ACCESS_TOKEN' } };\n const result = await this._API.patchResource(this.getRequestURL(cal), body);\n const headers = { Authorization: 'Bearer '.concat(result.token) };\n if (cal.external.service === ExternalCalendarSources.GOOGLE) {\n const res = await (\n await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })\n ).json();\n return res.items.map((c: any): ExtCalendar => ({ name: c.summary, id: c.id }) as ExtCalendar);\n } else if (cal.external.service === ExternalCalendarSources.MICROSOFT) {\n const res = await (await fetch('https://graph.microsoft.com/v1.0/me/calendars', { headers })).json();\n return res.value.map((c: any): ExtCalendar => ({ name: c.name, id: c.id }) as ExtCalendar);\n }\n }\n\n /**\n * If the external service is linked, choose an external calendar and set it for the chosen calendar.\n * @return the updated calendar.\n */\n async chooseAndSetExternalCalendar(cal: Calendar): Promise<Calendar> {\n const extCalId = await this.openModalAndPickExternalCalendar(cal);\n if (!extCalId) return;\n return await this.setExternalCalendar(cal, extCalId);\n }\n /**\n * Open the modal to pick a calendar from the external service.\n * @return the id of the external calendar.\n */\n private async openModalAndPickExternalCalendar(cal: Calendar): Promise<string> {\n let extCals: ExtCalendar[];\n try {\n await this._loading.show();\n extCals = await this.getExternalCalendars(cal);\n if (!extCals.length) throw new Error('NO_EXTERNAL_CALENDARS');\n } catch (error) {\n throw error;\n } finally {\n this._loading.hide();\n }\n const modal = await this._modal.create({\n component: IDEASuggestionsComponent,\n componentProps: {\n data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),\n searchPlaceholder: this._translate._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),\n sortData: true,\n hideIdFromUI: true,\n hideClearButton: true,\n mustChoose: true\n },\n backdropDismiss: false\n });\n modal.present();\n const res = await modal.onDidDismiss();\n return res.data ? res.data.value : null;\n }\n\n /**\n * First sync of the extenal calendar.\n */\n syncCalendar(cal: Calendar): Promise<void> {\n return new Promise((resolve, reject): void => this.syncCalendarHelper(cal, err => (err ? reject(err) : resolve())));\n }\n /**\n * Helper to recursively sync an the extenal calendar.\n */\n private syncCalendarHelper(cal: Calendar, done: (err?: Error) => void): void {\n // this is a recursive operation: the API returns if the sync has to continue or it finished\n this._API\n .patchResource(this.getRequestURL(cal), {\n idea: true,\n resourceId: cal.calendarId,\n body: { action: 'SYNC_EXTERNAL_CALENDAR', firstSync: true }\n })\n .then((res: any): void => {\n if (res.moreData) this.syncCalendarHelper(cal, done);\n else done();\n })\n .catch(err => done(err));\n }\n}\n\n/**\n * Helper structure to define external services' calendars (basic info).\n */\ninterface ExtCalendar {\n id: string;\n name: string;\n}\n","import { Component, Input, OnInit, inject } from '@angular/core';\nimport { ModalController, AlertController } from '@ionic/angular/standalone';\nimport { Calendar, Check, Membership } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEAAWSAPIService, IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar',\n templateUrl: 'calendar.component.html',\n styleUrls: ['calendar.component.scss']\n})\nexport class IDEACalendarComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to manage.\n */\n @Input() calendar: Calendar;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor: boolean;\n\n calendarWC: Calendar;\n membershipsChecks: Check[];\n membership: Membership;\n errors = new Set<string>();\n DEFAULT_COLOR = '#555';\n\n async ngOnInit(): Promise<void> {\n this.membership = this._tc.get('membership');\n this.calendarWC = new Calendar(this.calendar);\n try {\n const memberships: Membership[] = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);\n this.membershipsChecks = memberships.map(\n m =>\n new Check({\n value: m.userId,\n name: m.name,\n checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)\n })\n );\n } catch (error) {\n this._message.error('COMMON.COULDNT_LOAD_LIST');\n }\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors.has(field);\n }\n\n async save(): Promise<void> {\n if (!this.calendarWC.color) this.calendarWC.color = this.DEFAULT_COLOR;\n if (this.calendarWC.isShared() && this.advancedPermissions)\n this.calendarWC.usersCanManageAppointments = this.membershipsChecks\n .filter(x => x.checked)\n .map(x => String(x.value));\n else delete this.calendarWC.usersCanManageAppointments;\n\n this.errors = new Set(this.calendarWC.validate());\n if (this.errors.size) return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');\n\n try {\n await this._loading.show();\n const res = await this._calendars.putCalendar(this.calendarWC);\n this.calendar.load(res);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');\n this._modal.dismiss(this.calendar);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n }\n\n async delete(): Promise<void> {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendarWC);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');\n this._modal.dismiss(true);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n\n const header = this._translate._('COMMON.ARE_YOU_SURE');\n const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.DELETE'), handler: doDelete }\n ];\n const alert = await this._alert.create({ header, subHeader, message, buttons });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"_calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n","import { Component, EventEmitter, Input, Output, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Calendar } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar-item',\n templateUrl: 'calendarItem.component.html',\n styleUrls: ['calendarItem.component.scss']\n})\nexport class IDEACalendarItemComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _message = inject(IDEAMessageService);\n private _loading = inject(IDEALoadingService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to show.\n */\n @Input() calendar: Calendar;\n /**\n * Whether the component is disabled.\n */\n @Input() disabled: boolean;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor: boolean;\n /**\n * Report to parent components a change.\n */\n @Output() somethingChanged = new EventEmitter<Calendar>();\n\n async manageCalendar(): Promise<void> {\n if (this.disabled) return;\n const modal = await this._modal.create({\n component: IDEACalendarComponent,\n componentProps: {\n calendar: this.calendar,\n advancedPermissions: this.advancedPermissions,\n hideColor: this.hideColor\n }\n });\n modal.onDidDismiss().then(res => {\n const cal = res.data;\n if (cal === undefined) return;\n else if (cal === null) this.calendar = null;\n else this.calendar.load(cal);\n this.somethingChanged.emit();\n });\n modal.present();\n }\n\n async linkExtCalendarOrDelete(): Promise<void> {\n if (this.disabled) return;\n try {\n const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!cal) throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n this.somethingChanged.emit();\n }\n } catch (error) {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendar);\n this._message.success('COMMON.OPERATION_COMPLETED');\n this.somethingChanged.emit();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n const doLink = async (): Promise<void> => {\n try {\n await this._calendars.linkExtService(this.calendar);\n this.linkExtCalendarOrDelete();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n }\n };\n const header = this._translate._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE');\n const buttons = [\n { text: this._translate._('COMMON.DELETE'), handler: doDelete },\n { text: this._translate._('IDEA_AGENDA.CALENDARS.LINK'), handler: doLink }\n ];\n const alert = await this._alert.create({ header, message, buttons });\n alert.present();\n }\n }\n}\n","@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n","import { Component, Input, OnInit, inject } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport { Calendar, ExternalCalendarInfo, ExternalCalendarSources, Membership, Team } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar-creation',\n templateUrl: 'calendarCreation.component.html',\n styleUrls: ['calendarCreation.component.scss']\n})\nexport class IDEACalendarCreationComponent implements OnInit {\n private _modal = inject(ModalController);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _translate = inject(IDEATranslationsService);\n private _tc = inject(IDEATinCanService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * Whether we want to allow the creation of only a particular type of calendar, based on the scope.\n */\n @Input() fixScope: CalendarScopes;\n /**\n * Whether we want to allow the creation of local calendars.\n */\n @Input() onlyExternalCalendars: boolean;\n\n team: Team;\n membership: Membership;\n calendar: Calendar;\n DEFAULT_COLOR = '#555';\n SOURCES = Object.keys(ExternalCalendarSources);\n\n ngOnInit(): void {\n this.calendar = new Calendar();\n this.team = this._tc.get('team');\n this.membership = this._tc.get('membership');\n if (this.fixScope === CalendarScopes.SHARED) this.calendar.teamId = this.team.teamId;\n if (this.fixScope === CalendarScopes.PRIVATE) this.calendar.userId = this.membership.userId;\n }\n\n resetScope(): void {\n if (this.canChangeScope()) this.calendar.teamId = this.calendar.userId = null;\n }\n canChangeScope(): boolean {\n return !this.fixScope && this.scopeIsSet();\n }\n scopeIsSet(): boolean {\n return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);\n }\n\n async saveNewCalendar(service?: ExternalCalendarSources | string): Promise<void> {\n if (!this.scopeIsSet()) return;\n if (!service && this.onlyExternalCalendars) return;\n if (service) {\n this.calendar.external = new ExternalCalendarInfo({ service });\n this.calendar.name = '-'; // it will be substituted with the external name\n } else {\n this.calendar.name = this.calendar.userId\n ? this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')\n : this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');\n this.calendar.color = this.DEFAULT_COLOR;\n }\n try {\n await this._loading.show();\n const cal = await this._calendars.postCalendar(this.calendar);\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');\n if (!cal.external) {\n this._modal.dismiss(this.calendar);\n return;\n }\n try {\n await this._calendars.linkExtService(this.calendar);\n const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!res) {\n this._modal.dismiss(this.calendar);\n return;\n }\n this.calendar.load(res);\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n try {\n await this._calendars.syncCalendar(this.calendar);\n this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The possible scopes of the calendar.\n */\nexport enum CalendarScopes {\n SHARED = 'shared', // teamId\n PRIVATE = 'private' // userId\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonicModule } from '@ionic/angular';\n\nimport { CalendarDateFormatter, CalendarModule, DateAdapter } from 'angular-calendar';\nimport { adapterFactory } from 'angular-calendar/date-adapters/date-fns';\nimport { CustomDateFormatter } from './dateFormatter.provider';\n\nimport { IDEACheckerComponent, IDEATranslationsModule, IDEAUserAvatarComponent } from '@idea-ionic/common';\nimport { IDEAColorPickerComponent } from '@idea-ionic/uncommon';\n\nimport { IDEAAgendaComponent } from './agenda.component';\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarItemComponent } from './calendarItem.component';\nimport { IDEACalendarCreationComponent } from './calendarCreation.component';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n IonicModule,\n IDEATranslationsModule,\n IDEAColorPickerComponent,\n IDEACheckerComponent,\n IDEAUserAvatarComponent,\n CalendarModule.forRoot({ provide: DateAdapter, useFactory: adapterFactory })\n ],\n declarations: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n exports: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n providers: [{ provide: CalendarDateFormatter, useClass: CustomDateFormatter }, IDEACalendarsService]\n})\nexport class IDEAAgendaModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i2"],"mappings":"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"}
1
+ {"version":3,"file":"idea-ionic-agenda.mjs","sources":["../../../modules/agenda/src/dateFormatter.provider.ts","../../../modules/agenda/src/agenda.component.ts","../../../modules/agenda/src/agenda.component.html","../../../modules/agenda/src/calendars.service.ts","../../../modules/agenda/src/calendar.component.ts","../../../modules/agenda/src/calendar.component.html","../../../modules/agenda/src/calendarItem.component.ts","../../../modules/agenda/src/calendarItem.component.html","../../../modules/agenda/src/calendarCreation.component.ts","../../../modules/agenda/src/calendarCreation.component.html","../../../modules/agenda/src/agenda.module.ts","../../../modules/agenda/idea-ionic-agenda.ts"],"sourcesContent":["import { formatDate } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport { CalendarDateFormatter, DateFormatterParams } from 'angular-calendar';\n\n@Injectable()\nexport class CustomDateFormatter extends CalendarDateFormatter {\n // MONTH VIEW\n monthViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n monthViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM y', locale);\n\n // WEEK VIEW\n weekViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n weekViewColumnHeader = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'EEE', locale);\n weekViewTitle = ({ date, locale }: DateFormatterParams): string => formatDate(date, 'MMMM yyyy', locale);\n\n // DAY VIEW\n dayViewHour = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'HH:mm', locale) : formatDate(date, 'h aa', locale);\n dayViewTitle = ({ date, locale }: DateFormatterParams): string =>\n locale === 'it' ? formatDate(date, 'EEEE, dd MMM yyyy', locale) : formatDate(date, 'EEEE, MMM dd, yyyy', locale);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n Input,\n Output,\n EventEmitter,\n OnInit,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { IonContent, Platform } from '@ionic/angular/standalone';\nimport { finalize, fromEvent, Subject, takeUntil } from 'rxjs';\nimport {\n CalendarEvent,\n CalendarEventTimesChangedEvent,\n CalendarMonthViewBeforeRenderEvent,\n CalendarView,\n CalendarWeekViewBeforeRenderEvent\n} from 'angular-calendar';\nimport { isFuture, isToday, isSameDay, endOfWeek, addDays, addMinutes } from 'date-fns';\n// @ts-ignore\nimport ColorParse from 'color-parse';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-agenda',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'agenda.component.html',\n styleUrls: ['agenda.component.scss']\n})\nexport class IDEAAgendaComponent implements OnInit {\n private _cdr = inject(ChangeDetectorRef);\n private _platform = inject(Platform);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The events to display in the calendar.\n */\n @Input() events: AgendaEvent[] = [];\n /**\n * An array of day indexes (0 = sunday, 1 = monday, etc.) that will be hidden on the view.\n */\n @Input() excludeDays: number[] = [];\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n @Input() dayStartHour = 0;\n /**\n * The day start hours in 24 hour time. Must be 0-23\n */\n @Input() dayEndHour = 23;\n /**\n * The number of segments in an hour. Must divide equally into 60.\n */\n @Input() hourSegments = 2;\n /**\n * Whether to open the current day's details right away in month view.\n */\n @Input() activeDayIsOpen = false;\n /**\n * The view mode for the agenda.\n */\n @Input() view: CalendarView = CalendarView.Week;\n /**\n * The allowed view mode for the agenda.\n */\n @Input() allowedViews = [CalendarView.Day, CalendarView.Week, CalendarView.Month];\n /**\n * Whether to block any day/slot in the past.\n */\n @Input() onlyFuture = false;\n /**\n * Some notes to show underneath the calendar's header.\n */\n @Input() titleNotes: string;\n /**\n * The template for new events created by drag&drop.\n */\n @Input() newEventTemplate: AgendaEvent = { title: 'New', start: null, meta: {} };\n /**\n * Whether (and how) to allow the creation of events by drag&drop.\n * If enabled, on mobile it requires the `parentContent` to be set for a correct execution.\n */\n @Input() allowDragToCreate: DragToCreateOptions = DragToCreateOptions.DISABLED;\n /**\n * The parent ion-content, in case we want to control its scrollability for drag&drop features.\n */\n @Input() parentContent: IonContent;\n /**\n * Trigger when an event is selected.\n */\n @Output() selectEvent = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when a day is selected.\n */\n @Output() selectDay = new EventEmitter<Date>();\n /**\n * Trigger when a time slot is selected.\n */\n @Output() selectSlot = new EventEmitter<Date>();\n /**\n * Trigger when a new event is added by drag and drop.\n */\n @Output() newEventByDrag = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when an event changed date (drag&drop or resize).\n */\n @Output() changeEvent = new EventEmitter<AgendaEvent>();\n /**\n * Trigger when the view date of reference changed (because we moved inside the calendar).\n */\n @Output() changeDate = new EventEmitter<Date>();\n /**\n * Trigger before the rendering of the week or day view.\n */\n @Output() beforeWeekOrDayViewRenderEmitter = new EventEmitter<CalendarWeekViewBeforeRenderEvent>();\n /**\n * Trigger before the rendering of the month view.\n */\n @Output() beforeMonthViewRenderEmitter = new EventEmitter<CalendarMonthViewBeforeRenderEvent>();\n\n CalendarView = CalendarView;\n Attendance = EventAttendance;\n viewDate = new Date();\n refresh = new Subject<void>();\n /**\n * @hide\n */\n locale: string;\n /**\n * @hide\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n ngOnInit(): void {\n this.locale = this._translate.getCurrentLang();\n // in case of Italian locale the starting day for the week is monday (1), otherwise sunday (0)\n this.weekStartsOn = this.locale === 'it' ? 1 : 0;\n }\n isMobile(): boolean {\n return this._platform.is('mobile');\n }\n\n /**\n * Run some checks before the month view is rendered (e.g. disable invalid days).\n */\n beforeMonthViewRender(event: CalendarMonthViewBeforeRenderEvent): void {\n this.beforeMonthViewRenderEmitter.emit(event);\n const { body } = event;\n body.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n }\n /**\n * Run some checks before the week/day view is rendered (e.g. disable invalid days).\n */\n beforeWeekOrDayViewRender(event: CalendarWeekViewBeforeRenderEvent): void {\n this.beforeWeekOrDayViewRenderEmitter.emit(event);\n const { header, hourColumns } = event;\n header.forEach(day => {\n if (!this.dateIsValid(day.date)) day.cssClass = 'cal-disabled';\n });\n hourColumns.forEach(hourCol => {\n hourCol.hours.forEach(hour => {\n hour.segments.forEach(segment => {\n if (!this.dateIsValid(segment.date)) segment.cssClass = 'cal-disabled';\n });\n });\n });\n }\n\n dateIsValid(date: any, sameDayIsValid?: boolean): boolean {\n if (!this.onlyFuture) return true;\n return isFuture(date) || (sameDayIsValid ? isToday(date) : false);\n }\n\n setView(view: CalendarView): void {\n this.view = view;\n }\n\n viewDateChanged(newDate: Date): void {\n if (this.view === CalendarView.Month) this.activeDayIsOpen = false;\n this.changeDate.emit(newDate);\n }\n\n changeDay({ date, events }: { date: Date; events: AgendaEvent[] }): void {\n if (!this.dateIsValid(date, true)) return;\n if ((isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || !events || events.length === 0)\n this.activeDayIsOpen = false;\n else this.activeDayIsOpen = true;\n this.viewDate = date;\n }\n\n eventTimesChanged({ event, newStart, newEnd }: CalendarEventTimesChangedEvent): void {\n event.start = newStart;\n event.end = newEnd;\n this.events = this.events.slice();\n this.changeEvent.emit(event);\n }\n\n getAlternateColor(color: string, amount: number, opacity?: number): string | undefined {\n if (!color?.trim()) return undefined;\n const alt = ColorParse(color.trim());\n const r = Math.max(Math.min(255, Number(alt.values[0]) + amount), 0);\n const g = Math.max(Math.min(255, Number(alt.values[1]) + amount), 0);\n const b = Math.max(Math.min(255, Number(alt.values[2]) + amount), 0);\n return `rgba(${r}, ${g}, ${b}, ${opacity || 1})`;\n }\n\n getTooltipContent(event: AgendaEvent): string {\n if (!event) return '';\n let str = event.title ? '<b>' + event.title + '</b>' : '';\n if (event.target) str = str.concat('<br>', event.target);\n if (event.location) str = str.concat('<br>', event.location);\n if (event.description) {\n str = str.concat('<br>');\n str = str.concat('<br>', event.description);\n }\n if (event.icons) {\n str = str.concat('<br>');\n event.icons.forEach(x => (str = str.concat('<br>', '<i>', x.title, '</i>')));\n }\n if (event.avatars && event.avatars.length) {\n str = str.concat('<br><br>~');\n event.avatars.forEach(x => (str = str.concat('<br>', x.title)));\n }\n return str;\n }\n\n getPreviewDescription(description: string): string {\n return description && description.length > 100 ? description.slice(0, 100).concat('...') : description;\n }\n\n startDragToCreate(event: Event, segmentDate: Date, segmentElement: HTMLElement): void {\n if (!this.allowDragToCreate) return;\n\n if (this.parentContent) this.parentContent.scrollY = false;\n\n const eventByDragAndDrop: AgendaEvent = { ...this.newEventTemplate, start: segmentDate };\n this.events = [...this.events, eventByDragAndDrop];\n\n const segmentPosition = segmentElement.getBoundingClientRect();\n const endOfView = endOfWeek(this.viewDate, { weekStartsOn: this.weekStartsOn });\n\n const whileDragging = (draggingEvent: Event): void => {\n const { clientY, clientX } =\n draggingEvent.type === 'touchmove' ? (draggingEvent as TouchEvent).touches[0] : (draggingEvent as MouseEvent);\n\n const minutesDiff = ceilToNearest(clientY - segmentPosition.top, 30);\n const daysDiff = floorToNearest(clientX - segmentPosition.left, segmentPosition.width) / segmentPosition.width;\n\n let newEnd: Date;\n if (this.allowDragToCreate === DragToCreateOptions.ONLY_SAME_DAY) newEnd = addMinutes(segmentDate, minutesDiff);\n else newEnd = addDays(addMinutes(segmentDate, minutesDiff), daysDiff);\n\n if (newEnd > segmentDate && newEnd < endOfView) eventByDragAndDrop.end = newEnd;\n refreshView();\n };\n\n const endOfDrag = (): void => {\n if (this.parentContent) this.parentContent.scrollY = true;\n eventByDragAndDrop.end = this.getFixedEndDateWithMinimumSegmentDuration(eventByDragAndDrop);\n refreshView();\n this.newEventByDrag.emit(eventByDragAndDrop);\n };\n\n const refreshView = (): void => {\n this.events = [...this.events];\n this._cdr.detectChanges();\n };\n\n if (event.type === 'touchstart') {\n fromEvent(document, 'touchmove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'touchend')))\n .subscribe(whileDragging);\n } else {\n fromEvent(document, 'mousemove')\n .pipe(finalize(endOfDrag), takeUntil(fromEvent(document, 'mouseup')))\n .subscribe(whileDragging);\n }\n }\n private getFixedEndDateWithMinimumSegmentDuration(agendaBooking: AgendaEvent): Date {\n const fixedEnd = new Date(agendaBooking.end || agendaBooking.start);\n const segmentSizeInMinutes = 60 / this.hourSegments;\n if (fixedEnd.getTime() <= agendaBooking.start.getTime() + segmentSizeInMinutes * 60 * 1000)\n fixedEnd.setMinutes(agendaBooking.start.getMinutes() + segmentSizeInMinutes);\n return fixedEnd;\n }\n}\n\n/**\n * A richer version of the classic CalendarEvent.\n */\nexport interface AgendaEvent extends CalendarEvent {\n /**\n * A brief description for the event.\n */\n description?: string;\n /**\n * The customer/stakeholder/target of the event.\n */\n target?: string;\n /**\n * The location of the event.\n */\n location?: string;\n /**\n * A list of URLs of images to show as small avatars.\n */\n avatars?: { id: string; url: string; title: string }[];\n /**\n * A list of ion-icons to show.\n */\n icons?: { name: string; title: string }[];\n /**\n * The colors of the event displayed.\n */\n color?: { primary: string; secondary?: string } | any;\n /**\n * Whether the event is external; external events are less important UI-wise.\n */\n external?: boolean;\n /**\n * The attendance status to this event, if any.\n */\n attendance?: EventAttendance;\n /**\n * A standard and unique id for the event, valid across multiple sources.\n */\n iCalUID?: string;\n}\n\n/**\n * Possible attendance statuses for the event.\n */\nexport enum EventAttendance {\n DECLINED = -1,\n NEEDS_ACTION = 0,\n TENTATIVE,\n ACCEPTED\n}\n\n/**\n * The options to allow (or not) drag&drop to create a new event.\n */\nexport enum DragToCreateOptions {\n DISABLED = 0,\n ONLY_SAME_DAY = 1,\n FREE = 2\n}\n\nconst floorToNearest = (amount: number, precision: number): number => Math.floor(amount / precision) * precision;\nconst ceilToNearest = (amount: number, precision: number): number => Math.ceil(amount / precision) * precision;\n","<div class=\"agenda\">\n <!-- TOOLBAR -->\n <ion-row class=\"ion-align-items-center\">\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"5\"\n [sizeSm]=\"3\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n @if (allowedViews.length > 1) {\n <ion-item lines=\"none\" class=\"calendarViewSelector\">\n <ion-select\n interface=\"popover\"\n [value]=\"view\"\n (ionChange)=\"$event?.detail ? setView($event.detail.value) : null\"\n >\n @for (view of allowedViews; track view) {\n <ion-select-option [value]=\"view\">\n {{ 'IDEA_AGENDA.' + view | uppercase | translate }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n }\n </ion-col>\n <ion-col\n class=\"ion-align-self-center ion-text-right\"\n [size]=\"7\"\n [sizeSm]=\"4\"\n [pushSm]=\"5\"\n [sizeLg]=\"2\"\n [pushLg]=\"8\"\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarPreviousView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-back-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarToday\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"today-outline\" slot=\"icon-only\" />\n </ion-button>\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n size=\"small\"\n mwlCalendarNextView\n [view]=\"view\"\n [(viewDate)]=\"viewDate\"\n (viewDateChange)=\"viewDateChanged($event)\"\n >\n <ion-icon name=\"chevron-forward-outline\" slot=\"icon-only\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-align-self-center titleCol\" [size]=\"12\" [sizeSm]=\"5\" [pullSm]=\"7\" [sizeLg]=\"8\" [pullLg]=\"4\">\n <h2>{{ viewDate | calendarDate: view + 'ViewTitle' : locale }}</h2>\n @if (titleNotes) {\n <p>{{ titleNotes }}</p>\n }\n </ion-col>\n </ion-row>\n <!-- TEMPLATES (touch only what's necessary and leave everything else as it is) -->\n <ng-template #eventTitleTemplate let-event=\"event\" let-view=\"view\">\n <span\n class=\"cal-event-title\"\n [class.noWrap]=\"event.allDay\"\n [attr.aria-hidden]=\"{} | calendarA11y: 'hideEventTitle'\"\n >\n {{ event.title | calendarEventTitle: view : event }}\n @if (event.target) {\n <p>{{ event.target }}</p>\n } @else {\n @if (event.location) {\n <p>{{ event.location }}</p>\n }\n }\n @if (!event.allDay) {\n <p>{{ getPreviewDescription(event.description) }}</p>\n }\n </span>\n </ng-template>\n <ng-template\n #eventTemplate\n let-weekEvent=\"weekEvent\"\n let-tooltipPlacement=\"tooltipPlacement\"\n let-eventClicked=\"eventClicked\"\n let-tooltipTemplate=\"tooltipTemplate\"\n let-tooltipAppendToBody=\"tooltipAppendToBody\"\n let-tooltipDisabled=\"tooltipDisabled\"\n let-tooltipDelay=\"tooltipDelay\"\n let-column=\"column\"\n let-daysInWeek=\"daysInWeek\"\n >\n <div\n class=\"cal-event\"\n [class.external]=\"weekEvent.event.external\"\n [class.allDay]=\"weekEvent.event.allDay\"\n [class.needsAction]=\"Attendance.NEEDS_ACTION === weekEvent.event.attendance\"\n [class.declined]=\"Attendance.DECLINED === weekEvent.event.attendance\"\n [class.tentative]=\"Attendance.TENTATIVE === weekEvent.event.attendance\"\n [style.border-left-color]=\"weekEvent.event.color?.primary\"\n [style.color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 80 : -40)\"\n [style.background-color]=\"getAlternateColor(weekEvent.event.color?.primary, darkMode ? 60 : 80, 0.2)\"\n [mwlCalendarTooltip]=\"!tooltipDisabled && !isMobile() ? getTooltipContent(weekEvent.event) : ''\"\n [tooltipPlacement]=\"tooltipPlacement\"\n [tooltipEvent]=\"weekEvent.tempEvent || weekEvent.event\"\n [tooltipTemplate]=\"tooltipTemplate\"\n [tooltipAppendToBody]=\"tooltipAppendToBody\"\n [tooltipDelay]=\"tooltipDelay\"\n (mwlClick)=\"eventClicked.emit({ sourceEvent: $event })\"\n (mwlKeydownEnter)=\"eventClicked.emit({ sourceEvent: $event })\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"\n { event: weekEvent.tempEvent || weekEvent.event, locale: locale } | calendarA11y: 'eventDescription'\n \"\n >\n <mwl-calendar-event-actions [event]=\"weekEvent.tempEvent || weekEvent.event\" />\n &ngsp;\n <mwl-calendar-event-title\n [event]=\"weekEvent.tempEvent || weekEvent.event\"\n [customTemplate]=\"eventTitleTemplate\"\n [view]=\"daysInWeek === 1 ? 'day' : 'week'\"\n >\n </mwl-calendar-event-title>\n @if (!weekEvent.event.allDay) {\n <div class=\"eventGadgets\">\n @for (icon of weekEvent.event.icons; track icon) {\n <ion-icon [name]=\"icon.name\" [title]=\"icon.title\" />\n }\n @for (avatar of weekEvent.event.avatars; track avatar) {\n <idea-user-avatar size=\"mini\" [src]=\"avatar.url\" [name]=\"avatar.title\" />\n }\n </div>\n }\n </div>\n </ng-template>\n <ng-template\n #hourSegmentTemplate\n let-segment=\"segment\"\n let-locale=\"locale\"\n let-segmentHeight=\"segmentHeight\"\n let-isTimeLabel=\"isTimeLabel\"\n >\n <div\n #segmentElement\n class=\"cal-hour-segment\"\n [style.height.px]=\"segmentHeight\"\n [class.cal-hour-start]=\"segment.isStart\"\n [class.cal-after-hour-start]=\"!segment.isStart\"\n [ngClass]=\"segment.cssClass\"\n (mousedown)=\"allowDragToCreate ? startDragToCreate($event, segment.date, segmentElement) : null\"\n (touchstart)=\"allowDragToCreate ? startDragToCreate($event, segment.date, segmentElement) : null\"\n >\n @if (isTimeLabel) {\n <div class=\"cal-time\">\n {{ segment.date | calendarDate: 'weekViewHour' : locale }}\n </div>\n }\n </div>\n </ng-template>\n <!-- VIEWS -->\n <div>\n @switch (view) {\n @case (CalendarView.Month) {\n <mwl-calendar-month-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [activeDayIsOpen]=\"activeDayIsOpen\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays\"\n [weekStartsOn]=\"weekStartsOn\"\n [eventTitleTemplate]=\"eventTitleTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayClicked)=\"changeDay($event.day)\"\n (beforeViewRender)=\"beforeMonthViewRender($event)\"\n >\n </mwl-calendar-month-view>\n }\n @case (CalendarView.Week) {\n <mwl-calendar-week-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [excludeDays]=\"excludeDays\"\n [weekStartsOn]=\"weekStartsOn\"\n [dayStartHour]=\"dayStartHour\"\n [dayEndHour]=\"dayEndHour\"\n [hourSegments]=\"hourSegments\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (dayHeaderClicked)=\"dateIsValid($event.day.date) ? selectDay.emit($event.day.date) : null\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-week-view>\n }\n @case (CalendarView.Day) {\n <mwl-calendar-day-view\n [viewDate]=\"viewDate\"\n [events]=\"events\"\n [refresh]=\"refresh\"\n [locale]=\"locale\"\n [dayStartHour]=\"dayStartHour\"\n [dayEndHour]=\"dayEndHour\"\n [hourSegments]=\"hourSegments\"\n [eventTemplate]=\"eventTemplate\"\n [hourSegmentTemplate]=\"hourSegmentTemplate\"\n (eventClicked)=\"selectEvent.emit($event.event)\"\n (eventTimesChanged)=\"eventTimesChanged($event)\"\n (hourSegmentClicked)=\"dateIsValid($event.date) ? selectSlot.emit($event.date) : null\"\n (beforeViewRender)=\"beforeWeekOrDayViewRender($event)\"\n >\n </mwl-calendar-day-view>\n }\n }\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Calendar, ExternalCalendarSources, Suggestion } from 'idea-toolbox';\nimport {\n IDEAEnvironment,\n IDEALoadingService,\n IDEATranslationsService,\n IDEASuggestionsComponent\n} from '@idea-ionic/common';\nimport { IDEAAWSAPIService } from '@idea-ionic/uncommon';\n\n/**\n * Note: to test locally, you need to temporarily change the redirect URI:\n * - in the lambda `idea_calendars`, e.g. `SCARLETT_URL`;\n * - in the client config file: `APP_URL`.\n * In both cases, the value should be set to `http://localhost:8100` (or according to the local URL).\n */\n@Injectable()\nexport class IDEACalendarsService {\n protected _env = inject(IDEAEnvironment);\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * Get the ion-icon of an external service from its name.\n */\n getServiceIcon(service: ExternalCalendarSources | string): string {\n switch (service) {\n case ExternalCalendarSources.GOOGLE:\n return 'logo-google';\n case ExternalCalendarSources.MICROSOFT:\n return 'logo-windows';\n default:\n return 'help';\n }\n }\n /**\n * Get the base URL for API request (shared/private calendar).\n */\n getRequestURL(calendar: Calendar): string {\n return (calendar.teamId ? `teams/${calendar.teamId}/` : '').concat('calendars');\n }\n\n /**\n * Create a new calendar.\n */\n async postCalendar(cal: Calendar): Promise<Calendar> {\n const calendar = await this._API.postResource(this.getRequestURL(cal), { idea: true, body: cal });\n return new Calendar(calendar);\n }\n /**\n * Update an existing calendar.\n */\n async putCalendar(cal: Calendar): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: cal };\n const calendar = await this._API.putResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n /**\n * Delete a calendar.\n */\n async deleteCalendar(cal: Calendar): Promise<void> {\n await this._API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId });\n }\n /**\n * Associate an external calendar with the given calendar.\n */\n async setExternalCalendar(cal: Calendar, externalId: string): Promise<Calendar> {\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'SET_EXTERNAL_CALENDAR', externalId } };\n const calendar = await this._API.patchResource(this.getRequestURL(cal), body);\n return new Calendar(calendar);\n }\n\n /**\n * Link the calendar with the chosen external service (auth flow).\n */\n async linkExtService(cal: Calendar, baseURL: string): Promise<void> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n if (!baseURL) baseURL = window.location.protocol.concat('//', window.location.hostname);\n let url: string;\n switch (cal.external.service) {\n case ExternalCalendarSources.GOOGLE:\n url =\n 'https://accounts.google.com/o/oauth2/v2/auth?' +\n `client_id=${encodeURIComponent(this._env.google.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +\n '&include_granted_scopes=true' +\n '&access_type=offline&prompt=consent' +\n `&scope=${encodeURIComponent(this._env.google.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n case ExternalCalendarSources.MICROSOFT:\n url =\n 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +\n `client_id=${encodeURIComponent(this._env.microsoft.apiClientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +\n '&response_mode=query' +\n `&scope=${encodeURIComponent(this._env.microsoft.apiScope)}` +\n `&state=${encodeURIComponent(cal.calendarId)}`;\n break;\n }\n if (!url) throw new Error('INVALID_SERVICE');\n await Browser.open({ url });\n // since we don't know when/if the auth flow will finish, we wait\n await this.showAlertLinkingCalendar();\n }\n private async showAlertLinkingCalendar(): Promise<void> {\n return new Promise(async resolve => {\n const header = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE');\n const buttons = [{ text: this._translate._('COMMON.DONE'), handler: resolve }];\n const alert = await this._alert.create({ header, message, buttons, backdropDismiss: false });\n alert.present();\n });\n }\n\n /**\n * Get the external calendars list of the external service.\n */\n async getExternalCalendars(cal: Calendar): Promise<ExtCalendar[]> {\n if (!cal.external) throw new Error('NOT_EXTERNAL');\n // get the access token to make requests; in case it fails, proceed to link the external service\n const body = { idea: true, resourceId: cal.calendarId, body: { action: 'GET_ACCESS_TOKEN' } };\n const result = await this._API.patchResource(this.getRequestURL(cal), body);\n const headers = { Authorization: 'Bearer '.concat(result.token) };\n if (cal.external.service === ExternalCalendarSources.GOOGLE) {\n const res = await (\n await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })\n ).json();\n return res.items.map((c: any): ExtCalendar => ({ name: c.summary, id: c.id }) as ExtCalendar);\n } else if (cal.external.service === ExternalCalendarSources.MICROSOFT) {\n const res = await (await fetch('https://graph.microsoft.com/v1.0/me/calendars', { headers })).json();\n return res.value.map((c: any): ExtCalendar => ({ name: c.name, id: c.id }) as ExtCalendar);\n }\n }\n\n /**\n * If the external service is linked, choose an external calendar and set it for the chosen calendar.\n * @return the updated calendar.\n */\n async chooseAndSetExternalCalendar(cal: Calendar): Promise<Calendar> {\n const extCalId = await this.openModalAndPickExternalCalendar(cal);\n if (!extCalId) return;\n return await this.setExternalCalendar(cal, extCalId);\n }\n /**\n * Open the modal to pick a calendar from the external service.\n * @return the id of the external calendar.\n */\n private async openModalAndPickExternalCalendar(cal: Calendar): Promise<string> {\n let extCals: ExtCalendar[];\n try {\n await this._loading.show();\n extCals = await this.getExternalCalendars(cal);\n if (!extCals.length) throw new Error('NO_EXTERNAL_CALENDARS');\n } catch (error) {\n throw error;\n } finally {\n this._loading.hide();\n }\n const modal = await this._modal.create({\n component: IDEASuggestionsComponent,\n componentProps: {\n data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),\n searchPlaceholder: this._translate._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),\n sortData: true,\n hideIdFromUI: true,\n hideClearButton: true,\n mustChoose: true\n },\n backdropDismiss: false\n });\n modal.present();\n const res = await modal.onDidDismiss();\n return res.data ? res.data.value : null;\n }\n\n /**\n * First sync of the extenal calendar.\n */\n syncCalendar(cal: Calendar): Promise<void> {\n return new Promise((resolve, reject): void => this.syncCalendarHelper(cal, err => (err ? reject(err) : resolve())));\n }\n /**\n * Helper to recursively sync an the extenal calendar.\n */\n private syncCalendarHelper(cal: Calendar, done: (err?: Error) => void): void {\n // this is a recursive operation: the API returns if the sync has to continue or it finished\n this._API\n .patchResource(this.getRequestURL(cal), {\n idea: true,\n resourceId: cal.calendarId,\n body: { action: 'SYNC_EXTERNAL_CALENDAR', firstSync: true }\n })\n .then((res: any): void => {\n if (res.moreData) this.syncCalendarHelper(cal, done);\n else done();\n })\n .catch(err => done(err));\n }\n}\n\n/**\n * Helper structure to define external services' calendars (basic info).\n */\ninterface ExtCalendar {\n id: string;\n name: string;\n}\n","import { Component, Input, OnInit, inject } from '@angular/core';\nimport { ModalController, AlertController } from '@ionic/angular/standalone';\nimport { Calendar, Check, Membership } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEAAWSAPIService, IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar',\n templateUrl: 'calendar.component.html',\n styleUrls: ['calendar.component.scss']\n})\nexport class IDEACalendarComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to manage.\n */\n @Input() calendar: Calendar;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor: boolean;\n\n calendarWC: Calendar;\n membershipsChecks: Check[];\n membership: Membership;\n errors = new Set<string>();\n DEFAULT_COLOR = '#555';\n\n async ngOnInit(): Promise<void> {\n this.membership = this._tc.get('membership');\n this.calendarWC = new Calendar(this.calendar);\n try {\n const memberships: Membership[] = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);\n this.membershipsChecks = memberships.map(\n m =>\n new Check({\n value: m.userId,\n name: m.name,\n checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)\n })\n );\n } catch (error) {\n this._message.error('COMMON.COULDNT_LOAD_LIST');\n }\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors.has(field);\n }\n\n async save(): Promise<void> {\n if (!this.calendarWC.color) this.calendarWC.color = this.DEFAULT_COLOR;\n if (this.calendarWC.isShared() && this.advancedPermissions)\n this.calendarWC.usersCanManageAppointments = this.membershipsChecks\n .filter(x => x.checked)\n .map(x => String(x.value));\n else delete this.calendarWC.usersCanManageAppointments;\n\n this.errors = new Set(this.calendarWC.validate());\n if (this.errors.size) return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');\n\n try {\n await this._loading.show();\n const res = await this._calendars.putCalendar(this.calendarWC);\n this.calendar.load(res);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');\n this._modal.dismiss(this.calendar);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n }\n\n async delete(): Promise<void> {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendarWC);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');\n this._modal.dismiss(true);\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n\n const header = this._translate._('COMMON.ARE_YOU_SURE');\n const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.DELETE'), handler: doDelete }\n ];\n const alert = await this._alert.create({ header, subHeader, message, buttons });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"_calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n","import { Component, EventEmitter, Input, Output, inject } from '@angular/core';\nimport { AlertController, ModalController } from '@ionic/angular/standalone';\nimport { Calendar } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar-item',\n templateUrl: 'calendarItem.component.html',\n styleUrls: ['calendarItem.component.scss']\n})\nexport class IDEACalendarItemComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _message = inject(IDEAMessageService);\n private _loading = inject(IDEALoadingService);\n private _translate = inject(IDEATranslationsService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * The calendar to show.\n */\n @Input() calendar: Calendar;\n /**\n * Whether the component is disabled.\n */\n @Input() disabled: boolean;\n /**\n * Whether we want to enable advanced permissions (based on the memberships) on the calendar.\n */\n @Input() advancedPermissions: boolean;\n /**\n * Whether the calendar color is an important detail or it shouldn't be shown.\n */\n @Input() hideColor: boolean;\n /**\n * The URL to be used on the redirect calls.\n */\n @Input() baseURL: string;\n /**\n * Report to parent components a change.\n */\n @Output() somethingChanged = new EventEmitter<Calendar>();\n\n async manageCalendar(): Promise<void> {\n if (this.disabled) return;\n const modal = await this._modal.create({\n component: IDEACalendarComponent,\n componentProps: {\n calendar: this.calendar,\n advancedPermissions: this.advancedPermissions,\n hideColor: this.hideColor\n }\n });\n modal.onDidDismiss().then(res => {\n const cal = res.data;\n if (cal === undefined) return;\n else if (cal === null) this.calendar = null;\n else this.calendar.load(cal);\n this.somethingChanged.emit();\n });\n modal.present();\n }\n\n async linkExtCalendarOrDelete(): Promise<void> {\n if (this.disabled) return;\n try {\n const cal = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!cal) throw new Error('NO_EXTERNAL_CALENDAR_CHOSEN');\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_LINKED');\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n this.somethingChanged.emit();\n }\n } catch (error) {\n const doDelete = async (): Promise<void> => {\n try {\n await this._loading.show();\n await this._calendars.deleteCalendar(this.calendar);\n this._message.success('COMMON.OPERATION_COMPLETED');\n this.somethingChanged.emit();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n this._loading.hide();\n }\n };\n const doLink = async (): Promise<void> => {\n try {\n await this._calendars.linkExtService(this.calendar, this.baseURL);\n this.linkExtCalendarOrDelete();\n } catch (error) {\n this._message.error('COMMON.OPERATION_FAILED');\n }\n };\n const header = this._translate._('IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED');\n const message = this._translate._('IDEA_AGENDA.CALENDARS.DO_YOU_WANT_PROCEED_LINKING_OR_DELETE');\n const buttons = [\n { text: this._translate._('COMMON.DELETE'), handler: doDelete },\n { text: this._translate._('IDEA_AGENDA.CALENDARS.LINK'), handler: doLink }\n ];\n const alert = await this._alert.create({ header, message, buttons });\n alert.present();\n }\n }\n}\n","@if (calendar) {\n <ion-item\n class=\"calendarItem\"\n [button]=\"!disabled\"\n [title]=\"'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate\"\n (click)=\"calendar.external && !calendar.external.calendarId ? linkExtCalendarOrDelete() : manageCalendar()\"\n >\n @if (!hideColor) {\n <ion-avatar slot=\"start\" class=\"colorCircle\" [style.background-color]=\"calendar.color\" />\n }\n <ion-label>\n {{ calendar.name }}\n <p>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-text color=\"danger\">\n {{ 'IDEA_AGENDA.CALENDARS.TAP_TO_CONFIGURE' | translate }}\n </ion-text>\n }\n {{ calendar.description }}\n </p>\n </ion-label>\n @if (calendar.external && !calendar.external.calendarId) {\n <ion-icon\n slot=\"end\"\n color=\"danger\"\n name=\"flash-off\"\n [title]=\"'IDEA_AGENDA.CALENDARS.CALENDAR_NOT_YET_LINKED_HINT' | translate\"\n />\n }\n @if (calendar.external?.service) {\n <ion-icon\n slot=\"end\"\n [name]=\"_calendars.getServiceIcon(calendar.external.service)\"\n [title]=\"\n ('IDEA_AGENDA.CALENDARS.LINKED_TO' | translate) +\n ' ' +\n ('IDEA_AGENDA.CALENDARS.SERVICES.' + calendar.external.service | translate)\n \"\n />\n }\n </ion-item>\n}\n","import { Component, Input, OnInit, inject } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport { Calendar, ExternalCalendarInfo, ExternalCalendarSources, Membership, Team } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';\nimport { IDEATinCanService } from '@idea-ionic/uncommon';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@Component({\n selector: 'idea-calendar-creation',\n templateUrl: 'calendarCreation.component.html',\n styleUrls: ['calendarCreation.component.scss']\n})\nexport class IDEACalendarCreationComponent implements OnInit {\n private _modal = inject(ModalController);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _translate = inject(IDEATranslationsService);\n private _tc = inject(IDEATinCanService);\n _calendars = inject(IDEACalendarsService);\n\n /**\n * Whether we want to allow the creation of only a particular type of calendar, based on the scope.\n */\n @Input() fixScope: CalendarScopes;\n /**\n * Whether we want to allow the creation of local calendars.\n */\n @Input() onlyExternalCalendars: boolean;\n /**\n * The URL to be used on the redirect calls.\n */\n @Input() baseURL: string;\n\n team: Team;\n membership: Membership;\n calendar: Calendar;\n DEFAULT_COLOR = '#555';\n SOURCES = Object.keys(ExternalCalendarSources);\n\n ngOnInit(): void {\n this.calendar = new Calendar();\n this.team = this._tc.get('team');\n this.membership = this._tc.get('membership');\n if (this.fixScope === CalendarScopes.SHARED) this.calendar.teamId = this.team.teamId;\n if (this.fixScope === CalendarScopes.PRIVATE) this.calendar.userId = this.membership.userId;\n }\n\n resetScope(): void {\n if (this.canChangeScope()) this.calendar.teamId = this.calendar.userId = null;\n }\n canChangeScope(): boolean {\n return !this.fixScope && this.scopeIsSet();\n }\n scopeIsSet(): boolean {\n return Boolean(this.calendar.userId) || Boolean(this.calendar.teamId);\n }\n\n async saveNewCalendar(service?: ExternalCalendarSources | string): Promise<void> {\n if (!this.scopeIsSet()) return;\n if (!service && this.onlyExternalCalendars) return;\n if (service) {\n this.calendar.external = new ExternalCalendarInfo({ service });\n this.calendar.name = '-'; // it will be substituted with the external name\n } else {\n this.calendar.name = this.calendar.userId\n ? this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_PERSONAL_CALENDAR_NAME')\n : this._translate._('IDEA_AGENDA.CALENDARS.DEFAULT_TEAM_CALENDAR_NAME');\n this.calendar.color = this.DEFAULT_COLOR;\n }\n try {\n await this._loading.show();\n const cal = await this._calendars.postCalendar(this.calendar);\n this.calendar.load(cal);\n this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_CREATED');\n if (!cal.external) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n try {\n await this._loading.hide();\n await this._calendars.linkExtService(this.calendar, this.baseURL);\n const res = await this._calendars.chooseAndSetExternalCalendar(this.calendar);\n if (!res) {\n await this._modal.dismiss(this.calendar);\n return;\n }\n this.calendar.load(res);\n try {\n await this._loading.show(this._translate._('IDEA_AGENDA.CALENDARS.FIRST_SYNC_MAY_TAKE_A_WHILE'));\n await this._calendars.syncCalendar(this.calendar);\n await this._message.success('IDEA_AGENDA.CALENDARS.FIRST_SYNC_COMPLETED');\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n await this._modal.dismiss(this.calendar);\n }\n } catch (error) {\n await this._message.error('COMMON.OPERATION_FAILED');\n } finally {\n await this._loading.hide();\n }\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The possible scopes of the calendar.\n */\nexport enum CalendarScopes {\n SHARED = 'shared', // teamId\n PRIVATE = 'private' // userId\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n @if (!canChangeScope()) {\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (canChangeScope()) {\n <ion-button (click)=\"resetScope()\">\n <ion-icon name=\"arrow-back\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-buttons>\n <ion-title>\n @if (!scopeIsSet()) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.ADD_A_CALENDAR' | translate }}</span>\n }\n @if (calendar.userId) {\n <span>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</span>\n }\n @if (calendar.teamId) {\n <span>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate: { team: team.name } }}\n </span>\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <!-- 1st STEP -->\n @if (!scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.CREATE_PRIVATE_OR_TEAM' | translate }}</h1>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.userId = membership.userId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"person\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.PERSONAL_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"12\" [sizeSm]=\"6\">\n <ion-card [button]=\"true\" (click)=\"calendar.teamId = membership.teamId\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"people\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n }\n <!-- 2nd STEP -->\n @if (scopeIsSet()) {\n <ion-grid class=\"ion-padding choiceGrid\">\n <ion-row>\n <ion-col class=\"ion-text-center\">\n <h1>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.WHICH_EXTERNAL_SERVICE_TO_LINK_HINT' | translate }}</p>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n @if (!onlyExternalCalendars) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar()\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"remove\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK' | translate }}</h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.DONT_LINK_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n @for (s of SOURCES; track s) {\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <ion-card class=\"step2\" [button]=\"true\" (click)=\"saveNewCalendar(s)\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon [name]=\"_calendars.getServiceIcon(s)\" />\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <h1>\n {{ 'IDEA_AGENDA.CALENDARS.LINK_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + s | translate }}\n </h1>\n <p>{{ 'IDEA_AGENDA.CALENDARS.LINK_TO_HINT' | translate }}</p>\n </ion-card-content>\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonicModule } from '@ionic/angular';\n\nimport { CalendarDateFormatter, CalendarModule, DateAdapter } from 'angular-calendar';\nimport { adapterFactory } from 'angular-calendar/date-adapters/date-fns';\nimport { CustomDateFormatter } from './dateFormatter.provider';\n\nimport { IDEACheckerComponent, IDEATranslationsModule, IDEAUserAvatarComponent } from '@idea-ionic/common';\nimport { IDEAColorPickerComponent } from '@idea-ionic/uncommon';\n\nimport { IDEAAgendaComponent } from './agenda.component';\nimport { IDEACalendarComponent } from './calendar.component';\nimport { IDEACalendarItemComponent } from './calendarItem.component';\nimport { IDEACalendarCreationComponent } from './calendarCreation.component';\n\nimport { IDEACalendarsService } from './calendars.service';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n IonicModule,\n IDEATranslationsModule,\n IDEAColorPickerComponent,\n IDEACheckerComponent,\n IDEAUserAvatarComponent,\n CalendarModule.forRoot({ provide: DateAdapter, useFactory: adapterFactory })\n ],\n declarations: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n exports: [IDEAAgendaComponent, IDEACalendarComponent, IDEACalendarItemComponent, IDEACalendarCreationComponent],\n providers: [{ provide: CalendarDateFormatter, useClass: CustomDateFormatter }, IDEACalendarsService]\n})\nexport class IDEAAgendaModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idea-ionic/agenda",
3
- "version": "8.2.9",
3
+ "version": "8.2.11",
4
4
  "description": "IDEA Ionic agenda (calendar)",
5
5
  "license": "MPL-2.0",
6
6
  "author": "ITER IDEA <info@iter-idea.com> (https://iter-idea.com)",
@@ -17,6 +17,10 @@ export declare class IDEACalendarCreationComponent implements OnInit {
17
17
  * Whether we want to allow the creation of local calendars.
18
18
  */
19
19
  onlyExternalCalendars: boolean;
20
+ /**
21
+ * The URL to be used on the redirect calls.
22
+ */
23
+ baseURL: string;
20
24
  team: Team;
21
25
  membership: Membership;
22
26
  calendar: Calendar;
@@ -29,7 +33,7 @@ export declare class IDEACalendarCreationComponent implements OnInit {
29
33
  saveNewCalendar(service?: ExternalCalendarSources | string): Promise<void>;
30
34
  close(): void;
31
35
  static ɵfac: i0.ɵɵFactoryDeclaration<IDEACalendarCreationComponent, never>;
32
- static ɵcmp: i0.ɵɵComponentDeclaration<IDEACalendarCreationComponent, "idea-calendar-creation", never, { "fixScope": { "alias": "fixScope"; "required": false; }; "onlyExternalCalendars": { "alias": "onlyExternalCalendars"; "required": false; }; }, {}, never, never, false, never>;
36
+ static ɵcmp: i0.ɵɵComponentDeclaration<IDEACalendarCreationComponent, "idea-calendar-creation", never, { "fixScope": { "alias": "fixScope"; "required": false; }; "onlyExternalCalendars": { "alias": "onlyExternalCalendars"; "required": false; }; "baseURL": { "alias": "baseURL"; "required": false; }; }, {}, never, never, false, never>;
33
37
  }
34
38
  /**
35
39
  * The possible scopes of the calendar.
@@ -25,6 +25,10 @@ export declare class IDEACalendarItemComponent {
25
25
  * Whether the calendar color is an important detail or it shouldn't be shown.
26
26
  */
27
27
  hideColor: boolean;
28
+ /**
29
+ * The URL to be used on the redirect calls.
30
+ */
31
+ baseURL: string;
28
32
  /**
29
33
  * Report to parent components a change.
30
34
  */
@@ -32,5 +36,5 @@ export declare class IDEACalendarItemComponent {
32
36
  manageCalendar(): Promise<void>;
33
37
  linkExtCalendarOrDelete(): Promise<void>;
34
38
  static ɵfac: i0.ɵɵFactoryDeclaration<IDEACalendarItemComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<IDEACalendarItemComponent, "idea-calendar-item", never, { "calendar": { "alias": "calendar"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "advancedPermissions": { "alias": "advancedPermissions"; "required": false; }; "hideColor": { "alias": "hideColor"; "required": false; }; }, { "somethingChanged": "somethingChanged"; }, never, never, false, never>;
39
+ static ɵcmp: i0.ɵɵComponentDeclaration<IDEACalendarItemComponent, "idea-calendar-item", never, { "calendar": { "alias": "calendar"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "advancedPermissions": { "alias": "advancedPermissions"; "required": false; }; "hideColor": { "alias": "hideColor"; "required": false; }; "baseURL": { "alias": "baseURL"; "required": false; }; }, { "somethingChanged": "somethingChanged"; }, never, never, false, never>;
36
40
  }
@@ -40,7 +40,7 @@ export declare class IDEACalendarsService {
40
40
  /**
41
41
  * Link the calendar with the chosen external service (auth flow).
42
42
  */
43
- linkExtService(cal: Calendar): Promise<void>;
43
+ linkExtService(cal: Calendar, baseURL: string): Promise<void>;
44
44
  private showAlertLinkingCalendar;
45
45
  /**
46
46
  * Get the external calendars list of the external service.