ngx-rendering-service-lib 0.0.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 (32) hide show
  1. package/environments/environment.d.ts +5 -0
  2. package/esm2022/environments/environment.mjs +6 -0
  3. package/esm2022/index.mjs +13 -0
  4. package/esm2022/lib/dto/AssetStateData.mjs +2 -0
  5. package/esm2022/lib/module/RenderModule.mjs +2 -0
  6. package/esm2022/lib/module/eduhtml/eduHtml.component.mjs +34 -0
  7. package/esm2022/lib/module/image/image.component.mjs +51 -0
  8. package/esm2022/lib/module/pdf/pdf.component.mjs +81 -0
  9. package/esm2022/lib/module/spreadsheet/spreadsheet.component.mjs +47 -0
  10. package/esm2022/lib/module/url/url.component.mjs +118 -0
  11. package/esm2022/lib/module/video/video.component.mjs +61 -0
  12. package/esm2022/lib/render.component.mjs +145 -0
  13. package/esm2022/lib/rendering-api.module.mjs +23 -0
  14. package/esm2022/lib/rendering.module.mjs +25 -0
  15. package/esm2022/ngx-rendering-service-lib.mjs +5 -0
  16. package/esm2022/rendering-service-lib.module.mjs +32 -0
  17. package/fesm2022/ngx-rendering-service-lib.mjs +613 -0
  18. package/fesm2022/ngx-rendering-service-lib.mjs.map +1 -0
  19. package/index.d.ts +9 -0
  20. package/lib/dto/AssetStateData.d.ts +10 -0
  21. package/lib/module/RenderModule.d.ts +6 -0
  22. package/lib/module/eduhtml/eduHtml.component.d.ts +14 -0
  23. package/lib/module/image/image.component.d.ts +17 -0
  24. package/lib/module/pdf/pdf.component.d.ts +21 -0
  25. package/lib/module/spreadsheet/spreadsheet.component.d.ts +17 -0
  26. package/lib/module/url/url.component.d.ts +29 -0
  27. package/lib/module/video/video.component.d.ts +15 -0
  28. package/lib/render.component.d.ts +25 -0
  29. package/lib/rendering-api.module.d.ts +7 -0
  30. package/lib/rendering.module.d.ts +8 -0
  31. package/package.json +39 -0
  32. package/rendering-service-lib.module.d.ts +10 -0
@@ -0,0 +1,145 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { RenderingModule } from "./rendering.module";
3
+ import { BehaviorSubject, firstValueFrom, interval, Subject, switchMap, takeUntil } from "rxjs";
4
+ import { RenderingApiModule } from "./rendering-api.module";
5
+ import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
6
+ import { MatProgressBarModule } from "@angular/material/progress-bar";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "ngx-rendering-service-api";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "@angular/material/progress-spinner";
11
+ import * as i4 from "@angular/material/progress-bar";
12
+ export class RenderComponent {
13
+ constructor(renderControllerService, jobInfoControllerService) {
14
+ this.renderControllerService = renderControllerService;
15
+ this.jobInfoControllerService = jobInfoControllerService;
16
+ this.renderData$ = new BehaviorSubject(null);
17
+ this.finished = new Subject();
18
+ this.someButNotAllFinished = new Subject();
19
+ this.progress$ = new BehaviorSubject(null);
20
+ this.useUrlModule = false;
21
+ }
22
+ async ngOnChanges(changes) {
23
+ if (this.node === undefined || !this.checkIfBackendModule()) {
24
+ return;
25
+ }
26
+ const renderResponseData = (await firstValueFrom(this.renderControllerService.getRenderData({
27
+ body: this.request
28
+ })));
29
+ // It is possible that there is completed data AND a job id (if there).
30
+ // We need the data then AND trigger the progress logic to keep loading the unfinished resolutions.
31
+ if (renderResponseData.jobId === null) {
32
+ const items = renderResponseData.objectLinks?.map(item => {
33
+ const assetItem = {
34
+ link: item.link,
35
+ progress: 100,
36
+ height: item.height,
37
+ width: item.width
38
+ };
39
+ return assetItem;
40
+ });
41
+ const data = {
42
+ module: renderResponseData.module,
43
+ items: items
44
+ };
45
+ renderResponseData.objectLinks !== undefined && this.renderData$.next(data);
46
+ this.finished.next();
47
+ }
48
+ else {
49
+ this.progress$.next({ module: renderResponseData.module });
50
+ interval(500).pipe(takeUntil(this.finished), switchMap(() => this.jobInfoControllerService.getJobInfo({ jobId: renderResponseData.jobId }).pipe())).subscribe(async (status) => {
51
+ // Some, but not all, jobs are finished ->
52
+ if (status.jobs.some(j => j.status === 'FINISHED') && status.status !== 'FINISHED') {
53
+ const items = status.jobs.map(subJob => {
54
+ const assetItem = {
55
+ link: subJob.objectLink?.link ?? "",
56
+ progress: subJob.status !== 'QUEUED' ? subJob.progress : -(subJob.progress + 1),
57
+ height: subJob.objectLink?.height ?? subJob.quality,
58
+ width: subJob.objectLink?.width ?? 0
59
+ };
60
+ return assetItem;
61
+ });
62
+ const data = {
63
+ module: renderResponseData.module,
64
+ items: items
65
+ };
66
+ this.renderData$.next(data);
67
+ this.someButNotAllFinished.next(true);
68
+ // all finished and/or failed
69
+ }
70
+ else if (status.status === 'FINISHED' || status.status === 'FAILED') {
71
+ const items = status.jobs.map(subJob => {
72
+ const assetItem = {
73
+ link: subJob.objectLink?.link ?? "",
74
+ progress: subJob.progress,
75
+ height: subJob.objectLink?.height ?? subJob.quality,
76
+ width: subJob.objectLink?.width ?? 0
77
+ };
78
+ return assetItem;
79
+ });
80
+ const data = {
81
+ module: renderResponseData.module,
82
+ items: items
83
+ };
84
+ this.renderData$.next(data);
85
+ this.finished.next();
86
+ }
87
+ else {
88
+ // no finished jobs -> show either one progress bar with race leader (progress 0-100)
89
+ // or queue position (progress (-inf,-1])
90
+ let progress = 0;
91
+ if (status.jobs.some(j => j.status === 'PROCESSING')) {
92
+ progress = Math.max(...status.jobs.map(j => j.progress));
93
+ }
94
+ else if (status.jobs.some(j => j.status === 'QUEUED')) {
95
+ progress = -(Math.min(...status.jobs.map(j => j.progress + 1)));
96
+ }
97
+ this.progress$.next({
98
+ module: status.module,
99
+ progress: progress
100
+ });
101
+ }
102
+ });
103
+ }
104
+ }
105
+ checkIfBackendModule() {
106
+ if (["youtube", "pixabay"].includes((this.node?.remote?.repository?.repositoryType ?? "").toLowerCase())) {
107
+ this.useUrlModule = true;
108
+ return false;
109
+ }
110
+ if (this.node?.properties === undefined) {
111
+ return true;
112
+ }
113
+ if (this.node?.properties["ccm:replicationsource"] !== undefined && (this.node.properties["ccm:replicationsource"][0] ?? "") === "oai:dmglib.org") {
114
+ this.useUrlModule = true;
115
+ return false;
116
+ }
117
+ if (this.node?.properties["ccm:wwwurl"].length > 0) {
118
+ this.useUrlModule = true;
119
+ return false;
120
+ }
121
+ return true;
122
+ }
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderComponent, deps: [{ token: i1.RenderControllerService }, { token: i1.JobInfoControllerService }], target: i0.ɵɵFactoryTarget.Component }); }
124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: RenderComponent, isStandalone: true, selector: "rs-root", inputs: { request: "request", node: "node" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"module\">\n <ng-container *ngIf=\"renderData$ | async as data\">\n @defer (when data?.module === 'IMAGE'){\n <rs-module-image [data]=\"data\" [node]=\"node\"></rs-module-image>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'VIDEO' || data?.module === 'AUDIO'){\n <rs-module-video [data]=\"data\" [node]=\"node\"></rs-module-video>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'PDF' || data?.module === 'DOCUMENT') {\n <rs-module-pdf [data]=\"data\" [node]=\"node\"></rs-module-pdf>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'EDUHTML') {\n <rs-module-eduHtml [data]=\"data\" [node]=\"node\"></rs-module-eduHtml>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'SPREADSHEET') {\n <rs-module-spreadsheet [data]=\"data\" [node]=\"node\"></rs-module-spreadsheet>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n </ng-container>\n <ng-container *ngIf=\"useUrlModule\">\n @defer (when useUrlModule) {\n <rs-module-url [node]=\"node\"></rs-module-url>\n }\n </ng-container>\n <div class=\"progress\" *ngIf=\"(renderData$ | async) === null;\">\n <ng-container *ngIf=\"progress$ | async as progress\">\n <ng-container [ngSwitch]=\"['VIDEO', 'AUDIO'].includes(progress.module) ? 'bar' : 'spinner'\">\n <ng-container *ngSwitchCase=\"'bar'\">\n <div *ngIf=\"(progress.progress ?? 0) < 0\">Queue position: {{-(progress.progress ?? 0)}}</div>\n <mat-progress-bar [value]=\"(progress.progress ?? 0)\" *ngIf=\"(progress.progress ?? 0) >= 0\"></mat-progress-bar>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spinner'\">\n <div *ngIf=\"(progress.progress ?? 0) < 0\">Queue position: {{-(progress.progress ?? 0)}</div>\n <mat-spinner [diameter]=\"50\" *ngIf=\"(progress.progress ?? 0) >= 0\"></mat-spinner>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #loading>\n <div class=\"progress\">\n <mat-spinner></mat-spinner>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;gap:20px;padding:10px 30px}.module{overflow:auto;display:flex;flex-grow:1;height:auto;border:1px solid #aaa;padding:20px}.module rs-module-image,.module rs-module-video{width:100%}.module .progress{display:flex;justify-content:center;flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: RenderingApiModule }, { kind: "ngmodule", type: RenderingModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], deferBlockDependencies: [() => [import("./module/image/image.component").then(m => m.ImageComponent)], () => [import("./module/video/video.component").then(m => m.VideoComponent)], () => [import("./module/pdf/pdf.component").then(m => m.PdfComponent)], () => [import("./module/eduhtml/eduHtml.component").then(m => m.EduHtmlComponent)], () => [import("./module/spreadsheet/spreadsheet.component").then(m => m.SpreadsheetComponent)], () => [import("./module/url/url.component").then(m => m.UrlComponent)]] }); }
125
+ }
126
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.6", ngImport: i0, type: RenderComponent, resolveDeferredDeps: () => [import("./module/image/image.component").then(m => m.ImageComponent), import("./module/video/video.component").then(m => m.VideoComponent), import("./module/pdf/pdf.component").then(m => m.PdfComponent), import("./module/eduhtml/eduHtml.component").then(m => m.EduHtmlComponent), import("./module/spreadsheet/spreadsheet.component").then(m => m.SpreadsheetComponent), import("./module/url/url.component").then(m => m.UrlComponent)], resolveMetadata: (ImageComponent, VideoComponent, PdfComponent, EduHtmlComponent, SpreadsheetComponent, UrlComponent) => ({ decorators: [{
127
+ type: Component,
128
+ args: [{ selector: 'rs-root', standalone: true, imports: [
129
+ RenderingApiModule,
130
+ RenderingModule,
131
+ ImageComponent,
132
+ VideoComponent,
133
+ MatProgressSpinnerModule,
134
+ MatProgressBarModule,
135
+ PdfComponent,
136
+ UrlComponent,
137
+ EduHtmlComponent,
138
+ SpreadsheetComponent,
139
+ ], template: "<div class=\"module\">\n <ng-container *ngIf=\"renderData$ | async as data\">\n @defer (when data?.module === 'IMAGE'){\n <rs-module-image [data]=\"data\" [node]=\"node\"></rs-module-image>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'VIDEO' || data?.module === 'AUDIO'){\n <rs-module-video [data]=\"data\" [node]=\"node\"></rs-module-video>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'PDF' || data?.module === 'DOCUMENT') {\n <rs-module-pdf [data]=\"data\" [node]=\"node\"></rs-module-pdf>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'EDUHTML') {\n <rs-module-eduHtml [data]=\"data\" [node]=\"node\"></rs-module-eduHtml>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n @defer (when data?.module === 'SPREADSHEET') {\n <rs-module-spreadsheet [data]=\"data\" [node]=\"node\"></rs-module-spreadsheet>\n } @loading {\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n }\n </ng-container>\n <ng-container *ngIf=\"useUrlModule\">\n @defer (when useUrlModule) {\n <rs-module-url [node]=\"node\"></rs-module-url>\n }\n </ng-container>\n <div class=\"progress\" *ngIf=\"(renderData$ | async) === null;\">\n <ng-container *ngIf=\"progress$ | async as progress\">\n <ng-container [ngSwitch]=\"['VIDEO', 'AUDIO'].includes(progress.module) ? 'bar' : 'spinner'\">\n <ng-container *ngSwitchCase=\"'bar'\">\n <div *ngIf=\"(progress.progress ?? 0) < 0\">Queue position: {{-(progress.progress ?? 0)}}</div>\n <mat-progress-bar [value]=\"(progress.progress ?? 0)\" *ngIf=\"(progress.progress ?? 0) >= 0\"></mat-progress-bar>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spinner'\">\n <div *ngIf=\"(progress.progress ?? 0) < 0\">Queue position: {{-(progress.progress ?? 0)}</div>\n <mat-spinner [diameter]=\"50\" *ngIf=\"(progress.progress ?? 0) >= 0\"></mat-spinner>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #loading>\n <div class=\"progress\">\n <mat-spinner></mat-spinner>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;gap:20px;padding:10px 30px}.module{overflow:auto;display:flex;flex-grow:1;height:auto;border:1px solid #aaa;padding:20px}.module rs-module-image,.module rs-module-video{width:100%}.module .progress{display:flex;justify-content:center;flex-grow:1}\n"] }]
140
+ }], ctorParameters: () => [{ type: i1.RenderControllerService }, { type: i1.JobInfoControllerService }], propDecorators: { request: [{
141
+ type: Input
142
+ }], node: [{
143
+ type: Input
144
+ }] } }) });
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFNbkQsT0FBTyxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTlGLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7QUF5QnBFLE1BQU0sT0FBTyxlQUFlO0lBVTFCLFlBQ1UsdUJBQWdELEVBQ2hELHdCQUFrRDtRQURsRCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFSNUQsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsSUFBSSxDQUFDLENBQUM7UUFDL0QsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQTtRQUM5QyxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQStDLElBQUksQ0FBQyxDQUFDO1FBQ3BGLGlCQUFZLEdBQUcsS0FBSyxDQUFBO0lBTXBCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXNCO1FBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBRSxJ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SSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2xKLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1lBQ3hCLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1lBQ3hCLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQzs4R0FwSFUsZUFBZTtrR0FBZixlQUFlLHNJQ3RDNUIsZzFFQXNEQSwwVkQ5Qkksa0JBQWtCLDhCQUNsQixlQUFlLDBoQkFHZix3QkFBd0Isa09BQ3hCLG9CQUFvQjs7Z0dBU1gsZUFBZTtzQkFsQjNCLFNBQVM7bUNBQ0UsU0FBUyxjQUNQLElBQUksV0FDUDs0QkFDUCxrQkFBa0I7NEJBQ2xCLGVBQWU7NEJBQ2YsY0FBYzs0QkFDZCxjQUFjOzRCQUNkLHdCQUF3Qjs0QkFDeEIsb0JBQW9COzRCQUNwQixZQUFZOzRCQUNaLFlBQVk7NEJBQ1osZ0JBQWdCOzRCQUNoQixvQkFBb0I7eUJBQ3JCO3VJQU1RLE9BQU87MEJBQWYsS0FBSztvQkFDRyxJQUFJOzBCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JlbmRlcmluZ01vZHVsZX0gZnJvbSBcIi4vcmVuZGVyaW5nLm1vZHVsZVwiO1xuaW1wb3J0IHtcbiAgSm9iSW5mb0NvbnRyb2xsZXJTZXJ2aWNlLFxuICBSZW5kZXJDb250cm9sbGVyU2VydmljZSxcbiAgUmVuZGVyRGF0YVJlcXVlc3Rcbn0gZnJvbSBcIm5neC1yZW5kZXJpbmctc2VydmljZS1hcGlcIjtcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSwgaW50ZXJ2YWwsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtJbWFnZUNvbXBvbmVudH0gZnJvbSBcIi4vbW9kdWxlL2ltYWdlL2ltYWdlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtSZW5kZXJpbmdBcGlNb2R1bGV9IGZyb20gXCIuL3JlbmRlcmluZy1hcGkubW9kdWxlXCI7XG5pbXBvcnQge1ZpZGVvQ29tcG9uZW50fSBmcm9tIFwiLi9tb2R1bGUvdmlkZW8vdmlkZW8uY29tcG9uZW50XCI7XG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lck1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXJcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIm5neC1lZHUtc2hhcmluZy1hcGlcIjtcbmltcG9ydCB7TWF0UHJvZ3Jlc3NCYXJNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXJcIjtcbmltcG9ydCB7QXNzZXRTdGF0ZURhdGEsIEFzc2V0U3RhdGVJdGVtfSBmcm9tIFwiLi9kdG8vQXNzZXRTdGF0ZURhdGFcIjtcbmltcG9ydCB7UGRmQ29tcG9uZW50fSBmcm9tIFwiLi9tb2R1bGUvcGRmL3BkZi5jb21wb25lbnRcIjtcbmltcG9ydCB7VXJsQ29tcG9uZW50fSBmcm9tIFwiLi9tb2R1bGUvdXJsL3VybC5jb21wb25lbnRcIjtcbmltcG9ydCB7RWR1SHRtbENvbXBvbmVudH0gZnJvbSBcIi4vbW9kdWxlL2VkdWh0bWwvZWR1SHRtbC5jb21wb25lbnRcIjtcbmltcG9ydCB7U3ByZWFkc2hlZXRDb21wb25lbnR9IGZyb20gXCIuL21vZHVsZS9zcHJlYWRzaGVldC9zcHJlYWRzaGVldC5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnMtcm9vdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZW5kZXJpbmdBcGlNb2R1bGUsXG4gICAgUmVuZGVyaW5nTW9kdWxlLFxuICAgIEltYWdlQ29tcG9uZW50LFxuICAgIFZpZGVvQ29tcG9uZW50LFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBQZGZDb21wb25lbnQsXG4gICAgVXJsQ29tcG9uZW50LFxuICAgIEVkdUh0bWxDb21wb25lbnQsXG4gICAgU3ByZWFkc2hlZXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZW5kZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmVuZGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvLyBAVE9ETzogVXNlIGVudW0gcHJvdmlkZWQgYnkgQmFja2VuZCFcbiAgQElucHV0KCkgcmVxdWVzdDogUmVuZGVyRGF0YVJlcXVlc3QgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG5vZGU6IE5vZGUgfCB1bmRlZmluZWQ7XG4gIHJlbmRlckRhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBc3NldFN0YXRlRGF0YSB8IG51bGw+KG51bGwpO1xuICBmaW5pc2hlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHNvbWVCdXROb3RBbGxGaW5pc2hlZCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KClcbiAgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IG1vZHVsZTogc3RyaW5nLCBwcm9ncmVzcz86IG51bWJlciB9IHwgbnVsbD4obnVsbCk7XG4gIHVzZVVybE1vZHVsZSA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJDb250cm9sbGVyU2VydmljZTogUmVuZGVyQ29udHJvbGxlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBqb2JJbmZvQ29udHJvbGxlclNlcnZpY2U6IEpvYkluZm9Db250cm9sbGVyU2VydmljZSxcbiAgKSB7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMubm9kZSA9PT0gdW5kZWZpbmVkIHx8ICEgdGhpcy5jaGVja0lmQmFja2VuZE1vZHVsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlclJlc3BvbnNlRGF0YSA9IChhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlbmRlckNvbnRyb2xsZXJTZXJ2aWNlLmdldFJlbmRlckRhdGEoe1xuICAgICAgYm9keTogdGhpcy5yZXF1ZXN0ISFcbiAgICB9KSkpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgY29tcGxldGVkIGRhdGEgQU5EIGEgam9iIGlkIChpZiB0aGVyZSkuXG4gICAgLy8gV2UgbmVlZCB0aGUgZGF0YSB0aGVuIEFORCB0cmlnZ2VyIHRoZSBwcm9ncmVzcyBsb2dpYyB0byBrZWVwIGxvYWRpbmcgdGhlIHVuZmluaXNoZWQgcmVzb2x1dGlvbnMuXG4gICAgaWYgKHJlbmRlclJlc3BvbnNlRGF0YS5qb2JJZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgaXRlbXMgPSByZW5kZXJSZXNwb25zZURhdGEub2JqZWN0TGlua3M/Lm1hcChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgYXNzZXRJdGVtOiBBc3NldFN0YXRlSXRlbSA9IHtcbiAgICAgICAgICBsaW5rOiBpdGVtLmxpbmssXG4gICAgICAgICAgcHJvZ3Jlc3M6IDEwMCxcbiAgICAgICAgICBoZWlnaHQ6IGl0ZW0uaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiBpdGVtLndpZHRoXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzc2V0SXRlbVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGRhdGE6IEFzc2V0U3RhdGVEYXRhID0ge1xuICAgICAgICBtb2R1bGU6IHJlbmRlclJlc3BvbnNlRGF0YS5tb2R1bGUsXG4gICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgfVxuICAgICAgcmVuZGVyUmVzcG9uc2VEYXRhLm9iamVjdExpbmtzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZW5kZXJEYXRhJC5uZXh0KGRhdGEpO1xuICAgICAgdGhpcy5maW5pc2hlZC5uZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MkLm5leHQoe21vZHVsZTogcmVuZGVyUmVzcG9uc2VEYXRhLm1vZHVsZX0pO1xuICAgICAgaW50ZXJ2YWwoNTAwKS5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5maW5pc2hlZCksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmpvYkluZm9Db250cm9sbGVyU2VydmljZS5nZXRKb2JJbmZvKHtqb2JJZDogcmVuZGVyUmVzcG9uc2VEYXRhLmpvYklkISF9KS5waXBlKCkpLFxuICAgICAgKS5zdWJzY3JpYmUoYXN5bmMgKHN0YXR1cykgPT4ge1xuICAgICAgICAvLyBTb21lLCBidXQgbm90IGFsbCwgam9icyBhcmUgZmluaXNoZWQgLT5cbiAgICAgICAgaWYgKHN0YXR1cy5qb2JzLnNvbWUoaiA9PiBqLnN0YXR1cyA9PT0gJ0ZJTklTSEVEJykgJiYgc3RhdHVzLnN0YXR1cyAhPT0gJ0ZJTklTSEVEJykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gc3RhdHVzLmpvYnMubWFwKHN1YkpvYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NldEl0ZW06IEFzc2V0U3RhdGVJdGVtID0ge1xuICAgICAgICAgICAgICBsaW5rOiBzdWJKb2Iub2JqZWN0TGluaz8ubGluayA/PyBcIlwiLFxuICAgICAgICAgICAgICBwcm9ncmVzczogc3ViSm9iLnN0YXR1cyAhPT0gJ1FVRVVFRCcgPyBzdWJKb2IucHJvZ3Jlc3MgOiAtKHN1YkpvYi5wcm9ncmVzcyArMSksXG4gICAgICAgICAgICAgIGhlaWdodDogc3ViSm9iLm9iamVjdExpbms/LmhlaWdodCA/PyBzdWJKb2IucXVhbGl0eSxcbiAgICAgICAgICAgICAgd2lkdGg6IHN1YkpvYi5vYmplY3RMaW5rPy53aWR0aCA/PyAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNzZXRJdGVtXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBkYXRhOiBBc3NldFN0YXRlRGF0YSA9IHtcbiAgICAgICAgICAgIG1vZHVsZTogcmVuZGVyUmVzcG9uc2VEYXRhLm1vZHVsZSxcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICAgICAgICB0aGlzLnNvbWVCdXROb3RBbGxGaW5pc2hlZC5uZXh0KHRydWUpXG4gICAgICAgICAgLy8gYWxsIGZpbmlzaGVkIGFuZC9vciBmYWlsZWRcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnRklOSVNIRUQnIHx8IHN0YXR1cy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgY29uc3QgaXRlbXMgPSBzdGF0dXMuam9icy5tYXAoc3ViSm9iID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0SXRlbTogQXNzZXRTdGF0ZUl0ZW0gPSB7XG4gICAgICAgICAgICAgIGxpbms6IHN1YkpvYi5vYmplY3RMaW5rPy5saW5rID8/IFwiXCIsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiBzdWJKb2IucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGhlaWdodDogc3ViSm9iLm9iamVjdExpbms/LmhlaWdodCA/PyBzdWJKb2IucXVhbGl0eSxcbiAgICAgICAgICAgICAgd2lkdGg6IHN1YkpvYi5vYmplY3RMaW5rPy53aWR0aCA/PyAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNzZXRJdGVtXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBkYXRhOiBBc3NldFN0YXRlRGF0YSA9IHtcbiAgICAgICAgICAgIG1vZHVsZTogcmVuZGVyUmVzcG9uc2VEYXRhLm1vZHVsZSxcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbmRlckRhdGEkLm5leHQoZGF0YSlcbiAgICAgICAgICB0aGlzLmZpbmlzaGVkLm5leHQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vIGZpbmlzaGVkIGpvYnMgLT4gc2hvdyBlaXRoZXIgb25lIHByb2dyZXNzIGJhciB3aXRoIHJhY2UgbGVhZGVyIChwcm9ncmVzcyAwLTEwMClcbiAgICAgICAgICAvLyBvciBxdWV1ZSBwb3NpdGlvbiAocHJvZ3Jlc3MgKC1pbmYsLTFdKVxuICAgICAgICAgIGxldCBwcm9ncmVzcyA9IDBcbiAgICAgICAgICBpZiAoc3RhdHVzLmpvYnMuc29tZShqID0+IGouc3RhdHVzID09PSAnUFJPQ0VTU0lORycpKSB7XG4gICAgICAgICAgICBwcm9ncmVzcyA9IE1hdGgubWF4KC4uLnN0YXR1cy5qb2JzLm1hcChqID0+IGoucHJvZ3Jlc3MpKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLmpvYnMuc29tZShqID0+IGouc3RhdHVzID09PSAnUVVFVUVEJykpIHtcbiAgICAgICAgICAgIHByb2dyZXNzID0gLShNYXRoLm1pbiguLi5zdGF0dXMuam9icy5tYXAoaiA9PiBqLnByb2dyZXNzICsgMSkpKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICAgIG1vZHVsZTogc3RhdHVzLm1vZHVsZSxcbiAgICAgICAgICAgIHByb2dyZXNzOiBwcm9ncmVzc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjaGVja0lmQmFja2VuZE1vZHVsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoW1wieW91dHViZVwiLCBcInBpeGFiYXlcIl0uaW5jbHVkZXMoKHRoaXMubm9kZT8ucmVtb3RlPy5yZXBvc2l0b3J5Py5yZXBvc2l0b3J5VHlwZSA/PyBcIlwiKS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgdGhpcy51c2VVcmxNb2R1bGUgPSB0cnVlXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHRoaXMubm9kZT8ucHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubm9kZT8ucHJvcGVydGllc1tcImNjbTpyZXBsaWNhdGlvbnNvdXJjZVwiXSAhPT0gdW5kZWZpbmVkICYmICh0aGlzLm5vZGUucHJvcGVydGllc1tcImNjbTpyZXBsaWNhdGlvbnNvdXJjZVwiXVswXSA/PyBcIlwiKSA9PT0gXCJvYWk6ZG1nbGliLm9yZ1wiKSB7XG4gICAgICB0aGlzLnVzZVVybE1vZHVsZSA9IHRydWVcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGhpcy5ub2RlPy5wcm9wZXJ0aWVzW1wiY2NtOnd3d3VybFwiXS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVzZVVybE1vZHVsZSA9IHRydWVcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kdWxlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZW5kZXJEYXRhJCB8IGFzeW5jIGFzIGRhdGFcIj5cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnSU1BR0UnKXtcbiAgICAgIDxycy1tb2R1bGUtaW1hZ2UgW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS1pbWFnZT5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdWSURFTycgfHwgZGF0YT8ubW9kdWxlID09PSAnQVVESU8nKXtcbiAgICAgIDxycy1tb2R1bGUtdmlkZW8gW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS12aWRlbz5cbiAgICB9IEBsb2FkaW5nIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBkZWZlciAod2hlbiBkYXRhPy5tb2R1bGUgPT09ICdQREYnIHx8IGRhdGE/Lm1vZHVsZSA9PT0gJ0RPQ1VNRU5UJykge1xuICAgICAgPHJzLW1vZHVsZS1wZGYgW2RhdGFdPVwiZGF0YVwiIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS1wZGY+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnRURVSFRNTCcpIHtcbiAgICAgIDxycy1tb2R1bGUtZWR1SHRtbCBbZGF0YV09XCJkYXRhXCIgW25vZGVdPVwibm9kZVwiPjwvcnMtbW9kdWxlLWVkdUh0bWw+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgICBAZGVmZXIgKHdoZW4gZGF0YT8ubW9kdWxlID09PSAnU1BSRUFEU0hFRVQnKSB7XG4gICAgICA8cnMtbW9kdWxlLXNwcmVhZHNoZWV0IFtkYXRhXT1cImRhdGFcIiBbbm9kZV09XCJub2RlXCI+PC9ycy1tb2R1bGUtc3ByZWFkc2hlZXQ+XG4gICAgfSBAbG9hZGluZyB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VVcmxNb2R1bGVcIj5cbiAgQGRlZmVyICh3aGVuIHVzZVVybE1vZHVsZSkge1xuICAgIDxycy1tb2R1bGUtdXJsIFtub2RlXT1cIm5vZGVcIj48L3JzLW1vZHVsZS11cmw+XG4gIH1cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiICpuZ0lmPVwiKHJlbmRlckRhdGEkIHwgYXN5bmMpID09PSBudWxsO1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9ncmVzcyQgfCBhc3luYyBhcyBwcm9ncmVzc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiWydWSURFTycsICdBVURJTyddLmluY2x1ZGVzKHByb2dyZXNzLm1vZHVsZSkgPyAnYmFyJyA6ICdzcGlubmVyJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmFyJ1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMCkgPCAwXCI+UXVldWUgcG9zaXRpb246IHt7LShwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKX19PC9kaXY+XG4gICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgW3ZhbHVlXT1cIihwcm9ncmVzcy5wcm9ncmVzcyA/PyAwKVwiICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApID49IDBcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3Bpbm5lcidcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApIDwgMFwiPlF1ZXVlIHBvc2l0aW9uOiB7ey0ocHJvZ3Jlc3MucHJvZ3Jlc3MgPz8gMCl9PC9kaXY+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiICpuZ0lmPVwiKHByb2dyZXNzLnByb2dyZXNzID8/IDApID49IDBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,23 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { RenderingServiceApiModule } from "ngx-rendering-service-api";
3
+ import { environment } from "../environments/environment";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-rendering-service-api";
6
+ export class RenderingApiModule {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingApiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: RenderingApiModule, imports: [i1.RenderingServiceApiModule] }); }
9
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingApiModule, imports: [RenderingServiceApiModule.forRoot({
10
+ rootUrl: environment.rootUrl
11
+ })] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingApiModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [
17
+ RenderingServiceApiModule.forRoot({
18
+ rootUrl: environment.rootUrl
19
+ })
20
+ ]
21
+ }]
22
+ }] });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLWFwaS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlcmluZy1hcGkubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDZCQUE2QixDQUFDOzs7QUFTeEQsTUFBTSxPQUFPLGtCQUFrQjs4R0FBbEIsa0JBQWtCOytHQUFsQixrQkFBa0I7K0dBQWxCLGtCQUFrQixZQUwzQix5QkFBeUIsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTzthQUM3QixDQUFDOzsyRkFHTyxrQkFBa0I7a0JBUDlCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLHlCQUF5QixDQUFDLE9BQU8sQ0FBQzs0QkFDaEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO3lCQUM3QixDQUFDO3FCQUNIO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7UmVuZGVyaW5nU2VydmljZUFwaU1vZHVsZX0gZnJvbSBcIm5neC1yZW5kZXJpbmctc2VydmljZS1hcGlcIjtcbmltcG9ydCB7ZW52aXJvbm1lbnR9IGZyb20gXCIuLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRcIjtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIFJlbmRlcmluZ1NlcnZpY2VBcGlNb2R1bGUuZm9yUm9vdCh7XG4gICAgICByb290VXJsOiBlbnZpcm9ubWVudC5yb290VXJsXG4gICAgfSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdBcGlNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { CommonModule } from "@angular/common";
3
+ import { EduSharingApiModule } from "ngx-edu-sharing-api";
4
+ import { environment } from "../environments/environment";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "ngx-edu-sharing-api";
7
+ export class RenderingModule {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: RenderingModule, imports: [CommonModule, i1.EduSharingApiModule], exports: [CommonModule] }); }
10
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingModule, imports: [CommonModule,
11
+ EduSharingApiModule.forRoot({ rootUrl: environment.esRootUrl }), CommonModule] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [
17
+ CommonModule,
18
+ EduSharingApiModule.forRoot({ rootUrl: environment.esRootUrl })
19
+ ],
20
+ exports: [
21
+ CommonModule
22
+ ]
23
+ }]
24
+ }] });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyaW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7OztBQVd4RCxNQUFNLE9BQU8sZUFBZTs4R0FBZixlQUFlOytHQUFmLGVBQWUsWUFQeEIsWUFBWSxxQ0FJWixZQUFZOytHQUdILGVBQWUsWUFQeEIsWUFBWTtZQUNaLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFDLENBQUMsRUFHN0QsWUFBWTs7MkZBR0gsZUFBZTtrQkFUM0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBQyxDQUFDO3FCQUM5RDtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtFZHVTaGFyaW5nQXBpTW9kdWxlfSBmcm9tIFwibmd4LWVkdS1zaGFyaW5nLWFwaVwiO1xuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSBcIi4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudFwiO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEVkdVNoYXJpbmdBcGlNb2R1bGUuZm9yUm9vdCh7cm9vdFVybDogZW52aXJvbm1lbnQuZXNSb290VXJsfSlcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJlbmRlcmluZ01vZHVsZSB7fVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlbmRlcmluZy1zZXJ2aWNlLWxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZ3gtcmVuZGVyaW5nLXNlcnZpY2UtbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,32 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { RenderComponent } from "./lib/render.component";
3
+ import { CommonModule } from "@angular/common";
4
+ import * as i0 from "@angular/core";
5
+ export class RenderingServiceLibModule {
6
+ static forRoot() {
7
+ return {
8
+ ngModule: RenderingServiceLibModule,
9
+ };
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingServiceLibModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: RenderingServiceLibModule, imports: [RenderComponent,
13
+ CommonModule], exports: [CommonModule,
14
+ RenderComponent] }); }
15
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingServiceLibModule, imports: [RenderComponent,
16
+ CommonModule, CommonModule] }); }
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RenderingServiceLibModule, decorators: [{
19
+ type: NgModule,
20
+ args: [{
21
+ declarations: [],
22
+ imports: [
23
+ RenderComponent,
24
+ CommonModule,
25
+ ],
26
+ exports: [
27
+ CommonModule,
28
+ RenderComponent
29
+ ],
30
+ }]
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLXNlcnZpY2UtbGliLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW5kZXJpbmctc2VydmljZS1saWIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7O0FBYTdDLE1BQU0sT0FBTyx5QkFBeUI7SUFDN0IsTUFBTSxDQUFDLE9BQU87UUFFbkIsT0FBTztZQUNMLFFBQVEsRUFBRSx5QkFBeUI7U0FDcEMsQ0FBQztJQUNKLENBQUM7OEdBTlUseUJBQXlCOytHQUF6Qix5QkFBeUIsWUFSbEMsZUFBZTtZQUNmLFlBQVksYUFHWixZQUFZO1lBQ1osZUFBZTsrR0FHTix5QkFBeUIsWUFSbEMsZUFBZTtZQUNmLFlBQVksRUFHWixZQUFZOzsyRkFJSCx5QkFBeUI7a0JBWHJDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxlQUFlO3dCQUNmLFlBQVk7cUJBQ2I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZUFBZTtxQkFDaEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtSZW5kZXJDb21wb25lbnR9IGZyb20gXCIuL2xpYi9yZW5kZXIuY29tcG9uZW50XCI7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgUmVuZGVyQ29tcG9uZW50LFxuICAgIENvbW1vbk1vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZW5kZXJDb21wb25lbnRcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVuZGVyaW5nU2VydmljZUxpYk1vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxSZW5kZXJpbmdTZXJ2aWNlTGliTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBSZW5kZXJpbmdTZXJ2aWNlTGliTW9kdWxlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==