@sumaris-net/ngx-components 18.16.7 → 18.17.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 (57) hide show
  1. package/doc/changelog.md +11 -2
  2. package/esm2022/public_api.mjs +5 -4
  3. package/esm2022/src/app/admin/users/person.filter.mjs +76 -0
  4. package/esm2022/src/app/admin/users/person.service.mjs +197 -0
  5. package/esm2022/src/app/admin/users/person.validator.mjs +72 -0
  6. package/esm2022/src/app/admin/users/users.mjs +4 -4
  7. package/esm2022/src/app/core/about/about.modal.mjs +5 -5
  8. package/esm2022/src/app/core/home/home.mjs +3 -3
  9. package/esm2022/src/app/core/services/account.service.mjs +8 -2
  10. package/esm2022/src/app/core/services/network.service.mjs +7 -4
  11. package/esm2022/src/app/core/services/validator/account.validator.mjs +2 -2
  12. package/esm2022/src/app/shared/validator/validators.mjs +3 -3
  13. package/esm2022/src/app/social/feed/feed.component.mjs +180 -33
  14. package/esm2022/src/app/social/feed/feed.model.mjs +1 -1
  15. package/esm2022/src/app/social/feed/feed.module.mjs +5 -4
  16. package/esm2022/src/app/social/feed/feed.page.mjs +67 -0
  17. package/esm2022/src/app/social/feed/feed.service.mjs +64 -13
  18. package/esm2022/src/app/social/feed/testing/feed.testing.mjs +3 -3
  19. package/esm2022/src/app/social/message/message.form.mjs +8 -5
  20. package/esm2022/src/app/social/message/message.modal.mjs +10 -4
  21. package/esm2022/src/app/social/message/message.model.mjs +2 -2
  22. package/esm2022/src/app/social/message/message.module.mjs +5 -4
  23. package/esm2022/src/app/social/message/message.service.mjs +81 -1
  24. package/esm2022/src/app/social/social.errors.mjs +2 -1
  25. package/esm2022/src/app/social/social.testing.module.mjs +7 -1
  26. package/esm2022/src/environments/environment.mjs +5 -2
  27. package/fesm2022/sumaris-net.ngx-components.mjs +1029 -671
  28. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/public_api.d.ts +4 -3
  31. package/src/app/admin/{services/filter → users}/person.filter.d.ts +4 -4
  32. package/src/app/admin/{services → users}/person.service.d.ts +2 -1
  33. package/src/app/admin/{services/validator → users}/person.validator.d.ts +4 -4
  34. package/src/app/admin/users/users.d.ts +2 -2
  35. package/src/app/core/services/account.service.d.ts +2 -0
  36. package/src/app/core/services/network.service.d.ts +3 -2
  37. package/src/app/core/services/validator/account.validator.d.ts +1 -1
  38. package/src/app/social/feed/feed.component.d.ts +49 -13
  39. package/src/app/social/feed/feed.model.d.ts +3 -2
  40. package/src/app/social/feed/feed.module.d.ts +7 -6
  41. package/src/app/social/feed/feed.page.d.ts +24 -0
  42. package/src/app/social/feed/feed.service.d.ts +37 -24
  43. package/src/app/social/message/message.form.d.ts +3 -3
  44. package/src/app/social/message/message.modal.d.ts +6 -2
  45. package/src/app/social/message/message.model.d.ts +1 -1
  46. package/src/app/social/message/message.module.d.ts +2 -1
  47. package/src/app/social/message/message.service.d.ts +12 -0
  48. package/src/app/social/social.errors.d.ts +1 -0
  49. package/src/assets/i18n/en-US.json +7 -3
  50. package/src/assets/i18n/en.json +5 -2
  51. package/src/assets/i18n/fr.json +5 -2
  52. package/src/assets/manifest.json +1 -1
  53. package/src/theme/_ngx-components.forms.scss +1 -0
  54. package/src/theme/_ngx-components.table.scss +1 -0
  55. package/esm2022/src/app/admin/services/filter/person.filter.mjs +0 -76
  56. package/esm2022/src/app/admin/services/person.service.mjs +0 -184
  57. package/esm2022/src/app/admin/services/validator/person.validator.mjs +0 -72
@@ -0,0 +1,67 @@
1
+ import { ChangeDetectionStrategy, Component, Inject, Input, Optional } from '@angular/core';
2
+ import { ENVIRONMENT } from '../../../environments/environment.class';
3
+ import { APP_FEED_SERVICE } from './feed.service';
4
+ import { firstNotNilPromise } from '../../shared/observables';
5
+ import { BehaviorSubject, Subject } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../core/services/local-settings.service";
8
+ import * as i2 from "@ionic/angular";
9
+ import * as i3 from "./feed.component";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@ngx-translate/core";
12
+ import * as i6 from "../../../environments/environment.class";
13
+ export class FeedPage {
14
+ settings;
15
+ cd;
16
+ feedService;
17
+ environment;
18
+ destroySubject = new Subject();
19
+ loadingSubject = new BehaviorSubject(true);
20
+ debug;
21
+ title = 'SOCIAL.FEED.NEWS';
22
+ feedUrls;
23
+ feedItemId;
24
+ constructor(settings, cd, feedService, environment) {
25
+ this.settings = settings;
26
+ this.cd = cd;
27
+ this.feedService = feedService;
28
+ this.environment = environment;
29
+ this.debug = !environment?.production;
30
+ }
31
+ async ngOnInit() {
32
+ this.feedService.ready();
33
+ this.feedUrls = this.feedUrls ?? (await firstNotNilPromise(this.feedService.feedUrls$, { stop: this.destroySubject }));
34
+ console.debug('[feed-page] Feed URLs:', this.feedUrls);
35
+ this.loadingSubject.next(false);
36
+ this.cd.markForCheck();
37
+ }
38
+ ngOnDestroy() {
39
+ this.destroySubject.next();
40
+ this.destroySubject.complete();
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeedPage, deps: [{ token: i1.LocalSettingsService }, { token: i0.ChangeDetectorRef }, { token: APP_FEED_SERVICE, optional: true }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
43
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FeedPage, selector: "app-feed-page", inputs: { debug: "debug", title: "title", feedUrls: "feedUrls", feedItemId: "feedItemId" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>{{ title | translate }}</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <div class=\"ion-padding\">\n @if (loadingSubject | async) {\n <ion-spinner></ion-spinner>\n } @else {\n <app-feed [showHeader]=\"false\"\n [showReadMoreButton]=\"false\"\n [urls]=\"feedUrls\"\n cardColor=\"light\"\n [debug]=\"debug\"\n ></app-feed>\n }\n </div>\n</ion-content>\n", dependencies: [{ kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonBackButton, selector: "ion-back-button" }, { kind: "component", type: i3.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeedPage, decorators: [{
46
+ type: Component,
47
+ args: [{ selector: 'app-feed-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>{{ title | translate }}</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <div class=\"ion-padding\">\n @if (loadingSubject | async) {\n <ion-spinner></ion-spinner>\n } @else {\n <app-feed [showHeader]=\"false\"\n [showReadMoreButton]=\"false\"\n [urls]=\"feedUrls\"\n cardColor=\"light\"\n [debug]=\"debug\"\n ></app-feed>\n }\n </div>\n</ion-content>\n" }]
48
+ }], ctorParameters: () => [{ type: i1.LocalSettingsService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
49
+ type: Optional
50
+ }, {
51
+ type: Inject,
52
+ args: [APP_FEED_SERVICE]
53
+ }] }, { type: i6.Environment, decorators: [{
54
+ type: Optional
55
+ }, {
56
+ type: Inject,
57
+ args: [ENVIRONMENT]
58
+ }] }], propDecorators: { debug: [{
59
+ type: Input
60
+ }], title: [{
61
+ type: Input
62
+ }], feedUrls: [{
63
+ type: Input
64
+ }], feedItemId: [{
65
+ type: Input
66
+ }] } });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC5wYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC9mZWVkLnBhZ2UudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9mZWVkL2ZlZWQucGFnZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFnQixNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQU9oRCxNQUFNLE9BQU8sUUFBUTtJQVVQO0lBQ0E7SUFDbUM7SUFDSjtJQVpqQyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNyQyxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsS0FBSyxDQUFVO0lBRWYsS0FBSyxHQUFHLGtCQUFrQixDQUFDO0lBQzNCLFFBQVEsQ0FBVztJQUNuQixVQUFVLENBQVM7SUFFNUIsWUFDWSxRQUE4QixFQUM5QixFQUFxQixFQUNjLFdBQTRCLEVBQ2hDLFdBQXdCO1FBSHZELGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQzlCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ2MsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBRWpFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZILE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQzt3R0E3QlUsUUFBUSx1RkFZRyxnQkFBZ0IsNkJBQ2hCLFdBQVc7NEZBYnRCLFFBQVEsaUpDYnJCLDJtQkF3QkE7OzRGRFhhLFFBQVE7a0JBTHBCLFNBQVM7K0JBQ0UsZUFBZSxtQkFFUix1QkFBdUIsQ0FBQyxNQUFNOzswQkFjNUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUNuQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVc7eUNBVnhCLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IEFQUF9GRUVEX1NFUlZJQ0UsIElGZWVkU2VydmljZSB9IGZyb20gJy4vZmVlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEpzb25GZWVkIH0gZnJvbSAnLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZlZWQtcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mZWVkLnBhZ2UuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGZWVkUGFnZTxUIGV4dGVuZHMgSnNvbkZlZWQgPSBKc29uRmVlZD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBkZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHRpdGxlID0gJ1NPQ0lBTC5GRUVELk5FV1MnO1xuICBASW5wdXQoKSBmZWVkVXJsczogc3RyaW5nW107XG4gIEBJbnB1dCgpIGZlZWRJdGVtSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfRkVFRF9TRVJWSUNFKSBwdWJsaWMgZmVlZFNlcnZpY2U6IElGZWVkU2VydmljZTxUPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcml2YXRlIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50Py5wcm9kdWN0aW9uO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mZWVkU2VydmljZS5yZWFkeSgpO1xuICAgIHRoaXMuZmVlZFVybHMgPSB0aGlzLmZlZWRVcmxzID8/IChhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5mZWVkU2VydmljZS5mZWVkVXJscyQsIHsgc3RvcDogdGhpcy5kZXN0cm95U3ViamVjdCB9KSk7XG4gICAgY29uc29sZS5kZWJ1ZygnW2ZlZWQtcGFnZV0gRmVlZCBVUkxzOicsIHRoaXMuZmVlZFVybHMpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveVN1YmplY3QuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIj5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uPjwvaW9uLWJhY2stYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG5cbiAgICA8aW9uLXRpdGxlPnt7IHRpdGxlIHwgdHJhbnNsYXRlIH19PC9pb24tdGl0bGU+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudD5cbiAgPGRpdiBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgQGlmIChsb2FkaW5nU3ViamVjdCB8IGFzeW5jKSB7XG4gICAgICA8aW9uLXNwaW5uZXI+PC9pb24tc3Bpbm5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxhcHAtZmVlZCBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dSZWFkTW9yZUJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3VybHNdPVwiZmVlZFVybHNcIlxuICAgICAgICAgICAgICAgIGNhcmRDb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGVidWddPVwiZGVidWdcIlxuICAgICAgPjwvYXBwLWZlZWQ+XG4gICAgfVxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
@@ -1,13 +1,18 @@
1
- import { from, switchMap } from 'rxjs';
1
+ import { from, of, switchMap } from 'rxjs';
2
2
  import { JsonFeedUtils } from './feed.model';
3
3
  import { Inject, inject, Injectable, InjectionToken, Optional } from '@angular/core';
4
- import { firstArrayValue, isEmptyArray, isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';
4
+ import { firstArrayValue, isEmptyArray, isNilOrNaN, isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';
5
5
  import { filter, map, mergeMap } from 'rxjs/operators';
6
6
  import { StartableService } from '../../shared/services/startable-service.class';
7
7
  import { NetworkService } from '../../core/services/network.service';
8
8
  import { RxState } from '@rx-angular/state';
9
9
  import { ENVIRONMENT } from '../../../environments/environment.class';
10
10
  import { UrlUtils } from '../../shared/file/url.utils';
11
+ import { Message } from '../message/message.model';
12
+ import { PersonService } from '../../admin/users/person.service';
13
+ import { MessageModal } from '../message/message.modal';
14
+ import { ModalController } from '@ionic/angular';
15
+ import { MessageService } from '../message/message.service';
11
16
  import * as i0 from "@angular/core";
12
17
  import * as i1 from "../../core/services/local-settings.service";
13
18
  import * as i2 from "../../../environments/environment.class";
@@ -18,6 +23,9 @@ export class FeedService extends StartableService {
18
23
  _logPrefix = '[feed-service] ';
19
24
  _state = new RxState();
20
25
  network = inject(NetworkService);
26
+ modalCtrl = inject(ModalController);
27
+ messageService = inject(MessageService);
28
+ personService = inject(PersonService);
21
29
  locale$ = this._state.select('locale');
22
30
  feedUrls$ = this._state.select('feedUrls');
23
31
  get feedUrls() {
@@ -38,7 +46,7 @@ export class FeedService extends StartableService {
38
46
  console.debug(`${this._logPrefix}created`);
39
47
  }
40
48
  async ngOnStart() {
41
- await this.settings.ready();
49
+ await Promise.all([this.settings.ready(), this.network.ready()]);
42
50
  return {
43
51
  locale: this.settings.locale,
44
52
  };
@@ -48,9 +56,10 @@ export class FeedService extends StartableService {
48
56
  return from(this.start()).pipe(switchMap(() => this.watchAll(opts)));
49
57
  }
50
58
  if (isNotEmptyArray(opts?.urls)) {
51
- return this.locale$.pipe(mergeMap((locale) => this.loadAll(opts.urls, { locale, ...opts })));
59
+ const locale$ = opts.locale ? of(opts.locale) : this.locale$;
60
+ return locale$.pipe(mergeMap((locale) => this.loadAll({ locale, ...opts })));
52
61
  }
53
- return this.feedUrls$.pipe(filter(isNotEmptyArray), mergeMap((urls) => this.loadAll(urls, opts)));
62
+ return this.feedUrls$.pipe(filter(isNotEmptyArray), mergeMap((urls) => this.loadAll({ ...opts, urls })));
54
63
  }
55
64
  getHomeUrl(feed) {
56
65
  const feedUrl = feed?.feed_url ?? firstArrayValue(this.feedUrls);
@@ -63,12 +72,14 @@ export class FeedService extends StartableService {
63
72
  return feed.tag_template?.replace('{tag}', tag) ?? baseUrl + '/tag/' + tag;
64
73
  }
65
74
  async load(url, opts) {
66
- const { data } = await this.loadAll([url], opts);
67
- return data?.[0];
75
+ if (!url)
76
+ throw new Error('Missing url argument');
77
+ const { data } = await this.loadAll({ ...opts, urls: [url] });
78
+ return firstArrayValue(data);
68
79
  }
69
- async loadAll(urls, opts) {
80
+ async loadAll(opts) {
70
81
  await this.ready();
71
- urls = urls ?? this.feedUrls;
82
+ const urls = opts?.urls ?? this.feedUrls;
72
83
  opts = {
73
84
  maxAgeInMonths: opts?.maxAgeInMonths ?? this.environment.feed?.maxAgeInMonths,
74
85
  maxContentLength: opts?.maxContentLength ?? this.environment.feed?.maxContentLength,
@@ -79,7 +90,7 @@ export class FeedService extends StartableService {
79
90
  const feeds = await Promise.all((urls || []).map(async (url) => {
80
91
  try {
81
92
  // Get JSON
82
- const json = await this.network.get(url);
93
+ const json = await this.network.get(url, { nocache: opts?.cache });
83
94
  console.debug(`${this._logPrefix}Loaded JSON from ${url}`, json);
84
95
  // Resolve feed
85
96
  return await this.resolveFeed(json, url, opts);
@@ -94,13 +105,53 @@ export class FeedService extends StartableService {
94
105
  return Promise.resolve([]);
95
106
  }
96
107
  }));
97
- const data = feeds.flat();
108
+ const data = feeds.filter(isNotEmptyArray).flat();
98
109
  // Close opened resources
99
110
  if (opts.depth === 0) {
100
111
  this.onAfterLoadAll();
101
112
  }
102
113
  return { data, total: data.length };
103
114
  }
115
+ async openEditModal(event, feedItem, opts) {
116
+ const messageId = +feedItem.id;
117
+ if (isNilOrNaN(messageId))
118
+ throw new Error(`Cannot load message - invalid id: ${feedItem.id}`);
119
+ // Fetch the original message
120
+ const message = await this.messageService.load(messageId);
121
+ // Count recipients
122
+ let recipientFilterCount;
123
+ if (message?.recipientFilter) {
124
+ recipientFilterCount = await this.personService.countAll(message?.recipientFilter);
125
+ }
126
+ const hasTopModal = !!(await this.modalCtrl.getTop());
127
+ const modal = await this.modalCtrl.create({
128
+ component: MessageModal,
129
+ componentProps: {
130
+ title: 'SOCIAL.FEED.EDIT_TITLE',
131
+ suggestFn: (value, filter, sortBy, sortDirection, opts) => this.personService.suggest(value, filter, sortBy, sortDirection, opts),
132
+ canSelectType: false,
133
+ canRecipientFilter: false,
134
+ recipientFilterCount,
135
+ data: message,
136
+ debug: true,
137
+ },
138
+ cssClass: hasTopModal && 'stack-modal',
139
+ });
140
+ // Open the modal
141
+ await modal.present();
142
+ // On dismiss
143
+ const { data } = await modal.onDidDismiss();
144
+ if (!data || !(data instanceof Message))
145
+ return true; // CANCELLED
146
+ return await this.messageService.send(data, opts);
147
+ }
148
+ async deleteItem(feedItem) {
149
+ const messageId = +feedItem.id;
150
+ if (isNilOrNaN(messageId))
151
+ throw new Error(`Cannot delete message - invalid id: ${feedItem.id}`);
152
+ return await this.messageService.delete(messageId);
153
+ }
154
+ /* -- protected functions -- */
104
155
  async resolveFeed(json, url, opts) {
105
156
  // Check json is JsonFeed compatible
106
157
  if (JsonFeedUtils.isJsonFeed(json)) {
@@ -113,7 +164,7 @@ export class FeedService extends StartableService {
113
164
  return isNotEmptyArray(feed?.items) ? [feed] : [];
114
165
  }
115
166
  // not resolved (unknown format)
116
- return undefined;
167
+ return [];
117
168
  }
118
169
  async resolveFeedItems(json, opts) {
119
170
  if (!json)
@@ -156,4 +207,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
156
207
  type: Inject,
157
208
  args: [ENVIRONMENT]
158
209
  }] }] });
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC9mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFZLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0FBRXZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFvQixZQUFZLENBQUMsQ0FBQztBQWdCcEYsTUFBTSxPQUFPLFdBQXdDLFNBQVEsZ0JBQW1CO0lBaUJwRTtJQUNtQztJQWpCbkMsVUFBVSxHQUFHLGlCQUFpQixDQUFDO0lBQy9CLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBSyxDQUFDO0lBQzFCLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFM0MsT0FB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LElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxhQUFhO1lBQ2IsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFM0UsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSztnQkFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZELE9BQU8sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDcEUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTthQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7d0dBMU1VLFdBQVcsc0RBa0JBLFdBQVc7NEdBbEJ0QixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFtQk4sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IEpzb25GZWVkLCBKc29uRmVlZFV0aWxzIH0gZnJvbSAnLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IEluamVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZmlyc3RBcnJheVZhbHVlLCBpc0VtcHR5QXJyYXksIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBVcmxVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL3VybC51dGlscyc7XG5cbmV4cG9ydCBjb25zdCBBUFBfRkVFRF9TRVJWSUNFID0gbmV3IEluamVjdGlvblRva2VuPElGZWVkU2VydmljZTxhbnk+PignRmVlU2VydmljZScpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGZWVkU2VydmljZTxUIGV4dGVuZHMgSnNvbkZlZWQgPSBKc29uRmVlZD4ge1xuICB3YXRjaEFsbChvcHRzPzogeyB1cmxzPzogc3RyaW5nW107IG1heEFnZUluTW9udGhzPzogbnVtYmVyOyBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyIH0pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+O1xuXG4gIGdldEhvbWVVcmwoZmVlZD86IFQpOiBzdHJpbmc7XG5cbiAgZ2V0VGFnVXJsKGZlZWQ6IFQsIHRhZzogc3RyaW5nKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRTZXJ2aWNlU3RhdGUge1xuICBsb2NhbGU6IHN0cmluZztcbiAgZmVlZFVybHM/OiBzdHJpbmdbXTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZlZWRTZXJ2aWNlPFMgZXh0ZW5kcyBGZWVkU2VydmljZVN0YXRlPiBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2U8Uz4gaW1wbGVtZW50cyBJRmVlZFNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgX2xvZ1ByZWZpeCA9ICdbZmVlZC1zZXJ2aWNlXSAnO1xuICBwcm90ZWN0ZWQgX3N0YXRlID0gbmV3IFJ4U3RhdGU8Uz4oKTtcbiAgcHJvdGVjdGVkIG5ldHdvcmsgPSBpbmplY3QoTmV0d29ya1NlcnZpY2UpO1xuXG4gIGxvY2FsZSQgPSB0aGlzLl9zdGF0ZS5zZWxlY3QoJ2xvY2FsZScpO1xuICBmZWVkVXJscyQgPSB0aGlzLl9zdGF0ZS5zZWxlY3QoJ2ZlZWRVcmxzJyk7XG5cbiAgZ2V0IGZlZWRVcmxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0KCdmZWVkVXJscycpO1xuICB9XG5cbiAgc2V0IGZlZWRVcmxzKHVybHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc3RhdGUuc2V0KCdmZWVkVXJscycsICgpID0+IHVybHMpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihzZXR0aW5ncyk7XG5cbiAgICB0aGlzLl9zdGF0ZS5jb25uZWN0KCdsb2NhbGUnLCB0aGlzLnNldHRpbmdzLmxvY2FsZSQpO1xuXG4gICAgdGhpcy5fc3RhdGUuY29ubmVjdChcbiAgICAgICdmZWVkVXJscycsXG4gICAgICB0aGlzLmxvY2FsZSQucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsT3JCbGFuayksXG4gICAgICAgIG1hcCgobG9jYWxlKSA9PiAobG9jYWxlICYmIGVudmlyb25tZW50LmZlZWQ/Lmpzb25GZWVkPy5bbG9jYWxlXSkgPz8gW10pXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIERFQlVHXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fWNyZWF0ZWRgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxTPiB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpO1xuICAgIHJldHVybiA8Uz57XG4gICAgICBsb2NhbGU6IHRoaXMuc2V0dGluZ3MubG9jYWxlLFxuICAgIH07XG4gIH1cblxuICB3YXRjaEFsbChvcHRzPzogeyB1cmxzPzogc3RyaW5nW107IG1heEFnZUluTW9udGhzPzogbnVtYmVyOyBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyIH0pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8SnNvbkZlZWQ+PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuc3RhcnQoKSkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy53YXRjaEFsbChvcHRzKSkpO1xuICAgIH1cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KG9wdHM/LnVybHMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbGUkLnBpcGUobWVyZ2VNYXAoKGxvY2FsZSkgPT4gdGhpcy5sb2FkQWxsKG9wdHMudXJscywgeyBsb2NhbGUsIC4uLm9wdHMgfSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmVlZFVybHMkLnBpcGUoXG4gICAgICBmaWx0ZXIoaXNOb3RFbXB0eUFycmF5KSxcbiAgICAgIG1lcmdlTWFwKCh1cmxzKSA9PiB0aGlzLmxvYWRBbGwodXJscywgb3B0cykpXG4gICAgKTtcbiAgfVxuXG4gIGdldEhvbWVVcmwoZmVlZD86IEpzb25GZWVkKSB7XG4gICAgY29uc3QgZmVlZFVybCA9IGZlZWQ/LmZlZWRfdXJsID8/IGZpcnN0QXJyYXlWYWx1ZSh0aGlzLmZlZWRVcmxzKTtcbiAgICByZXR1cm4gZmVlZFVybCA/IFVybFV0aWxzLmdldFJvb3RVcmwoZmVlZFVybCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRUYWdVcmwoZmVlZDogSnNvbkZlZWQsIHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWZlZWQgfHwgIXRhZykgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAnZmVlZCcgb3IgJ3RhZycgYXJndW1lbnRcIik7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0SG9tZVVybChmZWVkKTtcbiAgICByZXR1cm4gZmVlZC50YWdfdGVtcGxhdGU/LnJlcGxhY2UoJ3t0YWd9JywgdGFnKSA/PyBiYXNlVXJsICsgJy90YWcvJyArIHRhZztcbiAgfVxuXG4gIGFzeW5jIGxvYWQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIGxvY2FsZT86IHN0cmluZztcbiAgICAgIG1heEFnZUluTW9udGhzPzogbnVtYmVyO1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBkZXB0aD86IG51bWJlcjtcbiAgICB9XG4gICk6IFByb21pc2U8SnNvbkZlZWQ+IHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMubG9hZEFsbChbdXJsXSwgb3B0cyk7XG4gICAgcmV0dXJuIGRhdGE/LlswXTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRBbGwoXG4gICAgdXJscz86IHN0cmluZ1tdLFxuICAgIG9wdHM/OiB7XG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjtcbiAgICAgIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gICAgICAvLyBJbnRlcm5hbCBvcHRpb25zIChmb3IgcmVjdXJzaXZlIGNhbGxzKVxuICAgICAgZGVwdGg/OiBudW1iZXI7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfVxuICApOiBQcm9taXNlPExvYWRSZXN1bHQ8SnNvbkZlZWQ+PiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIHVybHMgPSB1cmxzID8/IHRoaXMuZmVlZFVybHM7XG4gICAgb3B0cyA9IHtcbiAgICAgIG1heEFnZUluTW9udGhzOiBvcHRzPy5tYXhBZ2VJbk1vbnRocyA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heEFnZUluTW9udGhzLFxuICAgICAgbWF4Q29udGVudExlbmd0aDogb3B0cz8ubWF4Q29udGVudExlbmd0aCA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heENvbnRlbnRMZW5ndGgsXG4gICAgICBsb2NhbGU6IHRoaXMuc2V0dGluZ3MubG9jYWxlLFxuICAgICAgZGVwdGg6IDAsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG4gICAgY29uc3QgZmVlZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh1cmxzIHx8IFtdKS5tYXAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBKU09OXG4gICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMubmV0d29yay5nZXQodXJsKTtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1Mb2FkZWQgSlNPTiBmcm9tICR7dXJsfWAsIGpzb24pO1xuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBmZWVkXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzb2x2ZUZlZWQoanNvbiwgdXJsLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkcyBhdCAke3VybH0uIDQwNCAoTm90IGZvdW5kKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gRXJyb3Igd2hpbGUgZmV0Y2hpbmcgZmVlZHMgYXQgJHt1cmx9YCwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGEgPSBmZWVkcy5mbGF0KCk7XG5cbiAgICAvLyBDbG9zZSBvcGVuZWQgcmVzb3VyY2VzXG4gICAgaWYgKG9wdHMuZGVwdGggPT09IDApIHtcbiAgICAgIHRoaXMub25BZnRlckxvYWRBbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBkYXRhLCB0b3RhbDogZGF0YS5sZW5ndGggfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXNvbHZlRmVlZChcbiAgICBqc29uOiBhbnksXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIGxvY2FsZT86IHN0cmluZztcbiAgICAgIG1heEFnZUluTW9udGhzPzogbnVtYmVyO1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBkZXB0aD86IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9XG4gICk6IFByb21pc2U8SnNvbkZlZWRbXT4ge1xuICAgIC8vIENoZWNrIGpzb24gaXMgSnNvbkZlZWQgY29tcGF0aWJsZVxuICAgIGlmIChKc29uRmVlZFV0aWxzLmlzSnNvbkZlZWQoanNvbikpIHtcbiAgICAgIC8vIE1pZ3JhdGUgZnJvbSBvbGQgdmVyc2lvbnNcbiAgICAgIGxldCBmZWVkID0gSnNvbkZlZWRVdGlscy5taWdyYXRlRmVlZChqc29uKTtcblxuICAgICAgLy8gUmVzb2x2ZSBpdGVtcyAoZS5nLiB1c2luZyBmZWVkLm5leHRfdXJsKVxuICAgICAgZmVlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZUZlZWRJdGVtcyhmZWVkLCB7IC4uLm9wdHMsIGRlcHRoOiBvcHRzPy5kZXB0aCA/PyAwIH0pO1xuXG4gICAgICAvLyBUcnVuY2F0ZSBodG1sXG4gICAgICBKc29uRmVlZFV0aWxzLnRydW5jYXRlRmVlZEl0ZW1zSHRtbChmZWVkLCBvcHRzKTtcblxuICAgICAgcmV0dXJuIGlzTm90RW1wdHlBcnJheShmZWVkPy5pdGVtcykgPyBbZmVlZF0gOiBbXTtcbiAgICB9XG5cbiAgICAvLyBub3QgcmVzb2x2ZWQgKHVua25vd24gZm9ybWF0KVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUZlZWRJdGVtcyhcbiAgICBqc29uOiBKc29uRmVlZCxcbiAgICBvcHRzPzoge1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIGRlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxKc29uRmVlZD4ge1xuICAgIGlmICghanNvbikgcmV0dXJuIGpzb247XG5cbiAgICAvLyBMb2FkIGl0ZW1zXG4gICAgaWYgKGlzRW1wdHlBcnJheShqc29uLml0ZW1zKSAmJiBpc05vdE5pbE9yQmxhbmsoanNvbi5uZXh0X3VybCkpIHtcbiAgICAgIGNvbnN0IGRlcHRoID0gb3B0cz8uZGVwdGggPz8gMDtcbiAgICAgIGlmIChkZXB0aCA+PSAzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9TWF4IGRlcHRoIHJlYWNoZWQgKCR7ZGVwdGh9KSBmb3IgJHtqc29uLmZlZWRfdXJsfWApO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBpdGVtc1xuICAgICAgY29uc3QgZmVlZCA9IGF3YWl0IHRoaXMubG9hZChqc29uLm5leHRfdXJsLCB7IC4uLm9wdHMsIGRlcHRoOiBkZXB0aCArIDEgfSk7XG5cbiAgICAgIGlmIChpc0VtcHR5QXJyYXkoZmVlZD8uaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSB3aXRoIHRoZSBpbnB1dCBqc29uXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5qc29uLFxuICAgICAgICB0aXRsZToganNvbi50aXRsZSA/PyBmZWVkLnRpdGxlLFxuICAgICAgICBob21lX3BhZ2VfdXJsOiBqc29uLmhvbWVfcGFnZV91cmwgPz8gZmVlZC5ob21lX3BhZ2VfdXJsLFxuICAgICAgICBhdXRob3JzOiBpc05vdEVtcHR5QXJyYXkoanNvbi5hdXRob3JzKSA/IGpzb24uYXV0aG9ycyA6IGZlZWQuYXV0aG9ycyxcbiAgICAgICAgaXRlbXM6IGZlZWQuaXRlbXMsXG4gICAgICAgIHRhZ190ZW1wbGF0ZToganNvbi50YWdfdGVtcGxhdGUgPz8gZmVlZC50YWdfdGVtcGxhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWZ0ZXJMb2FkQWxsKCkge1xuICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUZlZWRzIGxvYWRlZGApO1xuICB9XG59XG4iXX0=
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC9mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBMEIsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckgsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBdUIsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0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QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTthQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7d0dBeFBVLFdBQVcsc0RBcUJBLFdBQVc7NEdBckJ0QixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFzQk4sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9hZFJlc3VsdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBKc29uRmVlZCwgSnNvbkZlZWRJdGVtLCBKc29uRmVlZFV0aWxzIH0gZnJvbSAnLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IEluamVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZmlyc3RBcnJheVZhbHVlLCBpc0VtcHR5QXJyYXksIGlzTmlsT3JOYU4sIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBVcmxVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL3VybC51dGlscyc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi4vbWVzc2FnZS9tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IFBlcnNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hZG1pbi91c2Vycy9wZXJzb24uc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdlTW9kYWwsIE1lc3NhZ2VNb2RhbE9wdGlvbnMgfSBmcm9tICcuLi9tZXNzYWdlL21lc3NhZ2UubW9kYWwnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlL21lc3NhZ2Uuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBBUFBfRkVFRF9TRVJWSUNFID0gbmV3IEluamVjdGlvblRva2VuPElGZWVkU2VydmljZTxhbnk+PignRmVlU2VydmljZScpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRMb2FkT3B0aW9ucyB7XG4gIGxvY2FsZT86IHN0cmluZztcbiAgbWF4QWdlSW5Nb250aHM/OiBudW1iZXI7XG4gIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gIGNhY2hlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZWVkc0xvYWRPcHRpb25zIGV4dGVuZHMgRmVlZExvYWRPcHRpb25zIHtcbiAgdXJscz86IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBGZWVkc1dhdGNoT3B0aW9ucyBleHRlbmRzIEZlZWRzTG9hZE9wdGlvbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBJRmVlZFNlcnZpY2U8VCBleHRlbmRzIEpzb25GZWVkID0gSnNvbkZlZWQ+IHtcbiAgcmVhZHkoKTogUHJvbWlzZTxGZWVkU2VydmljZVN0YXRlPjtcblxuICBsb2FkKHVybDogc3RyaW5nLCBvcHRzPzogRmVlZExvYWRPcHRpb25zKTogUHJvbWlzZTxUPjtcblxuICBsb2FkQWxsKG9wdHM/OiBGZWVkc0xvYWRPcHRpb25zKTogUHJvbWlzZTxMb2FkUmVzdWx0PFQ+PjtcblxuICB3YXRjaEFsbChvcHRzPzogRmVlZHNXYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+O1xuXG4gIGdldEhvbWVVcmwoZmVlZD86IFQpOiBzdHJpbmc7XG5cbiAgZ2V0VGFnVXJsKGZlZWQ6IFQsIHRhZzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIG9wZW5FZGl0TW9kYWwoZXZlbnQ6IEV2ZW50LCBmZWVkSXRlbTogVFsnaXRlbXMnXVswXSk6IFByb21pc2U8YW55PjtcblxuICBkZWxldGVJdGVtKGZlZWRJdGVtOiBUWydpdGVtcyddWzBdKTogUHJvbWlzZTxib29sZWFuPjtcblxuICBmZWVkVXJscyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlZWRTZXJ2aWNlU3RhdGUge1xuICBsb2NhbGU6IHN0cmluZztcbiAgZmVlZFVybHM/OiBzdHJpbmdbXTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZlZWRTZXJ2aWNlPFMgZXh0ZW5kcyBGZWVkU2VydmljZVN0YXRlLCBUIGV4dGVuZHMgSnNvbkZlZWQgPSBKc29uRmVlZD4gZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPFM+IGltcGxlbWVudHMgSUZlZWRTZXJ2aWNlPFQ+IHtcbiAgcHJvdGVjdGVkIF9sb2dQcmVmaXggPSAnW2ZlZWQtc2VydmljZV0gJztcbiAgcHJvdGVjdGVkIF9zdGF0ZSA9IG5ldyBSeFN0YXRlPFM+KCk7XG4gIHByb3RlY3RlZCBuZXR3b3JrID0gaW5qZWN0KE5ldHdvcmtTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIG1vZGFsQ3RybCA9IGluamVjdChNb2RhbENvbnRyb2xsZXIpO1xuICBwcm90ZWN0ZWQgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcGVyc29uU2VydmljZSA9IGluamVjdChQZXJzb25TZXJ2aWNlKTtcblxuICBsb2NhbGUkID0gdGhpcy5fc3RhdGUuc2VsZWN0KCdsb2NhbGUnKTtcbiAgZmVlZFVybHMkID0gdGhpcy5fc3RhdGUuc2VsZWN0KCdmZWVkVXJscycpO1xuXG4gIGdldCBmZWVkVXJscygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldCgnZmVlZFVybHMnKTtcbiAgfVxuXG4gIHNldCBmZWVkVXJscyh1cmxzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3N0YXRlLnNldCgnZmVlZFVybHMnLCAoKSA9PiB1cmxzKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRcbiAgKSB7XG4gICAgc3VwZXIoc2V0dGluZ3MpO1xuXG4gICAgdGhpcy5fc3RhdGUuY29ubmVjdCgnbG9jYWxlJywgdGhpcy5zZXR0aW5ncy5sb2NhbGUkKTtcblxuICAgIHRoaXMuX3N0YXRlLmNvbm5lY3QoXG4gICAgICAnZmVlZFVybHMnLFxuICAgICAgdGhpcy5sb2NhbGUkLnBpcGUoXG4gICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICBtYXAoKGxvY2FsZSkgPT4gKGxvY2FsZSAmJiBlbnZpcm9ubWVudC5mZWVkPy5qc29uRmVlZD8uW2xvY2FsZV0pID8/IFtdKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBERUJVR1xuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1jcmVhdGVkYCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8Uz4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnNldHRpbmdzLnJlYWR5KCksIHRoaXMubmV0d29yay5yZWFkeSgpXSk7XG5cbiAgICByZXR1cm4gPFM+e1xuICAgICAgbG9jYWxlOiB0aGlzLnNldHRpbmdzLmxvY2FsZSxcbiAgICB9O1xuICB9XG5cbiAgd2F0Y2hBbGwob3B0cz86IEZlZWRzV2F0Y2hPcHRpb25zKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuc3RhcnQoKSkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy53YXRjaEFsbChvcHRzKSkpO1xuICAgIH1cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KG9wdHM/LnVybHMpKSB7XG4gICAgICBjb25zdCBsb2NhbGUkID0gb3B0cy5sb2NhbGUgPyBvZihvcHRzLmxvY2FsZSkgOiB0aGlzLmxvY2FsZSQ7XG4gICAgICByZXR1cm4gbG9jYWxlJC5waXBlKG1lcmdlTWFwKChsb2NhbGUpID0+IHRoaXMubG9hZEFsbCh7IGxvY2FsZSwgLi4ub3B0cyB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZWVkVXJscyQucGlwZShcbiAgICAgIGZpbHRlcihpc05vdEVtcHR5QXJyYXkpLFxuICAgICAgbWVyZ2VNYXAoKHVybHMpID0+IHRoaXMubG9hZEFsbCh7IC4uLm9wdHMsIHVybHMgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldEhvbWVVcmwoZmVlZD86IEpzb25GZWVkKSB7XG4gICAgY29uc3QgZmVlZFVybCA9IGZlZWQ/LmZlZWRfdXJsID8/IGZpcnN0QXJyYXlWYWx1ZSh0aGlzLmZlZWRVcmxzKTtcbiAgICByZXR1cm4gZmVlZFVybCA/IFVybFV0aWxzLmdldFJvb3RVcmwoZmVlZFVybCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRUYWdVcmwoZmVlZDogSnNvbkZlZWQsIHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWZlZWQgfHwgIXRhZykgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAnZmVlZCcgb3IgJ3RhZycgYXJndW1lbnRcIik7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0SG9tZVVybChmZWVkKTtcbiAgICByZXR1cm4gZmVlZC50YWdfdGVtcGxhdGU/LnJlcGxhY2UoJ3t0YWd9JywgdGFnKSA/PyBiYXNlVXJsICsgJy90YWcvJyArIHRhZztcbiAgfVxuXG4gIGFzeW5jIGxvYWQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0cz86IEZlZWRMb2FkT3B0aW9ucyAmIHtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBkZXB0aD86IG51bWJlcjtcbiAgICB9XG4gICk6IFByb21pc2U8VD4ge1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXJsIGFyZ3VtZW50Jyk7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmxvYWRBbGwoeyAuLi5vcHRzLCB1cmxzOiBbdXJsXSB9KTtcbiAgICByZXR1cm4gZmlyc3RBcnJheVZhbHVlKGRhdGEpO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFsbChcbiAgICBvcHRzPzogRmVlZHNMb2FkT3B0aW9ucyAmIHtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBkZXB0aD86IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9XG4gICk6IFByb21pc2U8TG9hZFJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICBjb25zdCB1cmxzID0gb3B0cz8udXJscyA/PyB0aGlzLmZlZWRVcmxzO1xuICAgIG9wdHMgPSB7XG4gICAgICBtYXhBZ2VJbk1vbnRoczogb3B0cz8ubWF4QWdlSW5Nb250aHMgPz8gdGhpcy5lbnZpcm9ubWVudC5mZWVkPy5tYXhBZ2VJbk1vbnRocyxcbiAgICAgIG1heENvbnRlbnRMZW5ndGg6IG9wdHM/Lm1heENvbnRlbnRMZW5ndGggPz8gdGhpcy5lbnZpcm9ubWVudC5mZWVkPy5tYXhDb250ZW50TGVuZ3RoLFxuICAgICAgbG9jYWxlOiB0aGlzLnNldHRpbmdzLmxvY2FsZSxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuICAgIGNvbnN0IGZlZWRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAodXJscyB8fCBbXSkubWFwKGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBHZXQgSlNPTlxuICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLm5ldHdvcmsuZ2V0KHVybCwgeyBub2NhY2hlOiBvcHRzPy5jYWNoZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1Mb2FkZWQgSlNPTiBmcm9tICR7dXJsfWAsIGpzb24pO1xuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBmZWVkXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzb2x2ZUZlZWQoanNvbiwgdXJsLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkcyBhdCAke3VybH0uIDQwNCAoTm90IGZvdW5kKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH0gRXJyb3Igd2hpbGUgZmV0Y2hpbmcgZmVlZHMgYXQgJHt1cmx9YCwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGEgPSBmZWVkcy5maWx0ZXIoaXNOb3RFbXB0eUFycmF5KS5mbGF0KCk7XG5cbiAgICAvLyBDbG9zZSBvcGVuZWQgcmVzb3VyY2VzXG4gICAgaWYgKG9wdHMuZGVwdGggPT09IDApIHtcbiAgICAgIHRoaXMub25BZnRlckxvYWRBbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBkYXRhLCB0b3RhbDogZGF0YS5sZW5ndGggfTtcbiAgfVxuXG4gIGFzeW5jIG9wZW5FZGl0TW9kYWwoZXZlbnQ6IEV2ZW50LCBmZWVkSXRlbTogSnNvbkZlZWRJdGVtLCBvcHRzPzogeyBzaG93VG9hc3Q/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtZXNzYWdlSWQgPSArZmVlZEl0ZW0uaWQ7XG4gICAgaWYgKGlzTmlsT3JOYU4obWVzc2FnZUlkKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbG9hZCBtZXNzYWdlIC0gaW52YWxpZCBpZDogJHtmZWVkSXRlbS5pZH1gKTtcblxuICAgIC8vIEZldGNoIHRoZSBvcmlnaW5hbCBtZXNzYWdlXG4gICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZVNlcnZpY2UubG9hZChtZXNzYWdlSWQpO1xuXG4gICAgLy8gQ291bnQgcmVjaXBpZW50c1xuICAgIGxldCByZWNpcGllbnRGaWx0ZXJDb3VudDogbnVtYmVyO1xuICAgIGlmIChtZXNzYWdlPy5yZWNpcGllbnRGaWx0ZXIpIHtcbiAgICAgIHJlY2lwaWVudEZpbHRlckNvdW50ID0gYXdhaXQgdGhpcy5wZXJzb25TZXJ2aWNlLmNvdW50QWxsKG1lc3NhZ2U/LnJlY2lwaWVudEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzVG9wTW9kYWwgPSAhIShhd2FpdCB0aGlzLm1vZGFsQ3RybC5nZXRUb3AoKSk7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBNZXNzYWdlTW9kYWwsXG4gICAgICBjb21wb25lbnRQcm9wczogPE1lc3NhZ2VNb2RhbE9wdGlvbnM+e1xuICAgICAgICB0aXRsZTogJ1NPQ0lBTC5GRUVELkVESVRfVElUTEUnLFxuICAgICAgICBzdWdnZXN0Rm46ICh2YWx1ZSwgZmlsdGVyLCBzb3J0QnksIHNvcnREaXJlY3Rpb24sIG9wdHMpID0+IHRoaXMucGVyc29uU2VydmljZS5zdWdnZXN0KHZhbHVlLCBmaWx0ZXIsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgb3B0cyksXG4gICAgICAgIGNhblNlbGVjdFR5cGU6IGZhbHNlLFxuICAgICAgICBjYW5SZWNpcGllbnRGaWx0ZXI6IGZhbHNlLFxuICAgICAgICByZWNpcGllbnRGaWx0ZXJDb3VudCxcbiAgICAgICAgZGF0YTogbWVzc2FnZSxcbiAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICB9LFxuICAgICAgY3NzQ2xhc3M6IGhhc1RvcE1vZGFsICYmICdzdGFjay1tb2RhbCcsXG4gICAgfSk7XG5cbiAgICAvLyBPcGVuIHRoZSBtb2RhbFxuICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcblxuICAgIC8vIE9uIGRpc21pc3NcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IG1vZGFsLm9uRGlkRGlzbWlzcygpO1xuICAgIGlmICghZGF0YSB8fCAhKGRhdGEgaW5zdGFuY2VvZiBNZXNzYWdlKSkgcmV0dXJuIHRydWU7IC8vIENBTkNFTExFRFxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWVzc2FnZVNlcnZpY2Uuc2VuZChkYXRhLCBvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUl0ZW0oZmVlZEl0ZW06IEpzb25GZWVkSXRlbSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1lc3NhZ2VJZCA9ICtmZWVkSXRlbS5pZDtcbiAgICBpZiAoaXNOaWxPck5hTihtZXNzYWdlSWQpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZWxldGUgbWVzc2FnZSAtIGludmFsaWQgaWQ6ICR7ZmVlZEl0ZW0uaWR9YCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5tZXNzYWdlU2VydmljZS5kZWxldGUobWVzc2FnZUlkKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBmdW5jdGlvbnMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUZlZWQoXG4gICAganNvbjogYW55LFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdHM/OiB7XG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjtcbiAgICAgIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gICAgICAvLyBJbnRlcm5hbCBvcHRpb25zIChmb3IgcmVjdXJzaXZlIGNhbGxzKVxuICAgICAgZGVwdGg/OiBudW1iZXI7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfVxuICApOiBQcm9taXNlPEpzb25GZWVkW10+IHtcbiAgICAvLyBDaGVjayBqc29uIGlzIEpzb25GZWVkIGNvbXBhdGlibGVcbiAgICBpZiAoSnNvbkZlZWRVdGlscy5pc0pzb25GZWVkKGpzb24pKSB7XG4gICAgICAvLyBNaWdyYXRlIGZyb20gb2xkIHZlcnNpb25zXG4gICAgICBsZXQgZmVlZCA9IEpzb25GZWVkVXRpbHMubWlncmF0ZUZlZWQoanNvbik7XG5cbiAgICAgIC8vIFJlc29sdmUgaXRlbXMgKGUuZy4gdXNpbmcgZmVlZC5uZXh0X3VybClcbiAgICAgIGZlZWQgPSBhd2FpdCB0aGlzLnJlc29sdmVGZWVkSXRlbXMoZmVlZCwgeyAuLi5vcHRzLCBkZXB0aDogb3B0cz8uZGVwdGggPz8gMCB9KTtcblxuICAgICAgLy8gVHJ1bmNhdGUgaHRtbFxuICAgICAgSnNvbkZlZWRVdGlscy50cnVuY2F0ZUZlZWRJdGVtc0h0bWwoZmVlZCwgb3B0cyk7XG5cbiAgICAgIHJldHVybiBpc05vdEVtcHR5QXJyYXkoZmVlZD8uaXRlbXMpID8gW2ZlZWRdIDogW107XG4gICAgfVxuXG4gICAgLy8gbm90IHJlc29sdmVkICh1bmtub3duIGZvcm1hdClcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUZlZWRJdGVtcyhcbiAgICBqc29uOiBKc29uRmVlZCxcbiAgICBvcHRzPzoge1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIGRlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxKc29uRmVlZD4ge1xuICAgIGlmICghanNvbikgcmV0dXJuIGpzb247XG5cbiAgICAvLyBMb2FkIGl0ZW1zXG4gICAgaWYgKGlzRW1wdHlBcnJheShqc29uLml0ZW1zKSAmJiBpc05vdE5pbE9yQmxhbmsoanNvbi5uZXh0X3VybCkpIHtcbiAgICAgIGNvbnN0IGRlcHRoID0gb3B0cz8uZGVwdGggPz8gMDtcbiAgICAgIGlmIChkZXB0aCA+PSAzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9TWF4IGRlcHRoIHJlYWNoZWQgKCR7ZGVwdGh9KSBmb3IgJHtqc29uLmZlZWRfdXJsfWApO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBpdGVtc1xuICAgICAgY29uc3QgZmVlZCA9IGF3YWl0IHRoaXMubG9hZChqc29uLm5leHRfdXJsLCB7IC4uLm9wdHMsIGRlcHRoOiBkZXB0aCArIDEgfSk7XG5cbiAgICAgIGlmIChpc0VtcHR5QXJyYXkoZmVlZD8uaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSB3aXRoIHRoZSBpbnB1dCBqc29uXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5qc29uLFxuICAgICAgICB0aXRsZToganNvbi50aXRsZSA/PyBmZWVkLnRpdGxlLFxuICAgICAgICBob21lX3BhZ2VfdXJsOiBqc29uLmhvbWVfcGFnZV91cmwgPz8gZmVlZC5ob21lX3BhZ2VfdXJsLFxuICAgICAgICBhdXRob3JzOiBpc05vdEVtcHR5QXJyYXkoanNvbi5hdXRob3JzKSA/IGpzb24uYXV0aG9ycyA6IGZlZWQuYXV0aG9ycyxcbiAgICAgICAgaXRlbXM6IGZlZWQuaXRlbXMsXG4gICAgICAgIHRhZ190ZW1wbGF0ZToganNvbi50YWdfdGVtcGxhdGUgPz8gZmVlZC50YWdfdGVtcGxhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWZ0ZXJMb2FkQWxsKCkge1xuICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUZlZWRzIGxvYWRlZGApO1xuICB9XG59XG4iXX0=
@@ -52,15 +52,15 @@ export class FeedTestingPage {
52
52
  this.cd.markForCheck();
53
53
  }
54
54
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeedTestingPage, deps: [{ token: i1.LocalSettingsService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeedTestingPage, selector: "app-feed-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Feed test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <ion-grid class=\"form-container ion-padding-top\">\n <ion-row>\n <ion-col size=\"12\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Feed URL(s)</mat-label>\n <mat-select [(value)]=\"feedUrls\" multiple>\n <mat-option *ngFor=\"let feedUrl of availableFeedUrls\" [value]=\"feedUrl\">\n {{ feedUrl }}\n </mat-option>\n <mat-option>(Use environment)</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Header color</mat-label>\n <mat-select [(value)]=\"headerColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Card color</mat-label>\n <mat-select [(value)]=\"cardColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Shape</mat-label>\n <mat-select [(value)]=\"shape\">\n <mat-option *ngFor=\"let shape of availableShapes\" [value]=\"shape\">\n {{ shape }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"debug = $event.checked\" [checked]=\"debug\">Debug ?</mat-checkbox>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <div class=\"ion-padding\">\n <app-feed\n [feedUrls]=\"feedUrls\"\n [headerColor]=\"headerColor\"\n [cardColor]=\"cardColor\"\n [shape]=\"shape\"\n [debug]=\"debug\"\n ></app-feed>\n </div>\n</ion-content>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i3.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: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i3.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonBackButton, selector: "ion-back-button" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.FeedsComponent, selector: "app-feed", inputs: ["debug", "showHeader", "headerColor", "cardColor", "shape", "class", "feeds", "feedUrls", "maxAgeInMonths", "maxContentLength"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeedTestingPage, selector: "app-feed-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Feed test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <ion-grid class=\"form-container ion-padding-top\">\n <ion-row>\n <ion-col size=\"12\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Feed URL(s)</mat-label>\n <mat-select [(value)]=\"feedUrls\" multiple>\n <mat-option *ngFor=\"let feedUrl of availableFeedUrls\" [value]=\"feedUrl\">\n {{ feedUrl }}\n </mat-option>\n <mat-option>(Use environment)</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Header color</mat-label>\n <mat-select [(value)]=\"headerColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Card color</mat-label>\n <mat-select [(value)]=\"cardColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Shape</mat-label>\n <mat-select [(value)]=\"shape\">\n <mat-option *ngFor=\"let shape of availableShapes\" [value]=\"shape\">\n {{ shape }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"debug = $event.checked\" [checked]=\"debug\">Debug ?</mat-checkbox>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <div class=\"ion-padding\">\n <app-feed\n [urls]=\"feedUrls\"\n [headerColor]=\"headerColor\"\n [cardColor]=\"cardColor\"\n [shape]=\"shape\"\n [debug]=\"debug\"\n ></app-feed>\n </div>\n</ion-content>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i3.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: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i3.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonBackButton, selector: "ion-back-button" }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
56
  }
57
57
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeedTestingPage, decorators: [{
58
58
  type: Component,
59
- args: [{ selector: 'app-feed-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Feed test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <ion-grid class=\"form-container ion-padding-top\">\n <ion-row>\n <ion-col size=\"12\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Feed URL(s)</mat-label>\n <mat-select [(value)]=\"feedUrls\" multiple>\n <mat-option *ngFor=\"let feedUrl of availableFeedUrls\" [value]=\"feedUrl\">\n {{ feedUrl }}\n </mat-option>\n <mat-option>(Use environment)</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Header color</mat-label>\n <mat-select [(value)]=\"headerColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Card color</mat-label>\n <mat-select [(value)]=\"cardColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Shape</mat-label>\n <mat-select [(value)]=\"shape\">\n <mat-option *ngFor=\"let shape of availableShapes\" [value]=\"shape\">\n {{ shape }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"debug = $event.checked\" [checked]=\"debug\">Debug ?</mat-checkbox>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <div class=\"ion-padding\">\n <app-feed\n [feedUrls]=\"feedUrls\"\n [headerColor]=\"headerColor\"\n [cardColor]=\"cardColor\"\n [shape]=\"shape\"\n [debug]=\"debug\"\n ></app-feed>\n </div>\n</ion-content>\n" }]
59
+ args: [{ selector: 'app-feed-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Feed test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <ion-grid class=\"form-container ion-padding-top\">\n <ion-row>\n <ion-col size=\"12\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Feed URL(s)</mat-label>\n <mat-select [(value)]=\"feedUrls\" multiple>\n <mat-option *ngFor=\"let feedUrl of availableFeedUrls\" [value]=\"feedUrl\">\n {{ feedUrl }}\n </mat-option>\n <mat-option>(Use environment)</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Header color</mat-label>\n <mat-select [(value)]=\"headerColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Card color</mat-label>\n <mat-select [(value)]=\"cardColor\">\n <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n {{ color }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-form-field [subscriptSizing]=\"'dynamic'\">\n <mat-label>Shape</mat-label>\n <mat-select [(value)]=\"shape\">\n <mat-option *ngFor=\"let shape of availableShapes\" [value]=\"shape\">\n {{ shape }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"3\">\n <mat-checkbox (change)=\"debug = $event.checked\" [checked]=\"debug\">Debug ?</mat-checkbox>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <div class=\"ion-padding\">\n <app-feed\n [urls]=\"feedUrls\"\n [headerColor]=\"headerColor\"\n [cardColor]=\"cardColor\"\n [shape]=\"shape\"\n [debug]=\"debug\"\n ></app-feed>\n </div>\n</ion-content>\n" }]
60
60
  }], ctorParameters: () => [{ type: i1.LocalSettingsService }, { type: i0.ChangeDetectorRef }, { type: i9.Environment, decorators: [{
61
61
  type: Optional
62
62
  }, {
63
63
  type: Inject,
64
64
  args: [ENVIRONMENT]
65
65
  }] }] });
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC90ZXN0aW5nL2ZlZWQudGVzdGluZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvdGVzdGluZy9mZWVkLnRlc3RpbmcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7Ozs7QUFVdEYsTUFBTSxPQUFPLGVBQWU7SUEwQmQ7SUFDQTtJQUMrQjtJQTNCakMsaUJBQWlCLEdBQWE7UUFDdEMsc0ZBQXNGO1FBQ3RGLCtFQUErRTtLQUNoRixDQUFDO0lBQ1EsZUFBZSxHQUF3QztRQUMvRCxtQkFBbUI7UUFDbkIsUUFBUTtRQUNSLFNBQVM7UUFDVCxXQUFXO1FBQ1gsVUFBVTtRQUNWLFFBQVE7UUFDUixPQUFPO1FBQ1AsUUFBUTtRQUNSLE1BQU07UUFDTixhQUFhO0tBQ2QsQ0FBQztJQUNRLGVBQWUsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV0QyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsUUFBUSxDQUFXO0lBQ25CLEtBQUssR0FBdUIsUUFBUSxDQUFDO0lBQ3JDLFdBQVcsR0FBb0MsV0FBVyxDQUFDO0lBQzNELFNBQVMsR0FBb0MsT0FBTyxDQUFDO0lBRS9ELFlBQ1ksUUFBOEIsRUFDOUIsRUFBcUIsRUFDVSxXQUF3QjtRQUZ2RCxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBRWpFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVTLEtBQUssQ0FBQyxRQUF1QjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQzVELHNGQUFzRjtZQUN0RiwrRUFBK0U7U0FDaEYsQ0FBQztRQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0F6Q1UsZUFBZSx1RkE0QkosV0FBVzs0RkE1QnRCLGVBQWUscURDWDVCLCswRUF3RUE7OzRGRDdEYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLGVBQWUsbUJBRVIsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEI1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IEFwcENvbG9ycyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mZWVkLXRlc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmVlZC50ZXN0aW5nLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRmVlZFRlc3RpbmdQYWdlIHtcbiAgcHJvdGVjdGVkIGF2YWlsYWJsZUZlZWRVcmxzOiBzdHJpbmdbXSA9IFtcbiAgICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R1bml0ZXIvY2VzaXVtL21hc3Rlci9kb2MvZmVlZC8xLjEvZmVlZC1mci1GUi5qc29uJyxcbiAgICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R1bml0ZXIvY2VzaXVtL21hc3Rlci9kb2MvZmVlZC9mZWVkLWZyLmpzb24nLFxuICBdO1xuICBwcm90ZWN0ZWQgYXZhaWxhYmxlQ29sb3JzOiAoQXBwQ29sb3JzIHwgJ2xpZ2h0LXRyYW5zcGFyZW50JylbXSA9IFtcbiAgICAnbGlnaHQtdHJhbnNwYXJlbnQnLFxuICAgICdhY2NlbnQnLFxuICAgICdwcmltYXJ5JyxcbiAgICAnc2Vjb25kYXJ5JyxcbiAgICAndGVydGlhcnknLFxuICAgICdkYW5nZXInLFxuICAgICdsaWdodCcsXG4gICAgJ21lZGl1bScsXG4gICAgJ2RhcmsnLFxuICAgICd0cmFuc3BhcmVudCcsXG4gIF07XG4gIHByb3RlY3RlZCBhdmFpbGFibGVTaGFwZXMgPSBbJ3JvdW5kJywgJ2xlZ2FjeSddO1xuXG4gIHByb3RlY3RlZCBkZWJ1ZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZmVlZFVybHM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgc2hhcGU6ICdyb3VuZCcgfCAnbGVnYWN5JyA9ICdsZWdhY3knO1xuICBwcm90ZWN0ZWQgaGVhZGVyQ29sb3I6IEFwcENvbG9ycyB8ICdsaWdodC10cmFuc3BhcmVudCcgPSAnc2Vjb25kYXJ5JztcbiAgcHJvdGVjdGVkIGNhcmRDb2xvcjogQXBwQ29sb3JzIHwgJ2xpZ2h0LXRyYW5zcGFyZW50JyA9ICdsaWdodCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKS50aGVuKChzZXR0aW5ncykgPT4gdGhpcy5zdGFydChzZXR0aW5ncykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0KHNldHRpbmdzOiBMb2NhbFNldHRpbmdzKSB7XG4gICAgY29uc3QgbG9jYWxlID0gc2V0dGluZ3MubG9jYWxlIHx8IHRoaXMuZW52aXJvbm1lbnQ/LmRlZmF1bHRMb2NhbGUgfHwgJ2ZyJztcbiAgICB0aGlzLmZlZWRVcmxzID0gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8uanNvbkZlZWQ/Lltsb2NhbGVdIHx8IFtcbiAgICAgICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZHVuaXRlci9jZXNpdW0vbWFzdGVyL2RvYy9mZWVkLzEuMS9mZWVkLWZyLUZSLmpzb24nLFxuICAgICAgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kdW5pdGVyL2Nlc2l1bS9tYXN0ZXIvZG9jL2ZlZWQvZmVlZC1mci5qc29uJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuZGVidWcoJ1tmZWVkLXRlc3RpbmddIEZlZWQgVVJMczonLCB0aGlzLmZlZWRVcmxzKTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYmFjay1idXR0b24+PC9pb24tYmFjay1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cblxuICAgIDxpb24tdGl0bGU+RmVlZCB0ZXN0IHBhZ2U8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50PlxuICA8aW9uLWdyaWQgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBpb24tcGFkZGluZy10b3BcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkZlZWQgVVJMKHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiZmVlZFVybHNcIiBtdWx0aXBsZT5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBmZWVkVXJsIG9mIGF2YWlsYWJsZUZlZWRVcmxzXCIgW3ZhbHVlXT1cImZlZWRVcmxcIj5cbiAgICAgICAgICAgICAge3sgZmVlZFVybCB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24+KFVzZSBlbnZpcm9ubWVudCk8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sIHNpemU9XCIzXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+SGVhZGVyIGNvbG9yPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiaGVhZGVyQ29sb3JcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjb2xvciBvZiBhdmFpbGFibGVDb2xvcnNcIiBbdmFsdWVdPVwiY29sb3JcIj5cbiAgICAgICAgICAgICAge3sgY29sb3IgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkNhcmQgY29sb3I8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJjYXJkQ29sb3JcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjb2xvciBvZiBhdmFpbGFibGVDb2xvcnNcIiBbdmFsdWVdPVwiY29sb3JcIj5cbiAgICAgICAgICAgICAge3sgY29sb3IgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlNoYXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2hhcGVcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzaGFwZSBvZiBhdmFpbGFibGVTaGFwZXNcIiBbdmFsdWVdPVwic2hhcGVcIj5cbiAgICAgICAgICAgICAge3sgc2hhcGUgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiZGVidWcgPSAkZXZlbnQuY2hlY2tlZFwiIFtjaGVja2VkXT1cImRlYnVnXCI+RGVidWcgPzwvbWF0LWNoZWNrYm94PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cblxuICA8ZGl2IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICA8YXBwLWZlZWRcbiAgICAgIFtmZWVkVXJsc109XCJmZWVkVXJsc1wiXG4gICAgICBbaGVhZGVyQ29sb3JdPVwiaGVhZGVyQ29sb3JcIlxuICAgICAgW2NhcmRDb2xvcl09XCJjYXJkQ29sb3JcIlxuICAgICAgW3NoYXBlXT1cInNoYXBlXCJcbiAgICAgIFtkZWJ1Z109XCJkZWJ1Z1wiXG4gICAgPjwvYXBwLWZlZWQ+XG4gIDwvZGl2PlxuPC9pb24tY29udGVudD5cbiJdfQ==
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC90ZXN0aW5nL2ZlZWQudGVzdGluZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvdGVzdGluZy9mZWVkLnRlc3RpbmcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7Ozs7QUFVdEYsTUFBTSxPQUFPLGVBQWU7SUEwQmQ7SUFDQTtJQUMrQjtJQTNCakMsaUJBQWlCLEdBQWE7UUFDdEMsc0ZBQXNGO1FBQ3RGLCtFQUErRTtLQUNoRixDQUFDO0lBQ1EsZUFBZSxHQUF3QztRQUMvRCxtQkFBbUI7UUFDbkIsUUFBUTtRQUNSLFNBQVM7UUFDVCxXQUFXO1FBQ1gsVUFBVTtRQUNWLFFBQVE7UUFDUixPQUFPO1FBQ1AsUUFBUTtRQUNSLE1BQU07UUFDTixhQUFhO0tBQ2QsQ0FBQztJQUNRLGVBQWUsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV0QyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsUUFBUSxDQUFXO0lBQ25CLEtBQUssR0FBdUIsUUFBUSxDQUFDO0lBQ3JDLFdBQVcsR0FBb0MsV0FBVyxDQUFDO0lBQzNELFNBQVMsR0FBb0MsT0FBTyxDQUFDO0lBRS9ELFlBQ1ksUUFBOEIsRUFDOUIsRUFBcUIsRUFDVSxXQUF3QjtRQUZ2RCxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBRWpFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVTLEtBQUssQ0FBQyxRQUF1QjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQzVELHNGQUFzRjtZQUN0RiwrRUFBK0U7U0FDaEYsQ0FBQztRQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0F6Q1UsZUFBZSx1RkE0QkosV0FBVzs0RkE1QnRCLGVBQWUscURDWDVCLDIwRUF3RUE7OzRGRDdEYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLGVBQWUsbUJBRVIsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEI1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IEFwcENvbG9ycyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mZWVkLXRlc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmVlZC50ZXN0aW5nLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRmVlZFRlc3RpbmdQYWdlIHtcbiAgcHJvdGVjdGVkIGF2YWlsYWJsZUZlZWRVcmxzOiBzdHJpbmdbXSA9IFtcbiAgICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R1bml0ZXIvY2VzaXVtL21hc3Rlci9kb2MvZmVlZC8xLjEvZmVlZC1mci1GUi5qc29uJyxcbiAgICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R1bml0ZXIvY2VzaXVtL21hc3Rlci9kb2MvZmVlZC9mZWVkLWZyLmpzb24nLFxuICBdO1xuICBwcm90ZWN0ZWQgYXZhaWxhYmxlQ29sb3JzOiAoQXBwQ29sb3JzIHwgJ2xpZ2h0LXRyYW5zcGFyZW50JylbXSA9IFtcbiAgICAnbGlnaHQtdHJhbnNwYXJlbnQnLFxuICAgICdhY2NlbnQnLFxuICAgICdwcmltYXJ5JyxcbiAgICAnc2Vjb25kYXJ5JyxcbiAgICAndGVydGlhcnknLFxuICAgICdkYW5nZXInLFxuICAgICdsaWdodCcsXG4gICAgJ21lZGl1bScsXG4gICAgJ2RhcmsnLFxuICAgICd0cmFuc3BhcmVudCcsXG4gIF07XG4gIHByb3RlY3RlZCBhdmFpbGFibGVTaGFwZXMgPSBbJ3JvdW5kJywgJ2xlZ2FjeSddO1xuXG4gIHByb3RlY3RlZCBkZWJ1ZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZmVlZFVybHM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgc2hhcGU6ICdyb3VuZCcgfCAnbGVnYWN5JyA9ICdsZWdhY3knO1xuICBwcm90ZWN0ZWQgaGVhZGVyQ29sb3I6IEFwcENvbG9ycyB8ICdsaWdodC10cmFuc3BhcmVudCcgPSAnc2Vjb25kYXJ5JztcbiAgcHJvdGVjdGVkIGNhcmRDb2xvcjogQXBwQ29sb3JzIHwgJ2xpZ2h0LXRyYW5zcGFyZW50JyA9ICdsaWdodCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKS50aGVuKChzZXR0aW5ncykgPT4gdGhpcy5zdGFydChzZXR0aW5ncykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0KHNldHRpbmdzOiBMb2NhbFNldHRpbmdzKSB7XG4gICAgY29uc3QgbG9jYWxlID0gc2V0dGluZ3MubG9jYWxlIHx8IHRoaXMuZW52aXJvbm1lbnQ/LmRlZmF1bHRMb2NhbGUgfHwgJ2ZyJztcbiAgICB0aGlzLmZlZWRVcmxzID0gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8uanNvbkZlZWQ/Lltsb2NhbGVdIHx8IFtcbiAgICAgICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZHVuaXRlci9jZXNpdW0vbWFzdGVyL2RvYy9mZWVkLzEuMS9mZWVkLWZyLUZSLmpzb24nLFxuICAgICAgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kdW5pdGVyL2Nlc2l1bS9tYXN0ZXIvZG9jL2ZlZWQvZmVlZC1mci5qc29uJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuZGVidWcoJ1tmZWVkLXRlc3RpbmddIEZlZWQgVVJMczonLCB0aGlzLmZlZWRVcmxzKTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYmFjay1idXR0b24+PC9pb24tYmFjay1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cblxuICAgIDxpb24tdGl0bGU+RmVlZCB0ZXN0IHBhZ2U8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50PlxuICA8aW9uLWdyaWQgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBpb24tcGFkZGluZy10b3BcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkZlZWQgVVJMKHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiZmVlZFVybHNcIiBtdWx0aXBsZT5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBmZWVkVXJsIG9mIGF2YWlsYWJsZUZlZWRVcmxzXCIgW3ZhbHVlXT1cImZlZWRVcmxcIj5cbiAgICAgICAgICAgICAge3sgZmVlZFVybCB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24+KFVzZSBlbnZpcm9ubWVudCk8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sIHNpemU9XCIzXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+SGVhZGVyIGNvbG9yPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiaGVhZGVyQ29sb3JcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjb2xvciBvZiBhdmFpbGFibGVDb2xvcnNcIiBbdmFsdWVdPVwiY29sb3JcIj5cbiAgICAgICAgICAgICAge3sgY29sb3IgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkNhcmQgY29sb3I8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJjYXJkQ29sb3JcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjb2xvciBvZiBhdmFpbGFibGVDb2xvcnNcIiBbdmFsdWVdPVwiY29sb3JcIj5cbiAgICAgICAgICAgICAge3sgY29sb3IgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlNoYXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2hhcGVcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzaGFwZSBvZiBhdmFpbGFibGVTaGFwZXNcIiBbdmFsdWVdPVwic2hhcGVcIj5cbiAgICAgICAgICAgICAge3sgc2hhcGUgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiM1wiPlxuICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiZGVidWcgPSAkZXZlbnQuY2hlY2tlZFwiIFtjaGVja2VkXT1cImRlYnVnXCI+RGVidWcgPzwvbWF0LWNoZWNrYm94PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cblxuICA8ZGl2IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICA8YXBwLWZlZWRcbiAgICAgIFt1cmxzXT1cImZlZWRVcmxzXCJcbiAgICAgIFtoZWFkZXJDb2xvcl09XCJoZWFkZXJDb2xvclwiXG4gICAgICBbY2FyZENvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICBbc2hhcGVdPVwic2hhcGVcIlxuICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICA+PC9hcHAtZmVlZD5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuIl19