@pobuca/email-builder 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +1 -1
  2. package/bundles/pobuca-email-builder.umd.js +4464 -4414
  3. package/bundles/pobuca-email-builder.umd.js.map +1 -1
  4. package/bundles/pobuca-email-builder.umd.min.js +1 -1
  5. package/bundles/pobuca-email-builder.umd.min.js.map +1 -1
  6. package/esm2015/lib/classes/DefaultEmail.js +54 -53
  7. package/esm2015/lib/classes/Elements.js +229 -229
  8. package/esm2015/lib/classes/Structure.js +89 -89
  9. package/esm2015/lib/components/block/block.component.js +89 -89
  10. package/esm2015/lib/components/block-settings/block-settings.component.js +53 -53
  11. package/esm2015/lib/components/builder-container/builder-container.component.js +114 -114
  12. package/esm2015/lib/components/dialog.component.js +30 -30
  13. package/esm2015/lib/components/general-settings/general-settings.component.js +25 -25
  14. package/esm2015/lib/components/import-dialog/import-dialog.component.js +62 -62
  15. package/esm2015/lib/components/preview.component.js +89 -89
  16. package/esm2015/lib/components/structure/structure.component.js +163 -163
  17. package/esm2015/lib/components/structure-settings/structure-settings.component.js +31 -31
  18. package/esm2015/lib/components/template-list-dialog/template-list-dialog.component.js +45 -45
  19. package/esm2015/lib/directives/dynamic-component.directive.js +46 -46
  20. package/esm2015/lib/elements/abstract-block.js +23 -23
  21. package/esm2015/lib/elements/button/button.component.js +29 -29
  22. package/esm2015/lib/elements/divider/divider.component.js +30 -30
  23. package/esm2015/lib/elements/image/image.component.js +54 -54
  24. package/esm2015/lib/elements/social/social.component.js +42 -42
  25. package/esm2015/lib/elements/spacer/spacer.component.js +30 -30
  26. package/esm2015/lib/elements/text-element/text-element.component.js +80 -80
  27. package/esm2015/lib/groups/align.js +79 -79
  28. package/esm2015/lib/groups/back-repeat.js +55 -55
  29. package/esm2015/lib/groups/border.js +102 -102
  30. package/esm2015/lib/groups/color.js +139 -139
  31. package/esm2015/lib/groups/direction.js +63 -63
  32. package/esm2015/lib/groups/font-styles.js +127 -112
  33. package/esm2015/lib/groups/gaps.js +45 -45
  34. package/esm2015/lib/groups/line-height.js +68 -68
  35. package/esm2015/lib/groups/link.js +67 -67
  36. package/esm2015/lib/groups/margin.js +45 -45
  37. package/esm2015/lib/groups/padding.js +53 -53
  38. package/esm2015/lib/groups/upload-image.js +112 -112
  39. package/esm2015/lib/groups/width-height.js +94 -94
  40. package/esm2015/lib/interceptors/pb-interceptor.interceptor.js +51 -51
  41. package/esm2015/lib/interfaces/interfaces.js +13 -13
  42. package/esm2015/lib/pb-email-builder.component.js +258 -246
  43. package/esm2015/lib/pb-email-builder.module.js +291 -291
  44. package/esm2015/lib/pb-email-builder.service.js +134 -134
  45. package/esm2015/lib/pipes/slugify.pipe.js +39 -39
  46. package/esm2015/lib/services/internals/pb-email-object-store/pb-email-object-store.service.js +175 -165
  47. package/esm2015/lib/services/internals/user-interfaces/user-interface.service.js +122 -122
  48. package/esm2015/lib/services/pb-storage/FreeUsersStorage.class.js +11 -11
  49. package/esm2015/lib/services/pb-storage/index.js +7 -7
  50. package/esm2015/lib/services/pb-storage/pb-storage.service.js +79 -79
  51. package/esm2015/lib/services/user-image-uploader-service/free-users-image-uploader.service.js +26 -26
  52. package/esm2015/lib/services/user-image-uploader-service/index.js +8 -8
  53. package/esm2015/lib/services/user-image-uploader-service/paid-users-image-uploader.service.js +30 -30
  54. package/esm2015/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.js +112 -112
  55. package/esm2015/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.js +91 -91
  56. package/esm2015/lib/services/user-image-uploader-service/user-image-uploader.service.js +26 -26
  57. package/esm2015/lib/services/user-middleware-service/FreeUsersMiddleware.js +31 -31
  58. package/esm2015/lib/services/user-middleware-service/PaidUsersMiddleware.js +12 -12
  59. package/esm2015/lib/services/user-middleware-service/index.js +8 -8
  60. package/esm2015/lib/services/user-middleware-service/pb-middlewares.service.js +195 -195
  61. package/esm2015/lib/services/user-rest-api-service/free-users-rest-api.service.js +16 -16
  62. package/esm2015/lib/services/user-rest-api-service/index.js +7 -7
  63. package/esm2015/lib/services/user-rest-api-service/user-rest-api.service.js +116 -116
  64. package/esm2015/lib/tokens/private-tokens.js +17 -17
  65. package/esm2015/lib/tokens/tokens.js +159 -159
  66. package/esm2015/lib/utils.js +147 -147
  67. package/esm2015/pobuca-email-builder.js +42 -42
  68. package/esm2015/public_api.js +26 -26
  69. package/fesm2015/pobuca-email-builder.js +4206 -4168
  70. package/fesm2015/pobuca-email-builder.js.map +1 -1
  71. package/lib/classes/DefaultEmail.d.ts +10 -9
  72. package/lib/classes/Elements.d.ts +62 -62
  73. package/lib/classes/Structure.d.ts +11 -11
  74. package/lib/components/block/block.component.d.ts +25 -25
  75. package/lib/components/block-settings/block-settings.component.d.ts +18 -18
  76. package/lib/components/builder-container/builder-container.component.d.ts +36 -36
  77. package/lib/components/dialog.component.d.ts +10 -10
  78. package/lib/components/general-settings/general-settings.component.d.ts +6 -6
  79. package/lib/components/import-dialog/import-dialog.component.d.ts +16 -16
  80. package/lib/components/preview.component.d.ts +18 -18
  81. package/lib/components/structure/structure.component.d.ts +43 -43
  82. package/lib/components/structure-settings/structure-settings.component.d.ts +9 -9
  83. package/lib/components/template-list-dialog/template-list-dialog.component.d.ts +15 -15
  84. package/lib/directives/dynamic-component.directive.d.ts +13 -13
  85. package/lib/elements/abstract-block.d.ts +8 -8
  86. package/lib/elements/button/button.component.d.ts +18 -18
  87. package/lib/elements/divider/divider.component.d.ts +10 -10
  88. package/lib/elements/image/image.component.d.ts +19 -19
  89. package/lib/elements/social/social.component.d.ts +21 -21
  90. package/lib/elements/spacer/spacer.component.d.ts +5 -5
  91. package/lib/elements/text-element/text-element.component.d.ts +52 -52
  92. package/lib/groups/align.d.ts +17 -17
  93. package/lib/groups/back-repeat.d.ts +8 -8
  94. package/lib/groups/border.d.ts +13 -13
  95. package/lib/groups/color.d.ts +26 -26
  96. package/lib/groups/direction.d.ts +13 -13
  97. package/lib/groups/font-styles.d.ts +21 -17
  98. package/lib/groups/gaps.d.ts +7 -7
  99. package/lib/groups/line-height.d.ts +12 -12
  100. package/lib/groups/link.d.ts +11 -11
  101. package/lib/groups/margin.d.ts +8 -8
  102. package/lib/groups/padding.d.ts +8 -8
  103. package/lib/groups/upload-image.d.ts +19 -19
  104. package/lib/groups/width-height.d.ts +19 -19
  105. package/lib/interceptors/pb-interceptor.interceptor.d.ts +10 -10
  106. package/lib/interfaces/interfaces.d.ts +430 -422
  107. package/lib/pb-email-builder.component.d.ts +67 -67
  108. package/lib/pb-email-builder.module.d.ts +51 -51
  109. package/lib/pb-email-builder.service.d.ts +83 -83
  110. package/lib/pipes/slugify.pipe.d.ts +9 -9
  111. package/lib/services/internals/pb-email-object-store/pb-email-object-store.service.d.ts +50 -50
  112. package/lib/services/internals/user-interfaces/user-interface.service.d.ts +46 -46
  113. package/lib/services/pb-storage/FreeUsersStorage.class.d.ts +6 -6
  114. package/lib/services/pb-storage/index.d.ts +2 -2
  115. package/lib/services/pb-storage/pb-storage.service.d.ts +54 -54
  116. package/lib/services/user-image-uploader-service/free-users-image-uploader.service.d.ts +12 -12
  117. package/lib/services/user-image-uploader-service/index.d.ts +3 -3
  118. package/lib/services/user-image-uploader-service/paid-users-image-uploader.service.d.ts +14 -14
  119. package/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.d.ts +28 -28
  120. package/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.d.ts +27 -27
  121. package/lib/services/user-image-uploader-service/user-image-uploader.service.d.ts +26 -26
  122. package/lib/services/user-middleware-service/FreeUsersMiddleware.d.ts +15 -15
  123. package/lib/services/user-middleware-service/PaidUsersMiddleware.d.ts +7 -7
  124. package/lib/services/user-middleware-service/index.d.ts +3 -3
  125. package/lib/services/user-middleware-service/pb-middlewares.service.d.ts +190 -190
  126. package/lib/services/user-rest-api-service/free-users-rest-api.service.d.ts +10 -10
  127. package/lib/services/user-rest-api-service/index.d.ts +2 -2
  128. package/lib/services/user-rest-api-service/user-rest-api.service.d.ts +82 -82
  129. package/lib/tokens/private-tokens.d.ts +5 -5
  130. package/lib/tokens/tokens.d.ts +70 -70
  131. package/lib/utils.d.ts +88 -88
  132. package/package.json +8 -3
  133. package/pobuca-email-builder.d.ts +42 -42
  134. package/pobuca-email-builder.metadata.json +1 -1
  135. package/public_api.d.ts +16 -16
@@ -1,246 +1,258 @@
1
- /*
2
- * Copyright (c) 2024 Pobuca.
3
- * All rights reserved.
4
- */
5
- import { Component, ChangeDetectionStrategy, Input, Renderer2, Inject, ChangeDetectorRef, Output, EventEmitter, forwardRef } from '@angular/core';
6
- import { DOCUMENT } from '@angular/common';
7
- import { fromEvent, Subject, iif, EMPTY } from 'rxjs';
8
- import { switchMap, take, takeUntil, filter, catchError, withLatestFrom, exhaustMap, map } from 'rxjs/operators';
9
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
10
- import { PbEmailBuilderService } from './pb-email-builder.service';
11
- import { PBEmail } from './classes/DefaultEmail';
12
- import { SlugifyPipe } from './pipes/slugify.pipe';
13
- import { PbUserMiddlewaresService } from './services/user-middleware-service/pb-middlewares.service';
14
- import { PbUserInterfaceService } from './services/internals/user-interfaces/user-interface.service';
15
- import { PbEmailObjectStoreService } from './services/internals/pb-email-object-store/pb-email-object-store.service';
16
- import { PB_STRUCTURES, PB_BLOCKS, PB_GOOGLE_FONTS } from './tokens/tokens';
17
- import { PbUserRestApiService } from './services/user-rest-api-service/user-rest-api.service';
18
- import { deferOf } from './utils';
19
- export class PbEmailBuilderComponent {
20
- constructor(ngb, userRestApiService, userInterfaceService, emailObjectStore, renderer2, slugifyPipe, middlewares, changeDetectorRef, structures, blocks, googleFonts, doc) {
21
- this.ngb = ngb;
22
- this.userRestApiService = userRestApiService;
23
- this.userInterfaceService = userInterfaceService;
24
- this.emailObjectStore = emailObjectStore;
25
- this.renderer2 = renderer2;
26
- this.slugifyPipe = slugifyPipe;
27
- this.middlewares = middlewares;
28
- this.changeDetectorRef = changeDetectorRef;
29
- this.structures = structures;
30
- this.blocks = blocks;
31
- this.doc = doc;
32
- this.emailChange = new EventEmitter();
33
- this.previewTemplate = false;
34
- this.showGeneralSettings$ = this.userInterfaceService.editGeneralSettings$;
35
- this.currentTabIndex$ = this.userInterfaceService.currentTabIndex$;
36
- this.cdkDropListConnectedTo$ = this.userInterfaceService.cdkDropListConnectedTo$;
37
- this.getBuilderContainerStyles$ = this.emailObjectStore.builderContainerStyles$;
38
- this.currentHTMLTemplate$ = this.emailObjectStore.templateAsObservable$;
39
- this.activeMatProgress$ = this.userInterfaceService.activeMatProgress$.asObservable();
40
- this.customModuleList$ = this.userRestApiService.getAllUserModules$;
41
- this._onDestroy$ = new Subject();
42
- this.includedFonts = new Set();
43
- if (this.doc) {
44
- for (const font of googleFonts) {
45
- const link = this.doc.createElement('link');
46
- link.href = `https://fonts.googleapis.com/css?family=${font}`;
47
- link.rel = 'stylesheet';
48
- this.includedFonts.add(link);
49
- this.doc.head.appendChild(link);
50
- }
51
- }
52
- }
53
- writeValue(email) {
54
- try {
55
- this.emailObjectStore.setEmail(email);
56
- this.previewTemplate = false;
57
- this.changeDetectorRef.markForCheck();
58
- }
59
- catch (error) {
60
- this.userInterfaceService.notify(error.message);
61
- }
62
- }
63
- registerOnChange(fn) {
64
- this.onChange = fn;
65
- }
66
- registerOnTouched(fn) {
67
- this.onTouched = fn;
68
- }
69
- /**
70
- * Not implemented yet
71
- * @param isDisabled The state of builder
72
- */
73
- setDisabledState(isDisabled) {
74
- // tslint:disable-next-line: no-console
75
- console.info('[IpEmailBuilderComponent] Method [setDisabledState] is not implemented.');
76
- }
77
- saveEmail() {
78
- return this.emailObjectStore.currentEmailHasChanges$
79
- .pipe(exhaustMap(hasChanges => {
80
- return iif(() => hasChanges, this.ngb.createHTMLTemplate$(), this.userInterfaceService.notify('No changes were detected to be save!').afterDismissed());
81
- }), take(1))
82
- .subscribe();
83
- }
84
- disableBlocksList$(block) {
85
- return iif(() => { var _a; return !((_a = block.state) === null || _a === void 0 ? void 0 : _a.disabled); }, this.emailObjectStore.emailStructuresAsObservable$.pipe(map(({ length }) => length > 0), exhaustMap(hasStructures => (hasStructures ? this.middlewares.disableBlockDragFromList(block) : deferOf(true))))).pipe(take(1));
86
- }
87
- disableStructureList$(structure) {
88
- return this.middlewares.disableStructureDragFromList(structure).pipe(take(1));
89
- }
90
- trackByFn(block) {
91
- return block.type;
92
- }
93
- changeTabIndex(index) {
94
- this.userInterfaceService.changeTabIndex(index);
95
- }
96
- download(source) {
97
- return this.middlewares
98
- .exportFile(source)
99
- .pipe(exhaustMap(() => this.ngb.createHTMLTemplate$().pipe(map(serverResponse => (Object.assign(Object.assign({}, serverResponse), { type: source }))))), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
100
- this.userInterfaceService.notify(error.message);
101
- return EMPTY;
102
- }))), take(1))
103
- .subscribe(({ type, html, mjml }) => {
104
- const anchor = this.renderer2.createElement('a');
105
- let download = html;
106
- if (type === 'mjml') {
107
- download = mjml;
108
- }
109
- else if (type === 'json') {
110
- download = JSON.stringify(this.ngb.Email, null, 1);
111
- }
112
- const href = URL.createObjectURL(new Blob([download], {
113
- type: type === 'json' ? 'text/json' : 'text/html'
114
- }));
115
- const fileName = this.slugifyPipe.transform(this.ngb.Email.general.name || 'ngb-template');
116
- anchor.href = href;
117
- anchor.target = '_blank';
118
- anchor.download = `${fileName}.${type}`;
119
- anchor.click();
120
- URL.revokeObjectURL(href);
121
- });
122
- }
123
- importFile() {
124
- this.userInterfaceService
125
- .importDialog$()
126
- .pipe(switchMap(emailOrError => {
127
- if (emailOrError instanceof Error) {
128
- throw emailOrError;
129
- }
130
- return deferOf(emailOrError);
131
- }), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
132
- this.userInterfaceService.notify(error.message);
133
- return EMPTY;
134
- }))), take(1), filter(email => !!email))
135
- .subscribe(email => {
136
- this.writeValue(email);
137
- this.userInterfaceService.notify('Email has been imported successfully.');
138
- });
139
- }
140
- // getBackgroundImage(): SafeStyle {
141
- // const {
142
- // background: { url }
143
- // } = this.email.general;
144
- // return this.sanitizer.bypassSecurityTrustStyle(url && `url(${url})`);
145
- // }
146
- // getBuilderContainerStyles() {
147
- // const { background, padding, direction } = this.emailObjectStore.Email.general;
148
- // return {
149
- // direction,
150
- // backgroundRepeat: background.repeat,
151
- // backgroundColor: background.color,
152
- // backgroundSize: createWidthHeight(background.size),
153
- // backgroundPosition: 'top center',
154
- // ...createPadding(padding)
155
- // };
156
- // }
157
- createArrayFromStructureColumns({ columns }) {
158
- return new Array(columns).fill('');
159
- }
160
- togglePreview() {
161
- return this.emailObjectStore
162
- .createHTMLTemplate$()
163
- .pipe(exhaustMap(() => this.middlewares.togglePreview(!this.previewTemplate)), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
164
- this.userInterfaceService.notify(error.message);
165
- return EMPTY;
166
- }))), take(1))
167
- .subscribe(nextState => {
168
- this.previewTemplate = nextState;
169
- this.changeDetectorRef.markForCheck();
170
- });
171
- }
172
- ngOnInit() {
173
- fromEvent(window, 'beforeunload')
174
- .pipe(withLatestFrom(this.emailObjectStore.currentEmailHasChanges$), filter(([_, emailIsDirty]) => emailIsDirty), switchMap(([event]) => this.middlewares.preventWindowExit(event)), takeUntil(this._onDestroy$))
175
- .subscribe(ev => {
176
- ev.preventDefault();
177
- ev.returnValue = '';
178
- });
179
- this.emailObjectStore.emailAsObservable$.pipe(takeUntil(this._onDestroy$)).subscribe(email => {
180
- var _a, _b;
181
- (_a = this.onTouched) === null || _a === void 0 ? void 0 : _a.call(this);
182
- (_b = this.onChange) === null || _b === void 0 ? void 0 : _b.call(this, email);
183
- this.emailChange.next(email);
184
- });
185
- }
186
- ngOnChanges(changes) {
187
- if (changes.email) {
188
- this.writeValue(changes.email.currentValue);
189
- }
190
- }
191
- // private setEmail(email: PBEmail) {
192
- // try {
193
- // this.emailObjectStore.setEmail(email);
194
- // this.previewTemplate = false;
195
- // this.changeDetectorRef.markForCheck();
196
- // } catch (error) {
197
- // this.userInterfaceService.notify(error.message);
198
- // }
199
- // }
200
- ngOnDestroy() {
201
- this._onDestroy$.next();
202
- this._onDestroy$.complete();
203
- // Reset the builder state
204
- this.userInterfaceService.reset();
205
- if (this.doc) {
206
- this.includedFonts.forEach(font => font.remove());
207
- }
208
- this.includedFonts.clear();
209
- }
210
- }
211
- PbEmailBuilderComponent.decorators = [
212
- { type: Component, args: [{
213
- selector: 'pb-email-builder',
214
- template: "<!--\n ~ Copyright (c) 2024 Pobuca.\n ~ All rights reserved.\n -->\n\n<mat-sidenav-container>\n <div class=\"pb-builder-container\" fxLayout=\"column\" fxFlex>\n <mat-progress-bar *ngIf=\"activeMatProgress$ | async\" mode=\"buffer\"></mat-progress-bar>\n <mat-toolbar fxLayoutGap=\"1rem\" fxLayoutAlign=\"space-between center\">\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".top-actions\"></ng-content>\n\n <div fxFlexlayout fxLayoutGap=\"0.5rem\">\n <button *ngIf=\"ngb.config.useSaveButton\" type=\"button\" (click)=\"saveEmail()\" mat-stroked-button color=\"primary\"\n i18n=\"actions|Save Email\">\n Save Email\n </button>\n <button *ngIf=\"ngb.config.usePreviewButton\" type=\"button\" (click)=\"togglePreview()\" mat-stroked-button>\n <ng-container [ngSwitch]=\"previewTemplate\">\n <span *ngSwitchDefault i18n=\"actions|Preview\">Preview</span>\n <span *ngSwitchCase=\"true\" i18n=\"actions|Close Preview\">Close Preview</span>\n </ng-container>\n </button>\n\n <button mat-button mat-stroked-button i18n=\"actions|Import\" (click)=\"importFile()\">\n Import\n </button>\n\n <ng-container *ngIf=\"ngb.config.useDownloadButton\">\n <button mat-button [matMenuTriggerFor]=\"downloadMenu\" mat-stroked-button i18n=\"actions|Export\">\n Export\n </button>\n <mat-menu #downloadMenu=\"matMenu\">\n <button mat-menu-item (click)=\"download('html')\" i18n=\"actions|Export HTML\">\n Export HTML\n </button>\n <button mat-menu-item (click)=\"download('mjml')\" i18n=\"actions|Export MJML\">\n Export MJML\n </button>\n <button mat-menu-item (click)=\"download('json')\" i18n=\"actions|Export JSON\">\n Export JSON\n </button>\n </mat-menu>\n </ng-container>\n\n </div>\n <!-- <div class=\"history-actions\" style=\"margin-inline-start: auto;\">\n <span>Last saved Now</span>\n <button type=\"button\" mat-icon-button>\n <mat-icon>undo</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button>\n <mat-icon>redo</mat-icon>\n </button>\n </div> -->\n </mat-toolbar>\n <ng-container [ngSwitch]=\"previewTemplate\">\n <pb-builder-container *ngSwitchDefault [ngStyle]=\"getBuilderContainerStyles$ | async\">\n <ng-content select=\".rewrited-empty-email\"></ng-content>\n </pb-builder-container>\n\n <pb-preview-template fxLayout fxFlex=\"auto\" fxLayoutAlign=\"center\" [template]=\"currentHTMLTemplate$ | async\"\n *ngSwitchCase=\"true\">\n </pb-preview-template>\n </ng-container>\n </div>\n <mat-sidenav mode=\"side\" fxFlex=\"0 0 310px\" [opened]=\"!previewTemplate\" position=\"end\" class=\"pb-builder-content\">\n <mat-tab-group [selectedIndex]=\"currentTabIndex$ | async\" (selectedIndexChange)=\"changeTabIndex($event)\">\n <mat-tab i18n-label=\"Content\" label=\"Content\">\n <div class=\"main-padding\">\n <cdk-drop-list class=\"elements\" [cdkDropListConnectedTo]=\"cdkDropListConnectedTo$ | async\"\n [cdkDropListData]=\"blocks\" [cdkDropListSortingDisabled]=\"true\" id=\"block-elements\">\n <div cdkDrag *ngFor=\"let block of blocks; trackBy: trackByFn\" [cdkDragData]=\"block\"\n [cdkDragDisabled]=\"disableBlocksList$(block) | async\" class=\"drag-element\"\n [matTooltip]=\"block.state.message\">\n <mat-icon>{{ block.icon }}</mat-icon>\n <div class=\"drag-element-title\">{{ block.title }}</div>\n </div>\n </cdk-drop-list>\n\n <mat-divider style=\"margin: 1em 0;\"></mat-divider>\n <!-- <h3 class=\"divider\"><span>Structures</span></h3> -->\n <cdk-drop-list class=\"elements structure-elements\" cdkDropListConnectedTo=\"structures-drop-list\"\n [cdkDropListSortingDisabled]=\"true\" [cdkDropListData]=\"structures\">\n <div cdkDrag *ngFor=\"let structure of structures; trackBy: trackByFn\" [cdkDragData]=\"structure\"\n [cdkDragDisabled]=\"disableStructureList$(structure) | async\" class=\"drag-element structure-element\"\n [ngClass]=\"structure.type\">\n <div *ngFor=\"let column of createArrayFromStructureColumns(structure)\"></div>\n </div>\n </cdk-drop-list>\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".after-structure-blocks\"></ng-content>\n </div>\n </mat-tab>\n <mat-tab i18n-label=\"Modules\" label=\"Modules\" class=\"modules-tab\">\n <cdk-virtual-scroll-viewport itemSize=\"54\" [minBufferPx]=\"54 * 10\" [maxBufferPx]=\"54 * 20\"\n style=\"height: inherit;\"\n *ngIf=\"customModuleList$ | async as modules; else emptyModuleList\">\n <div class=\"main-padding\">\n <div class=\"custom-modules\" cdkDropList cdkDropListConnectedTo=\"structures-drop-list\"\n [cdkDropListData]=\"modules\" [cdkDropListSortingDisabled]=\"true\">\n <div fxLayout=\"column\" fxLayoutGap=\"1rem\">\n <ng-container *cdkVirtualFor=\"let module of modules\">\n <div cdkDrag [cdkDragData]=\"module.module\"\n [cdkDragDisabled]=\"disableStructureList$(module.module) | async\" class=\"drag-element\"\n style=\"padding: 1em;text-transform: uppercase;height: 54px;\">\n <span *ngIf=\"module.name\">{{module.name}}</span>\n <!-- <img *ngIf=\"module.thumb\" [src]=\"module.thumb\" /> -->\n </div>\n </ng-container>\n </div>\n </div>\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".after-content-blocks\"></ng-content>\n </div>\n </cdk-virtual-scroll-viewport>\n <ng-template #emptyModuleList>\n <h4 class=\"main-padding\" style=\"text-align: center;\" i18n=\"modules|empty list message\">\n Module list is empty\n </h4>\n </ng-template>\n </mat-tab>\n <mat-tab i18n-label=\"Settings\" label=\"Settings\">\n <div class=\"pb-builder-options\" [ngSwitch]=\"showGeneralSettings$ | async\">\n <pb-general-settings *ngSwitchDefault></pb-general-settings>\n <pb-block-settings *ngSwitchCase=\"'block'\"></pb-block-settings>\n <pb-structure-settings *ngSwitchCase=\"'structure'\" fxLayout=\"column\"></pb-structure-settings>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-sidenav>\n</mat-sidenav-container>\n",
215
- exportAs: 'pbEmailBuilder',
216
- changeDetection: ChangeDetectionStrategy.OnPush,
217
- providers: [
218
- {
219
- provide: NG_VALUE_ACCESSOR,
220
- useExisting: forwardRef(() => PbEmailBuilderComponent),
221
- multi: true
222
- },
223
- SlugifyPipe
224
- ],
225
- styles: ["/*!\n * Copyright (c) 2024 Pobuca.\n * All rights reserved.\n */:host{display:block;height:100vh}.hide{display:none}::ng-deep mat-sidenav-container{height:100%}::ng-deep mat-sidenav-container mat-sidenav-content{width:100%;z-index:unset!important;overflow:unset!important}::ng-deep h3.divider{text-align:center;display:block;overflow:hidden;margin:0 0 1rem}::ng-deep h3.divider span{font-weight:100;position:relative;display:inline-block}::ng-deep h3.divider span:after,::ng-deep h3.divider span:before{content:\"\";position:absolute;top:50%;height:1px;background:#ccc;width:99999px}::ng-deep h3.divider span:before{left:100%;margin-left:10px}::ng-deep h3.divider span:after{right:100%;margin-right:10px}::ng-deep .pb-builder-content{border-right:1px solid rgba(0,0,0,.12)}::ng-deep .pb-builder-content .overflow{position:absolute;top:0;bottom:0;left:0;right:0;background-color:#fff;opacity:.5;display:none;z-index:3}::ng-deep .pb-builder-content.disabled .overflow{display:block}::ng-deep .pb-builder-content .mat-tab-label{width:50%;min-width:auto;height:64px;font-size:medium;text-transform:uppercase;padding:0 12px}::ng-deep .pb-builder-content .mat-tab-body-wrapper,::ng-deep .pb-builder-content .mat-tab-group{height:100%}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body{padding:0}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements{display:grid;grid-gap:.5rem;margin-bottom:1rem;grid-template:repeat(2,1fr)/repeat(3,1fr)}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements.structure-elements{grid-template:repeat(4,1fr)/1fr}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements.cdk-drop-list-dragging .cdk-drag{transform:none!important}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body input{height:auto;border:none}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .custom-modules .drag-element img{max-width:100%}::ng-deep .pb-builder-container{position:relative;height:100%}::ng-deep .pb-builder-container mat-progress-bar{position:absolute}::ng-deep .pb-builder-container mat-toolbar{background-color:#fff}::ng-deep .pb-builder-options .mat-expansion-panel{box-shadow:none!important}::ng-deep .pb-builder-options .mat-expansion-panel.mat-expanded{overflow:visible}::ng-deep .pb-builder-options mat-expansion-panel-header:not(.mat-expanded){background:rgba(0,0,0,.04)}::ng-deep .pb-builder-options ::ng-deep .group{display:grid;grid-template:auto/repeat(2,1fr);grid-gap:1rem}::ng-deep .pb-builder-options ::ng-deep .group>*{align-self:center}::ng-deep .pb-builder-options ::ng-deep .group+.group{margin-top:1em}::ng-deep .pb-builder-options ::ng-deep .group.four{grid-template-columns:repeat(4,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.f-large{grid-template-columns:2fr 1fr}::ng-deep .pb-builder-options ::ng-deep .group.l-large{grid-template-columns:1fr 2fr}::ng-deep .pb-builder-options ::ng-deep .group.three{grid-template-columns:repeat(3,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.f-small{grid-template-columns:1fr repeat(2,2fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.f-large{grid-template-columns:2fr repeat(2,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.l-large{grid-template-columns:repeat(2,1fr) 2fr}::ng-deep .pb-builder-options ::ng-deep .group .mat-form-field-infix{width:auto!important}::ng-deep .drag-element{text-align:center;border:1px solid #ccc;box-sizing:border-box;background:#fff;color:#7b7b7b;cursor:move;transition:box-shadow .3s ease-in-out;will-change:box-shadow;border-radius:3px}::ng-deep .drag-element.cdk-drag-disabled,::ng-deep .drag-element.cdk-drag-placeholder{cursor:not-allowed;opacity:.6}::ng-deep .drag-element:hover{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}::ng-deep .drag-element .mat-icon{font-size:40px!important;padding:.5rem;width:auto;height:auto}::ng-deep .drag-element img{max-width:100%}::ng-deep .drag-element-title{font-size:.9em;text-transform:uppercase;margin-bottom:.5rem}::ng-deep .drag-element.structure-element{height:60px;position:relative;padding:4px;display:grid;grid-template:1fr/1fr}::ng-deep .drag-element.structure-element>div{background:#ccc;border:4px solid #bbb}::ng-deep .drag-element.structure-element.cols_2{grid-template-columns:repeat(2,5fr)}::ng-deep .drag-element.structure-element.cols_3{grid-template-columns:repeat(3,3.33fr)}::ng-deep .drag-element.structure-element.cols_4{grid-template-columns:repeat(4,2.5fr)}::ng-deep .drag-element.structure-element.cols_12{grid-template-columns:6fr 4fr}::ng-deep .drag-element.structure-element.cols_21{grid-template-columns:4fr 6fr}::ng-deep .main-padding{padding:1rem}::ng-deep .cdk-drop-list-receiving>:not(.cdk-drag){opacity:.6}::ng-deep .cdk-drop-list-dragging>*{pointer-events:none}@keyframes drag-animation{0%{opacity:0;height:0}to{opacity:1}}::ng-deep .cdk-drag-animating{animation:drag-animation 1s cubic-bezier(0,0,.2,1) infinite}::ng-deep .cdk-drag-preview{border-radius:4px;box-shadow:0 0 0 2px rgba(63,81,181,.5);min-height:60px;min-width:100px;background-color:#fff}::ng-deep .cdk-drag.structure-element.cdk-drag-placeholder{box-shadow:0 0 1px 2px #ff4081;width:100%;pointer-events:none}"]
226
- },] }
227
- ];
228
- PbEmailBuilderComponent.ctorParameters = () => [
229
- { type: PbEmailBuilderService },
230
- { type: PbUserRestApiService },
231
- { type: PbUserInterfaceService },
232
- { type: PbEmailObjectStoreService },
233
- { type: Renderer2 },
234
- { type: SlugifyPipe },
235
- { type: PbUserMiddlewaresService },
236
- { type: ChangeDetectorRef },
237
- { type: Array, decorators: [{ type: Inject, args: [PB_STRUCTURES,] }] },
238
- { type: Array, decorators: [{ type: Inject, args: [PB_BLOCKS,] }] },
239
- { type: Array, decorators: [{ type: Inject, args: [PB_GOOGLE_FONTS,] }] },
240
- { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
241
- ];
242
- PbEmailBuilderComponent.propDecorators = {
243
- email: [{ type: Input }],
244
- emailChange: [{ type: Output }]
245
- };
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGItZW1haWwtYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvcGItZW1haWwtYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLFNBQVMsRUFLVCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHdCQUF3QixFQUFlLE1BQU0sMkRBQTJELENBQUM7QUFFbEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsZUFBZSxF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O2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLHF2TkFBZ0Q7Z0JBRWhELFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDdEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7b0JBQ0QsV0FBVztpQkFDWjs7YUFDRjs7O1lBMUJRLHFCQUFxQjtZQVNyQixvQkFBb0I7WUFIcEIsc0JBQXNCO1lBQ3RCLHlCQUF5QjtZQXZCaEMsU0FBUztZQW1CRixXQUFXO1lBQ1gsd0JBQXdCO1lBZC9CLGlCQUFpQjt3Q0E4RGQsTUFBTSxTQUFDLGFBQWE7d0NBQ3BCLE1BQU0sU0FBQyxTQUFTO3dDQUNoQixNQUFNLFNBQUMsZUFBZTtZQUNRLFFBQVEsdUJBQXRDLE1BQU0sU0FBQyxRQUFROzs7b0JBM0JqQixLQUFLOzBCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IFBvYnVjYS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgSW5wdXQsXG4gIFJlbmRlcmVyMixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgSW5qZWN0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIGlpZiwgRU1QVFkgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCBmaWx0ZXIsIGNhdGNoRXJyb3IsIHdpdGhMYXRlc3RGcm9tLCBleGhhdXN0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBiRW1haWxCdWlsZGVyU2VydmljZSB9IGZyb20gJy4vcGItZW1haWwtYnVpbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IElTdHJ1Y3R1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBQQkVtYWlsIH0gZnJvbSAnLi9jbGFzc2VzL0RlZmF1bHRFbWFpbCc7XG5pbXBvcnQgeyBTbHVnaWZ5UGlwZSB9IGZyb20gJy4vcGlwZXMvc2x1Z2lmeS5waXBlJztcbmltcG9ydCB7IFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSwgVEV4cG9ydFR5cGUgfSBmcm9tICcuL3NlcnZpY2VzL3VzZXItbWlkZGxld2FyZS1zZXJ2aWNlL3BiLW1pZGRsZXdhcmVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVEJsb2NrcyB9IGZyb20gJy4vY2xhc3Nlcy9FbGVtZW50cyc7XG5pbXBvcnQgeyBQYlVzZXJJbnRlcmZhY2VTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9pbnRlcm5hbHMvdXNlci1pbnRlcmZhY2VzL3VzZXItaW50ZXJmYWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGJFbWFpbE9iamVjdFN0b3JlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaW50ZXJuYWxzL3BiLWVtYWlsLW9iamVjdC1zdG9yZS9wYi1lbWFpbC1vYmplY3Qtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBQQl9TVFJVQ1RVUkVTLCBQQl9CTE9DS1MsIFBCX0dPT0dMRV9GT05UUyB9IGZyb20gJy4vdG9rZW5zL3Rva2Vucyc7XG5pbXBvcnQgeyBQYlVzZXJSZXN0QXBpU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdXNlci1yZXN0LWFwaS1zZXJ2aWNlL3VzZXItcmVzdC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBkZWZlck9mIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BiLWVtYWlsLWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGItZW1haWwtYnVpbGRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BiLWVtYWlsLWJ1aWxkZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdwYkVtYWlsQnVpbGRlcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBiRW1haWxCdWlsZGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICBTbHVnaWZ5UGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFBiRW1haWxCdWlsZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBlbWFpbD86IFBCRW1haWw7XG4gIEBPdXRwdXQoKSBlbWFpbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UEJFbWFpbD4oKTtcblxuICBwcmV2aWV3VGVtcGxhdGUgPSBmYWxzZTtcbiAgc2hvd0dlbmVyYWxTZXR0aW5ncyQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmVkaXRHZW5lcmFsU2V0dGluZ3MkO1xuICBjdXJyZW50VGFiSW5kZXgkID0gdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5jdXJyZW50VGFiSW5kZXgkO1xuICBjZGtEcm9wTGlzdENvbm5lY3RlZFRvJCA9IHRoaXMudXNlckludGVyZmFjZVNlcnZpY2UuY2RrRHJvcExpc3RDb25uZWN0ZWRUbyQ7XG4gIGdldEJ1aWxkZXJDb250YWluZXJTdHlsZXMkID0gdGhpcy5lbWFpbE9iamVjdFN0b3JlLmJ1aWxkZXJDb250YWluZXJTdHlsZXMkO1xuICBjdXJyZW50SFRNTFRlbXBsYXRlJCA9IHRoaXMuZW1haWxPYmplY3RTdG9yZS50ZW1wbGF0ZUFzT2JzZXJ2YWJsZSQ7XG4gIGFjdGl2ZU1hdFByb2dyZXNzJCA9IHRoaXMudXNlckludGVyZmFjZVNlcnZpY2UuYWN0aXZlTWF0UHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICBjdXN0b21Nb2R1bGVMaXN0JCA9IHRoaXMudXNlclJlc3RBcGlTZXJ2aWNlLmdldEFsbFVzZXJNb2R1bGVzJDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBpbmNsdWRlZEZvbnRzID0gbmV3IFNldDxIVE1MTGlua0VsZW1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5nYjogUGJFbWFpbEJ1aWxkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclJlc3RBcGlTZXJ2aWNlOiBQYlVzZXJSZXN0QXBpU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJJbnRlcmZhY2VTZXJ2aWNlOiBQYlVzZXJJbnRlcmZhY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW1haWxPYmplY3RTdG9yZTogUGJFbWFpbE9iamVjdFN0b3JlU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc2x1Z2lmeVBpcGU6IFNsdWdpZnlQaXBlLFxuICAgIHByaXZhdGUgbWlkZGxld2FyZXM6IFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFBCX1NUUlVDVFVSRVMpIHB1YmxpYyBzdHJ1Y3R1cmVzOiBJU3RydWN0dXJlW10sXG4gICAgQEluamVjdChQQl9CTE9DS1MpIHB1YmxpYyBibG9ja3M6IFRCbG9ja3NbXSxcbiAgICBASW5qZWN0KFBCX0dPT0dMRV9GT05UUykgZ29vZ2xlRm9udHM6IFRCbG9ja3NbXSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogRG9jdW1lbnRcbiAgKSB7XG4gICAgaWYgKHRoaXMuZG9jKSB7XG4gICAgICBmb3IgKGNvbnN0IGZvbnQgb2YgZ29vZ2xlRm9udHMpIHtcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgbGluay5ocmVmID0gYGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT0ke2ZvbnR9YDtcbiAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHRoaXMuaW5jbHVkZWRGb250cy5hZGQobGluayk7XG4gICAgICAgIHRoaXMuZG9jLmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRm9ybSBDb250cm9sIGltcGxlbWVudGF0aW9uXG4gIHByaXZhdGUgb25DaGFuZ2U6IChfPzogYW55KSA9PiB2b2lkO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZDtcblxuICB3cml0ZVZhbHVlKGVtYWlsOiBQQkVtYWlsKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5zZXRFbWFpbChlbWFpbCk7XG4gICAgICB0aGlzLnByZXZpZXdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFRoZSBzdGF0ZSBvZiBidWlsZGVyXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgY29uc29sZS5pbmZvKCdbSXBFbWFpbEJ1aWxkZXJDb21wb25lbnRdIE1ldGhvZCBbc2V0RGlzYWJsZWRTdGF0ZV0gaXMgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc2F2ZUVtYWlsKCkge1xuICAgIHJldHVybiB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuY3VycmVudEVtYWlsSGFzQ2hhbmdlcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBleGhhdXN0TWFwKGhhc0NoYW5nZXMgPT4ge1xuICAgICAgICAgIHJldHVybiBpaWYoXG4gICAgICAgICAgICAoKSA9PiBoYXNDaGFuZ2VzLFxuICAgICAgICAgICAgdGhpcy5uZ2IuY3JlYXRlSFRNTFRlbXBsYXRlJCgpLFxuICAgICAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoJ05vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCB0byBiZSBzYXZlIScpLmFmdGVyRGlzbWlzc2VkKClcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZGlzYWJsZUJsb2Nrc0xpc3QkKGJsb2NrOiBUQmxvY2tzKSB7XG4gICAgcmV0dXJuIGlpZihcbiAgICAgICgpID0+ICFibG9jay5zdGF0ZT8uZGlzYWJsZWQsXG4gICAgICB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuZW1haWxTdHJ1Y3R1cmVzQXNPYnNlcnZhYmxlJC5waXBlKFxuICAgICAgICBtYXAoKHsgbGVuZ3RoIH0pID0+IGxlbmd0aCA+IDApLFxuICAgICAgICBleGhhdXN0TWFwKGhhc1N0cnVjdHVyZXMgPT4gKGhhc1N0cnVjdHVyZXMgPyB0aGlzLm1pZGRsZXdhcmVzLmRpc2FibGVCbG9ja0RyYWdGcm9tTGlzdChibG9jaykgOiBkZWZlck9mKHRydWUpKSlcbiAgICAgIClcbiAgICApLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICBkaXNhYmxlU3RydWN0dXJlTGlzdCQoc3RydWN0dXJlOiBJU3RydWN0dXJlKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZXMuZGlzYWJsZVN0cnVjdHVyZURyYWdGcm9tTGlzdChzdHJ1Y3R1cmUpLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICB0cmFja0J5Rm4oYmxvY2s6IFRCbG9ja3MgfCBJU3RydWN0dXJlKSB7XG4gICAgcmV0dXJuIGJsb2NrLnR5cGU7XG4gIH1cblxuICBjaGFuZ2VUYWJJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5jaGFuZ2VUYWJJbmRleChpbmRleCk7XG4gIH1cblxuICBkb3dubG9hZChzb3VyY2U6IFRFeHBvcnRUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZXNcbiAgICAgIC5leHBvcnRGaWxlKHNvdXJjZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBleGhhdXN0TWFwKCgpID0+IHRoaXMubmdiLmNyZWF0ZUhUTUxUZW1wbGF0ZSQoKS5waXBlKG1hcChzZXJ2ZXJSZXNwb25zZSA9PiAoeyAuLi5zZXJ2ZXJSZXNwb25zZSwgdHlwZTogc291cmNlIH0pKSkpLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5jYXRjaEVycm9yKGVycm9yKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh7IHR5cGUsIGh0bWwsIG1qbWwgfSkgPT4ge1xuICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLnJlbmRlcmVyMi5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxldCBkb3dubG9hZCA9IGh0bWw7XG4gICAgICAgIGlmICh0eXBlID09PSAnbWptbCcpIHtcbiAgICAgICAgICBkb3dubG9hZCA9IG1qbWw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgICAgZG93bmxvYWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm5nYi5FbWFpbCwgbnVsbCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgICAgICAgbmV3IEJsb2IoW2Rvd25sb2FkXSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZSA9PT0gJ2pzb24nID8gJ3RleHQvanNvbicgOiAndGV4dC9odG1sJ1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5zbHVnaWZ5UGlwZS50cmFuc2Zvcm0odGhpcy5uZ2IuRW1haWwuZ2VuZXJhbC5uYW1lIHx8ICduZ2ItdGVtcGxhdGUnKTtcbiAgICAgICAgYW5jaG9yLmhyZWYgPSBocmVmO1xuICAgICAgICBhbmNob3IudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGFuY2hvci5kb3dubG9hZCA9IGAke2ZpbGVOYW1lfS4ke3R5cGV9YDtcbiAgICAgICAgYW5jaG9yLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaHJlZik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGltcG9ydEZpbGUoKSB7XG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZVxuICAgICAgLmltcG9ydERpYWxvZyQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChlbWFpbE9yRXJyb3IgPT4ge1xuICAgICAgICAgIGlmIChlbWFpbE9yRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZW1haWxPckVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGVmZXJPZihlbWFpbE9yRXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PlxuICAgICAgICAgIHRoaXMubWlkZGxld2FyZXMuY2F0Y2hFcnJvcihlcnJvcikucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXNlckludGVyZmFjZVNlcnZpY2Uubm90aWZ5KGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgZmlsdGVyKGVtYWlsID0+ICEhZW1haWwpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGVtYWlsID0+IHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKGVtYWlsKTtcbiAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoJ0VtYWlsIGhhcyBiZWVuIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0QmFja2dyb3VuZEltYWdlKCk6IFNhZmVTdHlsZSB7XG4gIC8vICAgY29uc3Qge1xuICAvLyAgICAgYmFja2dyb3VuZDogeyB1cmwgfVxuICAvLyAgIH0gPSB0aGlzLmVtYWlsLmdlbmVyYWw7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSh1cmwgJiYgYHVybCgke3VybH0pYCk7XG4gIC8vIH1cblxuICAvLyBnZXRCdWlsZGVyQ29udGFpbmVyU3R5bGVzKCkge1xuICAvLyAgIGNvbnN0IHsgYmFja2dyb3VuZCwgcGFkZGluZywgZGlyZWN0aW9uIH0gPSB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuRW1haWwuZ2VuZXJhbDtcblxuICAvLyAgIHJldHVybiB7XG4gIC8vICAgICBkaXJlY3Rpb24sXG4gIC8vICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBiYWNrZ3JvdW5kLnJlcGVhdCxcbiAgLy8gICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZC5jb2xvcixcbiAgLy8gICAgIGJhY2tncm91bmRTaXplOiBjcmVhdGVXaWR0aEhlaWdodChiYWNrZ3JvdW5kLnNpemUpLFxuICAvLyAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAndG9wIGNlbnRlcicsXG4gIC8vICAgICAuLi5jcmVhdGVQYWRkaW5nKHBhZGRpbmcpXG4gIC8vICAgfTtcbiAgLy8gfVxuXG4gIGNyZWF0ZUFycmF5RnJvbVN0cnVjdHVyZUNvbHVtbnMoeyBjb2x1bW5zIH0pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShjb2x1bW5zKS5maWxsKCcnKTtcbiAgfVxuXG4gIHRvZ2dsZVByZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxPYmplY3RTdG9yZVxuICAgICAgLmNyZWF0ZUhUTUxUZW1wbGF0ZSQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGV4aGF1c3RNYXAoKCkgPT4gdGhpcy5taWRkbGV3YXJlcy50b2dnbGVQcmV2aWV3KCF0aGlzLnByZXZpZXdUZW1wbGF0ZSkpLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5jYXRjaEVycm9yKGVycm9yKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKG5leHRTdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMucHJldmlld1RlbXBsYXRlID0gbmV4dFN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmcm9tRXZlbnQ8QmVmb3JlVW5sb2FkRXZlbnQ+KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpXG4gICAgICAucGlwZShcbiAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5lbWFpbE9iamVjdFN0b3JlLmN1cnJlbnRFbWFpbEhhc0NoYW5nZXMkKSxcbiAgICAgICAgZmlsdGVyKChbXywgZW1haWxJc0RpcnR5XSkgPT4gZW1haWxJc0RpcnR5KSxcbiAgICAgICAgc3dpdGNoTWFwKChbZXZlbnRdKSA9PiB0aGlzLm1pZGRsZXdhcmVzLnByZXZlbnRXaW5kb3dFeGl0KGV2ZW50KSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShldiA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnJldHVyblZhbHVlID0gJyc7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5lbWFpbEFzT2JzZXJ2YWJsZSQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZShlbWFpbCA9PiB7XG4gICAgICB0aGlzLm9uVG91Y2hlZD8uKCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlPy4oZW1haWwpO1xuICAgICAgdGhpcy5lbWFpbENoYW5nZS5uZXh0KGVtYWlsKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5lbWFpbCkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKGNoYW5nZXMuZW1haWwuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlIHNldEVtYWlsKGVtYWlsOiBQQkVtYWlsKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5zZXRFbWFpbChlbWFpbCk7XG4gIC8vICAgICB0aGlzLnByZXZpZXdUZW1wbGF0ZSA9IGZhbHNlO1xuICAvLyAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fb25EZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgLy8gUmVzZXQgdGhlIGJ1aWxkZXIgc3RhdGVcbiAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLnJlc2V0KCk7XG5cbiAgICBpZiAodGhpcy5kb2MpIHtcbiAgICAgIHRoaXMuaW5jbHVkZWRGb250cy5mb3JFYWNoKGZvbnQgPT4gZm9udC5yZW1vdmUoKSk7XG4gICAgfVxuICAgIHRoaXMuaW5jbHVkZWRGb250cy5jbGVhcigpO1xuICB9XG59XG4iXX0=
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Component, ChangeDetectionStrategy, Input, Renderer2, Inject, ChangeDetectorRef, Output, EventEmitter, forwardRef } from '@angular/core';
6
+ import { DOCUMENT } from '@angular/common';
7
+ import { fromEvent, Subject, iif, EMPTY } from 'rxjs';
8
+ import { switchMap, take, takeUntil, filter, catchError, withLatestFrom, exhaustMap, map } from 'rxjs/operators';
9
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
10
+ import { PbEmailBuilderService } from './pb-email-builder.service';
11
+ import { PBEmail } from './classes/DefaultEmail';
12
+ import { SlugifyPipe } from './pipes/slugify.pipe';
13
+ import { PbUserMiddlewaresService } from './services/user-middleware-service/pb-middlewares.service';
14
+ import { PbUserInterfaceService } from './services/internals/user-interfaces/user-interface.service';
15
+ import { PbEmailObjectStoreService } from './services/internals/pb-email-object-store/pb-email-object-store.service';
16
+ import { PB_STRUCTURES, PB_BLOCKS, PB_GOOGLE_FONTS } from './tokens/tokens';
17
+ import { PbUserRestApiService } from './services/user-rest-api-service/user-rest-api.service';
18
+ import { deferOf } from './utils';
19
+ export class PbEmailBuilderComponent {
20
+ constructor(ngb, userRestApiService, userInterfaceService, emailObjectStore, renderer2, slugifyPipe, middlewares, changeDetectorRef, structures, blocks, googleFonts, doc) {
21
+ this.ngb = ngb;
22
+ this.userRestApiService = userRestApiService;
23
+ this.userInterfaceService = userInterfaceService;
24
+ this.emailObjectStore = emailObjectStore;
25
+ this.renderer2 = renderer2;
26
+ this.slugifyPipe = slugifyPipe;
27
+ this.middlewares = middlewares;
28
+ this.changeDetectorRef = changeDetectorRef;
29
+ this.structures = structures;
30
+ this.blocks = blocks;
31
+ this.doc = doc;
32
+ this.emailChange = new EventEmitter();
33
+ this.previewTemplate = false;
34
+ this.showGeneralSettings$ = this.userInterfaceService.editGeneralSettings$;
35
+ this.currentTabIndex$ = this.userInterfaceService.currentTabIndex$;
36
+ this.cdkDropListConnectedTo$ = this.userInterfaceService.cdkDropListConnectedTo$;
37
+ this.getBuilderContainerStyles$ = this.emailObjectStore.builderContainerStyles$;
38
+ this.currentHTMLTemplate$ = this.emailObjectStore.templateAsObservable$;
39
+ this.activeMatProgress$ = this.userInterfaceService.activeMatProgress$.asObservable();
40
+ this.customModuleList$ = this.userRestApiService.getAllUserModules$;
41
+ this._onDestroy$ = new Subject();
42
+ this.includedFonts = new Set();
43
+ if (this.doc) {
44
+ for (const font of googleFonts) {
45
+ const link = this.doc.createElement('link');
46
+ link.href = `https://fonts.googleapis.com/css?family=${font}`;
47
+ link.rel = 'stylesheet';
48
+ this.includedFonts.add(link);
49
+ this.doc.head.appendChild(link);
50
+ }
51
+ }
52
+ }
53
+ writeValue(email) {
54
+ try {
55
+ this.emailObjectStore.setEmail(email);
56
+ this.previewTemplate = false;
57
+ this.changeDetectorRef.markForCheck();
58
+ }
59
+ catch (error) {
60
+ this.userInterfaceService.notify(error.message);
61
+ }
62
+ }
63
+ registerOnChange(fn) {
64
+ this.onChange = fn;
65
+ }
66
+ registerOnTouched(fn) {
67
+ this.onTouched = fn;
68
+ }
69
+ /**
70
+ * Not implemented yet
71
+ * @param isDisabled The state of builder
72
+ */
73
+ setDisabledState(isDisabled) {
74
+ // tslint:disable-next-line: no-console
75
+ console.info('[IpEmailBuilderComponent] Method [setDisabledState] is not implemented.');
76
+ }
77
+ saveEmail() {
78
+ return this.emailObjectStore.currentEmailHasChanges$
79
+ .pipe(exhaustMap(hasChanges => {
80
+ return iif(() => hasChanges, this.ngb.createHTMLTemplate$(), this.userInterfaceService.notify('No changes were detected to be save!').afterDismissed());
81
+ }), take(1))
82
+ .subscribe();
83
+ }
84
+ disableBlocksList$(block) {
85
+ return iif(() => { var _a; return !((_a = block.state) === null || _a === void 0 ? void 0 : _a.disabled); }, this.emailObjectStore.emailStructuresAsObservable$.pipe(map(({ length }) => length > 0), exhaustMap(hasStructures => (hasStructures ? this.middlewares.disableBlockDragFromList(block) : deferOf(true))))).pipe(take(1));
86
+ }
87
+ disableStructureList$(structure) {
88
+ return this.middlewares.disableStructureDragFromList(structure).pipe(take(1));
89
+ }
90
+ trackByFn(block) {
91
+ return block.type;
92
+ }
93
+ changeTabIndex(index) {
94
+ this.userInterfaceService.changeTabIndex(index);
95
+ }
96
+ download(source) {
97
+ return this.middlewares
98
+ .exportFile(source)
99
+ .pipe(exhaustMap(() => this.ngb.createHTMLTemplate$().pipe(map(serverResponse => (Object.assign(Object.assign({}, serverResponse), { type: source }))))), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
100
+ this.userInterfaceService.notify(error.message);
101
+ return EMPTY;
102
+ }))), take(1))
103
+ .subscribe(({ type, html, mjml }) => {
104
+ const anchor = this.renderer2.createElement('a');
105
+ let download = html;
106
+ if (type === 'mjml') {
107
+ download = mjml;
108
+ }
109
+ else if (type === 'json') {
110
+ download = JSON.stringify(this.ngb.Email, null, 1);
111
+ }
112
+ const href = URL.createObjectURL(new Blob([download], {
113
+ type: type === 'json' ? 'text/json' : 'text/html'
114
+ }));
115
+ const fileName = this.slugifyPipe.transform(this.ngb.Email.general.name || 'ngb-template');
116
+ anchor.href = href;
117
+ anchor.target = '_blank';
118
+ anchor.download = `${fileName}.${type}`;
119
+ anchor.click();
120
+ URL.revokeObjectURL(href);
121
+ });
122
+ }
123
+ importFile() {
124
+ this.userInterfaceService
125
+ .importDialog$()
126
+ .pipe(switchMap(emailOrError => {
127
+ if (emailOrError instanceof Error) {
128
+ throw emailOrError;
129
+ }
130
+ return deferOf(emailOrError);
131
+ }), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
132
+ this.userInterfaceService.notify(error.message);
133
+ return EMPTY;
134
+ }))), take(1), filter(email => !!email))
135
+ .subscribe(email => {
136
+ this.writeValue(email);
137
+ this.userInterfaceService.notify('Email has been imported successfully.');
138
+ });
139
+ }
140
+ // getBackgroundImage(): SafeStyle {
141
+ // const {
142
+ // background: { url }
143
+ // } = this.email.general;
144
+ // return this.sanitizer.bypassSecurityTrustStyle(url && `url(${url})`);
145
+ // }
146
+ // getBuilderContainerStyles() {
147
+ // const { background, padding, direction } = this.emailObjectStore.Email.general;
148
+ // return {
149
+ // direction,
150
+ // backgroundRepeat: background.repeat,
151
+ // backgroundColor: background.color,
152
+ // backgroundSize: createWidthHeight(background.size),
153
+ // backgroundPosition: 'top center',
154
+ // ...createPadding(padding)
155
+ // };
156
+ // }
157
+ createArrayFromStructureColumns({ columns }) {
158
+ return new Array(columns).fill('');
159
+ }
160
+ togglePreview() {
161
+ return this.emailObjectStore
162
+ .createHTMLTemplate$()
163
+ .pipe(exhaustMap(() => this.middlewares.togglePreview(!this.previewTemplate)), catchError(error => this.middlewares.catchError(error).pipe(switchMap(() => {
164
+ this.userInterfaceService.notify(error.message);
165
+ return EMPTY;
166
+ }))), take(1))
167
+ .subscribe(nextState => {
168
+ this.previewTemplate = nextState;
169
+ this.changeDetectorRef.markForCheck();
170
+ });
171
+ }
172
+ ngOnInit() {
173
+ fromEvent(window, 'beforeunload')
174
+ .pipe(withLatestFrom(this.emailObjectStore.currentEmailHasChanges$), filter(([_, emailIsDirty]) => emailIsDirty), switchMap(([event]) => this.middlewares.preventWindowExit(event)), takeUntil(this._onDestroy$))
175
+ .subscribe(ev => {
176
+ ev.preventDefault();
177
+ ev.returnValue = '';
178
+ });
179
+ this.emailObjectStore.emailAsObservable$.pipe(takeUntil(this._onDestroy$)).subscribe(email => {
180
+ var _a, _b;
181
+ (_a = this.onTouched) === null || _a === void 0 ? void 0 : _a.call(this);
182
+ (_b = this.onChange) === null || _b === void 0 ? void 0 : _b.call(this, email);
183
+ this.emailChange.next(email);
184
+ if (this.doc && (email === null || email === void 0 ? void 0 : email.customFonts)) {
185
+ email.customFonts.forEach(font => {
186
+ const existing = Array.from(this.includedFonts).find(link => link.href === font.url);
187
+ if (!existing) {
188
+ const link = this.doc.createElement('link');
189
+ link.href = font.url;
190
+ link.rel = 'stylesheet';
191
+ this.includedFonts.add(link);
192
+ this.doc.head.appendChild(link);
193
+ }
194
+ });
195
+ }
196
+ });
197
+ }
198
+ ngOnChanges(changes) {
199
+ if (changes.email) {
200
+ this.writeValue(changes.email.currentValue);
201
+ }
202
+ }
203
+ // private setEmail(email: PBEmail) {
204
+ // try {
205
+ // this.emailObjectStore.setEmail(email);
206
+ // this.previewTemplate = false;
207
+ // this.changeDetectorRef.markForCheck();
208
+ // } catch (error) {
209
+ // this.userInterfaceService.notify(error.message);
210
+ // }
211
+ // }
212
+ ngOnDestroy() {
213
+ this._onDestroy$.next();
214
+ this._onDestroy$.complete();
215
+ // Reset the builder state
216
+ this.userInterfaceService.reset();
217
+ if (this.doc) {
218
+ this.includedFonts.forEach(font => font.remove());
219
+ }
220
+ this.includedFonts.clear();
221
+ }
222
+ }
223
+ PbEmailBuilderComponent.decorators = [
224
+ { type: Component, args: [{
225
+ selector: 'pb-email-builder',
226
+ template: "<!--\r\n ~ Copyright (c) 2024 Pobuca.\r\n ~ All rights reserved.\r\n -->\r\n\r\n<mat-sidenav-container>\r\n <div class=\"pb-builder-container\" fxLayout=\"column\" fxFlex>\r\n <mat-progress-bar *ngIf=\"activeMatProgress$ | async\" mode=\"buffer\"></mat-progress-bar>\r\n <mat-toolbar fxLayoutGap=\"1rem\" fxLayoutAlign=\"space-between center\">\r\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".top-actions\"></ng-content>\r\n\r\n <div fxFlexlayout fxLayoutGap=\"0.5rem\">\r\n <button *ngIf=\"ngb.config.useSaveButton\" type=\"button\" (click)=\"saveEmail()\" mat-stroked-button color=\"primary\"\r\n i18n=\"actions|Save Email\">\r\n Save Email\r\n </button>\r\n <button *ngIf=\"ngb.config.usePreviewButton\" type=\"button\" (click)=\"togglePreview()\" mat-stroked-button>\r\n <ng-container [ngSwitch]=\"previewTemplate\">\r\n <span *ngSwitchDefault i18n=\"actions|Preview\">Preview</span>\r\n <span *ngSwitchCase=\"true\" i18n=\"actions|Close Preview\">Close Preview</span>\r\n </ng-container>\r\n </button>\r\n\r\n <button mat-button mat-stroked-button i18n=\"actions|Import\" (click)=\"importFile()\">\r\n Import\r\n </button>\r\n\r\n <ng-container *ngIf=\"ngb.config.useDownloadButton\">\r\n <button mat-button [matMenuTriggerFor]=\"downloadMenu\" mat-stroked-button i18n=\"actions|Export\">\r\n Export\r\n </button>\r\n <mat-menu #downloadMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"download('html')\" i18n=\"actions|Export HTML\">\r\n Export HTML\r\n </button>\r\n <button mat-menu-item (click)=\"download('mjml')\" i18n=\"actions|Export MJML\">\r\n Export MJML\r\n </button>\r\n <button mat-menu-item (click)=\"download('json')\" i18n=\"actions|Export JSON\">\r\n Export JSON\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n\r\n </div>\r\n <!-- <div class=\"history-actions\" style=\"margin-inline-start: auto;\">\r\n <span>Last saved Now</span>\r\n <button type=\"button\" mat-icon-button>\r\n <mat-icon>undo</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button>\r\n <mat-icon>redo</mat-icon>\r\n </button>\r\n </div> -->\r\n </mat-toolbar>\r\n <ng-container [ngSwitch]=\"previewTemplate\">\r\n <pb-builder-container *ngSwitchDefault [ngStyle]=\"getBuilderContainerStyles$ | async\">\r\n <ng-content select=\".rewrited-empty-email\"></ng-content>\r\n </pb-builder-container>\r\n\r\n <pb-preview-template fxLayout fxFlex=\"auto\" fxLayoutAlign=\"center\" [template]=\"currentHTMLTemplate$ | async\"\r\n *ngSwitchCase=\"true\">\r\n </pb-preview-template>\r\n </ng-container>\r\n </div>\r\n <mat-sidenav mode=\"side\" fxFlex=\"0 0 310px\" [opened]=\"!previewTemplate\" position=\"end\" class=\"pb-builder-content\">\r\n <mat-tab-group [selectedIndex]=\"currentTabIndex$ | async\" (selectedIndexChange)=\"changeTabIndex($event)\">\r\n <mat-tab i18n-label=\"Content\" label=\"Content\">\r\n <div class=\"main-padding\">\r\n <cdk-drop-list class=\"elements\" [cdkDropListConnectedTo]=\"cdkDropListConnectedTo$ | async\"\r\n [cdkDropListData]=\"blocks\" [cdkDropListSortingDisabled]=\"true\" id=\"block-elements\">\r\n <div cdkDrag *ngFor=\"let block of blocks; trackBy: trackByFn\" [cdkDragData]=\"block\"\r\n [cdkDragDisabled]=\"disableBlocksList$(block) | async\" class=\"drag-element\"\r\n [matTooltip]=\"block.state.message\">\r\n <mat-icon>{{ block.icon }}</mat-icon>\r\n <div class=\"drag-element-title\">{{ block.title }}</div>\r\n </div>\r\n </cdk-drop-list>\r\n\r\n <mat-divider style=\"margin: 1em 0;\"></mat-divider>\r\n <!-- <h3 class=\"divider\"><span>Structures</span></h3> -->\r\n <cdk-drop-list class=\"elements structure-elements\" cdkDropListConnectedTo=\"structures-drop-list\"\r\n [cdkDropListSortingDisabled]=\"true\" [cdkDropListData]=\"structures\">\r\n <div cdkDrag *ngFor=\"let structure of structures; trackBy: trackByFn\" [cdkDragData]=\"structure\"\r\n [cdkDragDisabled]=\"disableStructureList$(structure) | async\" class=\"drag-element structure-element\"\r\n [ngClass]=\"structure.type\">\r\n <div *ngFor=\"let column of createArrayFromStructureColumns(structure)\"></div>\r\n </div>\r\n </cdk-drop-list>\r\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".after-structure-blocks\"></ng-content>\r\n </div>\r\n </mat-tab>\r\n <mat-tab i18n-label=\"Modules\" label=\"Modules\" class=\"modules-tab\">\r\n <cdk-virtual-scroll-viewport itemSize=\"54\" [minBufferPx]=\"54 * 10\" [maxBufferPx]=\"54 * 20\"\r\n style=\"height: inherit;\"\r\n *ngIf=\"customModuleList$ | async as modules; else emptyModuleList\">\r\n <div class=\"main-padding\">\r\n <div class=\"custom-modules\" cdkDropList cdkDropListConnectedTo=\"structures-drop-list\"\r\n [cdkDropListData]=\"modules\" [cdkDropListSortingDisabled]=\"true\">\r\n <div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n <ng-container *cdkVirtualFor=\"let module of modules\">\r\n <div cdkDrag [cdkDragData]=\"module.module\"\r\n [cdkDragDisabled]=\"disableStructureList$(module.module) | async\" class=\"drag-element\"\r\n style=\"padding: 1em;text-transform: uppercase;height: 54px;\">\r\n <span *ngIf=\"module.name\">{{module.name}}</span>\r\n <!-- <img *ngIf=\"module.thumb\" [src]=\"module.thumb\" /> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-content fxLayout fxLayoutGap=\"0.5rem\" select=\".after-content-blocks\"></ng-content>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n <ng-template #emptyModuleList>\r\n <h4 class=\"main-padding\" style=\"text-align: center;\" i18n=\"modules|empty list message\">\r\n Module list is empty\r\n </h4>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab i18n-label=\"Settings\" label=\"Settings\">\r\n <div class=\"pb-builder-options\" [ngSwitch]=\"showGeneralSettings$ | async\">\r\n <pb-general-settings *ngSwitchDefault></pb-general-settings>\r\n <pb-block-settings *ngSwitchCase=\"'block'\"></pb-block-settings>\r\n <pb-structure-settings *ngSwitchCase=\"'structure'\" fxLayout=\"column\"></pb-structure-settings>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n </mat-sidenav>\r\n</mat-sidenav-container>\r\n",
227
+ exportAs: 'pbEmailBuilder',
228
+ changeDetection: ChangeDetectionStrategy.OnPush,
229
+ providers: [
230
+ {
231
+ provide: NG_VALUE_ACCESSOR,
232
+ useExisting: forwardRef(() => PbEmailBuilderComponent),
233
+ multi: true
234
+ },
235
+ SlugifyPipe
236
+ ],
237
+ styles: ["/*!\n * Copyright (c) 2024 Pobuca.\n * All rights reserved.\n */:host{display:block;height:100vh}.hide{display:none}::ng-deep mat-sidenav-container{height:100%}::ng-deep mat-sidenav-container mat-sidenav-content{width:100%;z-index:unset!important;overflow:unset!important}::ng-deep h3.divider{text-align:center;display:block;overflow:hidden;margin:0 0 1rem}::ng-deep h3.divider span{font-weight:100;position:relative;display:inline-block}::ng-deep h3.divider span:after,::ng-deep h3.divider span:before{content:\"\";position:absolute;top:50%;height:1px;background:#ccc;width:99999px}::ng-deep h3.divider span:before{left:100%;margin-left:10px}::ng-deep h3.divider span:after{right:100%;margin-right:10px}::ng-deep .pb-builder-content{border-right:1px solid rgba(0,0,0,.12)}::ng-deep .pb-builder-content .overflow{position:absolute;top:0;bottom:0;left:0;right:0;background-color:#fff;opacity:.5;display:none;z-index:3}::ng-deep .pb-builder-content.disabled .overflow{display:block}::ng-deep .pb-builder-content .mat-tab-label{width:50%;min-width:auto;height:64px;font-size:medium;text-transform:uppercase;padding:0 12px}::ng-deep .pb-builder-content .mat-tab-body-wrapper,::ng-deep .pb-builder-content .mat-tab-group{height:100%}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body{padding:0}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements{display:grid;grid-gap:.5rem;margin-bottom:1rem;grid-template:repeat(2,1fr)/repeat(3,1fr)}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements.structure-elements{grid-template:repeat(4,1fr)/1fr}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .elements.cdk-drop-list-dragging .cdk-drag{transform:none!important}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body input{height:auto;border:none}::ng-deep .pb-builder-content .mat-tab-body-wrapper .mat-tab-body .custom-modules .drag-element img{max-width:100%}::ng-deep .pb-builder-container{position:relative;height:100%}::ng-deep .pb-builder-container mat-progress-bar{position:absolute}::ng-deep .pb-builder-container mat-toolbar{background-color:#fff}::ng-deep .pb-builder-options .mat-expansion-panel{box-shadow:none!important}::ng-deep .pb-builder-options .mat-expansion-panel.mat-expanded{overflow:visible}::ng-deep .pb-builder-options mat-expansion-panel-header:not(.mat-expanded){background:rgba(0,0,0,.04)}::ng-deep .pb-builder-options ::ng-deep .group{display:grid;grid-template:auto/repeat(2,1fr);grid-gap:1rem}::ng-deep .pb-builder-options ::ng-deep .group>*{align-self:center}::ng-deep .pb-builder-options ::ng-deep .group+.group{margin-top:1em}::ng-deep .pb-builder-options ::ng-deep .group.four{grid-template-columns:repeat(4,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.f-large{grid-template-columns:2fr 1fr}::ng-deep .pb-builder-options ::ng-deep .group.l-large{grid-template-columns:1fr 2fr}::ng-deep .pb-builder-options ::ng-deep .group.three{grid-template-columns:repeat(3,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.f-small{grid-template-columns:1fr repeat(2,2fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.f-large{grid-template-columns:2fr repeat(2,1fr)}::ng-deep .pb-builder-options ::ng-deep .group.three.l-large{grid-template-columns:repeat(2,1fr) 2fr}::ng-deep .pb-builder-options ::ng-deep .group .mat-form-field-infix{width:auto!important}::ng-deep .drag-element{text-align:center;border:1px solid #ccc;box-sizing:border-box;background:#fff;color:#7b7b7b;cursor:move;transition:box-shadow .3s ease-in-out;will-change:box-shadow;border-radius:3px}::ng-deep .drag-element.cdk-drag-disabled,::ng-deep .drag-element.cdk-drag-placeholder{cursor:not-allowed;opacity:.6}::ng-deep .drag-element:hover{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}::ng-deep .drag-element .mat-icon{font-size:40px!important;padding:.5rem;width:auto;height:auto}::ng-deep .drag-element img{max-width:100%}::ng-deep .drag-element-title{font-size:.9em;text-transform:uppercase;margin-bottom:.5rem}::ng-deep .drag-element.structure-element{height:60px;position:relative;padding:4px;display:grid;grid-template:1fr/1fr}::ng-deep .drag-element.structure-element>div{background:#ccc;border:4px solid #bbb}::ng-deep .drag-element.structure-element.cols_2{grid-template-columns:repeat(2,5fr)}::ng-deep .drag-element.structure-element.cols_3{grid-template-columns:repeat(3,3.33fr)}::ng-deep .drag-element.structure-element.cols_4{grid-template-columns:repeat(4,2.5fr)}::ng-deep .drag-element.structure-element.cols_12{grid-template-columns:6fr 4fr}::ng-deep .drag-element.structure-element.cols_21{grid-template-columns:4fr 6fr}::ng-deep .main-padding{padding:1rem}::ng-deep .cdk-drop-list-receiving>:not(.cdk-drag){opacity:.6}::ng-deep .cdk-drop-list-dragging>*{pointer-events:none}@keyframes drag-animation{0%{opacity:0;height:0}to{opacity:1}}::ng-deep .cdk-drag-animating{animation:drag-animation 1s cubic-bezier(0,0,.2,1) infinite}::ng-deep .cdk-drag-preview{border-radius:4px;box-shadow:0 0 0 2px rgba(63,81,181,.5);min-height:60px;min-width:100px;background-color:#fff}::ng-deep .cdk-drag.structure-element.cdk-drag-placeholder{box-shadow:0 0 1px 2px #ff4081;width:100%;pointer-events:none}"]
238
+ },] }
239
+ ];
240
+ PbEmailBuilderComponent.ctorParameters = () => [
241
+ { type: PbEmailBuilderService },
242
+ { type: PbUserRestApiService },
243
+ { type: PbUserInterfaceService },
244
+ { type: PbEmailObjectStoreService },
245
+ { type: Renderer2 },
246
+ { type: SlugifyPipe },
247
+ { type: PbUserMiddlewaresService },
248
+ { type: ChangeDetectorRef },
249
+ { type: Array, decorators: [{ type: Inject, args: [PB_STRUCTURES,] }] },
250
+ { type: Array, decorators: [{ type: Inject, args: [PB_BLOCKS,] }] },
251
+ { type: Array, decorators: [{ type: Inject, args: [PB_GOOGLE_FONTS,] }] },
252
+ { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
253
+ ];
254
+ PbEmailBuilderComponent.propDecorators = {
255
+ email: [{ type: Input }],
256
+ emailChange: [{ type: Output }]
257
+ };
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGItZW1haWwtYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvcGItZW1haWwtYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLFNBQVMsRUFLVCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHdCQUF3QixFQUFlLE1BQU0sMkRBQTJELENBQUM7QUFFbEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsZUFBZSxF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aEMsU0FBUztZQW1CRixXQUFXO1lBQ1gsd0JBQXdCO1lBZC9CLGlCQUFpQjt3Q0E4RGQsTUFBTSxTQUFDLGFBQWE7d0NBQ3BCLE1BQU0sU0FBQyxTQUFTO3dDQUNoQixNQUFNLFNBQUMsZUFBZTtZQUNRLFFBQVEsdUJBQXRDLE1BQU0sU0FBQyxRQUFROzs7b0JBM0JqQixLQUFLOzBCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgUG9idWNhLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIElucHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIEluamVjdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIGlpZiwgRU1QVFkgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwsIGZpbHRlciwgY2F0Y2hFcnJvciwgd2l0aExhdGVzdEZyb20sIGV4aGF1c3RNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgUGJFbWFpbEJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi9wYi1lbWFpbC1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJU3RydWN0dXJlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBQQkVtYWlsIH0gZnJvbSAnLi9jbGFzc2VzL0RlZmF1bHRFbWFpbCc7XHJcbmltcG9ydCB7IFNsdWdpZnlQaXBlIH0gZnJvbSAnLi9waXBlcy9zbHVnaWZ5LnBpcGUnO1xyXG5pbXBvcnQgeyBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2UsIFRFeHBvcnRUeXBlIH0gZnJvbSAnLi9zZXJ2aWNlcy91c2VyLW1pZGRsZXdhcmUtc2VydmljZS9wYi1taWRkbGV3YXJlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVEJsb2NrcyB9IGZyb20gJy4vY2xhc3Nlcy9FbGVtZW50cyc7XHJcbmltcG9ydCB7IFBiVXNlckludGVyZmFjZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ludGVybmFscy91c2VyLWludGVyZmFjZXMvdXNlci1pbnRlcmZhY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFBiRW1haWxPYmplY3RTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ludGVybmFscy9wYi1lbWFpbC1vYmplY3Qtc3RvcmUvcGItZW1haWwtb2JqZWN0LXN0b3JlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQQl9TVFJVQ1RVUkVTLCBQQl9CTE9DS1MsIFBCX0dPT0dMRV9GT05UUyB9IGZyb20gJy4vdG9rZW5zL3Rva2Vucyc7XHJcbmltcG9ydCB7IFBiVXNlclJlc3RBcGlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy91c2VyLXJlc3QtYXBpLXNlcnZpY2UvdXNlci1yZXN0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZGVmZXJPZiB9IGZyb20gJy4vdXRpbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwYi1lbWFpbC1idWlsZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGItZW1haWwtYnVpbGRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGItZW1haWwtYnVpbGRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGV4cG9ydEFzOiAncGJFbWFpbEJ1aWxkZXInLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGJFbWFpbEJ1aWxkZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIFNsdWdpZnlQaXBlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGJFbWFpbEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQElucHV0KCkgZW1haWw/OiBQQkVtYWlsO1xyXG4gIEBPdXRwdXQoKSBlbWFpbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UEJFbWFpbD4oKTtcclxuXHJcbiAgcHJldmlld1RlbXBsYXRlID0gZmFsc2U7XHJcbiAgc2hvd0dlbmVyYWxTZXR0aW5ncyQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmVkaXRHZW5lcmFsU2V0dGluZ3MkO1xyXG4gIGN1cnJlbnRUYWJJbmRleCQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmN1cnJlbnRUYWJJbmRleCQ7XHJcbiAgY2RrRHJvcExpc3RDb25uZWN0ZWRUbyQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmNka0Ryb3BMaXN0Q29ubmVjdGVkVG8kO1xyXG4gIGdldEJ1aWxkZXJDb250YWluZXJTdHlsZXMkID0gdGhpcy5lbWFpbE9iamVjdFN0b3JlLmJ1aWxkZXJDb250YWluZXJTdHlsZXMkO1xyXG4gIGN1cnJlbnRIVE1MVGVtcGxhdGUkID0gdGhpcy5lbWFpbE9iamVjdFN0b3JlLnRlbXBsYXRlQXNPYnNlcnZhYmxlJDtcclxuICBhY3RpdmVNYXRQcm9ncmVzcyQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmFjdGl2ZU1hdFByb2dyZXNzJC5hc09ic2VydmFibGUoKTtcclxuICBjdXN0b21Nb2R1bGVMaXN0JCA9IHRoaXMudXNlclJlc3RBcGlTZXJ2aWNlLmdldEFsbFVzZXJNb2R1bGVzJDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHJpdmF0ZSBpbmNsdWRlZEZvbnRzID0gbmV3IFNldDxIVE1MTGlua0VsZW1lbnQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG5nYjogUGJFbWFpbEJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyUmVzdEFwaVNlcnZpY2U6IFBiVXNlclJlc3RBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VySW50ZXJmYWNlU2VydmljZTogUGJVc2VySW50ZXJmYWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZW1haWxPYmplY3RTdG9yZTogUGJFbWFpbE9iamVjdFN0b3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHNsdWdpZnlQaXBlOiBTbHVnaWZ5UGlwZSxcclxuICAgIHByaXZhdGUgbWlkZGxld2FyZXM6IFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQEluamVjdChQQl9TVFJVQ1RVUkVTKSBwdWJsaWMgc3RydWN0dXJlczogSVN0cnVjdHVyZVtdLFxyXG4gICAgQEluamVjdChQQl9CTE9DS1MpIHB1YmxpYyBibG9ja3M6IFRCbG9ja3NbXSxcclxuICAgIEBJbmplY3QoUEJfR09PR0xFX0ZPTlRTKSBnb29nbGVGb250czogVEJsb2Nrc1tdLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IERvY3VtZW50XHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5kb2MpIHtcclxuICAgICAgZm9yIChjb25zdCBmb250IG9mIGdvb2dsZUZvbnRzKSB7XHJcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgICAgICBsaW5rLmhyZWYgPSBgaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PSR7Zm9udH1gO1xyXG4gICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xyXG4gICAgICAgIHRoaXMuaW5jbHVkZWRGb250cy5hZGQobGluayk7XHJcbiAgICAgICAgdGhpcy5kb2MuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRm9ybSBDb250cm9sIGltcGxlbWVudGF0aW9uXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKF8/OiBhbnkpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XHJcblxyXG4gIHdyaXRlVmFsdWUoZW1haWw6IFBCRW1haWwpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5zZXRFbWFpbChlbWFpbCk7XHJcbiAgICAgIHRoaXMucHJldmlld1RlbXBsYXRlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLm5vdGlmeShlcnJvci5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0XHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIHN0YXRlIG9mIGJ1aWxkZXJcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgIGNvbnNvbGUuaW5mbygnW0lwRW1haWxCdWlsZGVyQ29tcG9uZW50XSBNZXRob2QgW3NldERpc2FibGVkU3RhdGVdIGlzIG5vdCBpbXBsZW1lbnRlZC4nKTtcclxuICB9XHJcblxyXG4gIHNhdmVFbWFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuY3VycmVudEVtYWlsSGFzQ2hhbmdlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZXhoYXVzdE1hcChoYXNDaGFuZ2VzID0+IHtcclxuICAgICAgICAgIHJldHVybiBpaWYoXHJcbiAgICAgICAgICAgICgpID0+IGhhc0NoYW5nZXMsXHJcbiAgICAgICAgICAgIHRoaXMubmdiLmNyZWF0ZUhUTUxUZW1wbGF0ZSQoKSxcclxuICAgICAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoJ05vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCB0byBiZSBzYXZlIScpLmFmdGVyRGlzbWlzc2VkKClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFrZSgxKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGRpc2FibGVCbG9ja3NMaXN0JChibG9jazogVEJsb2Nrcykge1xyXG4gICAgcmV0dXJuIGlpZihcclxuICAgICAgKCkgPT4gIWJsb2NrLnN0YXRlPy5kaXNhYmxlZCxcclxuICAgICAgdGhpcy5lbWFpbE9iamVjdFN0b3JlLmVtYWlsU3RydWN0dXJlc0FzT2JzZXJ2YWJsZSQucGlwZShcclxuICAgICAgICBtYXAoKHsgbGVuZ3RoIH0pID0+IGxlbmd0aCA+IDApLFxyXG4gICAgICAgIGV4aGF1c3RNYXAoaGFzU3RydWN0dXJlcyA9PiAoaGFzU3RydWN0dXJlcyA/IHRoaXMubWlkZGxld2FyZXMuZGlzYWJsZUJsb2NrRHJhZ0Zyb21MaXN0KGJsb2NrKSA6IGRlZmVyT2YodHJ1ZSkpKVxyXG4gICAgICApXHJcbiAgICApLnBpcGUodGFrZSgxKSk7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlU3RydWN0dXJlTGlzdCQoc3RydWN0dXJlOiBJU3RydWN0dXJlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlcy5kaXNhYmxlU3RydWN0dXJlRHJhZ0Zyb21MaXN0KHN0cnVjdHVyZSkucGlwZSh0YWtlKDEpKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlGbihibG9jazogVEJsb2NrcyB8IElTdHJ1Y3R1cmUpIHtcclxuICAgIHJldHVybiBibG9jay50eXBlO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGFiSW5kZXgoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5jaGFuZ2VUYWJJbmRleChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZChzb3VyY2U6IFRFeHBvcnRUeXBlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlc1xyXG4gICAgICAuZXhwb3J0RmlsZShzb3VyY2UpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGV4aGF1c3RNYXAoKCkgPT4gdGhpcy5uZ2IuY3JlYXRlSFRNTFRlbXBsYXRlJCgpLnBpcGUobWFwKHNlcnZlclJlc3BvbnNlID0+ICh7IC4uLnNlcnZlclJlc3BvbnNlLCB0eXBlOiBzb3VyY2UgfSkpKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PlxyXG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5jYXRjaEVycm9yKGVycm9yKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudXNlckludGVyZmFjZVNlcnZpY2Uubm90aWZ5KGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIHRha2UoMSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCh7IHR5cGUsIGh0bWwsIG1qbWwgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMucmVuZGVyZXIyLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICBsZXQgZG93bmxvYWQgPSBodG1sO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnbWptbCcpIHtcclxuICAgICAgICAgIGRvd25sb2FkID0gbWptbDtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqc29uJykge1xyXG4gICAgICAgICAgZG93bmxvYWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm5nYi5FbWFpbCwgbnVsbCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKFxyXG4gICAgICAgICAgbmV3IEJsb2IoW2Rvd25sb2FkXSwge1xyXG4gICAgICAgICAgICB0eXBlOiB0eXBlID09PSAnanNvbicgPyAndGV4dC9qc29uJyA6ICd0ZXh0L2h0bWwnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLnNsdWdpZnlQaXBlLnRyYW5zZm9ybSh0aGlzLm5nYi5FbWFpbC5nZW5lcmFsLm5hbWUgfHwgJ25nYi10ZW1wbGF0ZScpO1xyXG4gICAgICAgIGFuY2hvci5ocmVmID0gaHJlZjtcclxuICAgICAgICBhbmNob3IudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICAgICAgYW5jaG9yLmRvd25sb2FkID0gYCR7ZmlsZU5hbWV9LiR7dHlwZX1gO1xyXG4gICAgICAgIGFuY2hvci5jbGljaygpO1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaHJlZik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW1wb3J0RmlsZSgpIHtcclxuICAgIHRoaXMudXNlckludGVyZmFjZVNlcnZpY2VcclxuICAgICAgLmltcG9ydERpYWxvZyQoKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoZW1haWxPckVycm9yID0+IHtcclxuICAgICAgICAgIGlmIChlbWFpbE9yRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlbWFpbE9yRXJyb3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZGVmZXJPZihlbWFpbE9yRXJyb3IpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT5cclxuICAgICAgICAgIHRoaXMubWlkZGxld2FyZXMuY2F0Y2hFcnJvcihlcnJvcikucGlwZShcclxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLm5vdGlmeShlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIGZpbHRlcihlbWFpbCA9PiAhIWVtYWlsKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZW1haWwgPT4ge1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShlbWFpbCk7XHJcbiAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoJ0VtYWlsIGhhcyBiZWVuIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBnZXRCYWNrZ3JvdW5kSW1hZ2UoKTogU2FmZVN0eWxlIHtcclxuICAvLyAgIGNvbnN0IHtcclxuICAvLyAgICAgYmFja2dyb3VuZDogeyB1cmwgfVxyXG4gIC8vICAgfSA9IHRoaXMuZW1haWwuZ2VuZXJhbDtcclxuICAvLyAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodXJsICYmIGB1cmwoJHt1cmx9KWApO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0QnVpbGRlckNvbnRhaW5lclN0eWxlcygpIHtcclxuICAvLyAgIGNvbnN0IHsgYmFja2dyb3VuZCwgcGFkZGluZywgZGlyZWN0aW9uIH0gPSB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuRW1haWwuZ2VuZXJhbDtcclxuXHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICBkaXJlY3Rpb24sXHJcbiAgLy8gICAgIGJhY2tncm91bmRSZXBlYXQ6IGJhY2tncm91bmQucmVwZWF0LFxyXG4gIC8vICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmQuY29sb3IsXHJcbiAgLy8gICAgIGJhY2tncm91bmRTaXplOiBjcmVhdGVXaWR0aEhlaWdodChiYWNrZ3JvdW5kLnNpemUpLFxyXG4gIC8vICAgICBiYWNrZ3JvdW5kUG9zaXRpb246ICd0b3AgY2VudGVyJyxcclxuICAvLyAgICAgLi4uY3JlYXRlUGFkZGluZyhwYWRkaW5nKVxyXG4gIC8vICAgfTtcclxuICAvLyB9XHJcblxyXG4gIGNyZWF0ZUFycmF5RnJvbVN0cnVjdHVyZUNvbHVtbnMoeyBjb2x1bW5zIH0pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gbmV3IEFycmF5KGNvbHVtbnMpLmZpbGwoJycpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUHJldmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLmVtYWlsT2JqZWN0U3RvcmVcclxuICAgICAgLmNyZWF0ZUhUTUxUZW1wbGF0ZSQoKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBleGhhdXN0TWFwKCgpID0+IHRoaXMubWlkZGxld2FyZXMudG9nZ2xlUHJldmlldyghdGhpcy5wcmV2aWV3VGVtcGxhdGUpKSxcclxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+XHJcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVzLmNhdGNoRXJyb3IoZXJyb3IpLnBpcGUoXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdGFrZSgxKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUobmV4dFN0YXRlID0+IHtcclxuICAgICAgICB0aGlzLnByZXZpZXdUZW1wbGF0ZSA9IG5leHRTdGF0ZTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgZnJvbUV2ZW50PEJlZm9yZVVubG9hZEV2ZW50Pih3aW5kb3csICdiZWZvcmV1bmxvYWQnKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmVtYWlsT2JqZWN0U3RvcmUuY3VycmVudEVtYWlsSGFzQ2hhbmdlcyQpLFxyXG4gICAgICAgIGZpbHRlcigoW18sIGVtYWlsSXNEaXJ0eV0pID0+IGVtYWlsSXNEaXJ0eSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChbZXZlbnRdKSA9PiB0aGlzLm1pZGRsZXdhcmVzLnByZXZlbnRXaW5kb3dFeGl0KGV2ZW50KSksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldiA9PiB7XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldi5yZXR1cm5WYWx1ZSA9ICcnO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuZW1haWxBc09ic2VydmFibGUkLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoZW1haWwgPT4ge1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZD8uKCk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2U/LihlbWFpbCk7XHJcbiAgICAgIHRoaXMuZW1haWxDaGFuZ2UubmV4dChlbWFpbCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kb2MgJiYgZW1haWw/LmN1c3RvbUZvbnRzKSB7XHJcbiAgICAgICAgZW1haWwuY3VzdG9tRm9udHMuZm9yRWFjaChmb250ID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gQXJyYXkuZnJvbSh0aGlzLmluY2x1ZGVkRm9udHMpLmZpbmQobGluayA9PiBsaW5rLmhyZWYgPT09IGZvbnQudXJsKTtcclxuICAgICAgICAgIGlmICghZXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluayA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgICAgICAgICAgbGluay5ocmVmID0gZm9udC51cmw7XHJcbiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xyXG4gICAgICAgICAgICB0aGlzLmluY2x1ZGVkRm9udHMuYWRkKGxpbmspO1xyXG4gICAgICAgICAgICB0aGlzLmRvYy5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLmVtYWlsKSB7XHJcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShjaGFuZ2VzLmVtYWlsLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIHNldEVtYWlsKGVtYWlsOiBQQkVtYWlsKSB7XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuc2V0RW1haWwoZW1haWwpO1xyXG4gIC8vICAgICB0aGlzLnByZXZpZXdUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gIC8vICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIC8vICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAvLyAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5ub3RpZnkoZXJyb3IubWVzc2FnZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIC8vIFJlc2V0IHRoZSBidWlsZGVyIHN0YXRlXHJcbiAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLnJlc2V0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZG9jKSB7XHJcbiAgICAgIHRoaXMuaW5jbHVkZWRGb250cy5mb3JFYWNoKGZvbnQgPT4gZm9udC5yZW1vdmUoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmluY2x1ZGVkRm9udHMuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19